Slide 1

Slide 1 text

1 社内情報検索システムで用いられる RAGの4つの実装方法 LLM Application Meetup vol.4 松本和高

Slide 2

Slide 2 text

2 松本 和高
 株式会社エクスプラザ リードエンジニア
 X: _mkazutaka
 Github: mkazutaka
 18年にバックエンドエンジニアとしてメルカリに入社。その後、ミラ ティブ、フリーランスを得て株式会社エクスプラザに所属。フロント エンドからバックエンドまで幅広く開発しています。趣味で、FXの自 動売買Botを作成している
 現在08/30に第一子が生まれ現在育休中
 https://note.com/mkazutaka/n/n9f0e2c4dee96 


Slide 3

Slide 3 text

CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy 3 株式会社エクスプラザ (EXPLAZA, Inc.) 会社名 プロダクトの力で、豊かな暮らしをつくる ミッション 代表取締役CEO 高橋一生 代表者 2020年07月03日 設立 東京都港区六本木4丁目8-5 和幸ビル 所在地 会社概要

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

5 noteで技術発信を実施 LLM関連の技術記事を noteで発信 https://note.com/explaza_inc/ CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy

Slide 6

Slide 6 text

6 本日の内容
 ● RAG(Retrieval-augmented Generation)について 
 ○ LLMを使って社内のドキュメントの情報を返す際に利用される 
 ● 手法を実装して、結果を見る


Slide 7

Slide 7 text

7 LLMには欠点がある
 ● もっともらしいウソの出力を出すことがある(ハルシエーション) 
 ● 最新のデータを持たない
 図. 2023/10/12にGPT3.5に対して質問した結果 正しくは359657627190

Slide 8

Slide 8 text

8 LLMに知識を補完するには
 ● 知識を与えてあげるとLLMは正しい回答をしてくれる場合もある 
 ○ プロンプトのテクニック
 知識を与える 正しい回答をする 図. GPT3.5に知識を与えて正しい回答を得る

Slide 9

Slide 9 text

9 検索によってLLMに知識を補完する: RAG
 ● RAG(Retrieval-augmented Generation: 検索により強化した文章生成)という 
 ○ ユーザから見えない形にすれば、LLMがあたかもその知識を知っているように 
 振る舞う
 知識を与える 正しい回答をする 検索エンジンなどで 取得 図. 検索エンジンで情報を取得し、 GPT3.5に知識を与えて正しい回答を得る

Slide 10

Slide 10 text

10 RAGの基本的な実装ステップ
 1. ドキュメントやウェブページを解析して、知識をDBに格納する 
 2. ユーザのプロンプトをもとに、DBから知識を検索し、ユーザのプロンプトを再構築 
 3. LLMからの結果をユーザに返す 
 参考: https://gpt-index.readthedocs.io/en/latest/getting_started/concepts.html

Slide 11

Slide 11 text

ここからは実装していく
 


Slide 12

Slide 12 text

12 環境
 ● 対象となるドキュメント
 ○ 商工会議所が出している「中小企業・小規模事業者のための インボイス制度対策」 
 ● 開発環境
 ○ Python、LLMはChatGPT、LlamaIndexを使う 
 中小企業・小規模事業者のための インボイス制度対策 https://www.jcci.or.jp/chusho/202203invoice_booklet.pdf

Slide 13

Slide 13 text

シンプルな実装


Slide 14

Slide 14 text

14 シンプルな実装: 実装
 1. SimpleDirectoryReaderを使ってファイルを読み込む 
 2. LlamaIndexにメモリベクトルDBにドキュメントを保存 
 3. 質問をする


Slide 15

Slide 15 text

インボイス制度について聞いてみる 


Slide 16

Slide 16 text

16 シンプルな実装: インボイスについて聞いてみた結果


Slide 17

Slide 17 text

17 シンプルな実装: インボイスについての正しい回答のページ
 ● 回答としてはファイルの1ページ目を参照してほしい 


Slide 18

Slide 18 text

● ChatGPTに送った内容を見る: P.12とP.26を知識として入れている 
 18 シンプルな実装: インボイス制度について聞いた際に参照されたファイル


Slide 19

Slide 19 text

課税事業者のメリット・デメリットを聞く


Slide 20

Slide 20 text

20 結果: 課税事業者のメリデメについて聞いてみた結果


Slide 21

Slide 21 text

21 シンプルな実装: 課税事業者のメリデメについての正しい回答のページ
 ● 回答としてはファイルの7ページ目を参照してほしい 


Slide 22

Slide 22 text

● ChatGPTに送った内容を見る: P.7とP.8を知識として入れている 
 22 シンプルな実装: 課税事業者のメリデメについて参照されたファイル


Slide 23

Slide 23 text

● インボイス制度についての質問は正しい場所を参考にできなかった 
 ○ ドキュメント内に「インボイス制度」という文字は30個ある 
 ○ 追加で、`「インボイス制度とは」について教えてください」`で試してみたが 
 だめだった
 ○ 別の方法も試してみる
 
 ● 課税事業者のメリットデメリットについては正しい場所を参考にした 
 ○ 表をパーサーが適当な形式に変換したが、よしなLLM側で解釈した 
 23 シンプルな実装の結論


Slide 24

Slide 24 text

Recursive Retrieverを用いた実装


Slide 25

Slide 25 text

● PDFファイルをページでわける(これをNodeと呼ぶ) 
 ○ Node郡の中から最適なNodeを選ぶ 
 25 ドキュメントの検索方法: シンプルな実装


Slide 26

Slide 26 text

● ページ単位でNodeをわけず、特定のチャンク単位で分ける 
 ○ 検索は、一番小さいチャンクに対して行う、LLMにあたえるものは一番 
 大きなチャンクを使う
 26 ドキュメントの検索方法: Recursive Retrieval (再帰的検索)


Slide 27

Slide 27 text

27 Recursive Retrieval(Chunk)の実装: 1/3
 1. SimpleDirectoryReaderを使ってファイルを読み込む 
 a. 今回は、Unstructuredを使う


Slide 28

Slide 28 text

28 Recursive Retrieval(Chunk)の実装: 2/3
 1. チャンクごとに再帰的なグラフを作る 


Slide 29

Slide 29 text

29 Recursive Retrieval(Chunk)の実装: 3/3
 1. すべてのnodeをDBに保存し、質問をする 
 a. RecursiveRetrieverが再帰的に検索してくれるため細かい実装は不要 


Slide 30

Slide 30 text

インボイス制度について聞いてみる 


Slide 31

Slide 31 text

31 Recursive Retriever(Chunk)の実装: インボイスについて聞いてみた結果


Slide 32

Slide 32 text

32 Recursive Retriever(Chunk)の実装: プロンプトの中身の一部
 ● 1ページ目の一部を参照している 


Slide 33

Slide 33 text

課税事業者のメリット・デメリットを聞く


Slide 34

Slide 34 text

34 Recursive Retriever(Chunk)の実装: 結果


Slide 35

Slide 35 text

35 Recursive Retriever(Chunk)の実装: プロンプトの中身の一部
 ● 7ページ目の一部を参照している 


Slide 36

Slide 36 text

● インボイス制度についての質問は正しい場所を参考にした 
 ○ チャンク数が固定なので、たまたまうまく行った可能性もある 
 
 ● 課税事業者のメリットデメリットについては正しい場所を参考にした 
 36 Recursive Retriever(Chunk)を用いた実装の結論


Slide 37

Slide 37 text

Recursive Retriever(Summary)を用いた実装


Slide 38

Slide 38 text

● 特定のチャンク単位で分けていたのを要約を用いる 
 ○ 今回はページ単位で要約する
 38 Recursive Retrieval (Summary)


Slide 39

Slide 39 text

39 Recursive Retrieval(Summary)の実装: 1/4
 1. SimpleDirectoryReaderを使ってファイルを読み込む 
 a. 今回はページごとに読む込みたいのでSimpleDirectoryReaderをそのまま使用 


Slide 40

Slide 40 text

40 Recursive Retrieval(Summary)の実装: 2/4
 1. デフォルトのプロンプトだと英語で要約文ができる 
 a. 日本語で検索を行うと結果がでなくなるのでプロンプトを英語に修正する 


Slide 41

Slide 41 text

41 Recursive Retrieval(Summary)の実装: 3/4
 1. ページごとにドキュメントを生成する 


Slide 42

Slide 42 text

42 Recursive Retrieval(Summary)の実装: 4/4
 1. 質問する


Slide 43

Slide 43 text

インボイス制度について聞いてみる 


Slide 44

Slide 44 text

44 Recursive Retriever(Summary)の実装:インボイスについて聞いてみた結果
 ● シンプルな実装でみたのとほぼ同じ 


Slide 45

Slide 45 text

課税事業者のメリット・デメリットを聞く


Slide 46

Slide 46 text

● シンプルな実装でみたのとほぼ同じ 
 46 Recursive Retriever(Summary)の実装:インボイスについて聞いてみた結果


Slide 47

Slide 47 text

● 今回のケースだとシンプルな実装の結果と同じになった 
 ○ (実装みすったかもしれない)
 
 ● ページごとに要約していくので、コストが掛かる 
 ○ 使い所はすこしむずかしい
 47 Recursive Retriever(Summary)を用いた実装の結論


Slide 48

Slide 48 text

Agentを用いた実装
 (おまけ)


Slide 49

Slide 49 text

49 LlamaIndexにAgentが10/2ぐらいに登場
 ● Agentとは
 ○ 要求を「どのような手段を使ってどういう順番で解決するか」を 
 LLMを使って自動的に決定してくれるような機能 
 
 ● LlamaIndexの作者いわく、Agentでできること 
 ○ 単一文書に対する事実に基づいたQA 
 ○ 単一ドキュメントの要約
 ○ 複数のドキュメントに対する事実に基づく比較 
 ○ 複数のドキュメントにわたる全体的な比較 


Slide 50

Slide 50 text

50 LhamaIndexのAgentのアーキテクチャ
 ● ドキュメントごとにAgentを作成
 ○ さらにそれを管理するAgentがいる 


Slide 51

Slide 51 text

51 Agentの実装
 ● 割りと長くなっちゃので省略
 ● 今回のケースだと単一のドキュメント 
 ○ サンプルに習って単一のドキュメントであってもMultiDocumentAgentを利用 


Slide 52

Slide 52 text

インボイス制度について聞いてみる 


Slide 53

Slide 53 text

53 Agentの実装:インボイスについて聞いてみた結果


Slide 54

Slide 54 text

● インボイス制度についての質問は正しくなさそう 
 ○ Agentにたよるとクエリの結果が非常に長くなる 
 ○ 実際に動かしてみると全ドキュメントを 
 検索してるのかってぐらいChatGPTを叩いてた 
 54 Agentを用いた実装の結論


Slide 55

Slide 55 text

55 まとめ
 ● 今回は、RAGの5つの実装と実際にドキュメント検索してみた 
 ○ ただし、これはあくまでデモ
 ○ 実際のユースケースでは、利用する質問と回答を作って定期的に 
 作ったプログラムが正常に回答を返しているかを評価する必要がある 
 ■ ここが難しい
 
 ● LhamaIndexには、他のRAG手法にFineTuning等もあるので見ると面白いかも 
 
 ● より精度を上げるには
 ○ VectorDBを変える: Azure Cognitive SearchのHybridSearch使うとか 
 ○ PDFParserを変える: Azure AI Document Intelligenceを使うとか 


Slide 56

Slide 56 text

56 最後に
 採用してます!!
 興味があればぜひ!
 
 あと多分LLM Appの登壇者も募集してます
 よかったらぜひ!お声がけください