pub struct ContextForgeBuilder { /* private fields */ }Expand description
Builder for ContextForge.
Lexicon scoring is opt-in. By default the engine ranks on relevance (BM25, plus semantic when an embedding model is set) with no lexicon layer. Lexicon scoring applies a query-independent importance boost, which suits persona/importance use cases but degrades pure relevance retrieval — so it must be requested explicitly:
with_default_english_scorerenables the built-inDefaultEnglishScorer(plain-English commitment/ confirmation/decision markers).with_persona_scoreradds a domain scorer.
When both are set they compose additively via CompositeLexiconScorer.
§Example
use context_forge::{Config, ContextForge, ConfigLexiconScorer};
use std::path::PathBuf;
#[tokio::main]
async fn main() -> Result<(), context_forge::Error> {
let mut config = Config::default();
config.db_path = PathBuf::from("memory.db");
// Relevance only, no lexicon (default):
let cf = ContextForge::builder(config.clone()).build().await?;
// Opt into the English importance scorer:
let cf = ContextForge::builder(config.clone())
.with_default_english_scorer()
.build()
.await?;
// English + a persona scorer loaded from a TOML string:
let toml = "[affirmations]\npatterns = [\"for the emperor\"]";
let persona: ConfigLexiconScorer = toml.parse()?;
let cf = ContextForge::builder(config)
.with_default_english_scorer()
.with_persona_scorer(persona)
.build()
.await?;
Ok(())
}Implementations§
Source§impl ContextForgeBuilder
impl ContextForgeBuilder
Sourcepub fn new(config: Config) -> Self
pub fn new(config: Config) -> Self
Create a new builder with the given config.
Prefer ContextForge::builder over calling this directly.
Sourcepub fn with_default_english_scorer(self) -> Self
pub fn with_default_english_scorer(self) -> Self
Enable the built-in DefaultEnglishScorer (opt-in).
Applies a query-independent importance boost to entries containing plain-English commitment/confirmation/decision/correction markers (“i’ll fix it”, “confirmed”, “we decided”, “never mind”). This is the right signal for persona/importance use cases (surfacing what matters to a user) but hurts pure relevance retrieval — a factual-QA benchmark showed it lowering recall by burying evidence under important-sounding distractors. Off by default for that reason; enable it when importance, not just relevance, is what you want to rank on.
Sourcepub fn with_persona_scorer(self, scorer: impl LexiconScorer + 'static) -> Self
pub fn with_persona_scorer(self, scorer: impl LexiconScorer + 'static) -> Self
Add a persona scorer (opt-in).
Typically a crate::ConfigLexiconScorer loaded from a domain-specific
TOML file. If with_default_english_scorer
was also called, the two compose additively via CompositeLexiconScorer
and the engine applies a -1.0 floor after fusion; otherwise the persona
scorer is used alone.
Sourcepub async fn build(self) -> Result<ContextForge>
pub async fn build(self) -> Result<ContextForge>
Open the database and build a ContextForge with the configured scorers.
Lexicon scoring is applied only if
with_default_english_scorer and/or
with_persona_scorer were called; with both,
they compose via CompositeLexiconScorer. With neither, the engine ranks
on relevance (BM25 + semantic) only.
§Errors
Returns an error if the database cannot be opened or migrations fail.
Auto Trait Implementations§
impl !RefUnwindSafe for ContextForgeBuilder
impl !UnwindSafe for ContextForgeBuilder
impl Freeze for ContextForgeBuilder
impl Send for ContextForgeBuilder
impl Sync for ContextForgeBuilder
impl Unpin for ContextForgeBuilder
impl UnsafeUnpin for ContextForgeBuilder
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> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
impl<T> Fruit for T
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 more