文書を検索できるようにするには、まずどの単位で切るかを決めます。ここを機械的に決めると、答えが隣の塊に逃げます。
506文字の本文で試したところ、40文字ごとに切った場合は5問中2問で、問いの語と答えの数値が別の塊に入りました。
本文506文字を5通りに分けて実際に数えました。40文字ごとでは3問、行ごとなら5問すべてが同じ塊に入ります。
チャンク戦略の良し悪しを、実際に切って数えました。用意したのは社内規程を模した本文506文字と、問い5件です。
分割も判定も本当に実行しています。数えたのは問いの語と、答えの数値が、同じ塊に入っているかです。
const FIND = [
{ q: ['宿泊費', '12000'], name: '宿泊費の上限' },
{ q: ['日帰り', '1000'], name: '日帰りの日当' },
{ q: ['前払', '7営業日'], name: '前払の期限' },
{ q: ['備品', '5000'], name: '備品の上限' },
{ q: ['報告書', '3営業日'], name: '報告書の期限' },
];
// 語と答えが両方そろう塊が1つでもあれば、その問いは当たり
const hit = (chunks) => FIND.filter(({ q }) => chunks.some((c) => q.every((w) => c.includes(w)))).length;
本文 506文字を分け方を変えて切り、問いの語と答えが同じ塊に入るかを数える 分け方 かたまり数 平均文字数 語と答えが同じ塊に入った数 40文字ごと 13個 39文字 3 / 5 80文字ごと 7個 72文字 5 / 5 160文字ごと 4個 127文字 5 / 5 行ごと 13個 39文字 5 / 5 行ごと+前行20字 13個 39文字 5 / 5
1行目と4行目を見比べてください。どちらも13個・平均39文字なのに、3問と5問で違います。
この2行が示しているのが要点です。塊の数も大きさも同じで、違うのは切る位置だけ。それで当たり方が変わります。
40文字ごとに切ると、1つの決まりの途中で切れます。「日帰りは1000円とする」の「1000」の前で切れれば、語と答えが別の塊になります。
80文字ごとにすると5問すべて当たりました。切れ目が決まりをまたがなくなるためです。160文字ごとでも当たります。
代償は渡す量です。160文字ごとでは平均127文字で、行ごとの39文字の3倍以上あります。関係のない決まりも一緒に渡すことになります。
正直に書いておくと、行ごとに前の行の20文字を足した設定でも、数字は5問のままでした。すでに5問すべて当たっているので、伸びしろがありません。
重なりが効くのは、切れ目が決まりの途中に来てしまう場合です。40文字ごとの設定に重なりを足せば、3問から増える可能性があります。
塊の数も大きさも同じ。違うのは切る位置だけ。
b Controls to what degree document length normalizes tf values.原文Elasticsearch Reference「Similarity settings」 この内容の有効期限2027-02-18
文書を切る単位と位置、そして重なりを持たせるかどうかです。この3つが検索の当たり方を決めます。
チャンク戦略は、文書を検索できる単位に切り分けるときの決め方です。切った塊が、検索の対象にも、AIに渡す単位にもなります。
前の節で効いたのは1番目でした。2番目を同じにしても、1番目が違えば結果が変わります。
塊の大きさは、検索の点の付け方にも影響します。多くの検索方式は文書の長さで点を割るためです。
Elasticsearchでも、文書の長さが語の出現回数をどの程度打ち消すかを制御する値が用意されています。塊の大きさがばらつくと、この補正の効き方もばらつきます。
見落としやすい点があります。検索に適した大きさと、AIに渡すのに適した大きさは同じとは限りません。
検索は小さいほうが的が絞れます。回答は前後の文脈があったほうが正確です。この食い違いを、親子の関係で解く形もあります。
測ってみて有効だったのは、当たらなかった問いについて、どこで切れているかを実際に見ることでした。前の節でも、40文字ごとの設定で外した2問は、数値の直前で切れていました。切り方の直し方が、そこから決まります。
k1 Controls non-linear term frequency normalization (saturation).原文Elasticsearch Reference「Similarity settings」 この内容の有効期限2027-02-18
文字数だけで決めることです。同じ文字数でも切る位置が違えば、当たり方は変わります。
チャンク戦略でいちばん多い失敗は、文字数を決めて終わりにすることです。前の節のとおり、同じ39文字でも3問と5問に分かれます。
この失敗は表に出にくい種類です。検索としては塊が返ってきます。エラーも出ません。
返ってきた塊に答えの数値が入っていないだけです。AIはその塊を読んで、書いてある範囲で答えます。数値が切れていることは指摘されません。
確かめるのは簡単です。実際に聞かれる問いを5件用意し、問いの語と答えが同じ塊に入るかを数える。前の節でやったことです。
この判定はコードで書けます。同じ塊に両方が含まれるかを見るだけなので、変更のたびに回せます。試験の作り方はシミュレーション評価の記事で扱っています。
外れたときに塊を大きくするのは、応急処置としては効きます。ただし渡す量が増え、関係のない記述も一緒に入ります。
前の節では、160文字ごとにすると平均127文字になりました。行ごとの39文字と比べて3倍以上です。当たったかどうかだけでなく、渡す量も並べて見てください。渡す量と費用の関係はLlamaIndexの記事で扱っています。
文字数を決めても、切る位置を決めたことにはならない。
BM25 similarity ( default ) TF/IDF based similarity that has built-in tf normalization and is supposed to work better for short fields (like names).原文Elasticsearch Reference「Similarity settings」 この内容の有効期限2027-02-18
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る