Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
LangGraphとFlaskを用いた社内資料検索ボットの実装④GithubRetriever構築編
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
熊懐葵
April 26, 2025
Technology
0
90
LangGraphとFlaskを用いた社内資料検索ボットの実装④GithubRetriever構築編
機械学習の社会実装勉強会 第46回 (
https://machine-learning-workshop.connpass.com/event/352980/
) の発表資料です。
熊懐葵
April 26, 2025
Tweet
Share
More Decks by 熊懐葵
See All by 熊懐葵
AI時代のインターン研修再設計 コーディング力から課題創出・業務遂行力へ
aoikumadaki
0
99
Claude Codeで進めるAWSリソースのTerraform移行
aoikumadaki
0
79
n8nで定期成果報告の資料づくりを自動化する
aoikumadaki
0
200
LangGraphとFlaskを用いた社内資料検索ボットの実装③アプリケーション構築編
aoikumadaki
0
140
LangGraphとFlaskを用いた社内資料検索ボットの実装②Retriever構築編
aoikumadaki
0
230
LangGraphとFlaskを用いた社内資料検索ボットの実装①AIエージェント構築編
aoikumadaki
0
450
StreamlitとLangChainを使った表画像OCRアプリの実装
aoikumadaki
3
880
LangChainでデータ分析エージェントを作ってみる
aoikumadaki
0
340
AWS LambdaとLangSmithを使った社内レポート添削システムMinervaの実装
aoikumadaki
0
380
Other Decks in Technology
See All in Technology
OCI技術資料 : コンピュート・サービス 概要
ocise
4
54k
プロジェクトマネジメントをチームに宿す -ゼロからはじめるチームプロジェクトマネジメントは活動1年未満のチームの教科書です- / 20260304 Shigeki Morizane
shift_evolve
PRO
1
250
AIエージェント時代に備える AWS Organizations とアカウント設計
kossykinto
3
770
生成AIの利用とセキュリティ /gen-ai-and-security
mizutani
1
1.6k
kintone開発のプラットフォームエンジニアの紹介
cybozuinsideout
PRO
0
860
20260311 技術SWG活動報告(デジタルアイデンティティ人材育成推進WG Ph2 活動報告会)
oidfj
0
290
Exadata Database Service on Dedicated Infrastructure(ExaDB-D) UI スクリーン・キャプチャ集
oracle4engineer
PRO
8
7.2k
ランサムウエア対策してますか?やられた時の対策は本当にできてますか?AWSでのリスク分析と対応フローの泥臭いお話。
hootaki
0
110
楽しく学ぼう!ネットワーク入門
shotashiratori
3
2.9k
越境する組織づくり ─ 多様性を前提にしたチームビルディングとリードの実践知
kido_engineer
2
190
20260311 ビジネスSWG活動報告(デジタルアイデンティティ人材育成推進WG Ph2 活動報告会)
oidfj
0
260
僕、S3 シンプルって名前だけど全然シンプルじゃありません よろしくお願いします
yama3133
1
190
Featured
See All Featured
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.1k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.4k
Un-Boring Meetings
codingconduct
0
220
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
200
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.9k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.4k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
How STYLIGHT went responsive
nonsquared
100
6k
A designer walks into a library…
pauljervisheath
210
24k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
140
Site-Speed That Sticks
csswizardry
13
1.1k
Mind Mapping
helmedeiros
PRO
1
120
Transcript
LangGraphとFlaskを用いた 社内資料検索ボットの実装 ④GithubRetriever構築編 2025/4/26 機械学習の社会実装勉強会 第46回 熊懐 葵
目次 • Sofiaについて • 背景と目的 • 使い方 • これまでの実装 •
Github Retriever 構築 • ① APIクライアント • ② GithubRetriever • ③ 統合 2
プロジェクト・業務データ 背景と目的 ディースタッツでは、複数のソフトを連携させてプロジェクトを推進している Slack Jira Confluence Github 連携・通知 タスク管理 業務資料
開発 データ・ノウハウを活かして業務効率化をしたい 3
社内資料検索ボット Sofia Sofia…Slack上で質問すると、Jira・Confluence・Github(←New!)の情報を元に 回答してくれるチャットボット Slack @Sofia <質問> 回答 + 参考URL
4
Github 社内資料検索ボット Sofia 社内情報にすぐ アクセスできる 5 Sofia…Slack上で質問すると、Jira・Confluence・Github(←New!)の情報を元に 回答してくれるチャットボット
社内資料検索ボット Sofia 概念図 Slack App Jira Confluence Cloud Run 6
1. 質問 2. HTTPリクエスト 3. 資料検索 4. 回答生成 7. レスポンス 6. 返信 Github
社内資料検索ボット Sofia 今回の実装 Slack App Jira Confluence Cloud Run 7
1. 質問 2. HTTPリクエスト 4. 回答生成 7. レスポンス 6. 返信 Github 3. 資料検索
Jira Retriever, Confluence Retrieverはどう作っていたか 8 1. まず、API クライアントを用意する → APIサーバーと通信する(リクエストを送信しデータを取得する)オブジェクト
Sofia Jiraクライアント(既にある) Confluenceクライアント(既にある) APIクライアント APIサーバー リクエスト!!! ...(何を?)
Jira Retriever, Confluence Retrieverはどう作っていたか 9 2. APIクライアントに組み込まれた、メソッドを使ってデータを取得する Jiraクライアント(既にある) Confluenceクライアント(既にある) Sofia
APIクライアント APIサーバー Aをリクエスト! Aのデータ Cをリクエスト! Bをリクエスト! Bのデータ Cのデータ メソッドを指定 してリクエスト レスポンス
Jira Retriever, Confluence Retrieverはどう作っていたか 10 3. 最後に、Retrieverを用意する → LLMのプロンプトに与える情報を取得するオブジェクト Sofia
Jira Retriever(作った) Confluence Retriever(作った) APIクライアント Aをリクエスト! Aのデータ Retriever 使うJira情報 選別 APIサーバー Retrieverオブジェクト Aのデータ
Github Retrieverを作るには? 11 Jira、Confluence RetrieverではRetrieverオブジェクトを作れば良かったが... Sofia APIクライアント Aをリクエスト! Aのデータ Retriever
使うJira情報 選別 APIサーバー APIクライアント Retriever APIサーバー Sofia Githubから情報を取得するAPIクライアントと、選別するRetrieverを作る!
Github Retrieverの構築過程 12 APIクライアント インター フェース作成 認証プロセス メソッド定義 Github Retriever
クエリ生成 Retriever作成 統合 main.py graph.py
APIクライアント > インターフェース作成 APIクライアントの設計図(=インターフェース)を書く 13 Abstract Base Classを使う @abstractmethodにより、 Github
APIで作るメソッドを強制する (作らないとエラーになる) 継承 テスト用API作成を楽にする
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 を使って 何らかの情報 を取得
APIクライアント > 認証プロセス整備 16 Githubサーバーから情報を取得するために認証が必要 1. Json Web Token(JWT)を取得 2.
Installation idを取得 3. Installation Access Token(IAT)を取得
APIクライアント > 認証プロセス整備 17 jwt発行 • トークン生成の時刻 • トークンの有効期限(最大10分) •
Github App本人確認 1. get_jwt : サーバーアクセス用アカウント(Github App)の身元証明 Client ID や Signing Key は Github App作成後に取得できる 本物です! どこのorgのApp ですか?
APIクライアント > 認証プロセス整備 19 このAppがD-stats org指定でリクエストを送ることができる 2. get_installation_id : Appがある場所を特定する
3. get_iat : Github Appのサーバーへのアクセス認可 本物です! トークンどうぞ D-stats Orgの Appへのリクエス トです!
参考: アクセストークンの発行手続きが複雑な理由 手軽なやり方: PAT(Personal Access Token)を発行する 20 スタートは簡単だけど... • (運用面:
組織のSecretを、特定の個人が管理しないといけない) • (運用面: 期限が切れたら手動で更新しないといけない) • セキュリティ面: 漏洩してしまうと何でもできてしまう 本物です!(認証) D-stats OrgのAppです!(Scope指定で認可) 操作権限を必要な分だけ絞って付与したいから、 「誰が」「どの範囲のscope(権限)で」を分けている (+時限式で柔軟に付与) Github App単位 PATは全権限を付与する
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__で権限付 与している仕組み
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 を使って 何らかの情報 を取得
APIクライアント > メソッド定義 23 1. リクエスト用の共通メソッドを作る トークンを入れて認証済みリク エストにする リクエスト先URL(https://api.github.com +
{path} 2. 各メソッドを定義する(例: commit情報取得リクエストの場合
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}
Github Retrieverの構築過程 25 APIクライアント インター フェース作成 認証プロセス メソッド定義 Github Retriever
クエリ生成 Retriever作成 統合 main.py graph.py
検索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
Github Retriever > クエリ生成 27 get_generate_github_query_chain (質問から検索queryを生成) → LangChainを使って作る(プロンプト+LLMモデル+出力方法) クエリの具体例・各リポジトリの情報・時間・質問
▼EXAMPLES: 質問とクエリ例 ▼REPO_INFO: リポジトリの詳細 リポジトリごと 質問から検索クエリを生成してください+例+etc
28 GithubAPIのメソッドを使ってjsonファイルを作る 全リポジトリの基本情報を取得するメソッド 参考: REPO_INFO用jsonを更新する(update_gh_repos.py) コミット情報を取得するメソッド 直近5つのコミットメッセージを入れる ファイルの中身を取得するメソッド READMEの中身を入れる jsonに書き込む
Github Retriever > クエリ生成 29 get_generate_github_query_chain (質問から検索queryを生成) → LangChainを使って作る(プロンプト+LLMモデル+出力方法) 検索クエリからURLを作る
検索クエリとURLの型付き オブジェクトを出力 質問からクエリ生成
社内資料検索ボット Sofia Slack @Sofia <質問> 回答 + 参考URL 30 ここに入れる
(踏むとGithubの検索画面へ)
Github Retriever > Retriever作成 31 GithubRetriever (検索queryから回答に用いるDocumentを取得) _get_relevant_documents下に 処理を書くと… graphで使う時.invokeで動かせる
生成したクエリ 生成したクエリ GithubRetriever ↑JiraRetriever ※graph.py searchメソッド でクエリ検索
参考: searchメソッドで取得できる情報 32 例: Github内のterraform管理について教えて → query = repo:D-stats/terraform-configuration リポジトリ内の初めから30ファイル(デフォルト)
query+type=code オプションで1000ファイルまで
Github Retriever > Retriever作成 33 GithubRetriever (検索queryから回答に用いるDocumentを取得) ファイルごとに中身を取得する 30ファイルで9秒弱かかる
Github Retriever > Retriever作成 34 GithubRetriever (検索queryから回答に用いるDocumentを取得) 結果をDocument形式でreturn Jira/Confluence Retrieverと同じ形式
←jira.py
統合(簡単!) 35 Retrieverを用意 main.py 追加
統合(簡単!) 36 Graphに追加する main.py confluence...?揃えたい(気持ち) Graph内部も少し手直し graph.py
Sofiaの GithubRetriever 構築 振り返り 37 APIクライアント インター フェース作成 認証プロセス メソッド定義
Github Retriever クエリ生成 Retriever作成 統合 main.py graph.py Jira/Confluence には既存のものがあるが、Githubにはないので作った Jira/Confluence Retriverとほぼ同じ設計で作れる ちょっと書き換えるだけ
ご清聴ありがとうございました