RAG 知识库避坑指南:分块策略、嵌入模型与检索调优全解析
解决 RAG「答非所问」「遗漏信息」「幻觉」的系统性方法
RAG 知识库避坑指南:分块策略、嵌入模型与检索调优全解析
解决 RAG「答非所问」「遗漏信息」「幻觉」的系统性方法
深度解析 RAG 系统常见失败模式及修复方案。覆盖文档预处理、分块策略选择、嵌入模型评测、混合检索调参、Reranker 配置,帮你把 RAG 回答准确率从 60% 提升到 90% 以上。
直接回答
RAG 效果差的 Top 3 原因(按影响从大到小):
RAG 系统完整架构
[文档预处理] → 清洗 → 分块 → 元数据标注
↓
[向量化] → 嵌入模型 → 向量存储(Chroma/Qdrant/Weaviate)
↓
[检索] → 向量检索 + BM25 → Reranker 重排序
↓
[生成] → 上下文拼接 → LLM → 最终回答
每个环节都可能引入误差,需要分层优化。
第一层:文档预处理
RAG 最常被忽视的坑:60% 的检索失败发生在文档预处理阶段,而不是检索算法。
python
import redef clean_document(text: str) -> str:
lines = text.split("\n")
# 过滤页码、重复标题等少于10字符的短行
lines = [l for l in lines if len(l.strip()) > 10 or l.strip() == ""]
text = "\n".join(lines)
# 合并 PDF 提取时被换行打断的句子
text = re.sub(r"(?
第二层:分块策略
语义分块示例(效果最好):
python
from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai import OpenAIEmbeddingssplitter = SemanticChunker(
OpenAIEmbeddings(),
breakpoint_threshold_type="percentile",
breakpoint_threshold_amount=90
)
chunks = splitter.create_documents([document])
第三层:嵌入模型选择
python
from sentence_transformers import SentenceTransformermodel = SentenceTransformer("BAAI/bge-m3")
embeddings = model.encode(texts, batch_size=32, normalize_embeddings=True)
第四层:混合检索
为什么纯向量检索不够?
用户问:"2024年Q3退款金额是多少?"纯向量检索 → 找到"退款政策说明"(语义相近)但无具体数字 ❌
BM25检索 → 精确匹配"2024年Q3"和"退款金额" ✅
混合检索 → 向量找相关章节 + BM25 精确锁定数字 ✅✅
python
from langchain.retrievers import EnsembleRetriever混合检索:向量 60% + BM25 40%
ensemble = EnsembleRetriever(
retrievers=[vector_retriever, bm25_retriever],
weights=[0.6, 0.4]
)
第五层:Reranker 重排序(最重要的单一优化)
提升 +15-25% 准确率:先召回 20 条,Reranker 精选 Top 4。
python
from sentence_transformers import CrossEncoderreranker = CrossEncoder("BAAI/bge-reranker-v2-m3")
def rerank(query, docs, top_n=4):
pairs = [[query, doc] for doc in docs]
scores = reranker.predict(pairs)
ranked = sorted(zip(scores, docs), reverse=True)
return [doc for _, doc in ranked[:top_n]]
candidates = ensemble.invoke(query) # 召回 20 条
top_docs = rerank(query, [c.page_content for c in candidates]) # 精选 4 条
系统评估:RAGAS 框架
python
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_precision, context_recallresult = evaluate(dataset=test_dataset,
metrics=[faithfulness, answer_relevancy, context_precision, context_recall])
每项 0-1 分:0.8+ 合格,0.9+ 优秀
print(result)
FAQ
Q:RAG 和微调(Fine-tuning)什么时候用哪个?
A:知识频繁更新 → RAG;知识稳定但需要特定风格/格式 → 微调;两者可以结合(微调模型 + RAG 知识库)。
Q:向量搜索为什么有时候找到不相关内容?
A:所有向量搜索都有相似度分数,低于阈值就是「强行匹配」。设置 score_threshold(0.5-0.6),且在 Prompt 中明确说明"如果检索信息不足以回答问题,请说不知道"。
Q:如何处理文档中的图表?
A:1)用 GPT-4V 将图表转为文字描述后入库;2)为图表单独生成自然语言描述(如「图3展示了2024年各季度销售额,Q3最高达1200万」)。
相关资源
相关工具