RAG 与检索增强:让模型有外部记忆
直觉版:开卷考试比闭卷考试更准
Section titled “直觉版:开卷考试比闭卷考试更准”LLM 的知识来自预训练数据,有截止日期,也可能记错。RAG(Retrieval-Augmented Generation)的思路是:在回答前先查资料,把检索到的相关文档放进 prompt,让模型基于这些资料生成答案。这就像开卷考试:模型不是全靠记忆,而是可以引用外部信息。
RAG 的核心优势是:知识可更新(换数据库就行)、答案可溯源(知道来自哪篇文档)、幻觉更少(有依据而非编造)。
工程版:分块、嵌入、排序与生成的全链路
Section titled “工程版:分块、嵌入、排序与生成的全链路”一个完整的 RAG 系统包含多个环节,每个环节都有工程取舍:
- 文档处理:长文档需要分块(chunking)。块太大可能超出上下文窗口;块太小可能丢失上下文语义。常见策略包括固定长度、按段落、按语义边界或递归分块。
- 嵌入与索引:用 embedding 模型把文本变成向量,存入向量数据库(如 FAISS、Milvus、Pinecone)。要评估召回率:Top-k 检索是否包含了真正相关的文档?
- 查询优化:用户原始 query 可能表达不清。HyDE(假设文档嵌入)让模型先生成假答案,再用假答案去检索;查询重写、扩展和路由也是常用手段。
- 重排序(Reranking):先用轻量模型召回大量候选,再用更强的交叉编码器精确排序,平衡速度与精度。
- 生成与引用:把检索结果拼进 prompt 时要注意顺序、冗余和冲突。要求模型给出引用来源,方便用户核验。
评估 RAG 不能只看生成质量,还要测检索召回、答案忠实度(faithfulness)和端到端延迟。一个常见的失败模式是”检索到了但模型没用到”,说明生成环节与检索环节没有对齐。
示例代码:简单的 RAG 流程
Section titled “示例代码:简单的 RAG 流程”import numpy as np
def cosine_similarity(v1, v2): """计算余弦相似度""" return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
class SimpleRAG: """简化的 RAG 系统示例"""
def __init__(self, documents): self.documents = documents # 实际应使用真实的 embedding 模型,这里用随机向量模拟 self.doc_embeddings = { doc: np.random.randn(128) for doc in documents }
def embed_query(self, query): """将查询转换为向量(实际应使用 embedding 模型)""" return np.random.randn(128)
def retrieve(self, query, top_k=3): """检索最相关的 k 个文档""" query_embedding = self.embed_query(query)
# 计算所有文档的相似度 similarities = [] for doc, doc_emb in self.doc_embeddings.items(): sim = cosine_similarity(query_embedding, doc_emb) similarities.append((doc, sim))
# 按相似度排序并返回 top-k similarities.sort(key=lambda x: x[1], reverse=True) return [doc for doc, _ in similarities[:top_k]]
def generate_with_context(self, query, retrieved_docs): """基于检索到的文档生成答案""" context = "\n\n".join([f"文档 {i+1}: {doc}" for i, doc in enumerate(retrieved_docs)]) prompt = f"""参考以下文档回答问题:
{context}
问题: {query}答案:""" return prompt
# 示例使用documents = [ "Python 是一种高级编程语言,广泛用于数据科学和机器学习。", "Transformer 是一种深度学习架构,使用注意力机制处理序列数据。", "RAG 结合了检索和生成,可以提高 LLM 的准确性和可溯源性。"]
rag = SimpleRAG(documents)query = "什么是 RAG?"retrieved = rag.retrieve(query, top_k=2)prompt = rag.generate_with_context(query, retrieved)print(prompt)研究版:RAG 的边界与新方向
Section titled “研究版:RAG 的边界与新方向”研究上,RAG 与长上下文模型的关系是热门话题:如果模型能直接读整本书,是否还需要检索?当前共识是,检索在精确性、可更新性和计算效率上仍有优势,但两者正在融合——模型可以自主决定何时检索、检索什么。
前沿方向包括:自适应检索(只在不确定时查资料)、多跳推理(跨文档追踪线索)、结构化 RAG(结合知识图谱、数据库 SQL 等)、以及端到端可微检索(让模型自己学习怎么查)。
🔬 开放研究问题
该领域的关键问题与研究方向:
- 检索与生成的协同优化:何时应该检索更多文档 vs. 信任模型参数记忆?
- HyDE 等查询扩展方法的理论基础是什么?在什么条件下能稳定提升召回率?
- 多模态 RAG(如结合 CLIP)面临哪些独特的挑战?图文检索的对齐质量如何保障?
本文引用论文
- Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks
RAG(检索增强生成)将预训练语言模型与信息检索系统结合:对于每个查询,先从知识库 检索相关文档,再将文档拼接进上下文后生成答案。这解决了语言模型知识过期和 幻觉问题的一大途径,是今天企业 AI 应用的核心架构之一。
- Dense Passage Retrieval for Open-Domain Question Answering
双塔 BERT + in-batch negatives 训出第一个工业级稠密检索器,几乎一夜淘汰 BM25。今天向量检索(FAISS、pgvector)的工程范式从这里定型。
- Precise Zero-Shot Dense Retrieval without Relevance Labels
让 LLM 先"假装"生成一个回答,再用它的 embedding 检索真文档。零监督、强泛化,是 RAG 时代最常被复用的检索增强 trick 之一。
- Improving language models by retrieving from trillions of tokens
DeepMind 在预训练阶段就引入 chunked retrieval,让 7B 模型匹敌 175B GPT-3。证明检索不只是 RAG 推理时招式,也是预训练范式的另一种可能。
- Learning Transferable Visual Models From Natural Language Supervision
用 4 亿对图文做对比学习,得到通用视觉 encoder。CLIP embedding 至今是几乎所有多模态系统(DALL·E、Stable Diffusion、LLaVA)的视觉前端。
- Visual Instruction Tuning
CLIP 视觉 encoder + LLaMA + GPT-4 合成的多模态指令数据,用极少算力做出第一个开源 GPT-4V 风格模型。开源多模态生态(LLaVA-1.5/1.6、Qwen-VL、InternVL)的范式起点。