Inside of LOVOT

GROOVE X 技術ブログ

LLMを用いたGitHubとSlackの会話ログ分析

はじめに

初めまして。インターン生として3週間GROOVE Xで開発をさせていただきました小野です。インターン生にも関わらず、今回はプロトタイプ開発に1から携わらせていただくことができました。とても貴重な経験となったので、ぜひ紹介させてください!

取り組んだタスク

ソフトウェア開発における個人の貢献は、コードの品質だけで測れるものではありません。GitHubでの設計議論やSlackでの問題解決といった日々の業務には、個人の能力やチームへの貢献を示す、客観的かつ定性的なデータが豊富に眠っています。

今回のタスクでは、この膨大なテキストデータをLLMで分析し、これまで見過ごされがちなデータを活用して、ユーザの貢献を明らかにできると考えました。この仮説を検証するため、GitHubのリポジトリデータやSlackの会話履歴を分析するプロトタイプの開発に挑戦しました。

【メンターよりひとこと】 本プロトタイプは、技術検証を目的としたものです。 テキストコミュニケーションの過程をLLMで評価するPoCで、活発なコミュニケーションのサンプルとして、GitHubやSlackをお題に取り上げました。

LLMによる評価の手順

では、実際にこのプロダクトではどのようにしてLLMによる評価を行うのか、その手順を説明します。 ここでの「各指標」というのは、プロジェクトへの個人の貢献度を測る軸です。

GitHub分析

  1. 情報取得: 対象リポジトリから、特定のユーザーに関連する全てのPR(Pull Request)やIssueの情報を取得します。
  2. 成果予測: LLMが各PRやIssueの内容を分析し、「このタスクで各指標において最大限の成果を出した場合、何点の価値があるか(理論上の満点)」を予測します。
  3. 行動評価と能力値算出: 予測された満点に対し、実際のユーザーの行動(コメントや会話内容など)が何点に相当するかをLLMが評価し、最終的な能力値を算出します。

Slack分析

  1. 情報取得: 対象チャンネルから、特定のユーザーが関与したスレッドの情報を取得します。
  2. 成果予測: LLMが各スレッドの文脈を分析し、「この議論で各指標において最大限の成果を出した場合、何点の価値があるか(理論上の満点)」を予測します。
  3. 行動評価と能力値算出: 予測された満点に対し、実際のユーザーの発言内容が何点に相当するかをLLMが評価し、最終的な能力値を算出します。

実際のプロダクトの様子

結果表示画面

各評価項目における能力値を一目で把握することができるレーダーチャートと各項目ごとにおける詳細な説明の両方を知ることができます。

あるGitHub Repository におけるユーザ分析

工夫点

1. 難易度を反映する2段階評価

LLMを用いて以下の2段階で評価を行います。

  • LLMによる満点の予測 最大限のポテンシャルを発揮した場合、そのタスクには何点の価値があったのかという「理論上の満点」を予測します。
  • LLMによる実際のユーザー行動評価 予測された満点に対し、実際の行動が何点に相当するかを評価します。

これにより、タスクの難易度を反映した評価が可能になります。
(例:4点満点の高難易度タスクで4点取ることと、1点満点の低難易度タスクで1点を取ること、同じ「満点」でもその価値の違いを正しく評価できます。)

2. LLMの多角的な活用

単なるスコアリングに留まらず、定性的な評価にもLLMを深く活用しています。

  • 評価とスコアリング ユーザーの行動を評価し、点数付けを行います。
  • スコア根拠の抽出 なぜそのスコアになったのか、根拠となる部分を抽出・要約します。
  • 能力値算出理由の生成 最終的な能力値が算出された背景や理由を、人間が読んで理解できる自然な文章で生成します。

これにより、定量的な評価(スコア)と定性的な評価(理由)を両立させ、納得感の高い評価体験を実現しています。

3. プロンプトの工夫

LLMから意図した通りの応答を引き出すためには、プロンプト(指示文)の工夫が重要です。

  • 役割(ペルソナ)設定 AIに特定の専門家などの役割を与え、思考の方向性やアウトプットのトーンを定めます。(例:「あなたは厳格かつ公正なエンジニアリングマネージャーです。」)

  • 構造化されたインプット # 評価基準# 制約条件 のようにマークダウンの見出しで情報を整理し、AIが各情報の文脈を正確に理解できるよう指示します。

  • 厳密な出力形式の指定 JSON形式や特定のテンプレートなど、回答のフォーマットを具体的に指示します。これにより、生成された出力をプログラムで自動処理しやすくなります。

4. 能力値の算出ロジック

ユーザーのGitHubやSlackでの活動評価に基づき、その人の「真の能力値」を統計的に推定するためのものです。単なるスコアの平均ではなく、MAP推定(最大事後確率推定) という手法を用いて、より信頼性の高い能力値を算出しています。

計算プロセスは、大きく分けて以下の3ステップで構成されています。

1. データの収集と準備

計算を始める前に、まず元となるデータを集めて整形します。

指定されたユーザーの評価データをGitHubやSlackから全て取得します。評価データの中から、有効なものだけをフィルタリングします。

2. 「最も確からしい能力値」の探索(MAP推定)

「もし能力値がXだったら、今までの評価結果になる確からしさはどのくらいか?」 を全ての可能性について検証し、最も確からしい能力値を探し出します。

この「最終的な確からしさ(事後確率)」は、以下の2つの要素を組み合わせて決定されます。

① 尤度(ゆうど):実績データからの証拠

  • 役割: ユーザーの実際の評価結果が、どれだけもっともらしいかを測ります。
  • 計算方法
    • 「もしあなたの真の能力がXだったら、観測された評価結果(level:ユーザの評価predictedMaxScore:予測された満点のペア)が得られる確からしさはどのくらいか?」を計算します。
    • ここではsigmoid関数を使って、ある能力値の人が特定の評価レベルを獲得する確率をモデル化しています。
    • 全ての評価結果についてこの確率を計算し、合計することで、データ全体としての「尤度」が算出されます。

② 事前確率:常識的な仮説

  • 役割: 評価データが少ない場合に、推定結果が極端な値になるのを防ぐ「おもり」や「常識」の役割を果たします。
  • 計算方法
    • 「データを見る前に、そもそも能力がXである可能性はどのくらいか?」を確率として定義します。
    • コードではベータ分布という統計分布を使い、ALPHA = 2, BETA_PARAM = 5と設定することで、「能力値は0点に近い、やや低い値である可能性が最も高い」という保守的で現実的な仮説を立てています。
    • これにより、初心者がいきなり最高評価を得ることを防ぎ、より安定した推定が可能になります。

探索方法:グリッドサーチ

  • 役割: 上記の「尤度」と「事前確率」を足し合わせた事後確率が最大になる能力値を見つけ出します。
  • 計算方法
    1. 候補点の作成: まず、能力値の範囲を細かい間隔で区切り、検証する候補点のリストを作成します。
    2. 総当たり計算: 作成した全ての候補点について、一つずつ「事後確率」を計算していきます。
    3. 最高点の特定: 全候補点の中で、事後確率が最大となったものが、最も確からしい能力値(MAP推定値)として採用されます。

3. 推定の信頼度の計算(ベイズ信頼区間)

最後に、算出した能力値が「どのくらい信頼できるか」を数値で示します。

  • 役割: 推定された能力値のばらつきの範囲を示します。評価データが多いほど、信頼度は高まり、この範囲は狭くなります。
  • 計算方法
    • 事後確率のグラフ(山のような形をしています)の頂点付近がどれだけ鋭いかを計算します。山が鋭ければ鋭いほど、推定の確信度が高いことを意味します。
    • この「鋭さ」から統計的なばらつきを算出し、95%の確率で真の能力値が収まるであろう範囲(信頼区間)を算出します。

インターンを通しての学び

AIを駆使した効率的な開発 🤖

インターンシップを通して、AIを開発プロセスに組み込むことで、作業効率を飛躍的に向上させられることを学びました。

重要なのは、単にAIを使うことではなく、それぞれのAIが持つ強みや最適な用途を理解し、目的に応じて賢く使い分けることです。

具体的には、AIに依頼したい役割を常に意識し、以下のように関わり方を変えることが効率化の鍵となります。

  • 戦略的な相談相手として 開発の方針や設計で悩んだ際に、アイデアの壁打ちや意思決定のサポートを求めます。

  • 単純作業のアシスタントとして 定型的なコードの生成、リファクタリング、ドキュメント作成、軽微な修正作業などを代行してもらいます。

  • コーディングのペアプログラマーとして 具体的な関数の実装方法や、より効率的なアルゴリズムの提案を求めます。

チーム開発から得られる価値 🤝

AIとの対話だけでなく、チーム内での人間同士の議論や壁打ちが、プロジェクトの質を高める上で不可欠であることを学びました。

一人で考えるだけでは得られない、多様な視点や知識を組み合わせることで、より良い成果を生み出すことができます。

  • 方針決定と軌道修正 定期的にチームで壁打ちを行うことで、多様な意見を反映した、より納得感の高い方針を決定できます。また、進行中のズレを早期に検知し、柔軟に軌道修正することが可能になります。

  • 知識の共有 各メンバーが持つ専門知識や経験を共有することで、最終的なアウトプットの質の最大化につながることを実感することができました。

スクラム形式での開発から得た学び 🏃

スクラム開発を繰り返すアプローチは、計画性と柔軟性を両立させる上で非常に効果的でした。

  • 計画性を意識した開発 各スプリントの開始時に具体的な目標(スプリントゴール)を設定することで、「今、何のためにこの作業をしているのか」という目的意識を常に持ちながら開発に取り組むことができました。これにより、日々のタスクが最終的なゴールにどう結びついているかを明確に意識できます。

  • 改善点や要因を発見する機会 スプリントの終わりに行う振り返りでは、単に作業の進捗を確認するだけでなく、「なぜ上手くいったのか」「何が課題だったのか」をチーム全員で率直に話し合うことで、プロセスの問題点や改善のヒントを具体的に発見し、次のスプリントに活かすことができると感じました。

まとめ

このインターンシップでは、LLMを活用した能力評価システムの開発に携わり、技術的なスキルだけでなく、現代の開発プロセスやチームで成果を出すためのソフトスキルを実践的に学ぶことができました。また、GitHubやSlackデータを対象に今回は貢献度の評価という観点からLLMを活用して、評価を行いましたが、この仕組みを活用して他のデータや評価方法に応用することで、ビジネスの様々な側面を可視化することが可能になると感じています。