1.4K Views
May 24, 24
スライド概要
ChatGPT Osaka vol2
Developer
Techカンファレンスの セッション情報を話す RAGを作ってみた話 ChatGPT Meetup Osaka #2
Hidetaka Okamoto (@hidetaka_dev) - WordCamp Kyoto 2017 WordCamp Kansai 2024 Stripe DevRel AWS Samurai 2017 Alexa Champions https://hidetaka.dev
今日の話 ● RAGは「検索」と「回答文生成」の2つで構成されている ● 「期待する回答文」を作れる「検索結果」を作ろう ● 検索用のインデックスをどう構成するかも重要 ● みんなで行こう、RAG / LLM沼
作ってみたもの
RAG Retrieval Augmented Generation 検索 によって 拡張 された 生成 処理
RAGの処理フロー
要はこういうこと
前提知識と質問をプレースホルダーにする
contextに「必要な情報を詰め込む」 ● LLMには「トークン数制限」がある ● {context}情報が多すぎると、制限に引っかかる恐れがある ○ ● ● 詳細に解説している記事ほど、contextに使い辛い 「関係性の高い部分だけ」を{context}に渡したい ○ 記事を細かく分割 ○ 質問に関係性の高い部分だけを取得する 「関連性・類似性」で検索できる、ベクトル検索が選ばれやすい
RAGアプリ開発のポイント ● {context} に効率よく参考情報を詰め込む ○ 文章の分割・再構成 ○ 検索手法の検討 ● 言語やユースケースにあったLLMを採用する ● 検索や回答生成時間の短縮と、 Event Streamを利用したインタラクションの提供
作ってみたもの
カンファレンス セッション情報アプリ - Cloudflare Workers AI - Cloudflare Vectorize - Cloudflare Workers + Hono(v4) + LangChain.js https://github.com/hideokamoto/react-wordpress-template
Step1: データのインデックス Step2: RAGアプリの構築
Step1: データのインデックス Step2: RAGアプリの構築
WordPressから データを取得
そのままでは、 装飾用のHTMLが ノイズになる
不要な情報を除去し、Markdownで再構成
Embeddingできる分量で、コンテンツを分割
https://www.langchain.com/
LangChain.jsで具体的な処理を抽象化 ● テキストの分割: TextSplitter クラス ● 保存する文書データ: Document クラス ● ベクトルデータへの変換: Embeddingsクラス ● ベクトルDBへの保存処理: VectorStore クラス ● 検索処理: Retriever クラス ● 文章生成: LLM / Chat クラス ● etc..
事前処理の流れ(ざっくり)
Step1: データのインデックス Step2: RAGアプリの構築
RAGの処理フロー(おさらい)
LangChainが 処理を管理する
RunnableXXXで プロンプトや モデル・引数を 指定
RunnableMapで、 検索結果と回答文 両方を返す
Honoの jsxRendererと HTMLモジュールで GUIを作成
作ってみた感想 ● 事前処理を頑張ると、検索の精度は10 - 20%くらいあげれる ○ 検索スコアが見れる検索を使おう ○ embeddingとインデックスを何回も繰り返すので、 いきなり大量のデータを投入しないほうがよさそう ● 回答生成のモデルを変えるだけでも、生成結果が変化する ○ ● 検索と回答生成それぞれで検証・評価を行おう いきなり全部やるのは、慣れるまで大変かも
勝手に考える実装の流れ ● ● ● 回答生成処理の実装 ○ 検索結果をプロンプトにベタ書きする ○ 「どんな文章をプロンプトに入れるべきか?」を検証する データの前処理・インデックス ○ 欲しいフォーマットで、テキストをインデックスする ○ ベクトルの次元やチャンクサイズを検証する 結合・Retrieverを作り込む
Q: なんでそんなに頑張ってるの? A: 自分の過去記事・資料を活かしたい
過去記事が増えすぎて把握しきれていない ● ● 個人ブログで1,000記事、Stripe Qiitaで200+記事 + 登壇資料 etc.. ○ 「この説明書いたのどの記事だっけ・・・?」 ○ 「前に書いた記事に古い情報あるか調べたい」 ○ 「過去記事を組み合わせた記事作りたい」 全文検索( Algolia / OpenSearch )とベクトル検索を活用したい ○ まずはテキスト記事から ○ 画像(キャプチャ)やPDF資料も将来的には
記事の 公開・更新・削除で インデックスを 操作するWF
今こんな感じ
まとめ ● RAGは「検索」と「回答文生成」の2つで構成されている ● 「期待する回答文」を作れる「検索結果」を作ろう ● 検索用のインデックスをどう構成するかも重要 ● みんなで行こう、RAG / LLM沼
Thank you! - x.com/@hidetaka_dev - wp.org/hideokamoto - hidetaka.dev