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
180
LangGraphとFlaskを用いた社内資料検索ボットの実装②Retriever構築編
機械学習の社会実装勉強会 第42回 (
https://machine-learning-workshop.connpass.com/event/341138/
) の発表資料です。
熊懐葵
December 28, 2024
Tweet
Share
More Decks by 熊懐葵
See All by 熊懐葵
n8nで定期成果報告の資料づくりを自動化する
aoikumadaki
0
110
LangGraphとFlaskを用いた社内資料検索ボットの実装④GithubRetriever構築編
aoikumadaki
0
67
LangGraphとFlaskを用いた社内資料検索ボットの実装③アプリケーション構築編
aoikumadaki
0
97
LangGraphとFlaskを用いた社内資料検索ボットの実装①AIエージェント構築編
aoikumadaki
0
310
StreamlitとLangChainを使った表画像OCRアプリの実装
aoikumadaki
3
660
LangChainでデータ分析エージェントを作ってみる
aoikumadaki
0
250
AWS LambdaとLangSmithを使った社内レポート添削システムMinervaの実装
aoikumadaki
0
280
Other Decks in Technology
See All in Technology
fukabori.fm 出張版: 売上高617億円と高稼働率を陰で支えた社内ツール開発のあれこれ話 / 20250704 Yoshimasa Iwase & Tomoo Morikawa
shift_evolve
PRO
2
6.8k
Zephyr RTOSを使った開発コンペに参加した件
iotengineer22
1
200
使いたいMCPサーバーはWeb APIをラップして自分で作る #QiitaBash
bengo4com
0
1.6k
マネジメントって難しい、けどおもしろい / Management is tough, but fun! #em_findy
ar_tama
7
910
AI導入の理想と現実~コストと浸透〜
oprstchn
0
190
タイミーのデータモデリング事例と今後のチャレンジ
ttccddtoki
6
2.3k
生まれ変わった AWS Security Hub (Preview) を紹介 #reInforce_osaka / reInforce New Security Hub
masahirokawahara
0
440
開発生産性を測る前にやるべきこと - 組織改善の実践 / Before Measuring Dev Productivity
kaonavi
6
1.5k
面倒な作業はAIにおまかせ。Flutter開発をスマートに効率化
ruideengineer
0
210
Delta airlines®️ USA Contact Numbers: Complete 2025 Support Guide
airtravelguide
0
340
生成AI時代 文字コードを学ぶ意義を見出せるか?
hrsued
1
810
「クラウドコスト絶対削減」を支える技術—FinOpsを超えた徹底的なクラウドコスト削減の実践論
delta_tech
4
140
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
22k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.9k
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
RailsConf 2023
tenderlove
30
1.1k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Raft: Consensus for Rubyists
vanstee
140
7k
The Language of Interfaces
destraynor
158
25k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Speed Design
sergeychernyshev
32
1k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
2.9k
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上での検索結果にとべる 検索結果 ※社内ユーザーとしてはあると便利な機能