生成AI活用への取組 - GitHub Copilot の利用者推移を可視化してみた

はじめに

アーキテクトチームの長沼です。

JDEPでは、アプリケーションの開発にAIペアプログラマーGitHub Copilot Business(以下、GCB)を取り入れています。 GCBは開発者にとって非常に便利な支援ツールであり、積極的に活用していきたいと考えています。 一方で、企業として利用する以上、費用対効果の説明やリソースの効率的な利用も時に求められます。

そこでJDEPでは、GCBの利用状況の可視化にも取り組んでいます。 今回はその1つとして、Copilot利用者数を可視化する取り組みについてご紹介します。

アーキテクチャ

GCBでは、GitHub Copilot User Management APIによって Copilot利用者の情報(利用者毎にAPIコール時点での最終利用日時や使用エディタ等)を取得できます。

これを日次で取得することによって、1日にどの程度GCBが利用されているかを可視化できます。

今回は以下のようなアーキテクチャで可視化してみることにしました。

Google CloudによるGitHub CopilotのSeat Usage可視化アーキテクチャ

各構成要素の役割は以下のとおりです。

# 構成要素 処理概要
(1) Cloud Functions GitHub Copilot User Management APIからGCBの利用者情報を取得し、後述(4)のBigQueryに格納
(2) Cloud Scheduler 日次で(1)のCloud Functionsを実行
(3) BigQuery GCBの利用者情報を時系列で保存するデータベース
(4) Looker BigQueryのデータを可視化するツール

実装

以降では、前述の構成要素の実装例についてご紹介します。
なお(1)〜(3)で示す実装例では、エラー処理ほか本筋に関係しない部分は省略して記述している部分があります。

(1) Cloud Functionsの処理

環境変数に指定された

  • GITHUB_ORG: 情報を取得したいGCB利用者が所属するGitHubのOrganization
  • GITHUB_TOKEN: GitHub Copilot User Management APIから情報を取得するためのAPIトークン
  • GOOGLE_CLOUD_PROJECT_ID: 構成要素(3)のBigQueryが属するGoogleのProject ID

を入力パラメータとして、 GitHub Copilot User Management APIから情報を取得し、BigQueryに格納する処理をPythonで実装した例を以下に示します。

import os
import requests
from datetime import datetime, timezone
from google.cloud import bigquery

# GitHubのAPIにより、GitHub Copilot利用者の最終利用日時を取得
def get_copilot_seat_usages(request=None):
    # GitHub側の変数
    GITHUB_HOSTNAME = os.getenv("GITHUB_HOSTNAME") or "api.github.com"
    GITHUB_API_VERSION = os.getenv("GITHUB_API_VERSION") or "2022-11-28"
    GITHUB_ACCEPT = os.getenv("GITHUB_ACCEPT") or "application/vnd.github+json"
    GITHUB_ORG = os.getenv("GITHUB_ORG")
    GITHUB_TOKEN = os.getenv("GITHUB_TOKEN")

    # Google Cloud側の変数
    GOOGLE_CLOUD_PROJECT_ID = os.getenv("GOOGLE_CLOUD_PROJECT_ID")
    BIGQUERY_DATASET_ID = os.getenv("BIGQUERY_DATASET_ID") or "github_copilot"
    BIGQUERY_TABLE_ID = os.getenv("BIGQUERY_TABLE_ID") or "copilot_seat_usages"

    # 処理実行時の時間
    REQUEST_TIMESTAMP = datetime.now(
        timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")

    # GitHub APIからGitHub Copilot利用者のusage情報を取得
    org_url = f"https://{GITHUB_HOSTNAME}/orgs/{GITHUB_ORG}/"
    seat_usage_url = f"{org_url}copilot/billing/seats"
    headers = {
        "Authorization": f"Bearer {GITHUB_TOKEN}",
        "Accept": GITHUB_ACCEPT,
        "X-GitHub-Api-Version": GITHUB_API_VERSION,
    }
    data = (requests.get(seat_usage_url, headers=headers)).json()

    # 取得usage情報からBigQuery格納情報を生成
    seats = data['seats']
    rows = []
    for seat in seats:
        asignee = seat['assignee']
        rows.append((
            asignee['id'],                 # user_id
            asignee['login'],              # username
            seat['last_activity_editor'],  # user_editor
            seat['last_activity_at'],      # last_activity_time
            REQUEST_TIMESTAMP              # request_timestamp
        ))

    # BigQueryに格納
    bqclient = bigquery.Client(project=GOOGLE_CLOUD_PROJECT_ID)
    table = bqclient.get_table(
        f"{GOOGLE_CLOUD_PROJECT_ID}.{BIGQUERY_DATASET_ID}.{BIGQUERY_TABLE_ID}")
    errors = bqclient.insert_rows(table, rows)

    if errors == []:
        return "Successfully inserted rows into BigQuery."
    else:
        return ("Encountered errors while inserting rows: {}".format(errors))

if __name__ == "__main__":
    get_copilot_seat_usages()

(2) Cloud Schedulerの処理

Cloud Schedulerは、Cronjobと同様の記述方法で、指定した日時に指定された処理(今回は(1)のCloud Functions)を実行できるGoogle Cloudのサービスです。

これを用いて、前述(1)のCloud Functionsを例えば毎日午前9時に実行することにより、実行時点での各GCB利用者の最終利用日時(last_activity_at)を取得します。
この利用日時が前日の午前9時以降の時間であれば、前日その利用者はGCBを利用していた、と考えることができます。

このCloud Schedulerの記述をTerraformで記述した例を以下に示します。

resource "google_cloud_scheduler_job" "get_copilot_seat_usages_invoker" {
  name        = "get_copilot_seat_usages_invoker"
  description = "Invoke get-copilot-seat-usage cloud functions"
  schedule    = "0 9 * * *" # 9:00 JST
  time_zone   = "Asia/Tokyo"
  region      = var.region # Please change me

  # 以降、target設定等の記述 (今回は省略)
}

(3) BigQueryの構造

BigQueryは、データ分析向けによく使われるGoogle Cloudのマネージドデータベースサービスです。

このBigQueryに、日次で(1)のCloud Functionsにより取得したGCBの利用者情報を

  • ユーザID
  • ユーザ名
  • 最終利用日時
  • 最終利用時のエディタ
  • 取得日時((1)のCloud Functions実行時間)

として格納していきます。

これをスキーマ含めてTerraformで構築する例を以下に示します。

resource "google_bigquery_dataset" "github_copilot" {
  dataset_id  = "github_copilot"
  location    = var.location # Please change me
  description = "Dataset for GitHub Copilot"
}

resource "google_bigquery_table" "copilot_seat_usages" {
  dataset_id = google_bigquery_dataset.github_copilot.dataset_id
  table_id   = "copilot_seat_usages"

  schema = <<EOF
  [
    {
      "name": "user_id",
      "type": "INT64",
      "mode": "REQUIRED",
      "description": "user id (seat[].assignee.id)"
    },
    {
      "name": "username",
      "type": "STRING",
      "mode": "REQUIRED",
      "description": "username (seat[].assignee.login)"
    },
    {
      "name": "last_editor",
      "type": "STRING",
      "mode": "NULLABLE",
      "description": "used editor in the last usage (seat[].last_activity_editor)"
    },
    {
      "name": "last_use_date",
      "type": "TIMESTAMP",
      "mode": "NULLABLE",
      "description": "last usage date in UTC (seat[].last_activity_at)"
    },
    {
      "name": "data_acq_date",
      "type": "TIMESTAMP",
      "mode": "REQUIRED",
      "description": "acquisition date by the daily request"
    }
  ]
  EOF
}

このほかJDEPでは、利用者と所属チーム(アプリケーション)の関係を保持するテーブルなども用意し、より詳細な分析も可能としています。

(4) Looker で用いるクエリ

Lookerは、BigQueryに格納された様々なデータを可視化するGoogle Cloudのサービスです。
可視化のイメージがアーキテクチャの図で示した右側のダッシュボードとなります。

本記事ではLookerの具体的な実装・設定は割愛しますが、日次で(data_acq_date-1)日午前9時からの24時間でGCBを使用した利用者数(latest_total_uesed_seats)の一覧を取得するクエリは以下のように書くことができます。

SELECT data_acq_date, COUNT(last_use_date) as latest_total_uesed_seats 
FROM `{GOOGLE_CLOUD_PROJECT_ID}.{BIGQUERY_DATASET_ID}.{BIGQUERY_TABLE_ID}` 
WHERE last_use_date >= DATE_SUB(data_acq_date, INTERVAL 1 DAY) AND last_use_date <= data_acq_date
GROUP BY data_acq_date

おわりに

今回は、GitHubが提供するAPIを用いて、GitHub Copilot Businessの日々の利用者を可視化する取り組みについてご紹介しました。
さらに最近、GitHub Copilot Metrics APIが公開され、Acceptance Rate (提案をどの程度採用したかの割合)等の指標がAPIで取得できるようになりました。
こうした情報も可視化・活用し、さらなる活用促進や効率的な利用に取り組んでいきたいと思います。

最後となりましたが、JCBでは我々と一緒に働きたいという人材を募集しています。 詳しい募集要項等については採用ページをご覧下さい。


本文および図表中では、「™」、「®」を明記しておりません。 記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。

©JCB Co., Ltd. 20︎21