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を用いた社内資料検索ボットの実装③アプリケーション構築編
Search
熊懐葵
February 22, 2025
Technology
170
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
LangGraphとFlaskを用いた社内資料検索ボットの実装③アプリケーション構築編
機械学習の社会実装勉強会 第44回 (
https://machine-learning-workshop.connpass.com/event/346001/
) の発表資料です。
熊懐葵
February 22, 2025
More Decks by 熊懐葵
See All by 熊懐葵
AI時代のインターン研修再設計 コーディング力から課題創出・業務遂行力へ
aoikumadaki
0
150
Claude Codeで進めるAWSリソースのTerraform移行
aoikumadaki
0
110
n8nで定期成果報告の資料づくりを自動化する
aoikumadaki
0
260
LangGraphとFlaskを用いた社内資料検索ボットの実装④GithubRetriever構築編
aoikumadaki
0
120
LangGraphとFlaskを用いた社内資料検索ボットの実装②Retriever構築編
aoikumadaki
0
260
LangGraphとFlaskを用いた社内資料検索ボットの実装①AIエージェント構築編
aoikumadaki
0
490
StreamlitとLangChainを使った表画像OCRアプリの実装
aoikumadaki
3
930
LangChainでデータ分析エージェントを作ってみる
aoikumadaki
0
380
AWS LambdaとLangSmithを使った社内レポート添削システムMinervaの実装
aoikumadaki
0
410
Other Decks in Technology
See All in Technology
SRE歴2ヶ月でも開発6年の知見を活かして、チームで止まっていた環境改善を前に進めた話
a_ono
0
160
40代で“やっとエンジニアになれた”――閉じた学びを開き、空の青さを知る / 20260628 Naoki Takahashi
shift_evolve
PRO
4
1.5k
グローバルチームと挑むプロダクト開発
sansantech
PRO
1
120
Docker Desktop不要の時代が来る? WSL標準の「wslc」で Linuxコンテナを動かしてみた.
ueponx
0
410
5分でわかるDuckDB Quack
chanyou0311
4
290
AI時代における最適なQA組織の作り方
ymty
3
320
從觀望到全公司落地:AI Agentic Coding 導入實戰 — 流程整合與安全治理
appleboy
0
400
「勝手に広まる」人気 AI エージェントを爆速で作ろう!(AWS Summit Japan 2026講演資料)
minorun365
PRO
10
2.8k
Agile and AI Redmine Japan 2026
hiranabe
4
570
感情と身体を置き去りにしない、エンジニアの生きのこり方 ──いまから、ここから「自分の状態」を扱うという選択
saorimurooka
0
440
Foundry Toolkit + Lemonade Serverでローカルワークフロー開発
seosoft
0
110
CVE-2026-20833_脆弱性対応とAES 化について
jukishiya
0
320
Featured
See All Featured
Prompt Engineering for Job Search
mfonobong
0
360
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
450
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Become a Pro
speakerdeck
PRO
31
6k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
180
Designing Experiences People Love
moore
143
24k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
230
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
210
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.9k
Transcript
LangGraphとFlaskを用いた 社内資料検索ボットの実装 ③アプリケーション構築編 2025/2/22 機械学習の社会実装勉強会 第44回 熊懐 葵
目次 • Sofiaについて • 背景と目的 • 使い方 • これまでの実装 •
アプリケーション構築 • インフラパート • アプリパート 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
Github 1. 質問 2. HTTPリクエスト 3. 資料検索 4. 回答生成 7. レスポンス 6. 返信
社内資料検索ボット Sofia 第2回までの実装 7 Sofia Jira Confluence Github 資料検索 回答生成
社内資料検索ボット Sofia 今回の実装 8 Sofia Jira Confluence Github 資料検索 回答生成
Slack App 質問 HTTPリクエスト レスポンス Flask 返信 Cloud Run リクエストを処理する アプリケーション Sofiaの実行環境
社内資料検索ボット Sofia 今回の実装 9 Sofia Slack App Flask Cloud Run
アプリケーション構築をインフラパートとアプリパートに分けて説明する アプリパート インフラパート ※少ない
社内資料検索ボット Sofia 今回の実装 10 Sofia Slack App Flask Cloud Run
Sofia リポジトリ Terraform用 リポジトリ アプリケーション構築をインフラパートとアプリパートに分けて説明する アプリパート (+開発環境) インフラパート (+ 開発環境)
Terraformとは 11 クラウド環境をコードベースで一括管理できるツール → クラウド環境をGithubで一括管理できるツール Terraformがないと... リソースのセットアップが面倒 ポチ...あっ (間違えた) ポチポチ...
インフラの把握が面倒 あのPJはどのリソースを 使ってたっけ... クラウド増やしたら管理ツール も増えた…覚えきれない…
Terraformとは 12 クラウド環境をコードベースで一括管理できるツール → クラウド環境をGithubで一括管理できるツール Terraformがあると... コードベースで一括でセットアップ コードベースで一括管理 ...楽 テンプレ用意
でさらに便利 インフラ環境の全 貌を把握できる
アプリ構築工程 13 インフラ (開発環境) GCP/Terraform Cloud Run アプリ Slack App
main.py (開発環境) デプロイ
アプリ構築 > インフラ > GCP/Terraform 1. GCPセットアップ(コンソール) • GCPプロジェクト作成 •
請求先アカウント紐付け 14
アプリ構築 > インフラ > GCP/Terraform 2. Terraformセットアップ • Github, GCSの環境構築・連携
• GithubActions実装 15 Cloud Run Terraform用 リポジトリ GCS コード管理 最新状態を 保存 Githubでコードを修正したら GCP側も自動で更新する
アプリ構築 > インフラ > GCP/Terraform Github, GCSの環境構築・連携(概要) 1. Githubリポジトリを作る $
gh repo create sofia 2. GCSバケットを作る $ gcloud auth login $ gcloud storage buckets create gs://sofia-terraform --project sofia--location asia-northeast1 16 3. 連携する (↓必要な設定ファイルをリポジトリに用意して...) $ terraform init $ terraform apply これでGithubからGCSを更新できるようになる
アプリ構築 > インフラ > GCP/Terraform (必要な設定ファイルとは...) 17 詳しくはこちら→ https://github.com/nakamasato/cloud-run-app-template 関連ファイル
詳しいセットアップ方法 はここに書かれている Cloud Runアプリ向けの Terraform用リポジトリ のテンプレート
アプリ構築 > インフラ > GCP/Terraform GithubActions実装(概要) 1. ワークフローを作る 18 (中身↓※一部)
PR更新時に • terraform init • terraform apply などが自動で動く apply: 更新内容と 比較し差分を更新 Terraform リポ init: 保存して いる最新状態 を取得 Cloud Run GCS
アプリ構築 > インフラ > GCP/Terraform GithubActions実装(概要) 2. ワークフローがGCPにアクセスできるようにOIDC(認証プロセス)を用意 19 OIDC(OpenID
Connect)ではない認証とはどういうものか 認証 「本物です。更新し たいです」 発行 Secret に保存 SAキーによる認証: 有効期限がなく漏洩すると危険・管理が手動で面倒 SAキー GithubActions GithubActionsのSA (サービスアカウント) GCPリソース サービスの実行権限 (IAM権限) 実行
アプリ構築 > インフラ > GCP/Terraform 20 OIDCトークン (証明書)発行 GithubActions GithubActionsのSA
(サービスアカウント) GCPリソース OIDC: 有効期限の短いトークンを自動発行する認証方法 Workload Identity Pool Secrity Token Service Identity Provider 今回の外部Workloads: Github STSトークンで認証 権限借用 OIDCトークンを渡す 外部Workloadsの ID発行・登録 検証 STSトークン発行 実行 IAM権限
アプリ構築 > インフラ > GCP/Terraform 21 OIDCトークン (証明書)発行 GithubActions GithubActionsのSA
(サービスアカウント) GCPリソース 外部エンジニアに、社内のリソースを使わせたいときのようなイメージ Workload Identity Pool Secrity Token Service Identity Provider 今回の外部Workloads: Github STSトークンで認証 権限借用 OIDCトークンを渡す 外部Workloadsの ID発行・登録 検証 STSトークン発行 実行 IAM権限 A社 B社 人事部 受付 総務部 ICカード エンジニア 高性能な機械 B社入館 許可証
アプリ構築 > インフラ > GCP/Terraform 22 GithubActions実装(概要) 2. ワークフローがGCPにアクセスできるようにOIDC(認証プロセス)を用意 →
Terraformから用意できる Terraformで用意するもの • 使用するサービスのAPI有効化(IAM, STSなど) • サービスアカウント • サービスアカウントが使うGCPリソース実行用のRole • Workload Identity Pool + IdPとの連携 • Workload Identity Poolのサービスアカウント権限借用の設定 $ terraform init $ terraform apply これでPRでリソースを更新したときに、本番環境も自動的に更新するようになる
アプリ構築 > インフラ > GCP/Terraform GithubActionsの認証に関連する主な設定ファイル 23 テンプレ→ https://github.com/nakamasato/cloud-run-app-template •
使用するサービスのAPI有効化(IAM, STSなど) • サービスアカウント • サービスアカウントが使うGCPリソース実行用のRole • Workload Identity Pool + IdPとの連携 • Workload Identity Poolのサービスアカウント権限借用 の設定 テンプレートではモジュールを使っている ↓ 一から設定したい場合は Workload Identity GithubActions OIDC連携 などで検索
アプリ構築 > インフラ > GCP/Terraform 1. GCPセットアップ(コンソール) • GCPプロジェクト作成 •
請求先アカウント紐付け 2. Terraformセットアップ • Github, GCSの環境構築・連携 • GithubActions実装 24 →完了!
アプリ構築 > インフラ > Cloud Run 25 Cloud Run: •
Sofiaの実行環境 • コンテナを実行するサービス • コンテナ: ソースコードや 実行環境をまとめてパッケージ化したもの • コンテナを作ることはできない→他のどこかに保存する Artifact Registry: • コンテナを置いておけるサービス • 実装: 基本的なもの • Google Cloud: https://cloud.google.com/artifact- registry/docs/repositories/terraform?hl=ja Sofia Artifact Registry Cloud Run
アプリ構築 > アプリ > Slack App @Sofia メッセージに反応し、Sofiaにリクエストを飛ばすAppを作成&install 26 Slack
App Cloud Run • Scope • app_mentions:read • chat:write • reactions:write • search:read • Event • app_mention 以下のSecretを取得しておく • Signing Secret • Bot Oauth Token • User Oauth Token Appを作成した後 Scopeを 設定した後 Event URL(エンドポイント) はアプリ作成後に設定 Bot User
アプリ構築 > アプリ > main.py 27 発表① 発表③ 発表②
アプリ構築 > アプリ > main.py 28 1. FlaskとSlackのインスタンスを作る 2. Graphを用意する
第1回で作ったもの 第2回で作ったもの 別の機会に説明したい
アプリ構築 > アプリ > main.py 29 3. Graphの出力は辞書データなので、Slackのメッセージ向きに加工する try-except 回答メッセージの
表示調整
アプリ構築 >アプリ > main.py 30 4. Sofiaの処理プロセスを書く リクエスト認証 ルート設定 SlackのリクエストURL
“Cloud Runのエンドポイント” + “/slack/events” リクエストのリトライを無視 Slack Eventはレスポンスが返ってく るまでリクエストを飛ばす リクエストURLを有効化した時に飛んでくるリクエストを無視
アプリ構築 >アプリ > main.py 31 5. Sofiaの処理プロセスを書く graph回答 生成&送信
アプリ構築 >アプリ > main.py 32 6. アプリを起動する これでSofiaが始めから終わりまで動くようになった
アプリ構築 > アプリ > デプロイ 33 完成したSofiaをArtifact Registry経由でCloud Runにデプロイしたい →
GithubでSofiaを更新したら、Cloud RunにデプロイするGithubActionsを実装 する merge・PRによる 更新でトリガー 並列実行対策 古い実行中ワークフ ローはキャンセル 権限 デプロイとは 関係なし
アプリ構築 > アプリ > デプロイ 34 デプロイジョブの前に pytestを通している デプロイ用のpoetryセットアップ ※カスタムアクション
コードを取得
アプリ構築 > アプリ > デプロイ 35 最新コミットの識別子(コ ミットハッシュ)で コンテナイメージの識別子 (タグ)を設定
カスタムアクションでデプロイ https://github.com/nakamasat o/github-actions Artifact Registryのリポジトリ名 このGithubActions用の サービスアカウント
アプリ構築 > アプリ > デプロイ 36 ワークフローがGCPにアクセスできるようにOIDC(認証プロセス)を用意 ※ Terraformリポジトリとアプリのリポジトリが別の場合、OIDCの設定も別に作 る必要がある
リポジトリが別な らトークンも別 Sofia リポジトリ Sofia Flask Cloud Run
社内資料検索ボット Sofia 概念図 Slack App Jira Confluence Cloud Run 37
Github 1. 質問 2. HTTPリクエスト 3. 資料検索 4. 回答生成 7. レスポンス 6. 返信
アプリ構築 > インフラ > Cloud Runなど 38 Cloud Runの実装について •
→のテンプレートなどが参考になる • Secretを環境変数に入れる Secretは、gcloudコマンドorコンソール経由で登録する $ echo -n "xxx" | gcloud secrets create sofia-openai-api-key -- replication-policy automatic --project $PROJECT --data-file=-
アプリ構築 > インフラ > Cloud Runなど 39 Secretの具体的な設定プロセス 1. TerraformでSecretリソースを作成
2. Secretの値を登録(gcloud・コンソール) 3. Cloud RunにSecretへのアクセス権を付与 4. Cloud Runの環境変数にSecretを設定 参考: Google Cloudの公式など https://cloud.google.com/run/docs/configuring/services/secrets?hl=ja#acc ess-secrets tfファイルに直接書くとGithub から誰でも見れてしまうから
ご清聴ありがとうございました