Smart Retrieval
Smart Retrieval is a 5-step re-ranking pipeline that combines BM25, query expansion, Reciprocal Rank Fusion, and Max Marginal Relevance to surface the most relevant ReasoningBank entries.
Pipeline
1. bank.retrieve(limit=10) → BM25+TF-IDF candidates
2. expandQuery(maxVariants=3) → 3 query reformulations
3. searchBM25 × 3 variants → BM25 scoring per variant (k1=1.5, b=0.75)
4. reciprocalRankFusion(k=60) → fuses 3 lists + recency boost
5. maximalMarginalRelevance(λ=0.6, topK=5) → diverse top 5Performance vs TF-IDF baseline
| Metric | Before (TF-IDF) | After (SmartRetrieval) |
|---|---|---|
| Candidates scanned | 5 000 | 500 (RETRIEVE_CAP) |
| BM25 queries | 1 | 3 (expand × 3) |
| Result diversity | low | high (MMR λ=0.6) |
| Retrieval quality (MRR@5) | 0.58 | 0.74 (+27%) |
| Timeout guard | none | 2s hard cap |
Injection into Phase Context
// Each phase receives acwContext when SmartRetrieval finds matches
phase.acwContext = {
trajectories: [
{ id: 'run-abc', verdict: 'success', summary: '...', duration: '3m12s' },
],
lesson: 'Always validate Zod schema before DB write',
summary: 'Similar past runs: [run-abc, run-def] | avg success: 100% | avg: 3min',
injected: true
}Configuration
# ~/.ada.json
{
"retrieval": {
"enabled": true,
"topK": 5,
"mmrLambda": 0.6, // 0=pure diversity, 1=pure relevance
"timeoutMs": 2000,
"expandVariants": 3,
"bm25": { "k1": 1.5, "b": 0.75 }
}
}