botbook/src/11-features/hybrid-search.md

2.8 KiB

Hybrid RAG Search

Hybrid search combines dense (semantic) and sparse (keyword) retrieval for better search quality than either method alone.

Overview

Method Strengths Weaknesses
Dense (Semantic) Synonyms, meaning, paraphrasing Rare terms, exact matches
Sparse (BM25) Exact terms, product codes, names No semantic understanding
Hybrid Best of both Slightly more computation

How It Works

User Query
    │
    ├──────────────────┐
    ▼                  ▼
Dense Search      Sparse Search
(Weight: 0.7)     (Weight: 0.3)
    │                  │
    └────────┬─────────┘
             ▼
    Reciprocal Rank Fusion
             │
             ▼
    Optional Reranking
             │
             ▼
       Final Results

Reciprocal Rank Fusion (RRF):

RRF_score(d) = Σ 1 / (k + rank_i(d))

Configuration

In config.csv:

name,value
rag-hybrid-enabled,true
rag-dense-weight,0.7
rag-sparse-weight,0.3
rag-top-k,10
rag-rrf-k,60
rag-reranker-enabled,false

Weight Tuning

Content Type Dense Sparse Use Case
Balanced 0.7 0.3 General purpose
Semantic-Heavy 0.9 0.1 Conversational, multilingual
Keyword-Heavy 0.4 0.6 Technical docs, product catalogs
Equal 0.5 0.5 When unsure

Reranking

Optional LLM-based reranking for highest quality:

name,value
rag-reranker-enabled,true
rag-reranker-model,quality
rag-reranker-top-n,20
Aspect Without With Reranking
Latency ~50ms ~500ms
Quality Good Excellent
Cost None LLM API cost

Use for: Legal, medical, financial, compliance-critical queries.

Usage

Hybrid search is automatic when enabled. No code changes needed:

USE KB "company-policies"
' Queries automatically use hybrid search

Performance

Metric Target
MRR (Mean Reciprocal Rank) > 0.7
Recall@10 > 0.9
Latency P95 < 200ms
Cache Hit Rate > 40%

Caching

name,value
rag-cache-enabled,true
rag-cache-ttl,3600
rag-cache-max-size,10000

Troubleshooting

Issue Solution
Poor results Adjust weights for content type
High latency Reduce rag-top-k, enable caching, disable reranking
Missing expected results Check document indexed, verify no filters excluding it

See Also