diff --git a/docs/HYBRIDRAG.md b/docs/HYBRIDRAG.md new file mode 100644 index 0000000..3a4aae3 --- /dev/null +++ b/docs/HYBRIDRAG.md @@ -0,0 +1,58 @@ +# HybridRAG Architecture + +## Overview + +HybridRAG combines three search sources to provide comprehensive results: +- **Vector search** (Qdrant) - Semantic similarity via embeddings +- **Graph search** (Neo4j) - Entity relationships in knowledge graph +- **Web search** (SearXNG) - External web results via Trafilatura extraction + +## Two-Stage RRF Fusion (v1.3.0+) + +To ensure fair ranking between wiki and web results, we use a two-stage Reciprocal Rank Fusion: + +``` +Stage 1: Wiki Merge + vector results ─┬─→ Mini-RRF ─→ Unified wiki ranking + graph results ─┘ + +Stage 2: Final RRF + wiki (merged) ─┬─→ Final RRF ─→ Combined results + web results ─┘ +``` + +**Why two stages?** + +Previously, wiki pages found by BOTH vector and graph received double RRF contribution, giving them an unfair 2x advantage over web results. The two-stage approach: +1. Merges vector+graph into a single "wiki" source +2. Wiki's internal ranking still benefits from multi-source confirmation +3. Wiki and web compete as equals in final ranking + +## Configuration + +| Setting | Default | Description | +|---------|---------|-------------| +| `VECTOR_SIMILARITY_THRESHOLD` | 0.7 | Minimum similarity score for vector results | +| `HYBRID_RAG_VECTOR_LIMIT` | 10 | Max vector results | +| `HYBRID_RAG_GRAPH_LIMIT` | 10 | Max graph results | +| `HYBRID_RAG_WEB_LIMIT` | 5 | Max web results | + +## Known Limitations & Future Improvements + +### Vector Search Noise + +**Status:** Open for improvement if needed after observation period. + +Vector search may return generic category/index pages (e.g., "Reference", "Projects", "Places") with high similarity scores (~0.86). These pages often have similar boilerplate content leading to uniform scores. + +**Potential solutions if this becomes problematic:** +1. **Raise threshold** - Increase `VECTOR_SIMILARITY_THRESHOLD` to 0.85+ +2. **Page-type filtering** - Exclude pages tagged as category/index/stub +3. **Content length signal** - Penalize pages with minimal content +4. **Duplicate score detection** - Flag results with suspiciously identical scores + +The LLM re-ranking phase typically demotes these low-quality results, so this may not require immediate action. + +### Graph Search + +Graph search uses only core keywords (no LLM-generated synonyms) to avoid false matches like "author" → "author2000". This is intentional - vector search handles semantic similarity via embeddings.