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を用いた社内資料検索ボットの実装①AIエージェント構築編
Search
熊懐葵
November 30, 2024
Technology
0
260
LangGraphとFlaskを用いた社内資料検索ボットの実装①AIエージェント構築編
機械学習の社会実装勉強会 第41回 (
https://machine-learning-workshop.connpass.com/event/336915/
) の発表資料です。
熊懐葵
November 30, 2024
Tweet
Share
More Decks by 熊懐葵
See All by 熊懐葵
LangGraphとFlaskを用いた社内資料検索ボットの実装④GithubRetriever構築編
aoikumadaki
0
50
LangGraphとFlaskを用いた社内資料検索ボットの実装③アプリケーション構築編
aoikumadaki
0
84
LangGraphとFlaskを用いた社内資料検索ボットの実装②Retriever構築編
aoikumadaki
0
160
StreamlitとLangChainを使った表画像OCRアプリの実装
aoikumadaki
3
550
LangChainでデータ分析エージェントを作ってみる
aoikumadaki
0
230
AWS LambdaとLangSmithを使った社内レポート添削システムMinervaの実装
aoikumadaki
0
240
Other Decks in Technology
See All in Technology
AIコーディングの最前線 〜活用のコツと課題〜
pharma_x_tech
4
2.9k
今日からはじめるプラットフォームエンジニアリング
jacopen
8
1.9k
ここはMCPの夜明けまえ
nwiizo
32
13k
品質文化を支える小さいクロスファンクショナルなチーム / Cross-functional teams fostering quality culture
toma_sm
0
180
Dynamic Reteaming And Self Organization
miholovesq
3
740
コスト最適重視でAurora PostgreSQLのログ分析基盤を作ってみた #jawsug_tokyo
non97
1
850
PostgreSQL Log File Mastery: Optimizing Database Performance Through Advanced Log Analysis
shiviyer007
PRO
1
150
持続可能なドキュメント運用のリアル: 1年間の成果とこれから
akitok_
1
270
バクラクの認証基盤の成長と現在地 / bakuraku-authn-platform
convto
4
880
10分で学ぶ、RAGの仕組みと実践
supermarimobros
0
740
LINE 購物幕後推手
line_developers_tw
PRO
0
330
Azure Maps Visual in PowerBIで分析しよう
nakasho
0
190
Featured
See All Featured
Embracing the Ebb and Flow
colly
85
4.7k
Build The Right Thing And Hit Your Dates
maggiecrowley
35
2.7k
Optimising Largest Contentful Paint
csswizardry
37
3.2k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.7k
GraphQLとの向き合い方2022年版
quramy
46
14k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.8k
VelocityConf: Rendering Performance Case Studies
addyosmani
329
24k
A designer walks into a library…
pauljervisheath
205
24k
Done Done
chrislema
184
16k
Automating Front-end Workflow
addyosmani
1370
200k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Statistics for Hackers
jakevdp
798
220k
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
ご清聴ありがとうございました