意味は願望、インデックスは事実
インポート済み@odus · 3月1日 21:59
会話の要約
PageIndexのベクトルなしRAGは、チャンク分割をやめて転置インデックスに回帰することで、ベクトルRAGにおける意味の分断と正確性不足の問題を解決しました。しかし、意味の曖昧なマッチング能力を犠牲にし、計算量と遅延を大幅に増加させます。そのため、現在のベストプラクティスは、ベクトル検索とキーワード検索を組み合わせて、正確性と意味理解のバランスを取るハイブリッド二経路検索です。
会話
PageIndexについて教えてください。なぜベクトルを使わないRAG(No-Vector RAG)を行うのでしょうか?
これは非常に先端的で、本質を突いた問題です。PageIndex と No-Vector RAG(ベクトルなし RAG) の台頭は、実際のところ、現在主流の Vector RAG(ベクトルデータベースに基づく検索拡張生成)が抱える限界に対する反省と修正です。
簡単に言えば、PageIndex は転置インデックス(Inverted Index)に基づく技術で、曖昧な意味ベクトル検索による断片化ではなく、キーワードマッチングによって関連する「ページ(Page)」または完全なコンテキストを正確に見つけることを目的としています。
以下では、PageIndex の概念と、なぜ私たちが「ベクトルなし RAG」へ移行し、またはそれを組み合わせ始めているのかを詳しく分解して説明します。
1. PageIndex とは何か?
従来の Vector RAG では、文書を小さな断片(Chunks)に分割し、ベクトルに変換してから、類似したベクトルを検索します。
一方、PageIndex モードでは、ロジックが検索エンジンの原点へと戻ります。
- インデックス作成段階: システムは文書を分割してベクトル化するのではなく、グローバルな転置インデックス(本の巻末にある索引ページに似たもの)を構築します。各キーワード(Keyword)がどのページ(Pages)または文書に出現するかを記録します。
- 検索段階: ユーザーが質問すると、システムは質問中のキーワードを抽出し、転置インデックスを通じて、それらのキーワードを含む完全なページを直接特定します。
- 生成段階: システムは、これらの完全なページの内容(断片化された Chunk ではなく)をコンテキストとして LLM(大規模言語モデル)に入力し、LLM 自身に読み取り、理解、回答の抽出を行わせます。
核心的な違い: Vector RAG が LLM に与えるのは「細かく切り刻まれた段落」ですが、PageIndex が LLM に与えるのは「手がかりを含む完全なページ」です。
2. なぜ「ベクトルなし RAG」(No-Vector RAG)を採用するのか?
Vector RAG は普及している一方、実際の導入では3つの大きな核心的課題が明らかになりました。ベクトルなし RAG はまさにこれらの問題を解決するためのものです。
A. 「断片化」がもたらす意味の破壊 (The Chunking Problem)
- Vector RAG の課題: ベクトルデータベースに格納するため、長文書を500~1000文字のブロックに分割する必要があります。その結果、コンテキストが失われます。例えば、契約書の「契約違反条項」が5ページ目にあり、「賠償金額」が10ページ目にある場合、ベクトル検索では5ページ目のブロックしか取得できず、LLM は完全な論理関係を必要とする質問に答えられない可能性があります。
- No-Vector の利点: PageIndex が検索するのはPage(ページ)またはDocument(文書)です。LLM はより長いコンテキストウィンドウを持つため(モデルが128k/200k/1M tokenをサポートするにつれて、この方法が実行可能になりました)、段落をまたいだ論理関係を理解できます。
B. 曖昧なマッチング vs. 正確なマッチング (Fuzziness vs. Precision)
- Vector RAG の課題: ベクトル検索は「意味の類似度」に基づく曖昧検索です。
- 例: 「エラーコード1024」を検索すると、ベクトルは「エラーコード1025」に関する内容を取得する可能性があります。数学空間では近い位置にありますが、プログラマーにとっては完全に誤りです。
- 固有名詞の無効化: 特定の SKU 番号、氏名、または非常に出現頻度の低い語を検索する場合、ベクトルはしばしば機能しません。
- No-Vector の利点: 転置インデックスは完全一致です。「1024」を検索すれば、「1024」を含むページだけが返されます。法律、金融、コードなど、厳密さが求められる分野では、これは極めて重要です。
C. 説明不可能性と保守コスト (Black Box & Complexity)
- Vector RAG の課題: ベクトルはブラックボックスです。なぜシステムが A と B を類似していると判断したのか分かりません。さらに、高性能なベクトルデータベース(Vector DB)の維持には高いコストがかかり、インデックスの更新(追加・削除・変更・検索)も従来のデータベースより複雑です。
- No-Vector の利点: キーワードベースの検索は完全に説明可能です(「このページに3つの検索語が含まれているから」)。また、転置インデックス技術(Lucene、ElasticSearch など)はすでに非常に成熟しており、安価で効率的です。
3. PageIndex vs. Vector RAG:核心的な比較
より直感的に理解するために、この2つのアーキテクチャを比較してみましょう。
| 特性 | Vector RAG (従来の主流) | No-Vector RAG / PageIndex |
|---|---|---|
| 検索単位 | Chunks (テキスト断片) | Pages / Full Documents (完全なページ) |
| マッチングロジック | 意味の類似度 (Cosine Similarity) | キーワード完全一致 (Exact Match / BM25) |
| コンテキストの完全性 | 低 (文脈を断片的に引用しやすい) | 高 (完全なコンテキストの論理を保持) |
| 適した場面 | オープンな質疑応答、意図理解、曖昧なクエリ | 正確なデータ検索、長文書分析、固有名詞検索 |
| 依存技術 | Embedding Model + Vector DB | Inverted Index (ElasticSearch など) + LLM Long Context |
| 計算コスト | インデックス作成は遅く、推論時にベクトル計算が必要 | インデックス作成は速く、推論時は主に LLM Token を消費 |
4. なぜ今になって注目されているのか?(技術的背景)
「転置インデックスは何十年も前からある技術なのに、なぜ今になって語られるのか?」と思うかもしれません。
それは LLM のコンテキストウィンドウ(Context Window)が大きくなったからです。
- 以前 (2023年初頭): LLM が見られるのは4k Tokenだけでした。ページ全体(2k Tokenほどある場合があります)を入れると、2ページでいっぱいになります。そのため、分割が必要でした(Vector RAG)。
- 現在: Claude 3 は200k、Gemini 1.5 Pro は1M以上の Token をサポートしています。
- 結果: もはや知識を苦労して「細かく切り刻む」必要はありません。PageIndex で関連するページをたとえ10ページ特定できれば、その10ページをすべて LLM に投入し、「この範囲を読んで、答えを探して」と言えばよいのです。
この "Retrieve Pages -> LLM Reads All" という方式は、多くの場合、"Embed Chunks -> Retrieve Chunks -> LLM Guesses" よりも優れた結果をもたらします。
まとめ
ベクトルなし RAG(PageIndex)を行うのは、ベクトルを完全に捨てるためではなく、ベクトル検索の「精度不足」と「コンテキストの喪失」の問題を解決するためです。
- Vector RAG は、直感の鋭い司書のようなものです。あなたの質問に関係しそうな本を何冊かおおよそ把握していますが、あなたには数ページだけを破り取って渡します。
- PageIndex は、厳密な索引システムのようなものです。キーワードが登場するすべてのページを開き、あなた自身(LLM)が章全体を読めるようにします。
今後のトレンドはハイブリッド(Hybrid RAG)です。 まず PageIndex でキーワードのカバレッジ(正確性)を確保し、次に Vector で意味上の取りこぼし(汎化性)を補います。
続けて、実際のコード実装における「ベクトル検索ベース」と「キーワードインデックスベース」の違いを比較する、簡単な Python コード例をお見せしましょうか?
従来のベクトル RAG はどのように行われていたのですか?なぜそんなにひどく聞こえるのでしょうか?長文はどのように圧縮されるのですか?
これは非常に鋭い質問です。あなたがベクトルRAG(Vector RAG)を「悪い」と感じたのは、私たちが先ほど正確性(PageIndexの強み)を使って、その曖昧さ(Vector RAGの弱み)を攻撃したからです。
実際には、ベクトルRAGは現在最も主流の技術であり、「悪い」わけではありません。ただ、「汎用性」のために「正確性」を犠牲にしているだけです。
あなたの質問に答えるために、ベクトルRAGの根本的なロジック、つまり長いテキストをどのように「圧縮」し「解体」しているのかを詳しく見ていく必要があります。
一、 元のベクトルRAGはどのように行われていたのか?(標準的な流れ)
ベクトルRAGの核心的なロジックは、テキストを数学的な座標に変換することです。そのワークフローは通常、4つのステップに分けられます。
- スライス(チャンキング):
-
まず、長いドキュメント(例えば100ページのPDF)を無数の小さな段落に分割します。
-
例えば、500文字ごとに1つの塊にします。
-
結果: 記事の本来の論理的な流れが強制的に中断されます。
- ベクトル化(埋め込み):
-
モデル(OpenAIのtext-embedding-3など)を使用して、この500文字を数字のセット(通常は1536個の浮動小数点数)に変換します。
-
この数字のセットは、このテキストの「意味的な位置」を表します。
- 保存(インデックス作成):
- この数字のセットをベクトルデータベース(Vector DB)に保存します。
- 検索(検索):
-
質問があると、その質問も数字のセットに変換されます。
-
データベースは、どのテキストの数字が質問の数字に最も近いか(コサイン類似度)を計算し、そのテキストをいくつか取得します。
二、 長いテキストはどのように「圧縮」されていたのか?(核心原理)
これはあなたの質問の中で最もハードコアな部分です。このプロセスでは、テキストは2回圧縮されており、これが情報喪失の根源です。
1. 物理的な圧縮:スライス(チャンキング)
あなたが映画(長いテキスト)を見ていると想像してください。編集者がフィルムを無数の30秒の短いビデオ(チャンク)に切り刻みます。
- 問題: もし台詞が編集点をまたいでいる場合、例えば前半がセグメント1に、後半がセグメント2にあるとします。セグメント1だけを取得した場合、何を言っているのか全くわかりません。これがコンテキストの喪失です。
2. 意味的な圧縮:埋め込み(埋め込み)
これは最も抽象的なステップです。いわゆる「ベクトル化」とは、実際には極めて損失の大きい意味的圧縮です。
-
原理: 埋め込みモデルは500文字を読み、その500文字が何について述べているかを1536の次元(数字)で要約しようとします。
-
比喩: あなたが友人(長いテキスト)を誰かに紹介しようとしているとします。
-
完全な紹介(原文): 「彼の名前は小明で、辛いものが好きで、子供の頃に犬に噛まれたので犬が怖くて、最近失恋したばかりで…」
-
ベクトル化(圧縮後): [身長: 180, 体重: 70kg, 性別: 男, 感情指数: 0.2]
-
なぜ「悪い」のか?
-
この圧縮は詳細を失います。あなたの質問が「小明の子供の頃に何があったのか?」である場合、数字のセット(身長、体重)だけを見ても、「犬に噛まれた」という詳細を導き出すことはできません。
-
埋め込みは実際には、豊かなテキストを「曖昧な主旨」に圧縮します。「この段落は個人情報についてだ」と覚えていても、具体的な「電話番号」は忘れているかもしれません。
三、 なぜベクトルRAGはそんなに「悪い」ように聞こえるのか?
技術自体が悪いわけではなく、知識集約型のタスクを処理する際に、以下の3つの点で根本的な欠点があるからです。
1. 「曖昧さ」が「幻覚」を引き起こす
ベクトル検索は「類似度」に基づいています。
-
例: 「無糖の飲料」を検索します。
-
ベクトルの結果: 「糖入り飲料」を推奨する可能性があります。
-
理由: 数学的な空間では、「含糖」と「無糖」という単語は非常に近くにあります(どちらも糖と飲料について話しているからです)。ベクトルは重要な「無」という字を区別するのが困難です。転置インデックス(キーワード一致)はこのような間違いを犯しません。「無」という字に一致する必要があるからです。
2. 「スライス」が論理を破壊する
多くの複雑なドキュメント(法律契約書、技術マニュアルなど)は、段落をまたいだ理解を必要とします。
-
シナリオ: 定義が1ページ目にあり、具体的な実行手順が10ページ目にあります。
-
ベクトルRAG: 10ページ目の実行手順は取得できるかもしれませんが、1ページ目が切り離されているため、LLMはそこで言及されている専門用語の意味を全く理解できず、でっち上げ始める可能性があります。
3. 「ブラックボックス」により最適化が不可能
-
ユーザーが質問をしたとき、ベクトルデータベースが間違った断片を取得した場合、開発者はデバッグが困難です。
-
なぜこの1536個の数字のセットが別の数字のセットと「類似」と判断されたのかわかりません。そのため、システムの最適化が非常に難しくなります。
まとめ:なぜ私たちはまだベクトルRAGを使っているのか?
多くの欠点があるように聞こえますが、ベクトルRAGにはPageIndexにはない利点があります。それは「言葉の行間」を理解することです。
-
ユーザー: 「車がエンジンかからないんだ。」
-
ドキュメント: 「バッテリー上がりがエンジン始動不良の原因となることがあります。」
この場合:
-
PageIndex(キーワード) は失敗する可能性があります。ユーザーは「バッテリー」や「始動不良」と言っていないからです。
-
Vector RAG(ベクトル) は成功します。「エンジンかからない」と「始動不良」が意味的に同じことだと認識するからです。
結論: 元のベクトルRAGが「悪い」と感じられたのは、それが「曖昧な要約」だからです。一方、PageIndexは「正確な位置特定」です。 現在のトレンドは、テキストを圧縮しないことです。LLMが一度に100万字を読めるようになった今、私たちは「圧縮されていない原文」を直接LLMに渡し、「中間者(ベクトルモデル)」に頼るのではなく、最も賢いモデル自身に読ませる方向に傾いています。
なぜ意味的に分割した後にRAGを行わないのですか?なぜ段落をもっと細かく分割しないのですか?
あなたの直感は非常に鋭いです。実際、「セマンティックチャンキング」 と 「粒度を細かくする(Small-to-Big)」 は、現在のRAG最適化の2つの主要な方向性です。
誰もこれらを「やっていない」わけではなく、それぞれに新しい副作用が伴います。
これはケーキを切るようなものです:
-
固定サイズのチャンキング(従来):とにかく5センチごとに切る。シンプルで乱暴、模様を壊しやすい。
-
セマンティックチャンキング:模様に沿って切る。効果は良いが、非常に遅く、どこが「模様」の終わりかを定義するのが難しい。
-
より細かく切る:粉々にする。一口ごとに食べられるが、その破片が元々イチゴの上にあったのか、下のビスケットの底にあったのかわからない。
以下で、なぜこれらの2つのアプローチが問題を完全に解決しないのか、詳しく説明します。
一、 なぜ「セマンティックチャンキング」が全面的に普及しないのか?
セマンティックチャンキングとは、NLPモデルを使って「この段落は終わったかどうか」を判断し、終わったら切るというもので、文字数で機械的に切るのではありません。
完璧に聞こえますが、実装には3つの大きな落とし穴があります:
- 遅くて高コスト(レイテンシとコスト)
-
従来の文字数でのチャンキングは、Pythonで一行コード
text[0:500]で完了し、0.0001秒かかります。 -
セマンティックチャンキングは、モデルが記事を「読む」必要があり、隣接する文の類似度を計算したり、LLMに「ここで話題が変わったか」を判断させたりします。大きなファイルを処理するのに数分以上かかることもあります。リアルタイム性が要求されるシステムでは、これは受け入れられません。
- 「セマンティック」の境界が極めて曖昧
-
例: ある段落が最初に「製品価格」について述べ、続いて「返金ポリシー」について述べる。
-
「価格」が終わったところで切るべきか?しかし、もし切ってしまうと、ユーザーが「この製品の返金時の価格は?」と尋ねたとき、RAGは困惑します。「価格」は前のブロックに、「返金」はこのブロックにあり、関連性が断ち切られています。
- 依然として「グローバルな依存関係」を解決できない
-
たとえ段落単位で完璧に区切っても、その段落は数ページ前の定義に依存している可能性があります。
-
例えば、10ページの段落が「上記の合意に従って実行する……」と述べている。
-
セマンティックチャンキングはこの段落が完全であることを保証しますが、1ページ目の「上記の合意」を含めることはできません。
二、 なぜ段落をもっと細かく切らないのか?
「大きく切るとノイズが含まれるなら、文レベルに切って、検索された文をそのまま使えば最も正確なのでは?」と考えるかもしれません。
ここで、RAG分野で最も古典的なパラドックスが登場します:検索粒度 vs. 理解粒度。
細かく切りすぎると(例えば文単位で切ると)、以下の致命的な問題が発生します。
1. 代名詞問題(The Pronoun Problem)
-
原文: 「イーロン・マスクはSpaceXを設立した。それはロケット打ち上げコストを大幅に削減した。」
-
チャンキング後(細粒度):
-
ブロックA: 「イーロン・マスクはSpaceXを設立した。」
-
ブロックB: 「それはロケット打ち上げコストを大幅に削減した。」
-
検索: ユーザーが「何が打ち上げコストを削減したのか?」と尋ねる。
-
結果: ベクトルがブロックBを見つける。
-
LLMに渡す: LLMは「それはコストを削減した」を見る。LLMは「『それ』とは誰だ?」と疑問に思う。
-
結末: 細かく切りすぎたため、照応関係が失われた。この断片は無駄なデータになる。
2. 意味密度が低すぎる(Low Semantic Density)
-
ベクトル検索では、正確に位置を特定するために、ある程度の「情報量」を持つ段落が必要です。
-
短い文に切ると:「はい、同意します。」または「規定は以下の通り:」
-
これらの短い文から生成されるベクトルは非常に汎用的で、特徴がありません。ユーザーが検索すると、これらの短い文がノイズとして大量に出現し、有用な情報のランキングを押し下げます。
3. 断片から全体像を組み立てられない
-
LLMのウィンドウに5つのブロックを入れられるとします。
-
大きなブロックでのチャンキング: 5つの完全な段落を見ることができ、おおよその流れを把握できます。
-
極細のチャンキング: 5つの孤立した文を見ることになります。まるで5つのパズルのピースを与えられて、全体の絵を推測するようなもので、非常に困難です。
三、 現在の高度な解決策:Parent-Child Indexing(親子インデックス)
あなたが提起した2つの問題を解決するために、現在最も成熟しているアプローチは 「Small-to-Big」(小さな塊で検索、大きな塊をLLMに渡す) です。
これは妥協案であり、「細かく切る」と「細かく切らない」の両方の利点を組み合わせています:
- チャンキング段階:
-
Child Chunk(小さな塊): ドキュメントを非常に細かい文や小さな段落(例えば100文字)に分割します。ベクトル化と検索に使用します。小さな塊は意味が純粋で、検索精度が高いためです。
-
Parent Chunk(大きな塊): この小さな塊がどの大きな親段落(例えば1000文字)に属するかを記録します。
- 検索段階:
- システムはベクトルを使って「小さな塊」(例えば「それはコストを削減した」という文)を見つけます。
- 生成段階(重要なステップ):
-
システムはこの小さな塊をLLMに渡しません。
-
システムはIDを使ってその「親」(Parent Chunk)を見つけ、コンテキストを含む1000文字の完全な段落をLLMに渡します。
まとめ:
-
セマンティックチャンキングを使わない -> 遅すぎるため、代わりにスライディングウィンドウ(重複チャンキング)で境界問題を補う。
-
細かい粒度で生成しない -> コンテキストがないと理解できないため。
したがって、現在のトレンドは実際には:非常に細かい粒度で「狙いを定め」(インデックス)、非常に粗い粒度で「読む」(生成) ことです。そしてPageIndexは、このロジックの究極の形態です:キーワードで狙いを定め、全文を読む。
ベクトルを使わないRAGはこれらの問題を解決しましたか?
これは非常に素晴らしい追加質問です。簡単に答えると、「分割」と「コンテキスト」の問題を極めて見事に解決した一方で、致命的な新たな欠陥ももたらしました。
ベクトルなし RAG(PageIndex)は万能薬ではなく、むしろ「あえて逆方向に進む」力技の美学のようなものです。
これは、「計算力で知力を補う」取引だと考えることができます。
一、どの問題を完全に解決したのか?(得)
ベクトルなし RAG は「事前処理による分割」を放棄し、LLM の超長文コンテキスト能力を直接活用することで、先ほど述べた慢性的な問題を根本から取り除きました。
1. 「断片化」を完全に解決 (Solved: Fragmentation)
- Vector RAG の問題: 分割の途中で切れてしまい、段落をまたぐ論理が失われます。
- ベクトルなし RAG の解決策: どこで切るべきか分からないなら、いっそ切らない。
- キーワードを含むページ全体、場合によっては章全体を直接 LLM に投入します。
- 効果: 「代名詞の指示対象が不明確になる」、「段落をまたぐ定義」といった問題が瞬時に消えます。LLM が首尾一貫した原文を見ているため、「それ」が誰を指すのか、「上述のプロトコル」がどのプロトコルなのかを自力で理解できます。
2. 「正確性」の問題を解決 (Solved: Precision)
- Vector RAG の問題: 「1024」を検索して「1025」が出たり、珍しい人名を検索しても見つからなかったりします。
- ベクトルなし RAG の解決策: 転置インデックス(Ctrl+F のロジック)に戻ります。
- 効果: 「1024」という語を必ず含むページだけが見つかります。契約番号、SKU、コードエラー、人名などの厳密な指標では、正確率が70%から100%に向上します。
3. 「ブラックボックスと保守」の問題を解決 (Solved: Black Box)
- Vector RAG の問題: ベクトルデータベースはブラックボックスで、なぜこの無関係な文章が検索されたのか分かりにくいです。
- ベクトルなし RAG の解決策: ロジックが透明です。
- 効果: なぜこのページを呼び戻したのか?このページに3つのキーワードがあるからです。呼び戻しが正しくなければ、問題はキーワード抽出戦略にあり、修正は非常に簡単です。
二、どのような新しい問題をもたらしたのか?(失)
何事にも代償があります。ベクトルなし RAG は実際には、「意味理解」を犠牲にして「正確なコンテキスト」を得ているのです。そのため、2つの新たな課題が生じます。
1. 「言外の意味」を失う (Lost: Semantic Fuzziness)
これはベクトルなし RAG の最大の弱点です。
- 場面: ユーザーが「どうすれば節約できますか?」と検索したとします。文書には「プロセスを最適化してコストを削減する」と書かれています。
- Vector RAG: 見つけられます。「節約する」≈「コストを削減する」だと理解するからです。
- ベクトルなし RAG: 見つけられません。 文書に「節約する」という2文字がないからです。
- 救済策: 検索前に LLM で「Query Expansion(クエリ拡張)」を行い、ユーザーの質問を複数のキーワードに書き換える必要があります(節約する -> コストを削減する、支出を減らす、倹約する)。しかし、これは複雑さと遅延を増加させます。
2. 「大海の中から針を探す」計算力と費用の消耗 (Cost & Latency)
- Vector RAG: LLM に5つの断片(約1000 Token)だけを見せます。安価で高速です。
- ベクトルなし RAG: LLM に10ページの完全なページ(約10,000~20,000 Token)を見せることがあります。
- 費用: API 請求額が10倍から20倍に跳ね上がります。
- 遅さ: LLM が2万文字を読む場合と1000文字を読む場合では、最初の1文字が生成されるまでの遅延(TTFT)がまったく異なります。
- 迷子になるリスク(Lost in the Middle): LLM は200kのコンテキストをサポートすると謳っていても、実験によれば、コンテキストが長すぎると、LLM は中央部分の情報を見落としやすく、冒頭と末尾だけを覚えていることがあります。
三、最終判定:どこが優れているのか?
本質を理解してもらうために、「持ち込み可の試験」にたとえてみましょう。
| モード | たとえの場面 | 結果 |
|---|---|---|
| Vector RAG | 暗記カードでのカンニング: 先生は本を見せてくれず、試験前に本を細かく切って、メモ(Chunk)を作ることだけを許可します。試験中は、問題に応じてどのメモを取るべきか推測します。 | メモの切り方が悪かったり、どのメモを取るべきか当てられなかったりすると、落第します。 |
| ベクトルなし RAG | 本をめくりながら受ける試験: 先生は本を丸ごと持ち込むことを許可します。目次(インデックス)を使って該当する章をすばやく開き、そこから最初から最後まで読んで答えを探します。 | 完全な論理を理解でき、文脈を断片的に引用することもありません。ただし、本をめくって読む速度は遅く、疲れます。 |
四、現在のベストプラクティスは何か?
どちらかがもう一方を「置き換える」わけではありません。現在最も強力なアーキテクチャは、長所を補い合う Hybrid RAG(ハイブリッド RAG)です。
- 二経路検索:
- 一方では Vector を使って「意味的に関連する」内容を探します(「節約する」と「コスト」の問題を解決)。
- もう一方では Keyword を使って「完全一致する」内容を探します(「契約番号」の問題を解決)。
- 再ランキング (Rerank):
- この2経路で取得した内容を混ぜ、精密なモデルでスコアリングし、最良の上位 N 件を選びます。
- 大きなウィンドウで生成:
- どの方法で検索したかにかかわらず、「コンテキストウィンドウ」をできるだけ大きくします(例えば、ある段落を検索したら、その前後2000文字も併せて LLM に渡す)。現在は安価な長文モデル(Gemini 1.5 Flash や Claude Haiku など)を利用して読み取らせます。
結論:
ベクトルなし RAG は「コンテキストの断片化」と「正確性」という、最も痛い2つのエンジニアリング上の問題を解決しました。しかし、LLM の長文能力とあなたの財布の厚さに極めて大きく依存します。
続けて、「ハイブリッド RAG(Hybrid RAG)」の具体的なアーキテクチャをどのように構築するのかを知りたいですか?それとも、長文 RAG のコストを最適化する方法を見てみたいですか?