🤖

gemini-pro に GitHub Discussions の本文を要約してもらう

2023/12/16に公開

GitHub Actions を使用して、gemini-pro (ジェミナイ-プロ) に Discussions の本文を要約してもらうワークフローを作成しました。

gemini-pro が作成したこの記事の要約

This GitHub workflow uses the gemini-pro model from Google Vertex AI to summarize the body of a discussion on GitHub. When a discussion is locked, the workflow is triggered and uses the Google Cloud OIDC authentication to generate a summary of the discussion body using the gemini-pro model. The summary is then printed to the console. The workflow requires the Google Cloud OIDC authentication to be set up and uses the @google-cloud/vertexai npm package to call the Vertex AI API.

成果物

workflowファイル

.github/workflows/discussion.yml

name: "disscussion summarizer"

on:
  discussion:
    types: [locked]
jobs:
  summarize:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      issues: write
      id-token: write
    steps:
      - name: setup-node
        uses: actions/setup-node@v4
        with:
          node-version: "20"
      - name: checkout
        uses: actions/checkout@v4
        
      - id: get-token
        uses: google-github-actions/auth@v2
        with:
          token_format: "access_token"
          workload_identity_provider: "projects/{アカウント番号}/locations/global/workloadIdentityPools/github-actions-workflow-pool/providers/github-actions-workflow-provider"
          service_account: "github-actions-workflow@{プロジェクトID}.iam.gserviceaccount.com"

      - run: npm i @google-cloud/vertexai

      - name: summarize
        id: summarize
        uses: actions/github-script@v7
        with:
          script: |
            const { VertexAI } = require("@google-cloud/vertexai");

            const body = context.payload.discussion.body;

            // Initialize Vertex with your Cloud project and location
            const vertex_ai = new VertexAI({
              project: "{プロジェクトID}",
              location: "asia-northeast1",
            });
            const model = "gemini-pro";

            // Instantiate the models
            const generativeModel = vertex_ai.preview.getGenerativeModel({
              model: model,
              generation_config: {
                max_output_tokens: 8192,
                temperature: 0.9,
                top_p: 1,
              },
            });

            const generateContent = async () => {
              const req = {
                contents: [
                  {
                    role: "user",
                    parts: [
                      {
                        text: `Provide a brief summary for the following discussions:

                        ${body}
                        `,
                      },
                    ],
                  },
                ],
              };

              const streamingResp = await generativeModel.generateContentStream(req);

              const response = await streamingResp.response;
              return response.candidates[0].content.parts[0].text;
            };

            return await generateContent();

      - run: echo ${{ steps.summarize.outputs.result }}

Google Cloud の OIDC 認証の設定

OIDC 認証の設定 はこちらの記事を参考とさせていただきました。

https://zenn.dev/kou_pg_0131/articles/gh-actions-oidc-gcp

使用するロールとして、roles/aiplatform.user を設定しました

詳細

IAM Service Account Credentials API の有効化

% gcloud services enable iamcredentials.googleapis.com --project={プロジェクトID}

サービスアカウントを作成

gcloud iam service-accounts create "github-actions-workflow" --project={プロジェクトID}

GitHub Actions から使用するリソースロールを付与

gcloud projects add-iam-policy-binding {プロジェクトID} \
  --member="serviceAccount:github-actions-workflow@{プロジェクトID}.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"
  • 今回は Vertex AI の gemini-pro を使用するので、roles/aiplatform.user を付与しました

プールを作成

gcloud iam workload-identity-pools create github-actions-workflow-pool \
  --location="global"
  --project={プロジェクトID} \

プロバイダを作成

gcloud iam workload-identity-pools providers create-oidc github-actions-workflow-provider \
  --location="global" \
  --workload-identity-pool=github-actions-workflow-pool \
  --attribute-mapping="google.subject=assertion.sub,attribute.repository=assertion.repository,attribute.actor=assertion.actor" \
  --issuer-uri="https://token.actions.githubusercontent.com"
  --project={プロジェクトID} \

Workload Identity プールからサービスアカウントのアクセス権を借用できるようにする

gcloud iam service-accounts add-iam-policy-binding \
  "github-actions-workflow@{プロジェクトID}.iam.gserviceaccount.com" \
  --role="roles/iam.workloadIdentityUser" \
  --member="principalSet://iam.googleapis.com/projects/{アカウント番号}/locations/global/workloadIdentityPools/github-actions-workflow-pool/attribute.repository/{GitHubアカウント名}/{GitHubリポジトリ名}"
  --project={プロジェクトID} \

GitHub Actions

Goole Cloud の OIDC 認証を使用する

google-github-actions/auth@v2 を使用して、作成したサービスアカウントのアクセストークンを取得します。

- id: get-token
uses: google-github-actions/auth@v2
with:
    token_format: "access_token"
    workload_identity_provider: "projects/{アカウント番号}/locations/global/workloadIdentityPools/github-actions-workflow-pool/providers/github-actions-workflow-provider"
    service_account: "github-actions-workflow@{プロジェクトID}.iam.gserviceaccount.com"

Discussions のイベントをトリガーに設定する

Discussions を使用して議論メモを書いた後、 lock conversation で Discussions をロックすると、Discussions のイベントがトリガーされます。

https://docs.github.com/ja/actions/using-workflows/events-that-trigger-workflows#discussion

on:
  discussion:
    types: [locked]
  • github.event.discussion.body で Discussions の本文を取得できます。

Vertex AI の gemini-pro を呼び出す

Google Cloud のコンソールにサンプルコードが表示されるので、こちらを参考とします。

@google-cloud/vertexai を使用して、APIを叩けば良さそうです。

SDK の公式ドキュメントを参考に、actions/github-script 内の script にベタ書きしました。

参考: https://github.com/googleapis/nodejs-vertexai?tab=readme-ov-file#streaming-content-generation

- run: npm i @google-cloud/vertexai

- name: summarize
id: summarize
uses: actions/github-script@v7
with:
    script: |
    const { VertexAI } = require("@google-cloud/vertexai");

    const body = context.payload.discussion.body;

    // Initialize Vertex with your Cloud project and location
    const vertex_ai = new VertexAI({
        project: "{プロジェクトID}",
        location: "asia-northeast1",
    });
    const model = "gemini-pro";

    // Instantiate the models
    const generativeModel = vertex_ai.preview.getGenerativeModel({
        model: model,
        generation_config: {
        max_output_tokens: 8192,
        temperature: 0.9,
        top_p: 1,
        },
    });

    const generateContent = async () => {
        const req = {
        contents: [
            {
            role: "user",
            parts: [
                {
                text: `Provide a brief summary in English for the following discussions:

                ${body}
                `,
                },
            ],
            },
        ],
        };

        const streamingResp = await generativeModel.generateContentStream(req);

        const response = await streamingResp.response;
        return response.candidates[0].content.parts[0].text;
    };

    return await generateContent();

現状、generateContentStream のレスポンスに含まれる日本語が文字化けするため、英語で要約してもらっています。
(関連Issue: https://github.com/googleapis/nodejs-vertexai/issues/78)

やってみた

Discussions として適切ではありませんが、機能検証のため、本記事のここまでの部分を作成したワークフローで要約してみました。
GtiHub の Discussions に貼り付け、lock conversation で Discussions をロック時にGitHub Actions が実行され、記事冒頭の通りの要約が生成されました。

まとめ

  • GitHub Actions から Vertex AI の gemini-pro を呼び出すワークフローを作成しました。
  • Google Cloud のコンソールにコードサンプルが表示されるのは嬉しいですね。
GitHubで編集を提案

Discussion