先聊聊大模型的"硬伤"
你有没有遇到过这种情况:
问ChatGPT或者其他AI:“我们公司最新的产品手册里说了什么?”
AI一本正经地给你编了一堆,听起来很像那么回事,但全是假的。
或者问它:“2025年最新的某某政策是什么?”
它告诉你:“我的知识截止到2024年,无法回答。”
这就是大模型的两个经典"硬伤":
- 知识有截止日期——训练完就定型了,新知识它不知道
- 容易"幻觉" ——不知道的事它也敢编,还编得有模有样
那怎么解决这个问题?RAG 就是答案。
RAG 到底是个啥?
RAG 全称是 Retrieval-Augmented Generation,翻译过来就是"检索增强生成"。
听起来很高大上,其实原理超级简单,我用一个比喻来说:
想象你是一个学生,要参加开卷考试。
闭卷考试 = 普通大模型,全靠脑子里记的东西答题,记错了就错了。
开卷考试 = RAG,考试前先去翻书找答案,再把找到的内容写进答卷里。
RAG 就是给大模型开了一个"外挂书包",让它在回答问题之前,先去你指定的资料库里检索相关内容,然后再基于这些内容来生成回答。
RAG 的工作流程,三步搞定
整个 RAG 的流程其实就三步,我画个简单的流程:
用户提问
↓
① 检索(Retrieval):去知识库里找相关内容
↓
② 增强(Augmented):把找到的内容塞进提示词
↓
③ 生成(Generation):大模型基于这些内容回答
↓
输出答案
举个具体例子:
你问:“我们公司的请假流程是什么?”
没有RAG的情况:
AI:“请假一般需要提前申请,填写请假单,经过上级审批……”(全是通用废话,跟你公司没半毛钱关系)
有RAG的情况:
- 系统先去公司内部文档库里搜索"请假流程"相关内容
- 找到了《员工手册第3章:请假制度》的具体段落
- 把这段内容连同你的问题一起发给AI
- AI基于真实文档回答你:“根据公司规定,请假需提前3天在OA系统提交申请,3天以内由直属主管审批,3天以上需HR和部门总监双重审批……”
是不是一下子就靠谱多了?
RAG 的核心组件,拆开来看
要搭一个 RAG 系统,你需要这几个东西:
1. 知识库(Knowledge Base)
就是你的"资料包",可以是:
- PDF 文档、Word 文件
- 网页内容
- 数据库记录
- 代码文档
- 任何你想让AI知道的内容
2. 向量数据库(Vector Database)
这是 RAG 里最"技术"的部分,但理解起来也不难。
普通数据库是按关键词搜索的,比如你搜"苹果",它只会找包含"苹果"这个词的内容。
向量数据库不一样,它把文本转换成一串数字(向量),然后通过语义相似度来搜索。
比如你搜"苹果",它能找到"iPhone"、“MacBook”、"乔布斯"相关的内容,因为它们在语义上是相关的。
常见的向量数据库有:Chroma、Pinecone、Weaviate、Milvus 等。
3. Embedding 模型
负责把文本转换成向量的工具。你可以理解为一个"翻译官",把人类语言翻译成机器能做数学运算的数字。
常用的有 OpenAI 的 text-embedding-ada-002,或者开源的 bge-m3(中文效果很好)。
4. 大语言模型(LLM)
最后负责生成回答的,就是 GPT、Claude、Qwen 这类模型。
一个最简单的 RAG 代码示例
用 Python + LangChain 搭一个最简版 RAG,感受一下:
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
# 第一步:加载你的文档
loader = TextLoader("company_handbook.txt", encoding="utf-8")
documents = loader.load()
# 第二步:把文档切成小块(太长了塞不进去)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 每块500个字符
chunk_overlap=50 # 块之间有50字符的重叠,防止信息断层
)
chunks = text_splitter.split_documents(documents)
# 第三步:转成向量,存进向量数据库
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(chunks, embeddings)
# 第四步:创建检索问答链
qa_chain = RetrievalQA.from_chain_type(
llm=OpenAI(),
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}) # 每次检索最相关的3块
)
# 第五步:提问!
answer = qa_chain.run("公司的请假流程是什么?")
print(answer)
就这么几十行代码,一个基础的 RAG 系统就跑起来了。
RAG 的几个坑,提前告诉你
坑1:文档切块(Chunking)很有讲究
切太小:上下文不够,AI理解不了完整意思
切太大:超出模型的上下文窗口,或者检索精度下降
建议: 一般 500-1000 字符一块,根据你的文档类型调整。
坑2:检索召回率不够
有时候明明文档里有答案,但就是没检索到。
解决方案:
- 用混合检索(关键词 + 语义双管齐下)
- 增加检索数量(k值调大)
- 优化 Embedding 模型(中文用中文专用模型)
坑3:检索到了但AI没用上
检索到了相关内容,但AI在生成时"忽略"了,还是按自己的理解回答。
解决方案: 优化提示词,明确告诉AI"只基于以下内容回答,不要发挥"。
RAG vs 微调,傻傻分不清楚?
很多初学者会问:我直接把数据拿去微调模型不就好了,为什么要用RAG?
| 对比项 | RAG | 微调(Fine-tuning) |
|---|---|---|
| 成本 | 低,随时更新知识库 | 高,每次更新都要重新训练 |
| 知识更新 | 实时,改文档就行 | 慢,需要重新训练 |
| 适合场景 | 知识密集型问答 | 改变模型风格/能力 |
| 可解释性 | 高,能看到检索来源 | 低,黑盒 |
| 幻觉控制 | 好,有原文约束 | 一般 |
结论: 大多数企业知识库、客服机器人、文档问答场景,优先选RAG,成本低、效果好、好维护。
现在流行的 RAG 框架
不想从零搭,直接用这些框架:
- LangChain — 最流行,生态最丰富,文档多
- LlamaIndex — 专注于数据索引和检索,RAG场景更专业
- Dify — 有可视化界面,不想写代码的首选
- FastGPT — 国内团队做的,中文支持好,开箱即用
总结
RAG 的核心思想就一句话:
与其让AI死记硬背,不如给它一个随时可查的"外挂书包"。
它解决了大模型最头疼的两个问题:知识过时 + 容易幻觉。
对于初学者来说,RAG 是一个性价比极高的技术方向——原理不复杂,落地场景多,企业需求大。
如果你想动手试试,推荐从 LangChain + Chroma + OpenAI 这个组合开始,跑通一个最简单的文档问答 demo,你就算入门了。
如果这篇文章对你有帮助,点个赞👍 收藏一下,后续我还会写 RAG 进阶优化、GraphRAG、多模态RAG等内容,一起学习!