Techカンファレンスの セッション情報を話す RAGを作ってみた話

1.5K Views

May 24, 24

スライド概要

ChatGPT Osaka vol2

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Techカンファレンスの セッション情報を話す RAGを作ってみた話 ChatGPT Meetup Osaka #2

2.

Hidetaka Okamoto (@hidetaka_dev) - WordCamp Kyoto 2017 WordCamp Kansai 2024 Stripe DevRel AWS Samurai 2017 Alexa Champions https://hidetaka.dev

3.

今日の話 ● RAGは「検索」と「回答文生成」の2つで構成されている ● 「期待する回答文」を作れる「検索結果」を作ろう ● 検索用のインデックスをどう構成するかも重要 ● みんなで行こう、RAG / LLM沼

4.

作ってみたもの

6.

RAG Retrieval Augmented Generation 検索 によって 拡張 された 生成 処理

7.

RAGの処理フロー

8.

要はこういうこと

9.

前提知識と質問をプレースホルダーにする

10.

contextに「必要な情報を詰め込む」 ● LLMには「トークン数制限」がある ● {context}情報が多すぎると、制限に引っかかる恐れがある ○ ● ● 詳細に解説している記事ほど、contextに使い辛い 「関係性の高い部分だけ」を{context}に渡したい ○ 記事を細かく分割 ○ 質問に関係性の高い部分だけを取得する 「関連性・類似性」で検索できる、ベクトル検索が選ばれやすい

11.

RAGアプリ開発のポイント ● {context} に効率よく参考情報を詰め込む ○ 文章の分割・再構成 ○ 検索手法の検討 ● 言語やユースケースにあったLLMを採用する ● 検索や回答生成時間の短縮と、 Event Streamを利用したインタラクションの提供

12.

作ってみたもの

13.

カンファレンス セッション情報アプリ - Cloudflare Workers AI - Cloudflare Vectorize - Cloudflare Workers + Hono(v4) + LangChain.js https://github.com/hideokamoto/react-wordpress-template

14.

Step1: データのインデックス Step2: RAGアプリの構築

15.

Step1: データのインデックス Step2: RAGアプリの構築

16.

WordPressから データを取得

17.

そのままでは、 装飾用のHTMLが ノイズになる

18.

不要な情報を除去し、Markdownで再構成

19.

Embeddingできる分量で、コンテンツを分割

20.

https://www.langchain.com/

21.

LangChain.jsで具体的な処理を抽象化 ● テキストの分割: TextSplitter クラス ● 保存する文書データ: Document クラス ● ベクトルデータへの変換: Embeddingsクラス ● ベクトルDBへの保存処理: VectorStore クラス ● 検索処理: Retriever クラス ● 文章生成: LLM / Chat クラス ● etc..

22.

事前処理の流れ(ざっくり)

23.

Step1: データのインデックス Step2: RAGアプリの構築

24.

RAGの処理フロー(おさらい)

25.

LangChainが 処理を管理する

26.

RunnableXXXで プロンプトや モデル・引数を 指定

27.

RunnableMapで、 検索結果と回答文 両方を返す

28.

Honoの jsxRendererと HTMLモジュールで GUIを作成

29.

作ってみた感想 ● 事前処理を頑張ると、検索の精度は10 - 20%くらいあげれる ○ 検索スコアが見れる検索を使おう ○ embeddingとインデックスを何回も繰り返すので、 いきなり大量のデータを投入しないほうがよさそう ● 回答生成のモデルを変えるだけでも、生成結果が変化する ○ ● 検索と回答生成それぞれで検証・評価を行おう いきなり全部やるのは、慣れるまで大変かも

30.

勝手に考える実装の流れ ● ● ● 回答生成処理の実装 ○ 検索結果をプロンプトにベタ書きする ○ 「どんな文章をプロンプトに入れるべきか?」を検証する データの前処理・インデックス ○ 欲しいフォーマットで、テキストをインデックスする ○ ベクトルの次元やチャンクサイズを検証する 結合・Retrieverを作り込む

31.

Q: なんでそんなに頑張ってるの? A: 自分の過去記事・資料を活かしたい

32.

過去記事が増えすぎて把握しきれていない ● ● 個人ブログで1,000記事、Stripe Qiitaで200+記事 + 登壇資料 etc.. ○ 「この説明書いたのどの記事だっけ・・・?」 ○ 「前に書いた記事に古い情報あるか調べたい」 ○ 「過去記事を組み合わせた記事作りたい」 全文検索( Algolia / OpenSearch )とベクトル検索を活用したい ○ まずはテキスト記事から ○ 画像(キャプチャ)やPDF資料も将来的には

33.

記事の 公開・更新・削除で インデックスを 操作するWF

34.

今こんな感じ

35.

まとめ ● RAGは「検索」と「回答文生成」の2つで構成されている ● 「期待する回答文」を作れる「検索結果」を作ろう ● 検索用のインデックスをどう構成するかも重要 ● みんなで行こう、RAG / LLM沼

36.

Thank you! - x.com/@hidetaka_dev - wp.org/hideokamoto - hidetaka.dev