pub struct GraphScoringConfig {
pub weight_semantic: f64,
pub weight_hotness: f64,
pub weight_utility: f64,
pub corroboration_boost: f64,
}Expand description
Scoring weights for utility-weighted semantic search.
The final score for a retrieved entity is computed as a linear combination of three signals:
score = weight_semantic * similarity
+ weight_hotness * hotness
+ weight_utility * utility_scoreDefaults (0.45 / 0.30 / 0.25) match the original hard-coded values, so
omitting the [graph.scoring] section from .recall-echo.toml produces
identical behavior to pre-v3.9.0 recall-echo.
Weights are not constrained to sum to 1.0 — the scoring function does not
normalize. Callers that change these should calibrate against their own
retrieval outcomes; see utility-feedback-loop-spec.md in pulse-null.
Graph-expanded candidates score through the same three terms; what differs
is where their similarity comes from (a parent’s similarity discounted by
the edge’s effective confidence, rather than a direct measurement against
the query vector). GraphScoringConfig::corroboration_boost governs the
one case where the two channels meet.
Fields§
§weight_semantic: f64Weight applied to cosine similarity. Default 0.45.
weight_hotness: f64Weight applied to the recency/access hotness signal. Default 0.30.
weight_utility: f64Weight applied to the utility score (outcome-feedback EMA). Default 0.25.
corroboration_boost: f64How much an entity’s measured relevance is raised when the graph
corroborates a semantic hit — i.e. when the same entity is reached both
by the query vector and over a surviving edge from one of the expanded
top hits. Default 0.05.
similarity = min(1.0, similarity * (1 + corroboration_boost * effective_confidence))Scaled by the edge’s effective (decayed) confidence, so a stale edge
corroborates weakly, and clamped at the similarity ceiling of 1.0, so
no amount of corroboration can push an entity past what a perfect
direct match would score on the same hotness and utility. 0.0
disables corroboration entirely.
The default is cut to the scale of the similarity distribution it
perturbs, measured over four LongMemEval stores (196–1804 entities):
the top-20 similarity band there is only 0.086 wide, so a boost of
0.134 would let corroboration promote an entity from the bottom of
the band to the top, and structure would outrank similarity outright.
0.05 moves a corroborated entity about a third of the band — enough
to break the near-ties that dominate a dense embedding space (the
rank-1-to-rank-2 gap in those stores is 0.005–0.051), and not
enough to overturn a decided ordering. Raise it only with retrieval
numbers in hand: corroboration amplifies whatever the extractor put in
the graph, including its mistakes.
Trait Implementations§
Source§impl Clone for GraphScoringConfig
impl Clone for GraphScoringConfig
Source§fn clone(&self) -> GraphScoringConfig
fn clone(&self) -> GraphScoringConfig
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for GraphScoringConfig
impl Debug for GraphScoringConfig
Source§impl Default for GraphScoringConfig
impl Default for GraphScoringConfig
Source§impl<'de> Deserialize<'de> for GraphScoringConfigwhere
GraphScoringConfig: Default,
impl<'de> Deserialize<'de> for GraphScoringConfigwhere
GraphScoringConfig: Default,
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for GraphScoringConfig
impl RefUnwindSafe for GraphScoringConfig
impl Send for GraphScoringConfig
impl Sync for GraphScoringConfig
impl Unpin for GraphScoringConfig
impl UnsafeUnpin for GraphScoringConfig
impl UnwindSafe for GraphScoringConfig
Blanket Implementations§
impl<T> AsyncFriendly for T
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::RequestSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian().