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
150
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
71
LangGraphとFlaskを用いた社内資料検索ボットの実装①AIエージェント構築編
aoikumadaki
0
210
StreamlitとLangChainを使った表画像OCRアプリの実装
aoikumadaki
3
470
LangChainでデータ分析エージェントを作ってみる
aoikumadaki
0
200
AWS LambdaとLangSmithを使った社内レポート添削システムMinervaの実装
aoikumadaki
0
200
Other Decks in Technology
See All in Technology
自分のやることに価値を見出だせるようになり、挑戦する勇気をもらったベイトソンの考え / Scrum Fest Fukuoka 2025
bonbon0605
0
160
アジリティを高めるテストマネジメント #QiitaQualityForward
makky_tyuyan
1
520
サイト信頼性エンジニアリングとAmazon Web Services / SRE and AWS
ymotongpoo
7
1.9k
OSSの実装を参考にBedrockエージェントを作る
moritalous
2
130
AIエージェント入門
minorun365
PRO
35
20k
AI-Driven-Development-20250310
yuhattor
3
290
[OpsJAWS Meetup33 AIOps] Amazon Bedrockガードレールで守る安全なAI運用
akiratameto
1
140
開発者体験を定量的に把握する手法と活用事例
ham0215
0
150
役員・マネージャー・著者・エンジニアそれぞれの立場から見たAWS認定資格
nrinetcom
PRO
5
6.9k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
32
23k
結果的にこうなった。から見える メカニズムのようなもの。
recruitengineers
PRO
1
120
エンジニアの健康管理術 / Engineer Health Management Techniques
y_sone
8
5.8k
Featured
See All Featured
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
Designing for Performance
lara
605
68k
Building an army of robots
kneath
303
45k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7.1k
Rebuilding a faster, lazier Slack
samanthasiow
80
8.9k
Stop Working from a Prison Cell
hatefulcrawdad
268
20k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
The Cult of Friendly URLs
andyhume
78
6.2k
A better future with KSS
kneath
238
17k
Why You Should Never Use an ORM
jnunemaker
PRO
55
9.2k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
4
390
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上での検索結果にとべる 検索結果 ※社内ユーザーとしてはあると便利な機能