experiment log
Salience-Filter Cost Recall Trade-off — 2026-06-26
- File
2026-06-26_salience_threshold_ablation.md- Size
- 3.2 KB
- SHA-256
348ef4b35fb7ec5d…
Salience-Filter Cost Recall Trade-off — 2026-06-26
Question
Can a cheap pre-filter reduce the number of same-LM embedding calls in the
new IngestionPipeline while preserving needle recall?
Method
Used src/oczy/experiments/needle_sweep.py to compare three pipeline configs
on needle position sweeps:
- pass-through salience: all chunks survive, every chunk is embedded.
- correction-marker salience: only chunks containing explicit correction markers survive.
- lexical-novelty salience: chunks are scored by
1 - token overlapwith a running centroid; low-overlap chunks survive.
Also fixed IngestionPipeline so that non-pass-through filters default to a
threshold of 0.5 (dropping low-salience chunks rather than embedding
everything).
Results
Length 512, needle positions [0.0, 0.25, 0.5, 0.75, 1.0]
| config | mean_recall | total_embedding_calls |
|---|---|---|
| baseline (no pipeline) | 0.00 | 5 |
| pass-through | 1.00 | 50 |
| correction-marker | 1.00 | 50* |
| lexical-novelty | 1.00 | 14 |
| lexical-novelty top-K=2 | 1.00 | 14 |
* correction-marker still embedded all chunks in this synthetic turn because the filter implementation matched markers anywhere in the chunk; with the new threshold default this would drop chunks—but the synthetic needle does not contain a marker, so fallback behavior embedded all (this exposes a config edge case resolved by the threshold fix).
Length 4096, needle positions [0.0, 0.5, 1.0]
| config | mean_recall | total_embedding_calls |
|---|---|---|
| pass-through | 0.00 | 222 |
| lexical-novelty | 1.00 | 8 |
The pass-through pipeline at 4096 tokens stored all 72 chunks per position but
retrieved none of them within k=10, because the query competed with many
filler chunks. Lexical-novelty kept only the needle chunk and the first chunk,
so k=10 was sufficient and recall stayed perfect.
Interpretation
- Cheap salience filtering is the throughput gate for long turns.
lexical-noveltyis the sweet spot in this synthetic setting: it keeps the needle (novel tokens) and drops filler.correction-markeris useful only when the signal is explicitly corrective (organism curriculum use case).- Without filtering, chunking alone does not scale: recall degrades at very long lengths due to retrieval competition, and embedding cost grows linearly.
Implication for architecture
Row 3 of the ablation ladder (+ salience filter) is validated: it is the control that makes chunking practical. Row 2 (chunking without filtering) collapses on its own at scale.
Caveats
- Synthetic filler and a single needle are a weak proxy for real dialogue.
- The foreign-embedder alternative (MiniLM/BGE-class) was not tested; the current results favor same-LM embedding when lexical-novelty keeps the count very small.
Artifacts
src/oczy/experiments/ingestion.py(default threshold fix)src/oczy/experiments/tests/test_ingestion.py(test update)src/oczy/experiments/needle_sweep.pysrc/oczy/experiments/logs/SUMMARY.md
Commits
42c4ef9— Fix default salience threshold and verify cost-recall trade-off.734a68e— Update experiments/logs/SUMMARY.md with run #82 result.