是什么
L2 · 主题中枢
RAG
RAG 用检索代替记忆,让大模型基于可信外部知识生成回答
RAG 的效果不取决于模型多强,而取决于能否精准召回相关上下文并有效过滤噪声。分块策略、Embedding 质量和重排机制是成败关键。
为什么
解决大模型知识截止、幻觉和私有数据不可见问题,让模型基于最新、可信的业务数据生成回答,降低训练成本。
怎么做
从文档解析、分块、向量化、存储到检索、重排、生成的最小闭环,用 LangChain 或 LlamaIndex 快速搭建原型。
什么时候
适用于需要引用最新/私有知识且容忍一定延迟的场景;知识固定、实时性要求极高或纯逻辑推理任务不适用。
FOCUS
先记住这些
为什么需要 RAG
相比微调,RAG 无需重新训练即可注入新知识,支持精确引用和溯源,更新成本低。相比纯 Prompt,能突破知识截止和上下文窗口限制。
真正难在哪里
分块粒度影响召回精度,过小丢失上下文,过大引入噪声。Embedding 模型对领域术语敏感度不足会导致语义漂移。检索噪声直接污染生成结果。
什么时候用
知识频繁更新、需要引用来源、私有数据不可公开训练时适用。知识固定、实时性要求极高、纯逻辑推理或数据量极小时应换简单方案。
ROUTE
学习路径
掌握文档解析、分块、向量化、检索、重排、生成的完整链路
用 LangChain 或 LlamaIndex 实现最小可用 RAG,跑通本地知识库问答
调整分块策略、替换 Embedding 模型、引入重排、优化 Top-K 和阈值
处理并发、缓存、监控、评估幻觉率,设计兜底策略
PROBLEM / POSITION / INTERFACE
先弄清它为什么存在,以及谁在使用
-
01 解决的问题
当模型需要回答训练数据之外的最新信息、企业私有知识或需要引用来源时
直接 Prompt 无法突破知识截止,微调成本高且更新困难,模型易产生幻觉或编造事实
- 成功标准
- 模型能准确引用检索到的外部知识,回答有据可查,幻觉率显著降低,知识更新无需重新训练
-
02 AI 生态位
位于检索系统与生成模型之间,负责将非结构化知识转化为模型可消费的上下文
- 上游
- 依赖文档解析、分块策略、Embedding 模型和向量数据库
- 下游
- 为对话系统、智能客服、知识问答、代码助手等提供增强后的生成能力
-
03 人的生态位
负责定义知识边界、评估检索质量、设计 Prompt 模板和验收生成结果
- 适合使用
- 知识频繁更新、需要引用来源、私有数据不可公开训练、对幻觉容忍度低
- 不必使用
- 知识固定且公开、实时性要求毫秒级、纯逻辑/数学推理、数据量极小可直接 Prompt
-
04 独特价值
无需重新训练即可动态注入最新知识,支持精确引用和溯源,成本远低于微调
分块粒度与检索召回率的平衡、多模态文档解析、跨语言 Embedding 对齐、幻觉与检索噪声的过滤
- 复杂度判断
- 复杂度不是功能数量,而是控制与验证成本。
INTERFACE FLOW
谁在操作,信息怎样流动
-
WHO OPERATES
HUMAN定义知识范围、选择分块策略、设计 Prompt 模板、评估检索与生成质量
SYSTEM执行文档解析、向量化、存储、检索、重排和生成调用
BACKEND维护向量数据库、管理索引、处理并发请求和缓存
-
INPUT
用户查询、业务文档、知识库索引、检索参数
-
CONTROL
检索 Top-K、相似度阈值、重排模型选择、Prompt 模板、温度参数、上下文窗口大小
-
OUTPUT
带引用来源的生成文本、检索上下文元数据、置信度评分,不直接修改外部系统
FLOW
RAG 最小使用流程
COMPARE
RAG 与替代方案对比
| 维度 | RAG | 微调 | 纯 Prompt |
|---|---|---|---|
| 知识更新成本 | 低,更新索引即可 | 高,需重新训练 | 无,受限于训练数据 |
| 引用溯源 | 支持,可精确到 Chunk | 不支持,黑盒生成 | 不支持 |
| 上下文窗口 | 可扩展,检索注入 | 受限于模型窗口 | 受限于模型窗口 |
| 幻觉控制 | 较强,依赖检索质量 | 中等,依赖训练数据 | 弱,易编造 |
| 适用场景 | 动态知识、私有数据 | 固定领域风格 | 简单问答、逻辑推理 |
import os
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import FAISS
from langchain.chains import RetrievalQA
# 加载文档
loader = TextLoader("knowledge.txt")
docs = loader.load()
# 分块
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(docs)
# 向量化与存储
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = FAISS.from_documents(chunks, embeddings)
# 检索与生成
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
return_source_documents=True
)
# 查询
result = qa_chain.invoke({"query": "RAG 的核心优势是什么?"})
print(result["result"])
print("来源:", [doc.metadata for doc in result["source_documents"]])使用 LangChain 实现本地知识库问答闭环
{
"result": "RAG 的核心优势在于无需重新训练即可动态注入最新知识,支持精确引用和溯源,更新成本远低于微调。",
"source_documents": [
{
"page_content": "RAG 通过检索外部知识增强生成,解决幻觉与知识滞后...",
"metadata": {
"source": "knowledge.txt",
"chunk_id": "chunk_001"
}
}
]
}PRACTICE
RAG 上线检查清单
FAQ
常见问题
01RAG 和微调有什么区别,什么时候选哪个?+
RAG 动态注入知识,支持引用,更新成本低;微调改变模型权重,适合固定领域风格。知识频繁更新选 RAG,风格/格式固定选微调。
避免盲目微调导致知识滞后和成本浪费02谁在实际使用 RAG?+
业务方定义知识边界,工程师搭建链路,算法调优检索质量,最终用户消费生成结果。
明确各环节责任,避免检索与生成脱节03最小可用 RAG 怎么搭建?+
用 LangChain 加载文档、分块、向量化存入 FAISS,构建 RetrievalQA 链,30 行代码跑通本地问答。
快速验证可行性,再逐步优化各模块04生产环境最容易在哪里失败?+
分块不当导致语义断裂、Embedding 不匹配领域术语、检索噪声污染生成、缺乏兜底策略。
决定监控指标和优化优先级05什么时候不需要 RAG?+
知识固定公开、实时性要求极高、纯逻辑推理或数据量极小时,直接 Prompt 或微调更合适。
控制系统成本,避免过度工程