pub struct RerankSpec {
pub enabled: bool,
pub rerank_k: u32,
pub model: String,
pub passage_field: String,
pub signal_blend: f32,
pub query_text: String,
pub validate_only: bool,
}Expand description
─── Second-stage reranking (optional) ───────────────────────────────────────
First-class, optional second-stage reranker over an over-fetched candidate window for plain VectorSearch / HybridSearch. Mirrors Weaviate reranker modules, Pinecone’s rerank API, Vespa global-phase rank-profiles, and Cohere/Qdrant rerank: a stateless, bounded, post-merge stage run once globally after shard fan-in. Additive & wire-compatible — old clients omit this message ⇒ rerank off, behavior identical to today.
Fields§
§enabled: boolmaster switch (false / message-absent ⇒ no rerank)
rerank_k: u32over-fetch pool size; 0 ⇒ default max(k*4, 24) clamped to the mode’s hard cap (48 for cross-encoder; 200 for the cheaper maxsim late-interaction path, sized for the issue’s “top-K ~100-200” fused window).
model: String“cross-encoder” | “maxsim” | “learned” | “score-fusion” | “custom”; “” ⇒ “score-fusion”.
- “maxsim” — token-level ColBERT-style MaxSim late interaction: the query and each hydrated passage are encoded into per-token L2-normalized matrices and scored Σ_q max_d q·d ÷ query-token-count. LLM-free; needs the embedding model loaded + query_text + passage_field, else it degrades to score-fusion (never errors).
- “learned” — (#768 LongMemEval Phase 7) non-generative GBDT reranker over the funnel feature vector [dense, BM25, MaxSim, recency, graph-distance, granularity], trained on LongMemEval dev relevance labels. Applied as the FINAL rerank over the fused+reranked candidate set. Needs a model loaded (STATELET_LEARNED_RERANKER_MODEL); else degrades to score-fusion. LLM-free.
passage_field: StringKV-key template for passage hydration (cross-encoder / maxsim). Tokens: {id} → candidate vector/result id (decimal) {index} → index_name e.g. “doc:{index}:{id}:text”. Empty ⇒ hydration disabled ⇒ fall back to score-fusion.
signal_blend: f32score-fusion only: blend = blend*norm_distance + (1-blend)*aux_signal. 0 ⇒ default 1.0 (pure full-precision/coarse distance re-rank). Range [0,1].
query_text: StringRaw query text for the text-based rerankers (both RPCs query by vector, not text). Required for model=“cross-encoder” and model=“maxsim”; empty ⇒ auto-downgrade to score-fusion.
validate_only: boolDry-run pre-flight validation. When true the RPC validates the rerank spec (passage_field template via validate_passage_field, plus reranker availability for model=“cross-encoder”) and returns an empty successful response if valid, or an InvalidArgument/FailedPrecondition Status if not — without executing the search. SDKs expose it as rerank_validate(…). Additive & wire-compatible: old clients omit it ⇒ false ⇒ unchanged.
Trait Implementations§
Source§impl Clone for RerankSpec
impl Clone for RerankSpec
Source§fn clone(&self) -> RerankSpec
fn clone(&self) -> RerankSpec
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 RerankSpec
impl Debug for RerankSpec
Source§impl Default for RerankSpec
impl Default for RerankSpec
Source§impl Message for RerankSpec
impl Message for RerankSpec
Source§fn encoded_len(&self) -> usize
fn encoded_len(&self) -> usize
Source§fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>where
Self: Sized,
fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>where
Self: Sized,
Source§fn encode_to_vec(&self) -> Vec<u8> ⓘwhere
Self: Sized,
fn encode_to_vec(&self) -> Vec<u8> ⓘwhere
Self: Sized,
Source§fn encode_length_delimited(
&self,
buf: &mut impl BufMut,
) -> Result<(), EncodeError>where
Self: Sized,
fn encode_length_delimited(
&self,
buf: &mut impl BufMut,
) -> Result<(), EncodeError>where
Self: Sized,
Source§fn encode_length_delimited_to_vec(&self) -> Vec<u8> ⓘwhere
Self: Sized,
fn encode_length_delimited_to_vec(&self) -> Vec<u8> ⓘwhere
Self: Sized,
Source§fn decode(buf: impl Buf) -> Result<Self, DecodeError>where
Self: Default,
fn decode(buf: impl Buf) -> Result<Self, DecodeError>where
Self: Default,
Source§fn decode_length_delimited(buf: impl Buf) -> Result<Self, DecodeError>where
Self: Default,
fn decode_length_delimited(buf: impl Buf) -> Result<Self, DecodeError>where
Self: Default,
Source§fn merge(&mut self, buf: impl Buf) -> Result<(), DecodeError>where
Self: Sized,
fn merge(&mut self, buf: impl Buf) -> Result<(), DecodeError>where
Self: Sized,
self. Read moreSource§fn merge_length_delimited(&mut self, buf: impl Buf) -> Result<(), DecodeError>where
Self: Sized,
fn merge_length_delimited(&mut self, buf: impl Buf) -> Result<(), DecodeError>where
Self: Sized,
self.Source§impl PartialEq for RerankSpec
impl PartialEq for RerankSpec
impl StructuralPartialEq for RerankSpec
Auto Trait Implementations§
impl Freeze for RerankSpec
impl RefUnwindSafe for RerankSpec
impl Send for RerankSpec
impl Sync for RerankSpec
impl Unpin for RerankSpec
impl UnsafeUnpin for RerankSpec
impl UnwindSafe for RerankSpec
Blanket Implementations§
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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> 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::Request