跳转到内容

RAG 与检索增强:让模型有外部记忆

直觉版:开卷考试比闭卷考试更准

Section titled “直觉版:开卷考试比闭卷考试更准”

LLM 的知识来自预训练数据,有截止日期,也可能记错。RAG(Retrieval-Augmented Generation)的思路是:在回答前先查资料,把检索到的相关文档放进 prompt,让模型基于这些资料生成答案。这就像开卷考试:模型不是全靠记忆,而是可以引用外部信息。

RAG 的核心优势是:知识可更新(换数据库就行)、答案可溯源(知道来自哪篇文档)、幻觉更少(有依据而非编造)。

工程版:分块、嵌入、排序与生成的全链路

Section titled “工程版:分块、嵌入、排序与生成的全链路”

一个完整的 RAG 系统包含多个环节,每个环节都有工程取舍:

  1. 文档处理:长文档需要分块(chunking)。块太大可能超出上下文窗口;块太小可能丢失上下文语义。常见策略包括固定长度、按段落、按语义边界或递归分块。
  2. 嵌入与索引:用 embedding 模型把文本变成向量,存入向量数据库(如 FAISS、Milvus、Pinecone)。要评估召回率:Top-k 检索是否包含了真正相关的文档?
  3. 查询优化:用户原始 query 可能表达不清。HyDE(假设文档嵌入)让模型先生成假答案,再用假答案去检索;查询重写、扩展和路由也是常用手段。
  4. 重排序(Reranking):先用轻量模型召回大量候选,再用更强的交叉编码器精确排序,平衡速度与精度。
  5. 生成与引用:把检索结果拼进 prompt 时要注意顺序、冗余和冲突。要求模型给出引用来源,方便用户核验。

评估 RAG 不能只看生成质量,还要测检索召回、答案忠实度(faithfulness)和端到端延迟。一个常见的失败模式是”检索到了但模型没用到”,说明生成环节与检索环节没有对齐。

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 与长上下文模型的关系是热门话题:如果模型能直接读整本书,是否还需要检索?当前共识是,检索在精确性、可更新性和计算效率上仍有优势,但两者正在融合——模型可以自主决定何时检索、检索什么。

前沿方向包括:自适应检索(只在不确定时查资料)、多跳推理(跨文档追踪线索)、结构化 RAG(结合知识图谱、数据库 SQL 等)、以及端到端可微检索(让模型自己学习怎么查)。

🔬 开放研究问题

该领域的关键问题与研究方向:

  1. 检索与生成的协同优化:何时应该检索更多文档 vs. 信任模型参数记忆?
  2. HyDE 等查询扩展方法的理论基础是什么?在什么条件下能稳定提升召回率?
  3. 多模态 RAG(如结合 CLIP)面临哪些独特的挑战?图文检索的对齐质量如何保障?

本文引用论文

  • Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks — Patrick Lewis et al. (2020)

    RAG(检索增强生成)将预训练语言模型与信息检索系统结合:对于每个查询,先从知识库 检索相关文档,再将文档拼接进上下文后生成答案。这解决了语言模型知识过期和 幻觉问题的一大途径,是今天企业 AI 应用的核心架构之一。

  • Dense Passage Retrieval for Open-Domain Question Answering — Vladimir Karpukhin et al. (2020)

    双塔 BERT + in-batch negatives 训出第一个工业级稠密检索器,几乎一夜淘汰 BM25。今天向量检索(FAISS、pgvector)的工程范式从这里定型。

  • Precise Zero-Shot Dense Retrieval without Relevance Labels — Luyu Gao et al. (2022)

    让 LLM 先"假装"生成一个回答,再用它的 embedding 检索真文档。零监督、强泛化,是 RAG 时代最常被复用的检索增强 trick 之一。

  • Improving language models by retrieving from trillions of tokens — Sebastian Borgeaud et al. (2022)

    DeepMind 在预训练阶段就引入 chunked retrieval,让 7B 模型匹敌 175B GPT-3。证明检索不只是 RAG 推理时招式,也是预训练范式的另一种可能。

  • Learning Transferable Visual Models From Natural Language Supervision — Alec Radford et al. (2021)

    用 4 亿对图文做对比学习,得到通用视觉 encoder。CLIP embedding 至今是几乎所有多模态系统(DALL·E、Stable Diffusion、LLaVA)的视觉前端。

  • Visual Instruction Tuning — Haotian Liu et al. (2023)

    CLIP 视觉 encoder + LLaMA + GPT-4 合成的多模态指令数据,用极少算力做出第一个开源 GPT-4V 风格模型。开源多模态生态(LLaVA-1.5/1.6、Qwen-VL、InternVL)的范式起点。