深色模式
RAG 检索增强生成
是什么
Retrieval-Augmented Generation:先检索与问题相关的资料,再把资料连同问题一起生成答案。让模型基于"你提供的证据"回答,而非凭记忆。
为什么需要
模型的知识有截止日期、有盲区。RAG 让 Agent 能回答私有文档、实时数据、领域知识,且可溯源。
核心流程
关键步骤
- 切分(Chunking):按语义/标题/固定长度切分,保留重叠(overlap)避免截断上下文。
- 嵌入模型:选领域适配、支持中文的 embedding;同一检索空间必须用同一模型。
- 向量检索 + 重排:先用向量召回 TopK(如 20),再用 cross-encoder 重排取 Top3~5,质量显著提升。
- 混合检索:向量 + BM25 关键词,互补召回。
- 引用(Citation):让模型标注答案来自哪个 chunk,便于核查。
最小范式
python
chunks = split_document(doc, size=800, overlap=100)
vec.upsert([embed(c) for c in chunks])
hits = vec.search(embed(query), top_k=20)
ranked = rerank(query, hits, top_k=4)
context = "\n\n".join(f"[来源{i+1}] {h.text}" for i, h in enumerate(ranked))
answer = llm(f"基于以下资料回答问题,并标注来源编号:\n{context}\n\n问题:{query}")1
2
3
4
5
6
2
3
4
5
6
常见陷阱
- 切分过碎/过粗:碎则丢上下文,粗则噪声多;按语义边界切最优。
- 只用向量不重排:召回相关但排序差,TopK 把关键段挤掉。
- 幻觉引用:模型编造来源编号,需校验编号确实存在于上下文。
- 不评估:用 recall@k、答案命中率量化,而不是"感觉还行"。
何时用 RAG vs 微调
知识频繁更新、需可溯源、数据私有 → RAG。任务范式固定、需固化风格 → 微调。两者可叠加。
参考
- LlamaIndex RAG 文档
- LangChain Retrieval 文档
- 各向量数据库文档(Milvus / Qdrant / pgvector / Elasticsearch)