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
140
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を用いた社内資料検索ボットの実装③アプリケーション構築編
aoikumadaki
0
53
LangGraphとFlaskを用いた社内資料検索ボットの実装①AIエージェント構築編
aoikumadaki
0
200
StreamlitとLangChainを使った表画像OCRアプリの実装
aoikumadaki
3
440
LangChainでデータ分析エージェントを作ってみる
aoikumadaki
0
190
AWS LambdaとLangSmithを使った社内レポート添削システムMinervaの実装
aoikumadaki
0
180
Other Decks in Technology
See All in Technology
The Future of SEO: The Impact of AI on Search
badams
0
240
EDRの検知の仕組みと検知回避について
chayakonanaika
4
1.3k
JEDAI Meetup! Databricks AI/BI概要
databricksjapan
0
280
Raycast AI APIを使ってちょっと便利な拡張機能を作ってみた / created-a-handy-extension-using-the-raycast-ai-api
kawamataryo
0
150
2024.02.19 W&B AIエージェントLT会 / AIエージェントが業務を代行するための計画と実行 / Algomatic 宮脇
smiyawaki0820
15
4.1k
表現を育てる
kiyou77
1
230
Perlの生きのこり - エンジニアがこの先生きのこるためのカンファレンス2025
kfly8
1
220
Iceberg Meetup Japan #1 : Iceberg and Databricks
databricksjapan
0
190
RSNA2024振り返り
nanachi
0
630
依存パッケージの更新はコツコツが勝つコツ! / phpcon_nagoya2025
blue_goheimochi
3
180
クラウドサービス事業者におけるOSS
tagomoris
3
950
エンジニアのためのドキュメント力基礎講座〜構造化思考から始めよう〜(2025/02/15jbug広島#15発表資料)
yasuoyasuo
18
7.1k
Featured
See All Featured
It's Worth the Effort
3n
184
28k
Statistics for Hackers
jakevdp
797
220k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
StorybookのUI Testing Handbookを読んだ
zakiyama
28
5.5k
Making Projects Easy
brettharned
116
6k
The Language of Interfaces
destraynor
156
24k
How STYLIGHT went responsive
nonsquared
98
5.4k
Speed Design
sergeychernyshev
27
800
Done Done
chrislema
182
16k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
1k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
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上での検索結果にとべる 検索結果 ※社内ユーザーとしてはあると便利な機能