Upgrade to Pro — share decks privately, control downloads, hide ads and more …

LangGraphとFlaskを用いた社内資料検索ボットの実装④GithubRetriever構築編

 LangGraphとFlaskを用いた社内資料検索ボットの実装④GithubRetriever構築編

機械学習の社会実装勉強会 第46回 (https://machine-learning-workshop.connpass.com/event/352980/) の発表資料です。

Avatar for 熊懐葵

熊懐葵

April 26, 2025
Tweet

More Decks by 熊懐葵

Other Decks in Technology

Transcript

  1. 目次 • Sofiaについて • 背景と目的 • 使い方 • これまでの実装 •

    Github Retriever 構築 • ① APIクライアント • ② GithubRetriever • ③ 統合 2
  2. 社内資料検索ボット Sofia 概念図 Slack App Jira Confluence Cloud Run 6

    1. 質問 2. HTTPリクエスト 3. 資料検索 4. 回答生成 7. レスポンス 6. 返信 Github
  3. 社内資料検索ボット Sofia 今回の実装 Slack App Jira Confluence Cloud Run 7

    1. 質問 2. HTTPリクエスト 4. 回答生成 7. レスポンス 6. 返信 Github 3. 資料検索
  4. Jira Retriever, Confluence Retrieverはどう作っていたか 8 1. まず、API クライアントを用意する → APIサーバーと通信する(リクエストを送信しデータを取得する)オブジェクト

    Sofia Jiraクライアント(既にある) Confluenceクライアント(既にある) APIクライアント APIサーバー リクエスト!!! ...(何を?)
  5. Jira Retriever, Confluence Retrieverはどう作っていたか 9 2. APIクライアントに組み込まれた、メソッドを使ってデータを取得する Jiraクライアント(既にある) Confluenceクライアント(既にある) Sofia

    APIクライアント APIサーバー Aをリクエスト! Aのデータ Cをリクエスト! Bをリクエスト! Bのデータ Cのデータ メソッドを指定 してリクエスト レスポンス
  6. Jira Retriever, Confluence Retrieverはどう作っていたか 10 3. 最後に、Retrieverを用意する → LLMのプロンプトに与える情報を取得するオブジェクト Sofia

    Jira Retriever(作った) Confluence Retriever(作った) APIクライアント Aをリクエスト! Aのデータ Retriever 使うJira情報 選別 APIサーバー Retrieverオブジェクト Aのデータ
  7. Github Retrieverを作るには? 11 Jira、Confluence RetrieverではRetrieverオブジェクトを作れば良かったが... Sofia APIクライアント Aをリクエスト! Aのデータ Retriever

    使うJira情報 選別 APIサーバー APIクライアント Retriever APIサーバー Sofia Githubから情報を取得するAPIクライアントと、選別するRetrieverを作る!
  8. APIクライアント (全体構成) 15 GithubAPI ├─ __init__:↓のget関数たちを使ってアクセストークンを取得 ├─ get_jwt ├─ get_installation_id

    ├─ get_iat ├─ _request:内部用の HTTP リクエスト関数(GET/POST) ├─ list_repositories ├─ list_commits ├─ search ├─ get_repo_contents 認証(共通) _request を使って 何らかの情報 を取得
  9. APIクライアント > 認証プロセス整備 17 jwt発行 • トークン生成の時刻 • トークンの有効期限(最大10分) •

    Github App本人確認 1. get_jwt : サーバーアクセス用アカウント(Github App)の身元証明 Client ID や Signing Key は Github App作成後に取得できる 本物です! どこのorgのApp ですか?
  10. APIクライアント > 認証プロセス整備 19 このAppがD-stats org指定でリクエストを送ることができる 2. get_installation_id : Appがある場所を特定する

    3. get_iat : Github Appのサーバーへのアクセス認可 本物です! トークンどうぞ D-stats Orgの Appへのリクエス トです!
  11. 参考: アクセストークンの発行手続きが複雑な理由 手軽なやり方: PAT(Personal Access Token)を発行する 20 スタートは簡単だけど... • (運用面:

    組織のSecretを、特定の個人が管理しないといけない) • (運用面: 期限が切れたら手動で更新しないといけない) • セキュリティ面: 漏洩してしまうと何でもできてしまう 本物です!(認証) D-stats OrgのAppです!(Scope指定で認可) 操作権限を必要な分だけ絞って付与したいから、 「誰が」「どの範囲のscope(権限)で」を分けている (+時限式で柔軟に付与) Github App単位 PATは全権限を付与する
  12. APIクライアント > 認証プロセス整備 21 まとめると、 GithubAPI ├─ __init__:↓のget関数たちを使ってアクセストークンを取得 ├─ get_jwt

    ├─ get_installation_id ├─ get_iat ├─ _request:内部用の HTTP リクエスト関数(GET/POST) ├─ list_repositories ├─ list_commits ├─ search ├─ get_repo_contents 認証(共通) _request を使って 何らかの情報 を取得 どのリクエストメソッドを使うに しても、最初に__init__で権限付 与している仕組み
  13. APIクライアント > メソッド定義 22 GithubAPI ├─ __init__:↓のget関数たちを使ってアクセストークンを取得 ├─ get_jwt ├─

    get_installation_id ├─ get_iat ├─ _request:内部用の HTTP リクエスト関数(GET/POST) ├─ list_repositories ├─ list_commits ├─ search ├─ get_repo_contents 認証(共通) _request を使って 何らかの情報 を取得
  14. APIクライアント > メソッド定義 24 ※ 欲しい情報によって、path(リクエストURL)を変える リクエスト先URL 欲しい情報とURLの対応はこちら: https://docs.github.com/en/rest/authentication/endpoints-available-for- github-app-installation-access-tokens?apiVersion=2022-11-28

    メソッド名 変数 path list_repositories owner, type /orgs/{owner}/repos?type={type} list_commits owner, repo /repos/{owner}/{repo}/commits search query /search/code?q={query}&type=code get_repo_contents owner, repo, path /repos/{owner}/{repo}/contents/{path}
  15. 検索queryか ら回答に用い る情報を取得 質問から検索 queryを生成 Github Retriever (作るもの) 26 get_generate_github_query_chain

    ├─ EXAMPLES (json) ├─ REPO_INFO (json) │ └─ (update_gh_repos)─ │ │ │ GithubRetriever ├─ __init__ ├─ _get_relevant_documents─ │ │ └─ Documentを返す GithubAPI list_repositories list_commits get_repo_contents GithubAPI search get_repo_contents
  16. Sofiaの GithubRetriever 構築 振り返り 37 APIクライアント インター フェース作成 認証プロセス メソッド定義

    Github Retriever クエリ生成 Retriever作成 統合 main.py graph.py Jira/Confluence には既存のものがあるが、Githubにはないので作った Jira/Confluence Retriverとほぼ同じ設計で作れる ちょっと書き換えるだけ