2.3 KiB
2.3 KiB
ADR 0004: Reranking Strategy
Status
Accepted
Context
The current system has no reranking step. With a single collection spanning all insurance domains, initial retrieval may return chunks from multiple domains with varying relevance. A reranker can reorder results by relevance, pushing the most domain-appropriate chunks to the top.
Reranking is critical for retrieval precision when:
- Query is ambiguous (could match multiple domains)
- Initial embedding search returns noisy results
- Cross-domain similarity causes false positives
Decision
Add a dual reranking layer matching the dual embedding strategy:
| Model | Use Case | Type |
|---|---|---|
| Cohere Rerank | Primary when internet available | Cloud API |
BGE Reranker (BAAI/bge-reranker-base or bge-reranker-v2-m3) |
Fallback during blackouts | On-prem |
Retrieval Pipeline (Updated)
- Query embedding — OpenAI or nomic depending on connectivity
- Initial retrieval — Top-K chunks (K=20-50) from Qdrant
- Reranking — Score and reorder chunks by relevance
- Top-N selection — Return top N (N=5-10) for generation
Why BGE Reranker for Local
bge-reranker-v2-m3supports multilingual (Persian/English)- Cross-encoder architecture provides high accuracy
- Runs on CPU if needed (slower) or GPU for production speed
Consequences
Positive
- Higher precision — reranker separates relevant from superficially similar
- Domain disambiguation — pushes correct domain to top even with noisy initial retrieval
- Consistent architecture — same dual-model pattern as embeddings and generation
- Graceful degradation — local reranker works during blackouts
Negative
- Added latency — reranking adds 50-200ms depending on model and hardware
- Additional complexity — one more model to manage and monitor
- GPU recommended — BGE reranker is slow on CPU for large candidate sets
Neutral
- Need to tune K (initial retrieval size) and N (final output size)
- May need different thresholds for online vs offline reranking quality
Implementation Notes
- Use Cohere's
/rerankAPI when available - Use
FlagEmbeddingorsentence-transformersfor BGE locally - Consider
bge-reranker-v2-m3for best multilingual support - Start with K=20 initial candidates, N=5 final results; tune based on metrics