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を用いた社内資料検索ボットの実装②Retriever構築編
Search
熊懐葵
December 28, 2024
Technology
0
100
LangGraphとFlaskを用いた社内資料検索ボットの実装②Retriever構築編
機械学習の社会実装勉強会 第42回 (
https://machine-learning-workshop.connpass.com/event/341138/
) の発表資料です。
熊懐葵
December 28, 2024
Tweet
Share
More Decks by 熊懐葵
See All by 熊懐葵
LangGraphとFlaskを用いた社内資料検索ボットの実装①AIエージェント構築編
aoikumadaki
0
160
StreamlitとLangChainを使った表画像OCRアプリの実装
aoikumadaki
3
310
LangChainでデータ分析エージェントを作ってみる
aoikumadaki
0
170
AWS LambdaとLangSmithを使った社内レポート添削システムMinervaの実装
aoikumadaki
0
140
Other Decks in Technology
See All in Technology
Accessibility Inspectorを活用した アプリのアクセシビリティ向上方法
hinakko
0
140
JAWS-UG20250116_iOSアプリエンジニアがAWSreInventに行ってきた(真面目編)
totokit4
0
110
20250116_JAWS_Osaka
takuyay0ne
2
160
知っててうれしい SQL について
greendrop
0
110
Alignment and Autonomy in Cybozu - 300人の開発組織でアラインメントと自律性を両立させるアジャイルな組織運営 / RSGT2025
ama_ch
1
2.1k
カップ麺の待ち時間(3分)でわかるPartyRockアップデート
ryutakondo
0
100
I could be Wrong!! - Learning from Agile Experts
kawaguti
PRO
8
3k
KMP with Crashlytics
sansantech
PRO
0
130
20241228 - 成為最強魔法使!AI 實時生成比賽的策略 @ 2024 SD AI 年會
dpys
0
340
知っててうれしい HTTP Cookie を使ったセッション管理について
greendrop
1
120
エンジニアリングマネージャー視点での、自律的なスケーリングを実現するFASTという選択肢 / RSGT2025
yoshikiiida
4
3.3k
プロダクトの寿命を延ばすためにエンジニアが考えるべきこと 〜バージョンアップってなんのためにやるのか〜 / Strategies for product longevity
kaonavi
0
100
Featured
See All Featured
Building an army of robots
kneath
302
44k
GraphQLの誤解/rethinking-graphql
sonatard
68
10k
Designing on Purpose - Digital PM Summit 2013
jponch
116
7.1k
Docker and Python
trallard
43
3.2k
VelocityConf: Rendering Performance Case Studies
addyosmani
327
24k
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
Visualization
eitanlees
146
15k
How STYLIGHT went responsive
nonsquared
96
5.3k
Six Lessons from altMBA
skipperchong
27
3.5k
The Power of CSS Pseudo Elements
geoffreycrofte
74
5.4k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.3k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.7k
Transcript
LangGraphとFlaskを用いた 社内資料検索ボットの実装 ②Retriever構築編 2024/12/28 機械学習の社会実装勉強会 第42回 熊懐 葵
目次 • 背景とモチベーション(おさらい) • 社内資料検索ボット Sofiaとは(おさらい) • retrieverについて • 検索手法について
• retrieverの実装 • データベースの用意 • confluence_retrieverの実装 • jira_retrieverの実装 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
Node Edge State Graph SofiaのGraph 実装のイメージ(前回) __start__ decide_datasource 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] 6 retrieve
SofiaのGraph 実装(前回) 7 今回説明する retriever(外部から情報を取得する機能: RAG)の作り方は前回割愛していた
社内資料検索ボット Sofia の実装 やること • LangGraphを用いたAIエージェントの構築 • State, Node, Edgeの準備~Graphの構築
• retrieverの構築 • Flaskを用いたアプリケーション全体の構築 8
retrieverとは 9 データベースからqueryの関連情報を検索し、 取得する confluence_retriever Confluenceから • CQLクエリ検索(キーワード検索) • ベクトル検索
で資料を取得する jira_retriever Jiraから • JQLクエリ検索(複数条件検索) で資料を取得する データベース retriever query このquery(キーワード・質問内容) と一致する(関連する)データは…
検索手法について > クエリ検索とは 10 CQLクエリの例(→キーワード検索) JQLクエリの例(→複数条件検索) GCP コマンドベースで資料の条件検索をすること
検索手法について > ベクトル検索とは 11 1. テキストデータを、機械学習モデルを使ってベクトルデータ(数値 データ)に変換する 2. queryをベクトルデータに変換し、類似度の高い資料を取得する ベクトルデータベース
あ 資料 あ query(質問) 似ている 無関係 似ていない ちょっっと 似ている
Sofiaにおけるクエリ検索とベクトル検索の違い 12 Jira Confluence ソフトにアクセスして直接情報を取得 クエリ検索 ベクトル検索 事前に作ったConfluenceの ベクトルDBから情報を取得 外部の最新状態から取得するか、少し前の状態から取得するか
13 キーワード検索 メリット • 最新状態から資料を取得できる デメリット • キーワードがズレていると引っか からない •
キーワードが同じでも内容が合っ てない資料が引っかかる ベクトル検索 メリット • キーワードが多少ずれていても取 得できる • ベクトルDBに入れる資料を絞るこ とで、検索結果の質を上げられる デメリット • 最新状態から取得できない(定期的 に更新作業が必要) キーワード検索とベクトル検索のメリット・デメリット confluence_retriever • CQLクエリ検索(キーワード検索) • ベクトル検索
retrieverの実装工程 14 ベクトルDB ラベル付与 資料ID取得 DB用意 DBに資料埋込 confluence_retr iever キーワード生成
クエリ検索 ベクトル検索 検索結果を合わ せる jira_retriever Jira情報取得 クエリ生成 クエリ検索 データ形式調整
retrieverの実装 > ベクトルDB > ラベル付与 15 事前に、ベクトルDBに入れたい資料にラベルをつけておく 作業メモなどは避けつつ、手順資料 などの優良資料にsofiaラベルをつける
retrieverの実装 > ベクトルDB > 資料ID取得 16 create_db.py①: ラベルIDを使って、ラベルのついた資料のIDを取得する • ConfluenceのURL(エンドポイント用)
• ユーザーのメールアドレス(認証用) • APIトークン(認証用) sofiaラベルがついた資料情報を取得 レスポンスからSofiaラベルがついた 資料のIDを取得
retrieverの実装 > ベクトルDB > 資料ID取得 17 (ちなみに検索バーからURLを検索すると…) 資料1つ目 資料2つ目 IDだけをまとめて取得する
ラベルを付けた資料のIDをまとめて取得できた
retrieverの実装 > ベクトルDB > DB用意 18 create_db.py②: ベクトルDBを用意する embeddingする機械学習モ デルを指定
ChromaというDBのテンプレートを使って ベクトルDBの箱をつくる DBを置く場所
retrieverの実装 > ベクトルDB > DBに資料埋込 19 create_db.py④: ベクトルDBに資料を埋め込む(embedding) ベクトルDBの作成 完了
create_db.py③: 取得したIDで資料をロードするConfluenceLoaderを用意する 資料を一つずつロード・embedding
ベクトルDB ラベル付与 資料ID取得 DB用意 DBに資料埋込 confluence_retr iever キーワード生成 クエリ検索 ベクトル検索
検索結果を合わ せる jira_retriever Jira情報取得 クエリ生成 クエリ検索 データ形式調整 retrieverの実装工程 20
※main.py retrieverの実装 > confluence_retrieverの定義 21 confluence.py⓪: confluence_retrieverをBaseRetrieverを使ったクラスで定義 _get_relevant_documents 下に処理を書くと… 使う時.invokeで動かせる
confluence_retriever 質問 質問
retrieverの実装 > confluence_ret… > キーワード生成 22 confluence.py①: chainで質問からキーワードを生成する {質問}からCQLを使って資料検索する ためのキーワードを生成してもらう
出力制御
retrieverの実装 > confluence_ret… > クエリ検索 23 confluence.py②: キーワードからCQLクエリを作り、資料検索する siteSearch ~
`生成されたキーワード” Confluence Cloud Run クエリ検索
retrieverの実装 > confluence_ret… > ベクトル検索 24 confluence.py③: retrieverを使ってベクトル検索する(retrieverは外部から) ベクトル検索 Cloud
Run ※retrieverはmain.pyから ※main.py
retrieverの実装 > confluence_ret… > ベクトル検索 25 ※外部でどのように準備しているのか Confluence Cloud Run
事前に作っているベクトルDBを指定 ※main.py ベクトル検索するretriever: VectorStore +.as_retriever()
retrieverの実装 > confluence_ret… > 結果を合わせる 26 confluence.py④: 資料の検索結果を合わせる 重複しないように合わせる confluence_retrieverの作成
完了
ベクトルDB ラベル付与 資料ID取得 DB用意 DBに資料埋込 confluence_retr iever キーワード生成 クエリ検索 ベクトル検索
検索結果を合わ せる jira_retriever Jira情報取得 クエリ生成 クエリ検索 データ形式調整 retrieverの実装工程 27
retrieverの実装 > jira_retriever > Jira情報取得 28 jira.py①: jira情報を取得する Jiraインスタンスを使って、 •
プロジェクト名 • ユーザー名 を取得している (+ ステータス名)
retrieverの実装 > jira_retriever > Jira情報取得 29 Jira情報は、LLMがJQLクエリを生成する際のプロンプトに使う Jiraのタスク情報検索画面 LLMにプロジェクト名(DO)やステータス情報(In Progress)を
与えることで、柔軟にクエリ生成できる キーワード以外でも絞る 生成例
retrieverの実装 > jira_retriever > クエリ生成 30 jira.py②: JQLクエリを生成するchainを作る(→invoke) プロンプト •
“質問からJQLを生成してください” • 質問テキスト • 取得したJira情報 • 質問とそこから変換したJQLの具体例 chain
retrieverの実装 > jira_retriever > クエリ検索 31 jira.py③: Jiraインスタンス+.jqlでクエリ検索する _get_relevant_documents 下に処理を書くと…
jira_retriever 使う時.invokeで動かせる 生成した JQLクエリ 生成した JQLクエリ
retrieverの実装 > jira_retriever > データ形式調整 32 jira.py④: LangChainのDocument形式に揃える ※LangChainのLoader, Chromaを使って取得したconfluence_retrieverの資料は
すでにDocument形式 page_content + metadata
ベクトルDB ラベル付与 資料ID取得 DB用意 DBに資料埋込 confluence_retr iever キーワード生成 クエリ検索 ベクトル検索
検索結果を合わ せる jira_retriever Jira情報取得 クエリ生成 クエリ検索 データ形式調整 retrieverの実装工程 33
Node Edge State Graph retrieverの構築完了 __start__ decide_datasource 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] 34 retrieve 質問を元に Confluence or jira から関連資料を retrieveする
ご清聴ありがとうございました
retrieverの実装 > ベクトルDB > DBに資料埋込(おまけ) 36 create_db.py④: ベクトルDBに資料を入れる(embedding) 問題点: DBの更新
• Confluenceでは、日々新しい資料が追加・更新されている • 良い回答を生成するためにも、DBを最新状態に保ちたい… 新規資料/更新資料のみembeddingするようにしている(→update_db.py) 新規資料(新しくsofiaラベルが付与された資料) 更新資料(資改変された資料)
retrieverの実装 > jira_retriever > クエリ検索(おまけ) 37 なぜJQLクエリはJiraRetrieverの外で作るのか? 生成した JQLクエリ 質問
confluence_retriever jira_retriever この下でCQLクエリを作っている 外部でJQLクエリを作ってきている
retrieverの実装 > jira_retriever > クエリ検索(おまけ) 38 JQLクエリをretrieve以外の用途でも使うため 回答 retrieveされたチケットのURL ※前回のGraphにNodeを追加している
質問から • JQLクエリ • Jiraリンク を作る confluenceの時はskip
retrieverの実装 > jira_retriever > クエリ検索(おまけ) 39 Jiraリンクを踏むと、Jira上での検索結果にとべる 検索結果 ※社内ユーザーとしてはあると便利な機能