2.3K Views
February 26, 24
スライド概要
Workers Tech Talks in Osaka #1の資料です
Developer
LangChainと Workers AI / Vectorizeを使って RAGを作ってみた話 Workers Tech Talks in Osaka #1
Hidetaka Okamoto (@hidetaka_dev) - WordCamp Kyoto 2017 WordCamp Kansai 2024 Stripe DevRel AWS Samurai 2017 Alexa Champions https://hidetaka.dev
RAG Retrieval Augmented Generation 検索 によって 拡張 された 生成 処理
RAGの処理フロー
要はこういうこと
前提知識と質問をプレースホルダーにする
RAGに「ベクトル検索」は必須じゃない ● {context} に追加情報を動的に追加できればOK ● 検索APIやDBへのクエリ結果を利用することもできる ● その場合、 「入力された質問文」を 「検索クエリ」に変換するLLM API呼び出しを追加する ● ただし「効率的な回答生成」にはベクトル検索が効果的
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タグや 画像など、 検索に利用しない 情報を削除 + 情報を 文字数などで 分割する
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を作成
Q: Workers AIのモデル、 日本語不得意では? A: 70%くらいは頑張ってくれる & 保険で翻訳処理も用意した
Q: Pages使わないの? A: Vectorizeが現状Bindできない
作ってみた感想 ● 「それっぽいレコメンド」はしてくれる ○ ● 5回中3回は「まぁそのセッション推すよね」となる印象 事前処理を頑張れば、精度は10 - 20%くらいあげれる 「この検索結果はプロンプトに使えるか?」で検証しよう ● 70%の精度ではproductionは難しい ○ スピーカーとセッションタイトルがあべこべになるケースも ○ Vectorize検索結果を返すだけなら、70%〜でもいけるかも?
Q: なんでそんなに頑張ってるの? A: 自分の過去記事・資料を活かしたい
過去記事が増えすぎて把握しきれていない ● ● 個人ブログで1,000記事、Stripe Qiitaで200+記事 + 登壇資料 etc.. ○ 「この説明書いたのどの記事だっけ・・・?」 ○ 「前に書いた記事に古い情報あるか調べたい」 ○ 「過去記事を組み合わせた記事作りたい」 全文検索( Algolia / OpenSearch )とベクトル検索を活用したい ○ まずはテキスト記事から ○ 画像(キャプチャ)やPDF資料も将来的には
関西でも LLM / RAGの話がしたい!
Thank you! - x.com/@hidetaka_dev - wp.org/hideokamoto - hidetaka.dev