$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
LangGraphとFlaskを用いた社内資料検索ボットの実装①AIエージェント構築編
Search
熊懐葵
November 30, 2024
Technology
0
430
LangGraphとFlaskを用いた社内資料検索ボットの実装①AIエージェント構築編
機械学習の社会実装勉強会 第41回 (
https://machine-learning-workshop.connpass.com/event/336915/
) の発表資料です。
熊懐葵
November 30, 2024
Tweet
Share
More Decks by 熊懐葵
See All by 熊懐葵
Claude Codeで進めるAWSリソースのTerraform移行
aoikumadaki
0
72
n8nで定期成果報告の資料づくりを自動化する
aoikumadaki
0
190
LangGraphとFlaskを用いた社内資料検索ボットの実装④GithubRetriever構築編
aoikumadaki
0
81
LangGraphとFlaskを用いた社内資料検索ボットの実装③アプリケーション構築編
aoikumadaki
0
130
LangGraphとFlaskを用いた社内資料検索ボットの実装②Retriever構築編
aoikumadaki
0
210
StreamlitとLangChainを使った表画像OCRアプリの実装
aoikumadaki
3
830
LangChainでデータ分析エージェントを作ってみる
aoikumadaki
0
320
AWS LambdaとLangSmithを使った社内レポート添削システムMinervaの実装
aoikumadaki
0
350
Other Decks in Technology
See All in Technology
2025年 開発生産「可能」性向上報告 サイロ解消からチームが能動性を獲得するまで/ 20251216 Naoki Takahashi
shift_evolve
PRO
2
210
20251222_サンフランシスコサバイバル術
ponponmikankan
2
130
マイクロサービスへの5年間 ぶっちゃけ何をしてどうなったか
joker1007
17
7.4k
AIBuildersDay_track_A_iidaxs
iidaxs
4
930
Amazon Connect アップデート! AIエージェントにMCPツールを設定してみた!
ysuzuki
0
120
Snowflake導入から1年、LayerXのデータ活用の現在 / One Year into Snowflake: How LayerX Uses Data Today
civitaspo
0
1.7k
AI との良い付き合い方を僕らは誰も知らない
asei
0
210
New Relic 1 年生の振り返りと Cloud Cost Intelligence について #NRUG
play_inc
0
160
特別捜査官等研修会
nomizone
0
520
Identity Management for Agentic AI 解説
fujie
0
340
【ServiceNow SNUG Meetup LT deck】WorkFlow Editorの廃止と Flow Designerへの移行戦略
niwato
0
120
20251218_AIを活用した開発生産性向上の全社的な取り組みの進め方について / How to proceed with company-wide initiatives to improve development productivity using AI
yayoi_dd
0
580
Featured
See All Featured
The agentic SEO stack - context over prompts
schlessera
0
550
How to Ace a Technical Interview
jacobian
281
24k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
Designing for humans not robots
tammielis
254
26k
Designing for Timeless Needs
cassininazir
0
87
How GitHub (no longer) Works
holman
316
140k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
Scaling GitHub
holman
464
140k
Building an army of robots
kneath
306
46k
Making Projects Easy
brettharned
120
6.5k
It's Worth the Effort
3n
187
29k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
120
Transcript
LangGraphとFlaskを用いた 社内資料検索ボットの実装 ①AIエージェント構築編 2024/11/30 機械学習の社会実装勉強会 第41回 熊懐 葵
目次 • 背景とモチベーション • 社内資料検索ボット Sofiaとは • AIエージェントとは • LangGraphとは
• Sofiaの実装(エージェント部分) • 材料を揃える • 繋ぎ合わせる • 構築確認 1
プロジェクト・業務データ 背景とモチベーション 社内では、複数のソフトを連携させてプロジェクトを推進している Slack Jira Confluence Github 連携・通知 タスク管理 業務資料
開発 業務ノウハウを活かして業務効率化をしたい 2
社内資料検索ボット Sofia Sofia…Slack上で質問すると、JiraやConfluenceの情報を元に回答してくれる チャットボット Slack @Sofia <質問> 回答 + 参考URL
3
社内資料検索ボット Sofia Sofia…Slack上で質問すると、JiraやConfluenceの情報を元に回答してくれる チャットボット Confluence 社内情報にすぐ アクセスできる 4
社内資料検索ボット Sofia アプリケーション全体 Slack App Jira Confluence Cloud Run LangGraphで
AIエージェントを構築 5
社内資料検索ボット Sofia の実装 やること • LangGraphを用いたAIエージェントの構築 • Flaskを用いたアプリケーション全体の構築 本発表の目的 SofiaのAIエージェント構築の説明を通して
LangGraphを使ったAIエージェントの構築の仕方をわかりやすくまとめる 6
AIエージェント(マルチエージェント)とは 従来の生成AI 指示 回答 AIエージェント 指示 不正確・一貫しない回答 • 長い複雑な指示 •
専門性の高い質問 複数のモデルで構成された、複雑なタスクを正確に実行できるシステム 回答 Aして BorCをして Dする Aする Bする Cする Dする 正確で一貫した回答 • 複雑な指示を整理 • 専門で役割分担 7
LangGraph(v0.2.28)とは AIエージェント構築のためのフレームワーク • 複数の処理単位(モデル)や処理の遷移を整理しながら 構築できる Node Edge 入力 出力 •
入力~出力までずっと同じデータ構造を保持し、各 Nodeで更新していく State Graph • Node, Edge, State を合わせてAIエージェント Graph 8
SofiaのGraph 動作フロー 情報の取得先を選択(Jira or Confluence) Jira or Confluenceから関連情報を取得 関連度の低い情報を削除 質問の意図を読み取り、質問を修正する
回答を生成する 開始 終了 情報の再評価か生成か 再評価 生成 情報が残っているか No Yes 情報に基づくか No Yes 質問に答えているか Yes No • 質問: ~して • 取得先: • 回答: • 資料: • 質問: ~して • 取得先: Confl. • 回答: ~です • 資料: [URL] 9
SofiaのGraph 動作フロー 情報の取得先を選択(Jira or Confluence) Jira or Confluenceから関連情報を取得 関連度の低い情報を削除 質問の意図を読み取り、質問を修正する
回答を生成する 開始 終了 情報の再評価か生成か 再評価 生成 情報が残っているか No Yes 情報に基づくか No Yes 質問に答えているか Yes No • 質問: ~して • 取得先: • 回答: • 資料: • 質問: ~して • 取得先: Confl. • 回答: ~です • 資料: [URL] Node Edge (Conditional edge) State Graph 10
SofiaのGraph 実装のイメージ(graph.py) __start__ decide_datasource retrieve grade_documents transform_query generate __end__ grade_documents_
or_generate decide_to_generate grade_generation_v_documents_and_question • question: ~して • datasource: • generation: • documents: • question: ~して • datasource : Confl. • generation: ~です • documents: [URL] class GraphState(… def decide_datasource(… def grade_...question(… def create_graph(… 11
SofiaのGraph 実装ステップ 材料を揃える Stateを定義 Nodeを定義 Edgeを定義 繋ぎ合わせる Graphを定義 Nodeを追加 Edgeを追加
構築確認 Graphをコン パイルする 12
SofiaのGraph実装 材料を揃える > Stateを定義 State…Graphの状態を表すデータ構造 TypedDictを使って型付き辞書を定義する • 質問: ~して •
取得先: Confl. • 回答: ~です • 資料: [URL] GraphStateクラス 13
SofiaのGraph実装 材料を揃える > Nodeを定義 全部で5つのNodeを定義する __start__ __end__ grade_documents_ or_generate decide_to_generate
grade_generation_v_documents_and_question 事前準備: chainの材料 • prompt • model • BaseModel or StrOutputParser decide_datasource retrieve grade_documents transform_query generate Nodeを定義する • chain(or retriever)を定義 • Stateから使用するデータを取得 • chainをinvoke • Stateのデータを更新 14
SofiaのGraph実装 材料を揃える > Nodeを定義 事前準備① prompt … 4つ( 以外) •
system prompt…データをどう更新して欲しいか • human prompt…使用するStateのデータ system prompt の例 decide_datasource の場合: ※ あなたはユーザーの質問をConfluenceまたはJiraに振り分けるエキスパートです。Confluenceにはドキュメント があり、Jiraにはチケットがあります。質問が明示的にJiraやチケットを指している場合のみJiraを選択してください。 retrieve 15
SofiaのGraph実装 材料を揃える > Nodeを定義 事前準備① prompt … 4つ( 以外) •
system prompt…データをどう更新して欲しいか • human prompt…更新したいStateのデータ retrieve __start__ __end__ decide_datasource retrieve grade_documents transform_query generate system prompt(ざっくり) あなたは、ユーザーの質問をConfluence またはJiraに振り分けるエキスパートです あなたは、質問と取得文書の 関連性を評価する採点者です あなたは、質問をより良い バージョンに変換する 質問リライターです あなたは、質問応答タスクのアシ スタントです。 以下の質問に回答して…。 あなたはX + Yして 16
SofiaのGraph実装 材料を揃える > Nodeを定義 事前準備② model …chat(ChatOpenAI)とretrievers 外部で定義し、引数として設定している(運用面を考慮) graph.py(Graph構築側) ※main.py(アプリ構築側)
各retrieverの構築はここでは割愛 17
SofiaのGraph実装 材料を揃える > Nodeを定義 事前準備② model …chatとretrievers __start__ __end__ decide_datasource
retrieve grade_documents transform_query generate model(ざっくり) chat chat chat chat retrievers (confluence_retriever か jira_retrievers 18
SofiaのGraph実装 材料を揃える > Nodeを定義 事前準備③ BaseModel or StrOutputParser …chainの出力制御をする •
BaseModel…pydanticのクラス。型ヒントを設定して、データバリデーション ができる。 • StrOutputParser…LangChainのクラス。modelの出力を文字列でそのまま返す。 BaseModelの例 StrOutputParserの例 型ヒント: str, 型詳細: 抽出資料が質問に関連しているか (yes / no) ※ 特に事前準備なし 19
SofiaのGraph実装 材料を揃える > Nodeを定義 事前準備③ BaseModel or StrOutputParser …chainの出力制御をする •
BaseModel…pydanticのクラス。型ヒントを設定して、データバリデーション ができる。 • StrOutputParser…LangChainのクラス。modelの出力を文字列でそのまま返す。 __start__ __end__ decide_datasource retrieve grade_documents transform_query generate BaseModel or StrOutputParser (ざっくり) BaseModel Literal[“confluence”, “jira”], jiraチケット関連の時だけjiraを選ぶ BaseModel str, 抽出資料が質問に関連 しているか。yes か no StrOutputParser StrOutputParser 20
SofiaのGraph実装 材料を揃える > Nodeを定義 全部で5つのNodeを定義する __start__ __end__ grade_documents_ or_generate decide_to_generate
grade_generation_v_documents_and_question 事前準備: chainの材料 • prompt • model • BaseModel or StrOutputParser decide_datasource retrieve grade_documents transform_query generate Nodeを定義する • chain(or retriever)を定義 • Stateから使用するデータを取得 • chainをinvoke • Stateのデータを更新 21
SofiaのGraph実装 材料を揃える > Nodeを定義 decide_datasource を定義 1. chainを定義 2. Stateから使用するデータを取得
3. chainをinvoke 4. Stateのデータを更新 chat + BaseModel + .with_structured_outputで出力制 御されたmodelを作る chain = prompt | model State • question: 使用 • datasource: 更新 • generation: • documents: 22 “Jira”か”Confluence”と出力する
SofiaのGraph実装 材料を揃える > Nodeを定義 retrieve を定義 1. (retrieverを外で定義済) 2. Stateから使用するデータを取得
3. invoke 4. Stateのデータを更新 ※main.py(アプリ構築側) State • question: 使用 • datasource: 使用 • generation: • documents: 更新 23 取得した資料データを出力する
SofiaのGraph実装 材料を揃える > Nodeを定義 grade_documentsを定義 1. chainを定義 2. Stateから使用するデータを取得 3.
chainをinvoke 4. Stateのデータを更新 chat + BaseModel + .with_structured_outputで出力制 御されたmodelを作る State • question: 使用 • datasource: • generation: • documents: 使用/更新 24 ループ内で資料ごとに”yes”か”no”を出力する yesならdocumentsに残す
SofiaのGraph実装 材料を揃える > Nodeを定義 transform_queryを定義 1. chainを定義 2. Stateから使用するデータを取得 3.
chainをinvoke 4. Stateのデータを更新 State • question: 使用/更新 • datasource: • generation: • documents: chain = prompt | model | Parser 25 より良い質問に修正し、出力する
SofiaのGraph実装 材料を揃える > Nodeを定義 generateを定義 1. chainを定義 2. Stateから使用するデータを取得 3.
chainをinvoke 4. Stateのデータを更新 State • question: 使用 • datasource: 使用 • generation: 更新 • documents: 使用 chain = prompt | model | Parser documentsの情報を整理 26
SofiaのGraph実装 材料を揃える > Nodeを定義 generateを定義 1. chainを定義 2. Stateから使用するデータを取得 3.
chainをinvoke 4. Stateのデータを更新 State • question: 使用 • datasource: 使用 • generation: 更新 • documents: 使用 Nodeの定義完了 27 回答を生成
SofiaのGraph実装 材料を揃える > Edgeを定義 事前準備: chainの材料(※) • prompt • model
• BaseModel Edgeを定義する • chainを定義(※) • Stateからチェックするデータを取得 • chainをinvoke(※) • chainの結果に応じて文字列を出力 _start_ decide_datasource retrieve grade_documents transform_query generate _end_ grade_documents_ or_generate decide_to_generate grade_generation_v_documents_and_question 全部で3つのEdge(Conditional Edge)を定義する ※ Stateのデータ チェックにchainを 使う ※ Stateのデータ チェックにchainを 使う NodeはStateのデータを出力 28
SofiaのGraph実装 材料を揃える > Edgeを定義 事前準備: chain3つ分を揃える(割愛) • prompt…3つ • model…全てchat
• BaseModel…3つ _start_ decide_datasource retrieve grade_documents transform_query generate _end_ grade_documents_ or_generate decide_to_generate grade_generation_v_documents_and_question documentsが回答に十分かチェックするchain 回答が事実に基づくかチェックするchain 回答が質問に答えているかチェックするchain 29
SofiaのGraph実装 材料を揃える > Edgeを定義 grade_documents _or_generateを定義 1. chainを定義 2. Stateからチェックするデータを取得
3. chainをinvoke 4. 文字列を出力 State • question: 使用 • datasource: • generation: • documents: 使用 chat + BaseModel + .with_structured_outputで出力制 御されたmodelを作る chain = prompt | model 30
SofiaのGraph実装 材料を揃える > Edgeを定義 grade_documents _or_generateを定義 1. chainを定義 2. Stateからチェックするデータを取得
3. chainをinvoke 4. 文字列を出力 State • question: 使用 • datasource: • generation: • documents: 使用 chainの結果(yesかno)に応じて 出力する文字列を変える chainの判断材料: • question • documentの数 • documentのmetadata 31
SofiaのGraph実装 材料を揃える > Edgeを定義 decide_to_generateを定義 1. chainを定義 2. Stateからチェックするデータを取得 3.
chainをinvoke 4. 文字列を出力 State • question: • datasource: • generation: • documents: 使用 documentが残ってないなら質問を修正 documentが残っているなら回答生成 32
SofiaのGraph実装 材料を揃える > Edgeを定義 grade_generation_v_documents_and_questionを定義 1. chainを定義 2. Stateからチェックするデータを取得 3.
chainをinvoke 4. 文字列を出力 State • question: 使用 • datasource: • generation: 使用 • documents: 使用 chat + BaseModel + .with_structured_outputで 出力制御されたmodelを作る 33 回答が事実に基づくかチェックするchain 回答が質問に答えているかチェックするchain
SofiaのGraph実装 材料を揃える > Edgeを定義 grade_generation_v_documents_and_questionを定義 1. chainを定義 2. Stateからチェックするデータを取得 3.
chainをinvoke 4. 文字列を出力 State • question: 使用 • datasource: • generation: 使用 • documents: 使用 事実に基づくか:no→回答の再生成 事実に基づくか:yes→ • 有益か:yes→処理終了 • 有益か:no→質問の再生成 34
SofiaのGraph 実装ステップ 材料を揃える Stateを定義 Nodeを定義 Edgeを定義 繋ぎ合わせる Graphを定義 Nodeを追加 Edgeを追加
構築確認 Graphをコン パイルする 35
SofiaのGraph実装 材料を揃える > Graphを定義 State workflowというGraphを定義 State 36
SofiaのGraph実装 材料を揃える > Nodeを追加 State Node名を指定してNodeを追加 decide_datasource retrieve grade_documents transform_query
generate Node名 Nodeの関数 37
SofiaのGraph実装 材料を揃える > Edgeを追加 繋げるNodeを指定してEdgeを追加 decide_datasource retrieve grade_documents transform_query generate
_start_ grade_documents_ or_generate 初めのEdgeでは STARTと書く 出力がneed to…ならgrade_documentsへ 出力がcan gene…ならgenerateへ 38
SofiaのGraph実装 材料を揃える > Edgeを追加 繋げるNodeを指定してEdgeを追加 decide_datasource retrieve grade_documents transform_query generate
_start_ _end_ grade_documents_ or_generate decide_to_generate grade_generation_v_documents_and_question 出力がtrans…ならtransform_queryへ 出力がgene…ならgenerateへ 最後のNodeでは Endと書く 39
SofiaのGraph実装 構築確認 compileしてreturnしたらGraph完成! decide_datasource retrieve grade_documents transform_query generate _start_ _end_
grade_documents_ or_generate decide_to_generate grade_generation_v_documents_and_question 40
おまけ Graphの可視化 41
おまけ Graphの可視化 markdown形式で図を出力できる 42
社内資料検索ボット Sofia の実装 ふりかえり やること • LangGraphを用いたAIエージェントの構築 • Flaskを用いたアプリケーション全体の構築 本発表の目的
SofiaのAIエージェント構築の説明を通して LangGraphを使ったAIエージェントの構築の仕方をわかりやすくまとめる 43
ご清聴ありがとうございました