到達範囲・新しさ・far の票¶
Status: 実測を記録し、2.6 系の計画を示す。本ページは 3 つの計測と 2 つの設計を 1 つの記述に
まとめ、何が確定し、何が出荷され、残りを次の系がどうするかを述べる。reach 設定の機構は
SCAN_WINDOW_REACH_DESIGN.md に、計測は benchmarks/measurements/ の下記の名前にある。
1. 一段落で¶
ベクトル走査窓は費用の上限として文書化されていた。それは新しさの優遇 (recency prior) でも あった — 最新の行だけを順位付けすることで、最近の答えはどれも小さな場で勝てばよくなる。古い行に 届くように窓を広げるとその優遇が消え、最近の答えで NDCG@10 が 20 点落ちた。窓をそのままにして その下の行を 2 本目の順位付きリストとして足すと優遇は保たれた — 出荷済みのリストは全クエリで 同一だった — が、2 本目のリストは 1 本目と同じ強さで投票し、その 10 票が 1 票しか持たない 最近の答えを押し出して、広い窓の損失の 3 分の 1 を払った。far の行が何票投じてよいかを 抑えることが最後の構造的なノブで、それが何を買おうと、残る問いは far の 1 票がいくらの価値を 持つべきか、であり、それは採点の決定である。2.6 系はそれを、いずれ必要になる時間重み付きの 検索と一緒に、既にある 1 つの計器で 1 つの設計として決める。
2. 窓の正体¶
results-scan-window-default-ab.md。LongMemEval、保存 237,654 文書、出荷既定の実 recall 経路、
答えが 10,000 行の窓のどちら側にあるかでクエリを 2 層に分け、near コホートを 12 rotation、
層あたり 240 対。replicate 対照は桁まで再現したので、以下の差はすべて窓であって他ではない。
| 窓 10,000 → 200,000 | Δ NDCG@10 |
|---|---|
| 答えが窓の中 (near) | −20.19 ± 1.70 |
| 答えが窓の下 (far) | +4.93 ± 0.90 |
切り捨ては起きていない: 全呼び出しが 10 行返し、ゲートの fallback は発火しなかった。near の損失は
reciprocal-rank fusion 内の順位の押し出しである — 正確には、ベクトル腕は融合に上位 limit 行を
渡すので、10,000 候補の中で 3 位だった最近の答えが 200,000 候補の中で 30 位になると、それは
リストの下にいるのではなくリストから消え、票が無くなる。
同じ run のもう 2 つの読みが以降のすべてを形作る。窓 50,000 は 200,000 より far 層の品質を多く 買った (+12.87 対 +6.06)。far の答えは深さ 20,000〜29,500 にあり、広い窓はそれらを 150,000 行 多く競わせただけだからである: 答えより先へ到達しても、費用だけがかかって何も買えない。 また 窓 300,000 と 500,000 は全 cell で一致した: 窓がコーパスを覆えばその値は意味を失うので、大きい 既定値はコーパスがそれより小さい利用者には無償である。
結論は数ではなく設計上の欠陥だった: 1 つの設定が 2 つの仕事をしていて、そのあいだはどちらも 動かせない。
3. 到達範囲を優遇から分離する¶
SCAN_WINDOW_REACH_DESIGN.md は 2 つの仕事に 2 つの設定を与えた。窓は near リストのまま、
出荷どおりに順位付けされる。CPERSONA_VECTOR_REACH が far リスト — 走査位置 [窓, reach) の
中でコサイン上位の行 — を融合の順位付きリストとしてもう 1 本足す。既存のリストは触られない
ので既存の行は票を保ち、far の行は追加しかできない。時間項は意図的に持たない: far の票が near の
票より軽くあるべきかは採点の問いであり、設計はそれを採点を持つ系に残した。
results-scan-window-reach-ab.md、同じ計器、同じ規則:
| reach 200,000、far リスト 10 行 | Δ NDCG@10 |
|---|---|
| near | −6.67 ± 0.85 |
| far | +3.87 ± 0.88 |
構造の主張は成立した: near リストは 480 対のうち 480 で id も順序も同一、窓と等しい reach は 出荷どおりの答えを厳密に再現し、replicate は桁まで再現した。near 層が失った点はすべて、 2 本のリストが存在した後の融合で失われている。
機序は far リストの票である。reciprocal-rank fusion は載っているリストごとに 1 / (k + rank + 1)
を与えるので、far リストの 1 位は near リストの 1 位とまったく同じ票を持つ。損失した 84 の
near クエリでは 251 行がそれまで無かった top10 に入り、そのうち 187 (75%) は far リストの
票しか持たない行だった。それらはベクトル票しか持たない最近の答えを押し出した。字句票も持つ
最近の答えは生き残った。far の利得が小さいのは鏡像の理由による: 1 票の far の答えは 2 票の
near 行のどれにも負け、同順位の near 行とは同点で、near の側が先に融合される。
探索的な掃引がさらに絞った。near の費用は到達範囲にほとんど依らない — 50,000 で −5.97、
300,000 で −8.49 — 一方で far の利得は強く依る — 50,000 で +10.20、300,000 で +4.25。
押し出すのは 10 個の全強度の票であって、それが引かれた深さではない。limit=100 では損失が
2 倍以上になり、押し出す行は 2 票ずつ持って来る。100 行の字句リストがほぼ全てと重なるからである。
出荷済: CPERSONA_VECTOR_REACH、既定 off、既定でビット一致。測定済みの費用を
behavior-contracts.md §4 に持つ opt-in である。
4. far の票を数で抑える¶
CPERSONA_VECTOR_FAR_LIMIT は far リストが融合に届く前に min(limit, N) 行に切る — 候補数の
設定であり、どの far 行が投票してよいかを変え、行の採点は何も変えない。reach の結果が残した
唯一の構造的ノブで、reach を 200,000 に固定し、far リストを 1・2・3・5・10 行にし、規則を
「near は −1.0 以内、far は全長リストの利得から 1 点以内」として登録された
(prereg-scan-window-far-limit-ab.md)。
results-scan-window-far-limit-ab.md、同じ計器、reach 200,000:
| far 行数 | Δ near | Δ far |
|---|---|---|
| 1 | −2.73 ± 0.48 | +1.32 ± 0.70 |
| 2 | −4.35 ± 0.63 | +1.87 ± 0.79 |
| 3 | −5.06 ± 0.70 | +2.24 ± 0.85 |
| 5 | −5.61 ± 0.75 | +3.25 ± 0.91 |
| 10 | −6.67 ± 0.85 | +3.87 ± 0.88 |
対照はすべて成立し — 全長リストは前回の run を桁まで再現し、near リストは全クエリで同一、損失は
長さに対して単調に減った — どの長さも通らなかった: far の行が 1 つでも 2.73 点かかり、規則の
両側は交わらない。理由は算術である。どのリストでも 1 位は 1 / (k + 1)、単一リストが投じうる
最大の票を持つので、far リストの 1 位は near リストの 1 位と同点で、2 票目を持たない 2 位以下の
near 行すべてに勝つ。数は far の 2〜10 票目を取り除ける — それが −6.67 から −2.73 までの距離
である — が、1 行のリストもリストであり、その 1 位は全強度で投票する。候補数のノブは尽きた。
残るのはその最初の票の重みである。
出荷済: CPERSONA_VECTOR_FAR_LIMIT、既定 off (応答の limit)、既定でビット一致。reach と同じく
測定済みの効果を文書に持つ opt-in である。
5. 3 つの計測が確立したこと¶
- 窓は名前の無い recency prior である。 この計器での near 層の価値は 20 点。到達範囲を伸ばす 変更はどれも、その優遇を別の手段で供給するか、その値段を払う。
- 優遇は候補の段階で保存できる。 2 本目のリストは 1 本目の票をそのまま残す — 論証ではなく クエリごとに実測した。
- 答えより先へ届いても費用だけで何も買えない。 窓でも far リストでも、利得は到達範囲が答えを ちょうど覆うところで最大で、先へ行くほど落ちる。コーパスの末尾を越えた到達範囲は不活性である。 「できるだけ大きく」はどちらの設定にも誤った形である。
- 押し出すのは行ではなく票である。 全強度の far 行は 1 票の最近の答えに勝つ。そういう行が 何個あるかが損失の大きさを決め、1 つがいくらの価値かが損失があるかどうかを決める。前者は 数でノブがあり、後者は重みで — まだ — ノブが無い。
- 深さは押し出された答えを救わない。 行数を増やせば全リストが深くなり far の行が字句票を
拾う。
limit=100では損失は小さくならず大きくなる。
6. 2.6 系の計画: 値段の付いた far の票を、新しさと一緒に設計する¶
6.1 なぜ採点の変更で、なぜ待つのか¶
これまで出荷したものはすべて融合の算術に触れていない: リストはリストで、票は
1 / (k + rank + 1) である。far の票を near の票より軽くすることは融合が計算するものを変える。
2.5 系が出荷するのは既定で出荷済みの挙動を保ち、答えが動いたのは壊れたからか変わったからかを
問わずに soak できる変更である。融合が票に付ける値段の変更は、採点を再定義する系のために
取っておき、同じ層に触れるもう 1 つの変更と一度に設計する。
6.2 形: 1 つの prior と、その特殊例¶
recency prior とは、行がどれだけ遡った位置にあるか — 走査位置か年齢 — の関数としての、票への 重みである。既存の設定はすべて 1 つの関数の特殊例である:
prior p(row) |
出荷しているもの |
|---|---|
| 窓の中で 1、外で 0 | 窓だけ (今日の既定) |
窓の中で 1、[窓, reach) で 1、その先で 0 |
CPERSONA_VECTOR_REACH |
| 窓の中で 1、far の先頭 N 行で 1、残りで 0 | CPERSONA_VECTOR_FAR_LIMIT |
窓の中で 1、[窓, reach) で w、その先で 0 |
値段の付いた far の票 (2.6) |
| 年齢の滑らかな関数 | recency-weighted search (2.6) |
2.6 の設計は最後の 2 行を 1 つの機構として作る: far リストの reciprocal-rank の寄与に重み
w ∈ (0, 1] を掛け、滑らかな版は窓の縁の段差を年齢の曲線に置き換える。段差版は既に測った
2 点のあいだを補間する — w = 0 は出荷どおりの答え (腕 A)、w = 1 は全長の far リスト (腕 S)
— ので、測定は両端の identity 対照を無償で得て、その間の 1 次元の掃引になる。relative-score
fusion では同じ重みが合計の前に far チャネルの正規化スコアを伸縮し、far リストがチャネル数を
増やさない (重みが 4 つ目の除数に代わるので、w → 0 で far リストは near 行に何も課さない)。
6.3 最終の再ソートを先に決めなければならない¶
本番では confidence スコアラが on で、on のとき recall の最後の段は融合済みリスト全体を、融合の 順序が生き残らない confidence スコアで再ソートする: 先に測ったところ、confidence off で行の 約 1 割が異なる 2 つの融合モードが、on では全行で一致した。融合しか見ない far 票の重みは本番では 見えない。したがって 2.6 の設計は最終再ソートを取り除くか、confidence スコアを融合スコアの 関数にするかのどちらかを行い、本番が走らせるのと同じ regime で測る — これまでのベンチマークは confidence off で走っており、計画は両者が一致すると仮定せずにそう述べる。
6.4 どの腕も走らせる前に事前登録すること¶
計器は既に 3 度使ったもの: scene-blocked の LongMemEval コーパス、near/far の 2 層、12 rotation、 replicate と identity の対照、クエリごとの retriever リスト。設計が足すのは:
- 腕: reach 200,000・全長の far リストで
w ∈ {0, 0.25, 0.5, 0.75, 1}— これまでの全記録が 判定された構成なので、掃引は既にある数字に対して読める。探索は reach 50,000 の対。 - 両端の identity 対照:
w = 0は腕 A を、w = 1は腕 S を桁まで再現しなければならない。 - 規則: near 層は出荷どおりの答えから −1.0 以内、far 層はその reach で重み無しの far リストが 買う値から 1 点以内。絶対の far バー (+5.0) は reach の値を選ぶ場面に適用し、ここでは適用しない。
- far-only の読み:
wが下がるにつれて押し出す行が数として減るか — それが重みのすべき ことであり、数にはできないことである。 - regime: confidence off で 1 回 (記録と比較可能)、§6.3 が決まった後に本番 regime で 1 回。 片方で通り片方で通らない重みはそのとおりに報告する。
6.5 展開¶
既定 off、既定でビット一致 — この記述のすべての設定がそうだったように。次に測定。そして — そのときに限り — 既定を一括で動かす。1 つの変更と 1 つの文書更新で: 到達範囲、far リストの長さ、 重み、そして大きいコーパス向けの文書が主張してよい運用範囲。最後のものがこの線全体が 存在する理由である。
6.6 2.5 系に残るもの¶
到達範囲と far リストの長さは、測定済みの費用を文書化した opt-in 設定として残る。六桁の コーパスを持つ読み手は今日それらを on にでき、何を買い何を払うかを知っている。既定は、値段の 付いた far の票が最近の答えに払わせずに既定を動かせるようになるまで動かない。
7. 未決¶
- 重みは 1 つの数であるべきか、far 領域内の走査深さの関数であるべきか — 探索的な掃引は利得が 到達範囲が答えをちょうど覆うところに集中すると言っており、測るまでは前者を支持する。
- 時間の曲線と位置の段差が 1 つの設定を共有できるか、書き込み速度が不均一なコーパスには 両方要るか。
- far の票が episode penalty とどう相互作用するか — それは既に最新 episode との位置関係で memory を区別している。