
🧠 图解记忆: 先让证据进候选,再把正确证据排前,最后约束模型按证据作答;扩大 K 不等于准确率更高。
💡 答案要点
召回率 vs 准确率的两难:
召回率↑ = 多召回文档 = 更容易包含正确答案 BUT 更多噪音
准确率↑ = 严格筛选 = 更少噪音 BUT 可能漏掉正确答案召回率优化(Recall):
python
# 1. Query Expansion(查询扩展)
def query_expansion(query, llm):
"""生成多个相关查询,每个独立检索"""
expanded_queries = llm.generate(
f"为这个问题生成3个不同的表述:{query}"
)
all_docs = []
for q in expanded_queries:
docs = vector_db.search(q, k=10)
all_docs.extend(docs)
# 用 RRF 融合
return rrf_fusion(all_docs)
# 2. HyDE(前面讲过)
# 3. 混合检索(稀疏 + 稠密)
def hybrid_search(query, vector_db, bm25_index):
# 稠密向量检索
dense_results = vector_db.search(embed(query), k=20)
# 稀疏 BM25 检索
sparse_results = bm25_index.search(query, k=20)
# RRF 融合
return rrf_fusion([dense_results, sparse_results])准确率优化(Precision):
python
# 1. Rerank(前面讲过)
# 2. 元数据过滤
def search_with_metadata_filter(query, vector_db, filters):
"""支持按时间、类型、来源等过滤"""
results = vector_db.search(
query_emb,
k=50,
filter={"category": "技术文档", "date": {"$gte": "2024-01-01"}}
)
return rerank(query, results, top_k=10)
# 3. 上下文窗口优化(前面讲过的 Lost in the Middle 解法)综合调优策略:
| 阶段 | 优化方法 | 效果 |
|---|---|---|
| 召回 | Query Expansion、HyDE、混合检索 | 召回率 +15-20% |
| 排序 | CrossEncoder Rerank | Precision +25% |
| 生成 | Faithfulness Prompt、引用追踪 | Faithfulness +10% |
| 压缩 | LLMLingua | 上下文利用率 +40% |
A/B 测试框架:
python
# 生产环境 A/B 测试不同配置
def ab_test(query, config_a, config_b):
result_a = rag_pipeline(query, **config_a)
result_b = rag_pipeline(query, **config_b)
# 记录到评估数据集
log_to_eval({"query": query, "config": "A", "result": result_a})
log_to_eval({"query": query, "config": "B", "result": result_b})
return result_a, result_b面试话术:
"RAG 调优核心是平衡召回和准确。我的策略是:先用 Query Expansion + HyDE 提升召回,再用 CrossEncoder Rerank 保证准确。生成阶段加 Faithfulness 约束 prompt,强制模型只引用检索内容。生产环境每周跑 RAGAS 评估,Faithfulness <0.9 就预警。"