検索する文字列を、問いから生成AIに書かせた仮の答えに置き換える手法があります。答えの中身が正しいかは問いません。
実際に測ったところ、nDCGは0.542から0.984に上がりました。ただし仮の答えを外した場合は0.139まで落ちます。
問いをそのまま使う場合と、仮の答えに置き換える場合を測りました。当たれば大きく上がり、外すと大きく落ちます。
HyDEで検索する文字列を差し替えると成績がどう動くのかを、実際に走らせて測りました。使ったのは社内規程を模した文書13件と、語が食い違う問い5件です。
仮の答えは文書の中身を見ずに、その分野で書かれていそうな文章として用意しました。生成AIに書かせる部分を手で置いた形です。外した場合の比較用も別に用意しています。
const modes = [
['問いをそのまま', (q) => q],
['仮の答え', (q) => HYPO[q]],
['問い+仮の答え', (q) => `${q}${HYPO[q]}`],
['外した仮の答え', (q) => WRONG[q]],
];
for (const [label, make] of modes) {
for (const { q, rel } of ALT_QUERIES) {
const ids = bm25(make(q)).map((x) => x.i);
p += precisionAt(ids, rel, K); r += recallAt(ids, rel, K); g += ndcgAt(ids, rel, K);
}
}
探すのに使った文字列 適合率@3 再現率@3 nDCG@3 問いをそのまま 0.400 0.700 0.542 仮の答え 0.600 1.000 0.984 問い+仮の答え 0.600 1.000 0.984 外した仮の答え 0.133 0.200 0.139 問い 問いのまま 仮の答え 外した仮の答え ホテル代の限度額 1 / 2 2 / 2 0 / 2 出張手当は日帰りだと 2 / 2 2 / 2 0 / 2 仮払の申請 2 / 2 2 / 2 1 / 2 消耗品の購入 1 / 1 1 / 1 0 / 1 レポートの提出期限 0 / 2 2 / 2 1 / 2
上の表を見てください。仮の答えに置き換えるとnDCGが0.542から0.984になりました。再現率@3は1.000で、正解をすべて上位3件に拾えています。
3行目は問いと仮の答えを繋げたものです。結果は仮の答えだけと同じ0.984でした。
問いの部分は7.6文字、仮の答えは35.0文字です。長いほうの語が結果を決めています。この題材では、問いを残す意味はありませんでした。
最後の行が、仮の答えを取り違えた場合です。nDCGは0.139で、問いをそのまま使った0.542を大きく下回ります。
問いごとの内訳では、5件のうち3件が0件になりました。関係のない条文に引っ張られた結果です。
当たれば0.984、外せば0.139。振れ幅が大きい。
The document captures relevance patterns but is unreal and may contain false details.原文Gao et al.「Precise Zero-Shot Dense Retrieval without Relevance Labels」 この内容の有効期限2027-02-18
問いに対する仮の答えを生成AIに書かせ、その文章で検索します。仮の答えが事実として正しいかは問いません。
HyDEは、問いではなく、問いに対する仮の答えで検索する手法です。仮想的な文書という意味の頭文字を取った呼び名です。
問いは「ホテル代の限度額」という短い語句です。文書は「宿泊費の上限は1泊12000円とする」という文です。形が違うので語が噛み合いません。
仮の答えを書かせると、出てくるのは文書に近い形の文章になります。検索の相手と同じ形にそろえるのが狙いです。
原論文も、問いを与えると、まず指示に従う言語モデルに対して例示なしで仮の文書を生成させると説明しています。手順としてはこれだけです。
同じ論文は、この文書について関連性のパターンは捉えているが実在せず、誤った細部を含みうると書いています。
金額が間違っていても構いません。語の方向さえ合っていれば検索は当たります。前の節で0.984まで上がったのも、金額ではなく語が合っていたからです。
仮の答えは私が書いています。その分野の言い回しを知っている状態で書いたので、実際の生成AIより有利になっている可能性があります。逆に言えば、HyDEが賭けているのはこの点です。生成AIが対象分野の言葉を知らなければ、外した場合の0.139のほうに寄ります。
Given a query, HyDE first zero-shot instructs an instruction-following language model (e.g. InstructGPT) to generate a hypothetical document.原文Gao et al.「Precise Zero-Shot Dense Retrieval without Relevance Labels」 この内容の有効期限2027-02-18
仮の答えを利用者に見せてしまうことです。仮の答えは検索のための道具で、答えそのものではありません。
HyDEでいちばん危ないのは、仮の答えが利用者の目に触れることです。中身が正しい保証はありません。
仮の答えは検索の入力として使ったら役目が終わります。答えを作る段には渡しません。
原論文も、2つ目の段が生成された文書を実在の資料に接地させ、埋め込みの絞り込みが誤った細部を落とすとしています。落とす仕組みが入っている前提の手法です。
前の節の実測では、外した仮の答えでnDCGが0.139まで落ちました。問いをそのまま使うより悪い数字です。
社内固有の呼び名や、業界の外では通じない略語が多い文書では、生成AIが的外れな文章を書きます。その場合はHyDEを入れないほうがましです。
検索のたびに生成AIを呼びます。この待ち時間は利用者にそのまま乗ります。検索そのものより長くかかることもあります。
言い換えを複数作る方式との比較はマルチクエリの記事で扱っています。あちらは検索回数が増え、こちらは生成の待ち時間が増えます。
仮の答えは検索の道具。答えに混ぜない。
This second step ground the generated document to the actual corpus, with the encoder's dense bottleneck filtering out the incorrect details.原文Gao et al.「Precise Zero-Shot Dense Retrieval without Relevance Labels」 この内容の有効期限2027-02-18
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る