RAGの精度が悪い?4つの手法で実務データを検証!最適構成を徹底解説

RAGの精度が悪い?4つの手法で実務データを検証!最適構成を徹底解説 AIモデル

📺 この記事のショート動画

📖この記事は約12分で読めます

1. 規約文書QAでRAGが失敗する現実と、なぜ精度が出ないのか

私は現在、企業の内部規約文書に対するQAシステムを開発するプロジェクトに携わっています。当初は非常に単純な構成で始めました。つまり、ユーザーの質問と文書チャンクとのコサイン類似度を計算し、上位k件を抽出してLLMに渡すという、いわゆるVanilla RAGの構成です。しかし、実際に動かした瞬間、私は愕然としました。期待していたような正確な回答は得られず、むしろ誤った情報を堂々と生成されてしまうのです。

具体的には、条番号を明確に指定した質問に対して、全く異なる条文のチャンクが検索結果として返ってくるという致命的な問題が発生しました。また、複数のセクションにまたがる質問に対しては、文脈を断絶した状態で回答を生成し、まるで質問の意図を理解していないような回答を返します。これは単なるLLMのハルシネーションではなく、検索段階で適切な情報が取りこぼされている、あるいは誤った情報が優先されていることが原因でした。

「RAGの精度が悪い」と一言で言っても、その原因が検索アルゴリズムにあるのか、生成モデルの能力不足にあるのか、あるいはデータの前処理に問題があるのかが明確ではありませんでした。多くのエンジニアが陥る罠ですが、LLMの温度パラメータをいじるだけで解決しようとしたり、より大きなモデルに切り替えるだけで解決すると思い込むケースが多々見られます。しかし、根本的な原因が検索の質にある場合、生成モデルを強化しても精度は向上しないのです。

そこで私は、安易な改善策に頼らず、Vanilla RAGから始めて段階的に手法を変え、それぞれを厳格に評価・考察し、採否判定を行うというアプローチを取りました。本記事では、その検証プロセスと、最終的に最適な構成を決定するまでの思考プロセスを、私の実務データに基づき詳細に共有します。RAG構築に悩む読者の皆様にとって、具体的な解決策が見つかることを願っています。

2. 検証対象とした4つのRAG手法と、それぞれの技術的な仕組み

私が比較検証したのは、大きく分けて4つの手法です。まずはベースラインとなる「Vanilla RAG」です。これは前述した通り、単純なベクトル検索とコサイン類似度のみを用いた構成で、最も実装が容易ですが、複雑なクエリには脆弱です。次に「Hybrid Search(ハイブリッド検索)」です。これはベクトル検索の柔軟な意味理解と、キーワード検索(BM25など)の厳密な一致検索を組み合わせた手法で、条番号や専門用語のような特定キーワードの検索精度を向上させることを目的としています。

3つ目は「Reranking(リランキング)」の導入です。これは検索フェーズで抽出された候補チャンクに対して、クロスエンコーダーを用いて再評価を行い、質問との関連性を再計算して順序を並び替える手法です。ベクトル検索は高速ですが精度に限界があるため、その上位数十件を抽出し、より重い計算リソースを割いて精度を高めるという戦略です。これは実務において最も劇的な効果をもたらすことが多い手法の一つです。

4つ目は「Contextual Compression(コンテキスト圧縮)」または「Query Transformation(クエリ変換)」を含む高度な前処理手法です。質問文を複数の視点から分解したり、生成された回答に必要な情報のみ抽出して圧縮したりすることで、LLMに渡すコンテキストの質を高めるアプローチです。特に、規約文書のように論理的な構造を持つデータでは、単に似た文章を拾うだけでなく、論理構造を理解した上で情報を抽出する必要があります。

これら4つの手法は、それぞれ異なるレイヤーで精度向上を狙っています。検索の段階で精度を上げるか、検索後の再評価で精度を上げるか、あるいは入力データそのものの質を変えるか。私の検証環境では、ローカルLLMであるLlama 3.1 8BやMistral 7BをOllamaで動作させ、ベクトルデータベースにはChromaDBを採用しました。これにより、クラウドAPIへの依存を排除し、完全にローカル環境で再現可能なベンチマーク環境を構築することができました。

3. 実務データによる4手法の比較検証と、具体的な性能差の数値

検証には、実際の企業規約文書から抽出した100件のテストクエリセットを作成しました。このセットには、単純な事実確認質問、条番号指定質問、複数セクションにわたる推論質問、そして曖昧な表現を含む質問が含まれています。まずVanilla RAGを評価したところ、全体の正答率は45%程度に留まりました。特に条番号指定質問の正答率は20%未満と極めて低く、ベクトル空間上で「条」や「第3条」といった数字や特定の記号が、意味的な類似度として適切に評価されていないことが判明しました。

次にHybrid Searchを導入して再評価を行いました。結果は劇的に改善し、正答率は62%まで向上しました。特に条番号指定質問の正答率は80%を超え、キーワード検索の強みが生かされたことが確認できました。しかし、複数セクションにわたる推論質問については、依然として精度が伸び悩んでいました。これは、検索結果として複数の関連チャンクが返されても、それらが論理的に結合されていないため、LLMが全体像を把握できていないことが原因だと分析しました。

ここでRerankingモデル(CrossEncoder)を導入し、検索結果の上位50件を再評価しました。この段階で正答率は78%まで跳ね上がりました。Rerankingにより、文脈的に最も関連性の高いチャンクが上位に並び替えられ、LLMが最も重要な情報にアクセスしやすくなったためです。特に、曖昧な表現を含む質問に対して、文脈を考慮した再評価が機能し、誤った解釈を防ぐ効果が明確に確認できました。計算コストは増大しましたが、精度向上の観点からは非常に有効な投資でした。

最後にContextual Compressionを組み合わせ、最終的な構成を評価しました。この手法では、検索されたチャンクから質問に直接関係のない情報をフィルタリングし、必要な情報のみを圧縮してLLMに渡しました。これにより、LLMのコンテキストウィンドウの無駄な消費を防ぎ、重要な情報に集中させることができました。最終的な正答率は85%を達成し、特に複雑な推論質問において、Vanilla RAGと比較して2倍近い精度向上を確認できました。この結果から、単一の手法ではなく、複合的なアプローチが必須であることが証明されました。

4. ローカル環境でのRAG構築におけるメリットと、避けるべきデメリット

ローカル環境でRAGシステムを構築する最大のメリットは、データのセキュリティとプライバシーの確保です。規約文書や社内データは、外部のクラウドAPIに送信することで機密情報が漏洩するリスクを伴います。ローカルLLMとベクトルDBを自社のPCやサーバーで完結させることで、データが外部に流出するリスクをゼロにすることができます。また、APIコストも発生しないため、大量のデータ処理や頻繁なテストを行っても経済的負担がありません。これは、開発段階での試行錯誤を自由にできる点でも大きな利点です。

しかし、ローカル環境には明確なデメリットも存在します。最も大きな制約はハードウェアリソース、特にVRAMとCPU性能です。Rerankingモデルや大規模なLLMを動かすには、十分なメモリとGPU性能が不可欠です。私の検証では、RTX 3090(24GB VRAM)を使用しましたが、モデルサイズやバッチサイズによってはVRAM不足に陥り、スワップ領域に依存して処理速度が極端に低下するケースがありました。また、推論速度もクラウドAPIに比べて遅く、リアルタイム性が求められるユースケースでは体感上の遅延が発生します。

さらに、モデルの選定とチューニングの難易度も高いです。クラウドサービスではモデルがブラックボックス化されており、ユーザーはパラメータ調整だけで済みますが、ローカル環境ではGGUF形式の量子化モデルの選択、Ollamaの設定、ベクトルDBのインデックス構成など、多くの技術的決定が必要です。例えば、INT4量子化モデルを使用すると精度が低下するリスクがあり、INT8やFP16を使用するとVRAM使用量が増大します。このバランスを絶えず見極めながら、最適な構成を見つける必要があります。

それでも、ローカルRAGの価値は非常に高いと考えます。特に、データの機密性が重要な企業や、カスタマイズ性の高いシステムが必要な場合、ローカル環境は唯一の選択肢です。また、最新のオープンソースモデルがリリースされるたびに、自社のシステムを即座にアップデートできる柔軟性も魅力です。デメリットを克服するための工夫、例えばモデルの量子化技術の活用や、分散処理の導入など、技術的な知見を深めることで、ローカルRAGのポテンシャルは無限大に広がります。

5. 最適な構成を決定し、読者が試せる具体的な活用方法と展望

今回の検証結果を踏まえ、私の推奨する最適な構成は「Hybrid Search + Reranking + Contextual Compression」の組み合わせです。まず、Hybrid Searchで検索の網羅性と精度を確保し、Rerankingで上位候補を精密に選別します。最後に、Contextual CompressionでLLMへの入力を最適化します。この構成は、実務データにおいて85%という高い正答率を達成し、複雑な質問にも対応できることが証明されました。読者の皆様も、まずはこの構成をベースに、自社のデータで検証してみることを強くお勧めします。

具体的なセットアップ方法としては、OllamaでLlama 3.1 8BやMistral 7Bを起動し、ベクトルDBにはChromaDBまたはWeaviateを使用するのが現実的です。Rerankingモデルには、Hugging Face上の軽量なクロスエンコーダー(例: bge-reranker-v2-m3)をLlama.cppやONNXで動作させるのが良いでしょう。また、Contextual Compressionには、LlamaIndexやLangChainなどのフレームワークを利用することで、実装のハードルを大幅に下げることができます。これらのツールを組み合わせることで、数日でプロトタイプを構築することが可能です。

将来的には、モデルの小型化と高性能化がさらに進むことが予想されます。現在、10Bパラメータ以下のモデルでも、適切なRAG構成と組み合わせれば、大規模モデルに匹敵する精度が出せるようになっています。また、ローカル環境での推論速度も、GPUアーキテクチャの進化や推論エンジンの最適化(vLLMやllama.cppの進化)により向上しています。さらに、マルチモーダルなRAG(画像や音声を含む文書からの検索)も、ローカル環境で実現可能になりつつあり、その可能性は計り知れません。

最後に、RAGの精度向上は「魔法」ではなく、地道な検証と最適化の積み重ねであることを強調します。単にツールを導入するだけでなく、なぜ精度が出ないのかを分析し、検索、生成、前処理の各段階で何が起きているかを理解することが重要です。私の今回の検証プロセスが、読者の皆様にとって、より良いRAGシステムを構築するための参考になれば幸いです。ローカルLLMの可能性を信じて、一緒に技術の進化を切り拓いていきましょう。


📰 参照元

RAGはなぜ精度が出ないのか?4手法を実務データで比較し最適構成を決めた

※この記事は海外ニュースを元に日本向けに再構成したものです。

📦 この記事で紹介した商品

※ 上記リンクはAmazonアソシエイトリンクです。購入いただくと当サイトに紹介料が入ります。

コメント

タイトルとURLをコピーしました