Skip to main content

Chapter 2: Multi-Query and Fusion

Multi-Query Retrieval​

Generate multiple query variations, retrieve for each, combine results:

from langchain.retrievers.multi_query import MultiQueryRetriever

# Create multi-query retriever
retriever = MultiQueryRetriever.from_llm(
retriever=vectorstore.as_retriever(),
llm=llm
)

# Automatically generates variations
results = retriever.get_relevant_documents(
"What are the benefits of RAG?"
)

Generated Variations Example​

Original: "What are the benefits of RAG?"

Generated:
1. "What advantages does RAG offer over traditional LLMs?"
2. "Why should I use retrieval augmented generation?"
3. "How does RAG improve AI system performance?"

RAG Fusion​

Advanced technique combining multi-query with reciprocal rank fusion:

def rag_fusion(query, llm, retriever, num_queries=4):
# Step 1: Generate query variations
queries = generate_query_variations(query, llm, num_queries)

# Step 2: Retrieve for each query
all_results = []
for q in [query] + queries:
results = retriever.get_relevant_documents(q)
all_results.append(results)

# Step 3: Reciprocal Rank Fusion
fused = reciprocal_rank_fusion(all_results)

return fused[:5] # Top 5 fused results

Benefits​

BenefitDescription
CoverageDifferent angles find different docs
RobustnessLess sensitive to query phrasing
QualityRRF promotes consistently relevant docs

When to Use​

✅ Use multi-query when:

  • Queries are complex or multi-faceted
  • Users express things differently
  • Higher recall is needed

❌ Skip when:

  • Latency is critical
  • Simple, clear queries
  • Cost is a concern