Skip to content
🔗 分享本题
查看我的学习进度 →
RAG 召回率与准确率链路优化图解

🧠 图解记忆: 先让证据进候选,再把正确证据排前,最后约束模型按证据作答;扩大 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 RerankPrecision +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 就预警。"

📚 参考:Anthropic:Introducing Contextual Retrieval(召回率优化)