検索が当たらないとき、問いのほうに語を足して広げるという手があります。「ホテル代」と聞かれたら「宿泊費」も足して検索する形です。
実際に測ったところ、言い換えで聞いた問いでは40.0%が53.3%に上がりました。ところが元の語で聞いた問いでは1ポイントも動きません。
2種類の問いで実際に測りました。言い換えの問いでは13.3ポイント上がり、元の語の問いでは変わりません。
クエリ拡張がどの問いに効くのかを、実際に広げて測りました。用意したのは元の語で聞いた問い5件と、言い換えで聞いた問い5件です。
広げる処理も検索も本当に実行しています。足す語は同義語の辞書から取っており、そこを変えれば結果も変わります。
const widen = (qs) => {
let out = qs;
for (const [base, alts] of Object.entries(SYNONYM)) {
if (qs.includes(base)) out += alts.join('');
for (const a of alts) if (qs.includes(a)) out += base + alts.filter((x) => x !== a).join('');
}
return out;
};
元の語で聞いた場合(問い 5件) 問い そのまま 広げてから 広げた語数 宿泊費の上限は 67% 67% 11文字 日帰りの日当 67% 67% 4文字 前払の申請期限 33% 33% 6文字 備品の購入 33% 33% 5文字 報告書の提出期限 33% 33% 7文字 適合率@3 46.7% → 46.7% 再現率@3 90.0% → 90.0% 言い換えで聞いた場合(問い 5件) 問い そのまま 広げてから 広げた語数 ホテル代の限度額 33% 67% 9文字 出張手当は日帰りだと 67% 67% 2文字 仮払の申請 67% 67% 6文字 消耗品の購入 33% 33% 4文字 レポートの提出期限 0% 33% 6文字 適合率@3 40.0% → 53.3% 再現率@3 70.0% → 90.0%
上の表は全行が同じです。語を11文字ぶん足しても、67%が67%のまま。効果がありません。
理由は単純で、もともと語が一致しているからです。「宿泊費の上限は」という問いは、文書中の「宿泊費」にそのまま当たります。
そこに「ホテル代」「宿代」を足しても、文書側にその語はありません。足した語は空振りするだけで、順位は変わりません。
下の表では2行が動きました。「ホテル代の限度額」が33%から67%、「レポートの提出期限」が0%から33%です。
どちらも、文書中の語と違う言葉で聞かれていた問いです。「レポート」に「報告書」を足したことで、初めて当たるようになりました。
指標によって動き方が違う点も見ておいてください。適合率は13.3ポイント、再現率は20.0ポイント動いています。
広げると当たる文書が増えるので、取りこぼしはまず減ります。ところが上位3件の枠は限られているので、適合率のほうは伸びが小さくなります。指標の違いはnDCGの記事で扱っています。
すでに当たっている問いに語を足しても、空振りするだけ。
Retrieval allows LLMs to access relevant context at runtime.原文Docs by LangChain「Retrieval」 この内容の有効期限2027-02-18
検索する前に、問いへ語を足して広げます。文書を変えずに、当たる範囲を広げる手立てです。
クエリ拡張は、検索する前に問いのほうへ語を足す処理です。文書側には手を入れません。
同じ問題を解く手立ては複数あります。文書側を広げるか、問い側を広げるか、当たり方そのものを変えるかです。
クエリ拡張は真ん中です。文書を作り直さずに済むので、すでに大量の文書を入れてある構成でも後から足せます。
2番目は辞書を書かずに済みますが、1回の検索ごとにAIの呼び出しが増えます。応答時間と費用に効きます。
この処理が効いてくるのは、検索の結果をAIに渡す構成です。LangChainも、実際の用途の多くは検索と生成を組み合わせ、根拠のある文脈に沿った答えを作る方向に進むとしています。
検索が当たらなければ、渡す文書もありません。答えの質は、その手前で決まっています。
測ってみて実際的だったのは、検索して0件だった問いを集めて、そこだけで測ることでした。前の節でも、動いたのは0%だった問いです。全体の平均で測ると、効いた分が薄まって見えます。
But most real-world applications go one step further: they integrate retrieval with generation to produce grounded, context-aware answers.原文Docs by LangChain「Retrieval」 この内容の有効期限2027-02-18
関係のない文書が上位に来ます。足した語が別の文脈で使われていると、そちらに引っ張られます。
クエリ拡張は語を足す処理なので、足しすぎれば当たる範囲も広がりすぎます。
「精算」に「清算」を足すと、会社の清算について書かれた文書も当たります。同じ字でも意味が違う場面です。
前の節の計測でも、広げた語数と効果は比例していません。11文字足しても効果0、6文字足して0%から33%という結果でした。
問いが長くなると、照合する語も増えます。語の数だけ索引を引くことになるので、応答時間に効きます。
AIに言い換えを作らせる方式では、さらに1回の呼び出しが加わります。検索の前段が重くなるという形です。
判断は前の節の表から出ます。元の語で聞かれているなら、広げても得るものがありません。
実際の問いを集めて、文書中の語と一致しているかを見てください。一致していない問いが多いなら効きます。同じ問題への別の手立てはハイブリッド検索の記事で扱っています。
語を足すほど効くわけではない。当たっていない問いにだけ効く。
A knowledge base is a repository of documents or structured data used during retrieval.原文Docs by LangChain「Retrieval」 この内容の有効期限2027-02-18
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る