500万件超の文書を処理して得た Production RAG の経験
(blog.abdellatif.io)- 8か月にわたり RAG(検索拡張生成) プロジェクトを進める中で、実際に効果のあった方法と時間の無駄だった方法を見極めた
- 初期には Langchain と Llamaindex を使ってプロトタイプを素早く完成させたが、実際のユーザーフィードバックで性能の限界を経験した
- 文書検索性能の改善に最も大きく寄与した要因は、クエリ生成、リランキング、チャンク化戦略、メタデータ活用、クエリルーティング であることが分かった
- 実務では ベクターデータベース、埋め込み、リランキング、LLM などを柔軟に選択しながらカスタムパイプラインを構築する
- あらゆる経験とノウハウを オープンソースプロジェクト(agentset-ai/agentset) に集約して公開した
8か月間の Production RAG 構築経験の概要
- 合計900万ページ(Usul AI)、400万ページ(ある匿名の法務AI企業)などの大規模データセットで RAG システムを構築・運用 した経験を共有する
- 初期には YouTube チュートリアルを追って Langchain から Llamaindex へ移り、数日でプロトタイプを完成させたが、実運用では ユーザーにしか気づけない低い性能 の問題が明らかになった
- 数か月にわたりシステム構成要素を部分的に修正しながら、最適な性能に到達した
性能改善に実質的に寄与した要素(ROI順)
-
クエリ生成(Query Generation)
- ユーザーの最後のクエリだけではすべての文脈を含められないため、LLM で会話内容を見直し、意味的クエリとキーワードクエリを複数生成 する
- これらのクエリを並列処理し、リランカーに渡すことで、検索範囲の拡大とハイブリッドサーチのバイアス補正 の効果を得る
-
リランキング(Reranking)
- 5行程度のコードで実装できるリランキングが性能に与える影響 は想像以上に大きい
- 大量のチャンク入力(例: 50個)から上位の一部(例: 15個)のチャンクを再整列・選別する工程が、最も ROI が高い
- リランキングだけでも、設計が不十分なパイプラインの不足分をかなり補える
-
チャンク化戦略(Chunking Strategy)
- 開発全体の 主要な時間を占める部分
- データ構造とパターンを正確に理解し、論理単位でチャンク化し、文字や文が途中で切れないように直接確認する 必要がある
- 各チャンクごとに独立した意味が保たれていなければならない
-
LLM 入力におけるメタデータ活用
- 単なるチャンクテキストだけを LLM に渡すのではなく、メタデータ(title, author など) を追加することで、文脈と回答品質を大きく改善した
-
クエリルーティング(Query Routing)
- RAG では回答不可能なタイプ(例: 記事要約、著者情報の要求など)に対しては、軽量ルーターを導入し、そのクエリを API+LLM 処理経路へ分岐 する
実運用スタック(Our stack)
- ベクターデータベース: Azure → Pinecone → Turbopuffer(低コストで、デフォルトでキーワード検索をサポート)
- 文書抽出: カスタム方式を適用
- チャンク化ツール: 基本は Unstructured.io、企業向けパイプラインはカスタム(Chonkie も良い評価)
- 埋め込みモデル: text-embedding-large-3 を使用(他モデルは未検証)
- リランカー: None → Cohere 3.5 → Zerank(一般的ではないが実際には優秀)
- LLM: GPT 4.1 → GPT 5 → GPT 4.1(主に Azure クレジットを使用)
オープンソース化と結論
- すべての学習成果と実戦経験は オープンソースプロジェクトagentset-ai/agentset に結実した
- MIT ライセンス で公開されており、自由に利用でき、問い合わせも可能(連絡先あり)
1件のコメント
Hacker Newsのコメント