Slide 1

Slide 1 text

LangGraphとFlaskを用いた 社内資料検索ボットの実装 ②Retriever構築編 2024/12/28 機械学習の社会実装勉強会 第42回 熊懐 葵

Slide 2

Slide 2 text

目次 • 背景とモチベーション(おさらい) • 社内資料検索ボット Sofiaとは(おさらい) • retrieverについて • 検索手法について • retrieverの実装 • データベースの用意 • confluence_retrieverの実装 • jira_retrieverの実装 1

Slide 3

Slide 3 text

プロジェクト・業務データ 背景とモチベーション 社内では、複数のソフトを連携させてプロジェクトを推進している Slack Jira Confluence Github 連携・通知 タスク管理 業務資料 開発 業務ノウハウを活かして業務効率化をしたい 2

Slide 4

Slide 4 text

社内資料検索ボット Sofia Sofia…Slack上で質問すると、JiraやConfluenceの情報を元に回答してくれる チャットボット Slack @Sofia <質問> 回答 + 参考URL 3

Slide 5

Slide 5 text

社内資料検索ボット Sofia Sofia…Slack上で質問すると、JiraやConfluenceの情報を元に回答してくれる チャットボット Confluence 社内情報にすぐ アクセスできる 4

Slide 6

Slide 6 text

社内資料検索ボット Sofia Slack App Jira Confluence Cloud Run LangGraphで AIエージェントを構築 5

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

SofiaのGraph 実装(前回) 7 今回説明する retriever(外部から情報を取得する機能: RAG)の作り方は前回割愛していた

Slide 9

Slide 9 text

社内資料検索ボット Sofia の実装 やること • LangGraphを用いたAIエージェントの構築 • State, Node, Edgeの準備~Graphの構築 • retrieverの構築 • Flaskを用いたアプリケーション全体の構築 8

Slide 10

Slide 10 text

retrieverとは 9 データベースからqueryの関連情報を検索し、 取得する confluence_retriever Confluenceから • CQLクエリ検索(キーワード検索) • ベクトル検索 で資料を取得する jira_retriever Jiraから • JQLクエリ検索(複数条件検索) で資料を取得する データベース retriever query このquery(キーワード・質問内容) と一致する(関連する)データは…

Slide 11

Slide 11 text

検索手法について > クエリ検索とは 10 CQLクエリの例(→キーワード検索) JQLクエリの例(→複数条件検索) GCP コマンドベースで資料の条件検索をすること

Slide 12

Slide 12 text

検索手法について > ベクトル検索とは 11 1. テキストデータを、機械学習モデルを使ってベクトルデータ(数値 データ)に変換する 2. queryをベクトルデータに変換し、類似度の高い資料を取得する ベクトルデータベース あ 資料 あ query(質問) 似ている 無関係 似ていない ちょっっと 似ている

Slide 13

Slide 13 text

Sofiaにおけるクエリ検索とベクトル検索の違い 12 Jira Confluence ソフトにアクセスして直接情報を取得 クエリ検索 ベクトル検索 事前に作ったConfluenceの ベクトルDBから情報を取得 外部の最新状態から取得するか、少し前の状態から取得するか

Slide 14

Slide 14 text

13 キーワード検索 メリット • 最新状態から資料を取得できる デメリット • キーワードがズレていると引っか からない • キーワードが同じでも内容が合っ てない資料が引っかかる ベクトル検索 メリット • キーワードが多少ずれていても取 得できる • ベクトルDBに入れる資料を絞るこ とで、検索結果の質を上げられる デメリット • 最新状態から取得できない(定期的 に更新作業が必要) キーワード検索とベクトル検索のメリット・デメリット confluence_retriever • CQLクエリ検索(キーワード検索) • ベクトル検索

Slide 15

Slide 15 text

retrieverの実装工程 14 ベクトルDB ラベル付与 資料ID取得 DB用意 DBに資料埋込 confluence_retr iever キーワード生成 クエリ検索 ベクトル検索 検索結果を合わ せる jira_retriever Jira情報取得 クエリ生成 クエリ検索 データ形式調整

Slide 16

Slide 16 text

retrieverの実装 > ベクトルDB > ラベル付与 15 事前に、ベクトルDBに入れたい資料にラベルをつけておく 作業メモなどは避けつつ、手順資料 などの優良資料にsofiaラベルをつける

Slide 17

Slide 17 text

retrieverの実装 > ベクトルDB > 資料ID取得 16 create_db.py①: ラベルIDを使って、ラベルのついた資料のIDを取得する • ConfluenceのURL(エンドポイント用) • ユーザーのメールアドレス(認証用) • APIトークン(認証用) sofiaラベルがついた資料情報を取得 レスポンスからSofiaラベルがついた 資料のIDを取得

Slide 18

Slide 18 text

retrieverの実装 > ベクトルDB > 資料ID取得 17 (ちなみに検索バーからURLを検索すると…) 資料1つ目 資料2つ目 IDだけをまとめて取得する ラベルを付けた資料のIDをまとめて取得できた

Slide 19

Slide 19 text

retrieverの実装 > ベクトルDB > DB用意 18 create_db.py②: ベクトルDBを用意する embeddingする機械学習モ デルを指定 ChromaというDBのテンプレートを使って ベクトルDBの箱をつくる DBを置く場所

Slide 20

Slide 20 text

retrieverの実装 > ベクトルDB > DBに資料埋込 19 create_db.py④: ベクトルDBに資料を埋め込む(embedding) ベクトルDBの作成 完了 create_db.py③: 取得したIDで資料をロードするConfluenceLoaderを用意する 資料を一つずつロード・embedding

Slide 21

Slide 21 text

ベクトルDB ラベル付与 資料ID取得 DB用意 DBに資料埋込 confluence_retr iever キーワード生成 クエリ検索 ベクトル検索 検索結果を合わ せる jira_retriever Jira情報取得 クエリ生成 クエリ検索 データ形式調整 retrieverの実装工程 20

Slide 22

Slide 22 text

※main.py retrieverの実装 > confluence_retrieverの定義 21 confluence.py⓪: confluence_retrieverをBaseRetrieverを使ったクラスで定義 _get_relevant_documents 下に処理を書くと… 使う時.invokeで動かせる confluence_retriever 質問 質問

Slide 23

Slide 23 text

retrieverの実装 > confluence_ret… > キーワード生成 22 confluence.py①: chainで質問からキーワードを生成する {質問}からCQLを使って資料検索する ためのキーワードを生成してもらう 出力制御

Slide 24

Slide 24 text

retrieverの実装 > confluence_ret… > クエリ検索 23 confluence.py②: キーワードからCQLクエリを作り、資料検索する siteSearch ~ `生成されたキーワード” Confluence Cloud Run クエリ検索

Slide 25

Slide 25 text

retrieverの実装 > confluence_ret… > ベクトル検索 24 confluence.py③: retrieverを使ってベクトル検索する(retrieverは外部から) ベクトル検索 Cloud Run ※retrieverはmain.pyから ※main.py

Slide 26

Slide 26 text

retrieverの実装 > confluence_ret… > ベクトル検索 25 ※外部でどのように準備しているのか Confluence Cloud Run 事前に作っているベクトルDBを指定 ※main.py ベクトル検索するretriever: VectorStore +.as_retriever()

Slide 27

Slide 27 text

retrieverの実装 > confluence_ret… > 結果を合わせる 26 confluence.py④: 資料の検索結果を合わせる 重複しないように合わせる confluence_retrieverの作成 完了

Slide 28

Slide 28 text

ベクトルDB ラベル付与 資料ID取得 DB用意 DBに資料埋込 confluence_retr iever キーワード生成 クエリ検索 ベクトル検索 検索結果を合わ せる jira_retriever Jira情報取得 クエリ生成 クエリ検索 データ形式調整 retrieverの実装工程 27

Slide 29

Slide 29 text

retrieverの実装 > jira_retriever > Jira情報取得 28 jira.py①: jira情報を取得する Jiraインスタンスを使って、 • プロジェクト名 • ユーザー名 を取得している (+ ステータス名)

Slide 30

Slide 30 text

retrieverの実装 > jira_retriever > Jira情報取得 29 Jira情報は、LLMがJQLクエリを生成する際のプロンプトに使う Jiraのタスク情報検索画面 LLMにプロジェクト名(DO)やステータス情報(In Progress)を 与えることで、柔軟にクエリ生成できる キーワード以外でも絞る 生成例

Slide 31

Slide 31 text

retrieverの実装 > jira_retriever > クエリ生成 30 jira.py②: JQLクエリを生成するchainを作る(→invoke) プロンプト • “質問からJQLを生成してください” • 質問テキスト • 取得したJira情報 • 質問とそこから変換したJQLの具体例 chain

Slide 32

Slide 32 text

retrieverの実装 > jira_retriever > クエリ検索 31 jira.py③: Jiraインスタンス+.jqlでクエリ検索する _get_relevant_documents 下に処理を書くと… jira_retriever 使う時.invokeで動かせる 生成した JQLクエリ 生成した JQLクエリ

Slide 33

Slide 33 text

retrieverの実装 > jira_retriever > データ形式調整 32 jira.py④: LangChainのDocument形式に揃える ※LangChainのLoader, Chromaを使って取得したconfluence_retrieverの資料は すでにDocument形式 page_content + metadata

Slide 34

Slide 34 text

ベクトルDB ラベル付与 資料ID取得 DB用意 DBに資料埋込 confluence_retr iever キーワード生成 クエリ検索 ベクトル検索 検索結果を合わ せる jira_retriever Jira情報取得 クエリ生成 クエリ検索 データ形式調整 retrieverの実装工程 33

Slide 35

Slide 35 text

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する

Slide 36

Slide 36 text

ご清聴ありがとうございました

Slide 37

Slide 37 text

retrieverの実装 > ベクトルDB > DBに資料埋込(おまけ) 36 create_db.py④: ベクトルDBに資料を入れる(embedding) 問題点: DBの更新 • Confluenceでは、日々新しい資料が追加・更新されている • 良い回答を生成するためにも、DBを最新状態に保ちたい… 新規資料/更新資料のみembeddingするようにしている(→update_db.py) 新規資料(新しくsofiaラベルが付与された資料) 更新資料(資改変された資料)

Slide 38

Slide 38 text

retrieverの実装 > jira_retriever > クエリ検索(おまけ) 37 なぜJQLクエリはJiraRetrieverの外で作るのか? 生成した JQLクエリ 質問 confluence_retriever jira_retriever この下でCQLクエリを作っている 外部でJQLクエリを作ってきている

Slide 39

Slide 39 text

retrieverの実装 > jira_retriever > クエリ検索(おまけ) 38 JQLクエリをretrieve以外の用途でも使うため 回答 retrieveされたチケットのURL ※前回のGraphにNodeを追加している 質問から • JQLクエリ • Jiraリンク を作る confluenceの時はskip

Slide 40

Slide 40 text

retrieverの実装 > jira_retriever > クエリ検索(おまけ) 39 Jiraリンクを踏むと、Jira上での検索結果にとべる 検索結果 ※社内ユーザーとしてはあると便利な機能