検索の的を絞るには、文書を小さく切るのが効きます。ところが小さく切った文をそのままAIに渡すと、答えが入っていないことがあります。
実際に測ったところ、文で検索して文だけを渡す構成では5問中1問しか答えが入っていませんでした。文で検索して条文を渡すと5問すべて入ります。
3通りの組み合わせで実際に数えました。文だけを渡すと5問中1問、条文を渡すと5問すべてに答えが入ります。
親子ドキュメント検索が何を解くのかを、実際に測って確かめました。用意したのは見出しの文と金額の文が分かれた条文8件です。
検索も判定も本当に実行しています。数えたのは上位1件として渡した文字列に、答えの数値が入っているかです。
const PARENT = [
'宿泊費について定める。国内出張の場合、1泊あたり12000円を上限とする。超過分は自己負担とする。',
'日当について定める。国内出張は1日2000円、日帰りの場合は1000円を支給する。',
'前払について定める。希望する場合は出発の7営業日前までに申請すること。',
/* ... 全8件 ... */
];
// 子は文単位に割る
PARENT.forEach((t, pi) => t.split('。').filter(Boolean)
.forEach((s) => CHILD.push({ text: s + '。', parent: pi })));
親 8件 / 子 19件。上位1件として渡した文字列に、答えが入っているか 構成 答えが入っていた 渡した平均文字数 親で検索して親を渡す 5 / 5 39文字 子で検索して子を渡す 1 / 5 15文字 子で検索して親を渡す 5 / 5 39文字
真ん中の行が1/5です。文で検索して、当たった文だけを渡すと、答えの数値が入っていません。
原因は本文の書かれ方です。「宿泊費について定める」という文には宿泊費という語はあっても、金額は書かれていません。金額は次の文にあります。
検索としては正しく当たっています。問いの語を含む文が1位に来ました。ところが渡した文には、聞かれた答えが入っていません。
3行目が解き方です。文で検索して、その文が属する条文を渡します。当てるのは小さい単位、渡すのは大きい単位という分け方になります。
結果は5/5です。検索の的が絞れたうえで、答えを含む条文全体が渡ります。
代償は明確です。15文字が39文字になりました。2.6倍です。
この条文は短いので39文字ですが、実際の規程はもっと長くなります。条文が長いほど、この差は開きます。渡す量と費用の関係はLlamaIndexの記事で扱っています。
検索は当たっている。渡した文に答えが入っていないだけ。
Query it and supply the retrieved content as context to the LLM (2-Step RAG) .原文Docs by LangChain「Retrieval」 この内容の有効期限2027-02-18
小さい単位で検索し、当たった単位が属する大きい単位を渡します。単位を1つに決めない構成です。
親子ドキュメント検索は、検索する単位と、AIに渡す単位を別々に決める構成です。小さく検索して、大きく渡します。
この構成が生まれる理由は、要求が食い違うためです。検索は小さいほど的が絞れ、回答は大きいほど文脈がそろいます。
1つの単位に決めようとすると、どちらかを諦めることになります。前の節の1行目と2行目が、その2つの端にあたります。
そもそもの前提として、AIは渡された内容から答えます。LangChainの説明でも、検索した内容を文脈としてモデルに渡すという2段の流れが示されています。
同じ文書では、この形が検索を組み合わせた生成の基礎であり、その場に固有の情報でモデルの答えを補強するものだとされています。渡す内容が薄ければ、答えも薄くなります。
決め方の目安は、親が「答えが完結している単位」になっているかです。前の節の条文は、その条件を満たしています。
測ってみて分かったのは、この構成が要るかどうかは、本文の書かれ方で決まるということでした。問いの語と答えが同じ文にある文書なら、子だけ渡しても足ります。分かれている文書だと、前の節のように1/5まで落ちます。
This is the foundation of Retrieval-Augmented Generation (RAG) , enhancing an LLM’s answers with context-specific information.原文Docs by LangChain「Retrieval」 この内容の有効期限2027-02-18
親を大きくしすぎることです。渡す量が増え、関係のない記述まで一緒に渡ります。
親子ドキュメント検索でやりがちなのは、安全側に倒して親を大きく取ることです。答えは確実に入りますが、代償があります。
LangChainも、モデルの限界として文脈が有限であり、資料の全体を一度に取り込めないことを挙げています。
親を章単位にすれば答えは入ります。ところが1件で数千文字になり、上位3件を渡した時点で上限に近づきます。
量だけの問題ではありません。大きい単位には、その問いに関係のない記述も含まれます。
前の節の条文は3文でしたが、章単位なら数十文になります。読む側は、その中から答えを探すことになります。
組む前に測れます。問いを5件用意して、問いの語と答えが同じ文にあるかを見るだけです。
同じ文にあるなら、この構成は要りません。分かれているなら、親をどこまで広げれば答えが入るかを数えてください。分け方そのものの話はチャンク戦略の記事で扱っています。
親を大きくすれば答えは入る。関係のない記述も一緒に入る。
Finite context : they can’t ingest entire corpora at once.原文Docs by LangChain「Retrieval」 この内容の有効期限2027-02-18
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る