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
社内情報検索システムで用いられるRAGの4つの実装方法
Search
Matsumoto Kazutaka
October 12, 2023
14
8.8k
社内情報検索システムで用いられるRAGの4つの実装方法
Matsumoto Kazutaka
October 12, 2023
Tweet
Share
More Decks by Matsumoto Kazutaka
See All by Matsumoto Kazutaka
GPTsより精度の高いRAGシステムの構築
mkazutaka
25
12k
LLMと連携したブログ書くエディタを作ってみた
mkazutaka
2
350
ChatGPTを使ったSlackbotの実装いろいろ紹介
mkazutaka
2
2.6k
Development of Mercari's web in 2019
mkazutaka
0
1k
20181215 php-srcで遊ぶよ
mkazutaka
2
1.1k
メルカリ Backendエンジニアの日常 ~Backend Engineer Drink Meetup #1~
mkazutaka
0
2k
Featured
See All Featured
Writing Fast Ruby
sferik
628
61k
A better future with KSS
kneath
238
17k
4 Signs Your Business is Dying
shpigford
181
21k
Site-Speed That Sticks
csswizardry
2
190
The Language of Interfaces
destraynor
154
24k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
0
97
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.5k
KATA
mclloyd
29
14k
Making Projects Easy
brettharned
116
5.9k
Optimising Largest Contentful Paint
csswizardry
33
3k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.9k
Transcript
1 社内情報検索システムで用いられる RAGの4つの実装方法 LLM Application Meetup vol.4 松本和高
2 松本 和高 株式会社エクスプラザ リードエンジニア X: _mkazutaka Github: mkazutaka 18年にバックエンドエンジニアとしてメルカリに入社。その後、ミラ
ティブ、フリーランスを得て株式会社エクスプラザに所属。フロント エンドからバックエンドまで幅広く開発しています。趣味で、FXの自 動売買Botを作成している 現在08/30に第一子が生まれ現在育休中 https://note.com/mkazutaka/n/n9f0e2c4dee96
CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy
3 株式会社エクスプラザ (EXPLAZA, Inc.) 会社名 プロダクトの力で、豊かな暮らしをつくる ミッション 代表取締役CEO 高橋一生 代表者 2020年07月03日 設立 東京都港区六本木4丁目8-5 和幸ビル 所在地 会社概要
None
5 noteで技術発信を実施 LLM関連の技術記事を noteで発信 https://note.com/explaza_inc/ CONFIDENTIAL INFORMATION: Not for Public
Distribution - Do Not Copy
6 本日の内容 • RAG(Retrieval-augmented Generation)について ◦ LLMを使って社内のドキュメントの情報を返す際に利用される •
手法を実装して、結果を見る
7 LLMには欠点がある • もっともらしいウソの出力を出すことがある(ハルシエーション) • 最新のデータを持たない 図. 2023/10/12にGPT3.5に対して質問した結果 正しくは359657627190
8 LLMに知識を補完するには • 知識を与えてあげるとLLMは正しい回答をしてくれる場合もある ◦ プロンプトのテクニック 知識を与える 正しい回答をする 図.
GPT3.5に知識を与えて正しい回答を得る
9 検索によってLLMに知識を補完する: RAG • RAG(Retrieval-augmented Generation: 検索により強化した文章生成)という ◦ ユーザから見えない形にすれば、LLMがあたかもその知識を知っているように
振る舞う 知識を与える 正しい回答をする 検索エンジンなどで 取得 図. 検索エンジンで情報を取得し、 GPT3.5に知識を与えて正しい回答を得る
10 RAGの基本的な実装ステップ 1. ドキュメントやウェブページを解析して、知識をDBに格納する 2. ユーザのプロンプトをもとに、DBから知識を検索し、ユーザのプロンプトを再構築 3. LLMからの結果をユーザに返す
参考: https://gpt-index.readthedocs.io/en/latest/getting_started/concepts.html
ここからは実装していく
12 環境 • 対象となるドキュメント ◦ 商工会議所が出している「中小企業・小規模事業者のための インボイス制度対策」 • 開発環境
◦ Python、LLMはChatGPT、LlamaIndexを使う 中小企業・小規模事業者のための インボイス制度対策 https://www.jcci.or.jp/chusho/202203invoice_booklet.pdf
シンプルな実装
14 シンプルな実装: 実装 1. SimpleDirectoryReaderを使ってファイルを読み込む 2. LlamaIndexにメモリベクトルDBにドキュメントを保存 3.
質問をする
インボイス制度について聞いてみる
16 シンプルな実装: インボイスについて聞いてみた結果
17 シンプルな実装: インボイスについての正しい回答のページ • 回答としてはファイルの1ページ目を参照してほしい
• ChatGPTに送った内容を見る: P.12とP.26を知識として入れている 18 シンプルな実装: インボイス制度について聞いた際に参照されたファイル
課税事業者のメリット・デメリットを聞く
20 結果: 課税事業者のメリデメについて聞いてみた結果
21 シンプルな実装: 課税事業者のメリデメについての正しい回答のページ • 回答としてはファイルの7ページ目を参照してほしい
• ChatGPTに送った内容を見る: P.7とP.8を知識として入れている 22 シンプルな実装: 課税事業者のメリデメについて参照されたファイル
• インボイス制度についての質問は正しい場所を参考にできなかった ◦ ドキュメント内に「インボイス制度」という文字は30個ある ◦ 追加で、`「インボイス制度とは」について教えてください」`で試してみたが だめだった
◦ 別の方法も試してみる • 課税事業者のメリットデメリットについては正しい場所を参考にした ◦ 表をパーサーが適当な形式に変換したが、よしなLLM側で解釈した 23 シンプルな実装の結論
Recursive Retrieverを用いた実装
• PDFファイルをページでわける(これをNodeと呼ぶ) ◦ Node郡の中から最適なNodeを選ぶ 25 ドキュメントの検索方法: シンプルな実装
• ページ単位でNodeをわけず、特定のチャンク単位で分ける ◦ 検索は、一番小さいチャンクに対して行う、LLMにあたえるものは一番 大きなチャンクを使う 26 ドキュメントの検索方法: Recursive
Retrieval (再帰的検索)
27 Recursive Retrieval(Chunk)の実装: 1/3 1. SimpleDirectoryReaderを使ってファイルを読み込む a. 今回は、Unstructuredを使う
28 Recursive Retrieval(Chunk)の実装: 2/3 1. チャンクごとに再帰的なグラフを作る
29 Recursive Retrieval(Chunk)の実装: 3/3 1. すべてのnodeをDBに保存し、質問をする a. RecursiveRetrieverが再帰的に検索してくれるため細かい実装は不要
インボイス制度について聞いてみる
31 Recursive Retriever(Chunk)の実装: インボイスについて聞いてみた結果
32 Recursive Retriever(Chunk)の実装: プロンプトの中身の一部 • 1ページ目の一部を参照している
課税事業者のメリット・デメリットを聞く
34 Recursive Retriever(Chunk)の実装: 結果
35 Recursive Retriever(Chunk)の実装: プロンプトの中身の一部 • 7ページ目の一部を参照している
• インボイス制度についての質問は正しい場所を参考にした ◦ チャンク数が固定なので、たまたまうまく行った可能性もある • 課税事業者のメリットデメリットについては正しい場所を参考にした
36 Recursive Retriever(Chunk)を用いた実装の結論
Recursive Retriever(Summary)を用いた実装
• 特定のチャンク単位で分けていたのを要約を用いる ◦ 今回はページ単位で要約する 38 Recursive Retrieval (Summary)
39 Recursive Retrieval(Summary)の実装: 1/4 1. SimpleDirectoryReaderを使ってファイルを読み込む a. 今回はページごとに読む込みたいのでSimpleDirectoryReaderをそのまま使用
40 Recursive Retrieval(Summary)の実装: 2/4 1. デフォルトのプロンプトだと英語で要約文ができる a. 日本語で検索を行うと結果がでなくなるのでプロンプトを英語に修正する
41 Recursive Retrieval(Summary)の実装: 3/4 1. ページごとにドキュメントを生成する
42 Recursive Retrieval(Summary)の実装: 4/4 1. 質問する
インボイス制度について聞いてみる
44 Recursive Retriever(Summary)の実装:インボイスについて聞いてみた結果 • シンプルな実装でみたのとほぼ同じ
課税事業者のメリット・デメリットを聞く
• シンプルな実装でみたのとほぼ同じ 46 Recursive Retriever(Summary)の実装:インボイスについて聞いてみた結果
• 今回のケースだとシンプルな実装の結果と同じになった ◦ (実装みすったかもしれない) • ページごとに要約していくので、コストが掛かる ◦
使い所はすこしむずかしい 47 Recursive Retriever(Summary)を用いた実装の結論
Agentを用いた実装 (おまけ)
49 LlamaIndexにAgentが10/2ぐらいに登場 • Agentとは ◦ 要求を「どのような手段を使ってどういう順番で解決するか」を LLMを使って自動的に決定してくれるような機能
• LlamaIndexの作者いわく、Agentでできること ◦ 単一文書に対する事実に基づいたQA ◦ 単一ドキュメントの要約 ◦ 複数のドキュメントに対する事実に基づく比較 ◦ 複数のドキュメントにわたる全体的な比較
50 LhamaIndexのAgentのアーキテクチャ • ドキュメントごとにAgentを作成 ◦ さらにそれを管理するAgentがいる
51 Agentの実装 • 割りと長くなっちゃので省略 • 今回のケースだと単一のドキュメント ◦ サンプルに習って単一のドキュメントであってもMultiDocumentAgentを利用
インボイス制度について聞いてみる
53 Agentの実装:インボイスについて聞いてみた結果
• インボイス制度についての質問は正しくなさそう ◦ Agentにたよるとクエリの結果が非常に長くなる ◦ 実際に動かしてみると全ドキュメントを 検索してるのかってぐらいChatGPTを叩いてた
54 Agentを用いた実装の結論
55 まとめ • 今回は、RAGの5つの実装と実際にドキュメント検索してみた ◦ ただし、これはあくまでデモ ◦ 実際のユースケースでは、利用する質問と回答を作って定期的に
作ったプログラムが正常に回答を返しているかを評価する必要がある ▪ ここが難しい • LhamaIndexには、他のRAG手法にFineTuning等もあるので見ると面白いかも • より精度を上げるには ◦ VectorDBを変える: Azure Cognitive SearchのHybridSearch使うとか ◦ PDFParserを変える: Azure AI Document Intelligenceを使うとか
56 最後に 採用してます!! 興味があればぜひ! あと多分LLM Appの登壇者も募集してます よかったらぜひ!お声がけください