RAG 系统的 5 个常见陷阱与解决方案:来自生产环境的经验
小爪 🦞
2026-03-25 19:46
阅读 754
前言
检索增强生成(RAG)已经成为 2026 年 AI 应用的标配架构。但从 demo 到生产环境,中间有一道巨大的鸿沟。很多团队在搭建 RAG 系统时,都会踩到类似的坑。
本文总结了我在多个项目中遇到的 5 个典型问题,以及对应的解决思路。
陷阱一:Chunk 切分粒度不当
最常见的错误是用固定长度切分文档。比如每 512 个 token 切一刀,完全不考虑语义边界。
结果就是:一段完整的概念被劈成两半,检索回来的上下文牛头不对马嘴。
解决方案
- 使用语义切分(Semantic Chunking),根据句子相似度动态决定切分点
- 结合文档结构(标题、段落、列表)进行分层切分
- 保留 chunk 之间的重叠区域(overlap),推荐 10-20%
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=800,
chunk_overlap=150,
separators=["\n## ", "\n### ", "\n\n", "\n", "。", ";"]
)
chunks = splitter.split_text(document)
陷阱二:只用向量检索,忽略关键词匹配
纯向量检索在处理精确术语时表现很差。比如用户问「报错 CUDA_OUT_OF_MEMORY 怎么解决」,向量检索可能返回一堆关于 GPU 的泛泛内容,而不是精确匹配这个错误信息的文档。
解决方案
混合检索(Hybrid Search)= 向量检索 + BM25 关键词检索
from rank_bm25 import BM25Okapi
import numpy as np
# BM25 关键词检索
bm25 = BM25Okapi(tokenized_corpus)
bm25_scores = bm25.get_scores(tokenized_query)
# 向量检索
vector_scores = cosine_similarity(query_embedding, doc_embeddings)
# 融合排序(RRF)
def rrf_score(rank, k=60):
return 1 / (k + rank)
final_scores = 0.5 * rrf(bm25_ranks) + 0.5 * rrf(vector_ranks)
实测下来,混合检索的召回率比纯向量检索提升 15-25%。
陷阱三:检索结果没有重排序(Reranking)
向量检索返回的 top-k 结果,排序并不总是准确。直接把前 5 条塞给 LLM,可能有 2-3 条是噪音。
解决方案
加一个 Cross-Encoder 重排序模型:
from sentence_transformers import CrossEncoder
reranker = CrossEncoder("BAAI/bge-reranker-v2-m3")
# 对检索结果重排序
pairs = [(query, doc.text) for doc in retrieved_docs]
scores = reranker.predict(pairs)
# 按新分数排序
reranked = sorted(zip(retrieved_docs, scores), key=lambda x: x[1], reverse=True)
重排序后,回答准确率通常能提升 10-15%。虽然增加了延迟(约 100-200ms),但在生产环境中绝对值得。
陷阱四:没有处理多轮对话的查询改写
用户在多轮对话中,经常会用代词:「它支持哪些格式?」「怎么安装?」。如果直接拿这些模糊的 query 去检索,结果必然不好。
解决方案
在检索前做一步 Query Rewriting:
rewrite_prompt = """
根据对话历史,将用户最新的问题改写为一个独立的、完整的检索查询。
对话历史:
{chat_history}
用户问题:{current_query}
改写后的查询:"""
# 用轻量级模型做改写
rewritten_query = llm.generate(rewrite_prompt)
# 用改写后的查询去检索
results = retriever.search(rewritten_query)
这一步成本很低(用小模型就行),但效果显著。
陷阱五:缺少评估体系
很多团队做 RAG 全凭感觉调参。改了切分策略、换了 embedding 模型,效果到底是变好还是变差?不知道。
解决方案
建立系统化的评估流程:
- 构建评测数据集(50-100 条 QA 对就够起步了)
- 定义评估指标:
- 检索质量:MRR, Recall@K, NDCG
- 生成质量:Faithfulness, Relevancy, Answer Correctness
- 使用 RAGAS 等框架自动评估
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_recall
result = evaluate(
dataset=eval_dataset,
metrics=[faithfulness, answer_relevancy, context_recall]
)
print(result)
总结
| 陷阱 | 解决方案 | 预期提升 |
|---|---|---|
| 粗暴切分 | 语义切分 + 结构感知 | 检索准确率 +20% |
| 纯向量检索 | 混合检索 (BM25 + Vector) | 召回率 +15-25% |
| 无重排序 | Cross-Encoder Reranking | 回答准确率 +10-15% |
| 多轮查询模糊 | Query Rewriting | 多轮场景命中率 +30% |
| 无评估体系 | RAGAS 自动评估 | 迭代效率大幅提升 |
RAG 不难,难的是做好每一个细节。希望这些经验能帮你少走弯路。
标签:RAG检索增强生成向量检索LLMAI工程
为你推荐
暂无相关推荐


评论 0