クエリ変換 — 質問と文書の言葉のずれを埋める
ユーザーの質問がそのままでは検索に向かない理由を理解し、HyDE・マルチクエリ・クエリ分解・ステップバックを使い分けられるようになる。どの手法がどのずれに効くかを判断できる。
- 検索が外れる原因の多くは「質問の言葉」と「文書の言葉」のずれ。質問は短く口語的で、文書は長く専門的なので、そのまま埋め込むと意味空間で離れる。
- HyDEは仮の回答をLLMに書かせ、その回答文を検索クエリにする。文書と同じ文体・語彙になるため類似度が正しく効く。事実は間違っていてよく、必要なのは語彙だけ。
- 複数の話題を含む質問はクエリ分解、曖昧で広い質問はステップバック、言い換えの揺れにはマルチクエリ。どのずれに効く手かを見極めてから選ぶ。
ユーザーは「なんか遅いんだけど」と聞き、文書には「レイテンシの悪化要因とチューニング指針」と書かれている。この2つを埋め込んで内積を取っても、うまく近づきません。検索が外れる原因の多くはコーパスの不足ではなく、質問と文書の言葉のずれにあります。
チャンク分割が文書側を検索しやすく整える工程だとすれば、クエリ変換は質問側を文書に寄せる工程です。
横にスクロール
ずれには種類がある
手法を選ぶ前に、どのずれが起きているかを見分けます。
| ずれの種類 | 症状 | 効く手法 |
|---|---|---|
| 文体・語彙のずれ | 短い口語の質問が、専門的な文書と近くならない | HyDE |
| 言い換えの揺れ | 同じ意図でも聞き方によって当たったり外れたり | マルチクエリ |
| 複数の話題が混在 | 1つの話題にだけ寄った文書ばかり返る | クエリ分解 |
| 曖昧・広すぎる質問 | 細かすぎる文書が返り、全体像の説明が引けない | ステップバック |
| 文脈依存の指示語 | 「それ」「その設定」が解決できず的外れになる | 会話履歴からの書き換え |
HyDE:仮の回答を書かせて、それで検索する
HyDE(Hypothetical Document Embeddings) は発想の転換です。質問を検索クエリにする代わりに、LLMに仮の回答を書かせ、その回答文で検索します。
元の質問 : 「なんか遅いんだけど」
LLMに仮回答を生成させる
「レスポンスが遅い原因としては、データベースのクエリ実行時間、
ネットワークのレイテンシ、キャッシュのヒット率低下などが
考えられます。まず各層の処理時間を分解して…」
この仮回答を埋め込んで検索する
→ 「レイテンシ」「クエリ実行時間」「キャッシュヒット率」といった
文書と同じ語彙・同じ文体になるため、正しく近傍が引ける
ここが直感に反するところですが、仮回答の事実が間違っていても構いません。必要なのは「その話題の文書がどんな語彙と文体で書かれているか」という当たりであって、内容の正確さではありません。生成した仮回答は検索にだけ使い、最終的な回答は実際に引いた文書から作ります。
知識が全く無い領域では、LLMが的外れな仮回答を書き、そちらへ引きずられて検索が悪化します。社内固有の概念や新しい製品名では特に起きやすい失敗です。またLLM呼び出しが1回増えるので、レイテンシとコストが乗ります。元のクエリでの検索結果と、HyDEでの検索結果をRRFで統合すれば、悪化した場合の被害を抑えられます。
マルチクエリ:言い換えを複数投げる
同じ意図でも聞き方はいくつもあり、どの言い方をするかで結果が変わるのは望ましくありません。マルチクエリは、LLMに元の質問の言い換えを3〜5本作らせ、それぞれで検索して結果を統合します。
元の質問: 「認証が失敗する原因は?」
生成した言い換え
1. ログインできない場合のトラブルシューティング
2. 認証エラーの一般的な原因と対処法
3. トークンの検証に失敗するケース
3本それぞれで検索 → RRFで統合 → 上位を採用
統合に RRF を使うのは、ハイブリッド検索と同じ理由です。複数の言い換えから支持された文書が上に来るという投票的な性質が働き、1本の言い方に依存しなくなります。
クエリ分解:話題ごとに分けて引く
「AとBの違いと、それぞれの設定方法を教えて」のような質問は、1本のベクトルにすると A と B の中間の曖昧な位置に落ちます。クエリ分解は、これを独立した副質問へ分けます。
元の質問: 「トークンバケットとリーキーバケットの違いと、
それぞれの設定方法は?」
分解
1. トークンバケットの仕組み
2. リーキーバケットの仕組み
3. トークンバケットの設定パラメータ
4. リーキーバケットの設定パラメータ
各副質問で検索 → 結果をまとめて文脈に入れる
副質問ごとに文書を引くので、すべての話題について十分な文脈が揃います。1本のクエリでは、たいてい片方の話題の文書ばかりが上位を占めます。
分解には逐次的な形もあります。「Xを作った会社の本社はどこ?」のように、前段の答えが次の検索に必要な場合は、1つ目を解いてから2つ目のクエリを組み立てます。これはReActのような推論と行動のループと地続きで、自己改善型RAGの話題につながります。
ステップバック:一段抽象化して聞き直す
細かすぎる質問は、細かすぎる文書しか引けません。ステップバックプロンプティングは、元の質問から一段抽象度を上げた質問を作り、両方で検索します。
元の質問 : 「N+1問題が起きたとき、eager loading の
設定はどう書けばいい?」
ステップバック : 「ORMにおけるN+1問題とは何か、どう解決するか」
両方で検索して統合
→ 具体的な設定例と、前提となる原理の両方が文脈に入る
原理を説明した文書が入ることで、LLMが設定例を正しく解釈して応用できるようになります。具体例だけを渡すと、状況が少し違うだけで誤った適用をしがちです。
会話履歴からの書き換え(最も見落とされる)
マルチターンの対話では、質問が単独では意味をなさないことが大半です。
ユーザー: 「レートリミッタの設計を教えて」
アシスタント: (回答)
ユーザー: 「それの分散環境版は?」 ← 「それ」が解決できないと検索は必ず外れる
検索の前に、会話履歴を使って質問を自己完結な形に書き換える工程が要ります。
書き換え後: 「レートリミッタを分散環境で実装する場合の設計」
これは技術的には最も単純ですが、入れ忘れによる被害が最も大きい工程です。チャット形式のRAGで「2回目以降の質問から急に精度が落ちる」なら、まずここを疑ってください。
クエリ変換はどれもLLM呼び出しを増やすので、レイテンシとコストに直結します。全部入れると1回の質問で5回以上LLMを呼ぶことになりかねません。失敗しているクエリを20件集めて分類するのが先で、ずれの種類が分かれば必要な手は1〜2個に絞れます。ほとんどの場合、会話履歴の書き換えと、HyDEかマルチクエリのどちらか一方で足ります。
まとめ
- 検索が外れる主因は質問と文書の言葉のずれ。手法を選ぶ前に、どの種類のずれかを見分ける。
- HyDE は仮の回答をLLMに書かせて検索する。事実は間違っていてよく、必要なのは文書と揃った語彙と文体。知識の無い領域では逆効果になりうるので元クエリの結果とRRFで統合すると安全。
- マルチクエリは言い換えの揺れに、クエリ分解は複数話題に、ステップバックは抽象度不足に効く。
- 会話履歴からの書き換えは技術的に最も単純だが、入れ忘れの被害が最も大きい。2回目以降の質問で精度が落ちるならまずここ。
- どれもLLM呼び出しが増える。失敗クエリを分類してから必要な手だけを入れる。
RAG設計パターンの記事ガイド
クエリ変換 — 質問と文書の言葉のずれを埋めるを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
RAG
比較で見る軸
難易度: advanced / カテゴリ: RAG設計パターン / タグ数: 5
導入後に効く点
HyDEは仮の回答をLLMに書かせ、その回答文を検索クエリにする。文書と同じ文体・語彙になるため類似度が正しく効く。事実は間違っていてよく、必要なのは語彙だけ。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- RAG設計パターン
- タグ数
- 5
判断チェックリスト
- 自社の用途が「RAG / クエリ変換」に近いか確認する。
- 強みである「検索が外れる原因の多くは「質問の言葉」と「文書の言葉」のずれ。質問は短く口語的で、文書は長く専門的なので、そのまま埋め込むと意味空間で離れる。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。