SECTOR 06 / KNOWLEDGE EXPEDITION

RAG 技术详解

深入理解检索增强生成(RAG)技术的核心原理、系统架构与工程实践

01

RAG 架构设计与核心流程

EXPLORE +

为什么需要 RAG?

大语言模型虽然知识渊博,但存在两个致命缺陷:知识截止(训练数据有截止日期,无法感知新知识)和幻觉(可能编造看似合理但事实错误的内容)。RAG(Retrieval-Augmented Generation)通过检索外部知识库来增强生成能力,像一个学者在回答问题前先去查资料。

# RAG 核心三阶段
# 1. 索引(Indexing):将文档切片、向量化,构建可检索的知识库
# 2. 检索(Retrieval):根据用户问题召回最相关的文档片段
# 3. 生成(Generation):基于检索结果 + 原始问题,生成可信回答

def rag_pipeline(question, knowledge_base):
# 阶段一:检索
query_embedding = embed(question) # 将问题向量化
relevant_docs = search(query_embedding, # 在向量库中语义检索
knowledge_base, top_k=5)

# 阶段二:生成
context = "\n\n".join(relevant_docs) # 拼接检索到的上下文
prompt = f"基于以下资料:\n{context}\n\n回答:{question}"
answer = llm.generate(prompt) # 让 LLM 基于上下文回答
return answer

RAG 的哲学意义

RAG 的核心理念是:真正的智能不在于记住一切,而在于知道在哪里找到答案。就像一位博学之士,不在于脑中存了多少本书,而在于知道遇到问题时该翻开哪本书。RAG 将 LLM 从「背诵者」转变为「研究者」——不是依赖训练时学到的知识,而是在回答的当下主动查阅资料。这种「检索→思考→回答」的范式,比纯粹的参数化记忆更接近人类智能的本质。

完整 RAG 系统架构

用户提问

1. 查询理解(Query Understanding)
├── 查询改写(Query Rewriting):"transformer 注意力机制" → "transformer 的注意力机制是什么?有哪些类型?"
├── 查询扩展(Query Expansion):用 LLM 生成同义问题,多角度检索
└── 查询分解(Query Decomposition):复杂问题拆解为子问题

2. 检索(Retrieval)
├── 稠密检索(Dense Retrieval):语义嵌入相似度搜索
├── 稀疏检索(Sparse Retrieval):BM25 关键词匹配
└── 混合检索(Hybrid Search):加权融合两种检索结果

3. 重排序(Reranking)
└── Cross-encoder 精排:对召回结果逐对打分,过滤不相关信息

4. 上下文构建(Context Construction)
├── 窗口扩展:以检索到的 chunk 为中心,展开其上下文
├── 去重融合:合并信息重叠的文档片段
└── 压缩精简:只保留与问题最相关的句子

5. 生成(Generation)
├── 引用标注:在生成内容中标注信息来源
├── 幻觉检测:LLM 自我评估回答的可信度
└── 溯源验证:确保每个陈述都有资料支撑

用户收到回答 + 引用来源
02

向量数据库与 Embedding

EXPLORE +

Embedding:把语义变成数学

Embedding 是将文本、图片等非结构化数据映射到高维向量空间的技术。语义相近的文本在向量空间中距离更近——这是 RAG 检索的数学基础。

# Embedding 的核心思想:语义相似度 = 向量距离
# 模型:text-embedding-3-small (OpenAI), bge-large (BAAI),
# m3e (Moka), stella (infgrad)
# 输出维度:384 ~ 3072 维向量

def cosine_similarity(vec_a, vec_b):
"""余弦相似度:1=完全相同,0=完全不相关,-1=语义相反"""
dot = sum(a*b for a,b in zip(vec_a, vec_b))
norm_a = sum(a*a for a in vec_a)**0.5
norm_b = sum(b*b for b in vec_b)**0.5
return dot / (norm_a * norm_b)

# 示例:语义相似度对比
print(cosine_similarity(
embed("猫坐在垫子上"),
embed("一只猫咪趴在毯子上")
)) # 0.87 — 语义高度相似

print(cosine_similarity(
embed("猫坐在垫子上"),
embed("如何编写 Python 程序")
)) # 0.12 — 语义几乎无关

向量数据库选型对比

数据库索引算法开源适合场景
FAISSIVF+PQ/HNSW高性能离线检索、批量向量搜索
Milvus多种混合大规模生产环境、分布式部署
QdrantHNSWRust 实现、低延迟、过滤器丰富
ChromaHNSW快速原型、轻量嵌入、开发者友好
Pinecone专有Serverless 托管、免运维

HNSW 算法的精妙之处

HNSW(Hierarchical Navigable Small World)是目前最流行的近似最近邻搜索算法。它的核心思想借鉴了社交网络中的「六度分隔」理论——通过构建多层图索引,搜索时从顶层(粗粒度)快速定位到目标区域,再到底层(细粒度)精确搜索。搜索时间复杂度从暴力搜索的 O(N) 降到 O(log N),同时保持 95%+ 的检索精度。

03

检索策略:从朴素到智能

EXPLORE +

检索方法的进化谱系

RAG 的检索策略经历了从简单到复杂的演进,理解每种方法的优劣是构建高质量 RAG 系统的关键。

1. 稠密检索(Dense Retrieval)

用双编码器(Dual Encoder)架构将查询和文档分别编码为向量,通过向量相似度检索。

class DenseRetriever:
def __init__(self, model_name="BAAI/bge-large-zh"):
self.encoder = SentenceTransformer(model_name)
self.index = FAISS(IndexFlatIP, 1024) # 内积索引

def add_documents(self, docs):
"""将文档向量化后加入索引"""
vectors = self.encoder.encode(docs)
self.index.add(vectors)

def search(self, query, k=5):
"""语义检索"""
q_vec = self.encoder.encode([query])
scores, indices = self.index.search(q_vec, k)
return [self.docs[i] for i in indices[0]]

2. 稀疏检索(BM25)

基于词频统计的经典检索方法,对精确关键词匹配非常有效。

# BM25 评分公式
# Score(q,d) = Σ IDF(q_i) × TF(q_i,d) × (k₁+1) / (TF + k₁×(1-b+b×|d|/avg_dl))
# 其中 k₁=1.6, b=0.75 是经验参数

3. 混合检索(Hybrid Search)

稠密检索擅长语义匹配但可能遗漏精准关键词,稀疏检索擅长关键词匹配但缺乏语义理解。混合检索加权融合两者:

def hybrid_search(query, dense_retriever, sparse_retriever, alpha=0.5):
"""alpha=0 纯稠密, alpha=1 纯稀疏"""
dense_results = dense_retriever.search(query)
sparse_results = sparse_retriever.search(query)

# RRF(Reciprocal Rank Fusion)融合策略
combined = {}
for rank, doc in enumerate(dense_results):
combined[doc.id] = combined.get(doc.id, 0) + alpha * 1/(rank+60)
for rank, doc in enumerate(sparse_results):
combined[doc.id] = combined.get(doc.id, 0) + (1-alpha) * 1/(rank+60)

return sorted(combined.items(), key=lambda x: -x[1])[:10]

4. 重排序(Reranking)

检索后的结果需要精排:Cross-encoder 模型同时看到查询和文档,计算更精确的相关性分数。

# 粗排:双编码器(效率高,精度一般)
# 精排:Cross-encoder(效率低,精度高)
# 典型管线:粗排取 top-100 → 精排取 top-5
04

高阶 RAG 范式

EXPLORE +

RAG 的智能进化

基础 RAG(检索→生成)虽然有效,但在复杂场景下暴露出诸多问题:检索结果不相关、多步推理困难、无法自我修正。于是,一系列高阶 RAG 范式应运而生。

1. Corrective RAG(CRAG)

CRAG 在检索后增加质量评估环节:如果检索结果不可靠,自动触发网络搜索或知识回退。

def corrective_rag(question):
docs = retrieve(question)
relevance = evaluate_relevance(docs, question) # 自评检索质量

if relevance > 0.8:
return generate(question, docs) # 高质量,直接生成
elif relevance > 0.3:
docs += web_search(question) # 补充网络搜索
return generate(question, docs)
else:
return "我无法从现有资料中找到可靠答案" # 回退到保守回答

2. Self-RAG

Self-RAG 让模型自主决定:是否需要检索、检索到什么、以及生成的内容是否可信。通过训练模型输出特殊的反思 token(如 `<检索>`、`<相关>`、`<支持>`),实现检索和生成的深度融合。

3. Agentic RAG

Agentic RAG 将 RAG 流程从「固定的检索→生成」流水线升级为智能体自主规划

Agent 的思考过程:
1. 用户问「华为 2024 年的研发投入和苹果对比如何?」
2. Agent 思考:这个问题涉及两个实体的数据,需要分别检索
3. 行动一:检索「华为 2024 年报 研发投入」
4. 行动二:检索「Apple 2024 R&D spending」
5. 发现数据单位不同(人民币 vs 美元)
6. 行动三:查询汇率(1 USD = 7.2 CNY)
7. 行动四:计算并对比
8. 生成综合回答:"华为研发投入 1797 亿元(约 250 亿美元),
苹果 303 亿美元。苹果的研发投入比华为高约 21%。"

4. HyDE(假设性文档嵌入)

HyDE 的核心洞察:查询和文档之间可能存在语义差异。比如搜索「如何治疗感冒」,文档可能写作「上呼吸道感染的用药方案」。HyDE 的做法是:先用 LLM 根据问题生成一段假设性回答,然后用这个假设回答去检索,因为「回答 vs 文档」的语义匹配度通常高于「问题 vs 文档」。

05

RAG 评估与质量保障

EXPLORE +

RAG 评估的三维框架

一个 RAG 系统的好坏不能只看最终回答是否准确,需要从三个独立维度评估:

# RAG 评估三维度
# 1. Retrieval Quality(检索质量)
# - Context Relevance:检索到的上下文与问题的相关度
# - Hit Rate:关键信息是否被成功召回
# - MRR (Mean Reciprocal Rank):正确答案的排位
#
# 2. Generation Quality(生成质量)
# - Answer Relevance:回答是否直接回应问题
# - Faithfulness:回答是否有来源支撑(不凭空编造)
# - Completeness:是否完整覆盖了问题的各个方面
#
# 3. Integration Quality(融合质量)
# - Citation Accuracy:引用标注是否正确
# - Context Utilization:模型是否真正利用了检索到的上下文
# - Hallucination Rate:无中生有的比例

RAGAS 评估框架

RAGAS 是最流行的 RAG 评估框架,提供标准化评分:

from ragas import evaluate
from ragas.metrics import context_precision, faithfulness

# context_precision:检索到的文档中有多少真正相关
# faithfulness:生成的回答中有多少信息有检索结果支撑
# answer_relevancy:回答与问题的相关程度

scores = evaluate(
dataset=test_questions,
metrics=[context_precision, faithfulness, answer_relevancy]
)

评估驱动的 RAG 优化策略

发现问题可能原因优化方案
检索不相关Chunk 太大/太小、Embedding 模型不适合领域调整切片策略、换用领域 Embedding 模型
幻觉率高模型忽略上下文、检索信息不足增加 top-k、使用更严格的 system prompt
回答不完整检索遗漏关键信息、查询理解不充分查询改写、多路检索融合
引用错误引用机制设计不当、Span 定位不准确基于 chunk 的引用、限制引用范围
06

RAG 的局限性与未来方向

EXPLORE +

RAG 的先天局限

RAG 并非万能。在追求 RAG 的同时,我们需要清醒认识它的边界:

  • 「垃圾进,垃圾出」:如果知识库本身质量不高、信息过时或存在偏见,RAG 只是让 LLM 更高效地重复这些错误。RAG 增强的是知识的可信度,而非知识的真理性
  • 检索瓶颈:再好的检索算法也有召回极限。如果关键信息不在 top-k 中,后续生成再好也无济于事。
  • 上下文窗口的局限:检索到的文档越多,LLM 的处理负担越重。虽然窗口已扩展到百万级,但「迷失在中间」现象仍然存在。
  • 系统复杂度:一个生产级 RAG 系统需要协调 Embedding 模型、向量数据库、重排序、提示词管理、监控评估等 10+ 组件,每个环节都可能是短板。

RAG 的未来演进

  • GraphRAG:在向量检索之外引入知识图谱,通过实体间的关系路径进行多跳推理,回答需要跨文档联结才能解答的复杂问题。
  • 多模态 RAG:超越纯文本检索,同时检索图像、表格、音频、视频。例如,回答「这个图表的趋势说明了什么?」需要同时理解图片和文字。
  • Agentic 融合:RAG 不再是固定的检索→生成流程,而是由 Agent 自主规划——它会自问「我需要什么信息?从哪里获取?如何验证?」
  • 与微调的边界消融:未来的 RAG 系统可能结合轻量级微调,在检索和记忆之间取得最佳平衡。

最后的哲思

RAG 代表了 AI 发展中的一个深刻转向:从「让模型背下整个互联网」到「让模型学会使用工具」。这不仅是技术的演进,更是对智能本质的重新思考——真正的智慧不在于存储了多少信息,而在于知道如何获取、甄别和运用知识。就像一位真正的学者,不在于脑中装着多少本书,而在于面对未知时,知道该翻开哪一本书、如何批判性地阅读、以及如何将不同来源的智慧融合成新的洞见。