fix(agent): deterministic hybrid ranking; don't reinforce zero-score filler
test_hebbian_activation_boost failed intermittently. Root causes, all in the query path: - normalize_scores mapped a set of identical scores — including the single-candidate case — to 0.0, so a lone perfect match contributed nothing to the fused score. Identical positive scores now normalise to 1.0 (all equally the best match); identical non-positive scores stay 0.0. - merge_vector_keyword sorted a HashMap's entries by score alone and then truncated, so which ties survived varied from run to run; hybrid_search had the same problem in its final sort. Both now break ties by index. - hybrid_search applied the Hebbian boost to every returned record, including the zero-score filler that pads the list when fewer than k records match. With random tie-breaking a filler record could collect as many boosts as the real hit. Only records with a positive fused score are reinforced now. Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
0744d52639
commit
3ed0489faa
@@ -113,13 +113,24 @@ impl HDF5Memory {
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
// Ties broken by index so results (and therefore which records get
|
||||
// boosted) don't depend on HashMap iteration order upstream.
|
||||
results.sort_by(|a, b| {
|
||||
b.score
|
||||
.partial_cmp(&a.score)
|
||||
.unwrap_or(std::cmp::Ordering::Equal)
|
||||
.then(a.index.cmp(&b.index))
|
||||
});
|
||||
|
||||
let hit_indices: Vec<usize> = results.iter().map(|r| r.index).collect();
|
||||
// Only reinforce records that actually matched. When fewer than `k`
|
||||
// records are relevant, the rest of the list is zero-score filler;
|
||||
// boosting it would teach the store that arbitrary records are
|
||||
// important just because they were nearby in iteration order.
|
||||
let hit_indices: Vec<usize> = results
|
||||
.iter()
|
||||
.filter(|r| r.score > 0.0)
|
||||
.map(|r| r.index)
|
||||
.collect();
|
||||
self.apply_hebbian_boost(&hit_indices);
|
||||
self.flush().ok();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user