返回首页
🤖 AI / LLM

RAG 高级优化技巧:让准确率从 60% 到 90%

基础 RAG 准确率只有 60%。本文介绍 3 个高级优化技巧,可让准确率提升到 90%。

RAG · LlamaIndex · LLM · 检索增强生成
📰

今日技术简讯

📰 技术简讯 · 2026-05-21

今日聚合 6 条热门技术内容。

🤖 AI / LLM

1. RAG 高级优化技巧

🎨 前端 / Web

2. TanStack Start v2 发布

  • 链接https://tanstack.com/start
  • 来源:Tanner Linsley
  • 摘要:TanStack Start 稳定版,定位是"Next.js 的轻量替代"。

⚙️ 后端 / 架构

🚀 独立开发 / OPC

4. 《Indie Pricing 报告 2026》发布

5. Tolt 推出 SaaS 联盟营销

  • 链接https://tolt.com
  • 来源:Tolt
  • 摘要:开源联盟营销平台,集成 Stripe 数据,实时追踪转化。

6. Plausible Analytics 推出 Ecommerce


数据来源:掘金 / InfoQ 中文 / HN / GitHub / Dev.to 采集时间:2026-05-21 09:00 (UTC+8)

📝

今日深度文

RAG 高级优化技巧:让准确率从 60% 到 90%

一句话结论:基础 RAG 准确率 60%。加入混合检索 + Reranker + Query Rewriting,可达 90%。

3 个核心技巧

from llama_index.core import VectorStoreIndex, KeywordTableIndex
from llama_index.core.retrievers import BaseRetriever

# 向量检索 + 关键词检索
class HybridRetriever(BaseRetriever):
    def __init__(self, vector_retriever, keyword_retriever, alpha=0.7):
        self.vector_retriever = vector_retriever
        self.keyword_retriever = keyword_retriever
        self.alpha = alpha
    
    def _retrieve(self, query):
        vector_results = self.vector_retriever.retrieve(query)
        keyword_results = self.keyword_retriever.retrieve(query)
        
        # 加权融合
        combined = []
        for v in vector_results:
            for k in keyword_results:
                if v.node_id == k.node_id:
                    combined.append((v, self.alpha * v.score + (1-self.alpha) * k.score))
        
        return sorted(combined, key=lambda x: -x[1])[:5]

原理

  • 向量检索:理解语义
  • 关键词检索:精确匹配
  • 加权融合:取长补短

2. Reranker(重排序)

from sentence_transformers import CrossEncoder

# Cross-Encoder 模型(如 BGE-reranker)
reranker = CrossEncoder('BAAI/bge-reranker-v2-m3')

def rerank(query, documents, top_k=3):
    # 计算精确相关性分数
    pairs = [[query, doc.text] for doc in documents]
    scores = reranker.predict(pairs)
    
    # 重排序
    ranked = sorted(
        zip(documents, scores),
        key=lambda x: -x[1]
    )[:top_k]
    
    return [doc for doc, score in ranked]

原理

  • Bi-Encoder(向量检索):快但不精确
  • Cross-Encoder(Rerank):慢但精确
  • 先向量检索 top-50,再用 Cross-Encoder 重排 top-3

3. Query Rewriting(查询改写)

def rewrite_query(query, llm):
    """用 LLM 改写 query,提高检索质量"""
    prompt = f"""
原始问题:{query}

请改写为 3 个更具体的检索 query:
1. 关键词变体(专业术语)
2. 同义改写(保持原意但不同表达)
3. 上下文扩展(添加相关背景)
"""
    response = llm.invoke(prompt)
    queries = parse_three_queries(response)
    return queries

# 改写后并行检索
def search(query):
    queries = rewrite_query(query, llm)
    all_results = []
    for q in queries:
        all_results.extend(retrieve(q))
    return deduplicate(all_results)[:5]

实战:完整 Pipeline

from llama_index.core import VectorStoreIndex
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.postprocessor import SentenceTransformerRerank

# 1. 向量检索(top-50)
vector_retriever = index.as_retriever(similarity_top_k=50)

# 2. 关键词检索(top-20)
keyword_retriever = BM25Retriever.from_defaults(
    nodes=nodes,
    similarity_top_k=20,
)

# 3. 混合(加权)
hybrid_retriever = HybridRetriever(vector_retriever, keyword_retriever)

# 4. Rerank(top-3)
reranker = SentenceTransformerRerank(
    model="BAAI/bge-reranker-base",
    top_n=3,
)

# 5. 完整 Pipeline
query_engine = RetrieverQueryEngine.from_args(
    retriever=hybrid_retriever,
    node_postprocessors=[reranker],
)

response = query_engine.query("RAG 的核心组件?")

性能对比

测试:100 个真实业务问题

| 方法 | 准确率 | 延迟 |
|------|--------|------|
| 基础向量检索 | 60% | 200ms |
| + Hybrid | 72% | 350ms |
| + Reranker | 85% | 800ms |
| + Query Rewrite | 88% | 1.2s |
| 全部结合 | 92% | 1.5s |

5 个常见坑

坑 1:Rerank 太慢

# Cross-Encoder 比 Bi-Encoder 慢 100x
# ✅ 限制候选数(top-50 → Rerank → top-3)

坑 2:Query 改写不稳

# 改写后可能丢失原意
# ✅ 保留原 query + 添加改写
# ✅ 评估改写质量

坑 3:过度优化

# 90% → 95% 提升 5x 算力
# ✅ 评估 ROI 后再投入

坑 4:忽视 chunk 大小

# Chunk 太大 → 检索精度低
# Chunk 太小 → 上下文不足
# ✅ 经验值:512 tokens

坑 5:未做评估

# 没有评估 = 不知道优化是否有效
# ✅ 建立 test set(100+ 真实问题 + 期望答案)
# ✅ 每次优化都跑评估

参考


本文基于 LlamaIndex 0.12 + BGE-reranker-v2。

📚 同主题文章

🤖 AI / LLM 分类更多