目录
"想让ChatGPT读取公司的员工手册,自动回答员工提问"、"想检索最新论文数据库并自动总结"——这类需求越来越多。但ChatGPT的训练数据停留在过去某个时间点,机密的公司文档也不能直接拿去训练AI。
解决这个矛盾的技术,就是 RAG(Retrieval-Augmented Generation/检索增强生成)。自2023年起,它已成为企业AI落地中最重要的关键词之一,ChatGPT的"Custom GPTs"、"Projects"功能在底层也用了RAG。
本文将用3个步骤图解RAG的工作原理,从向量数据库、LangChain实现到与微调的区别,面向初学者讲清楚,但同时保持技术层面的准确性。
1. RAG是什么——Retrieval-Augmented Generation
RAG(Retrieval-Augmented Generation) 直译就是"用检索(Retrieval)增强(Augmented)的生成(Generation)"。中文里通常译为"检索增强生成"。
用一句话概括:"LLM(大语言模型)在给出答案之前,先从外部数据库检索相关信息,再参考检索结果生成回答的机制"。
用做菜来类比
单独的LLM就像是"靠记忆做饭的厨师"。手艺虽好,但不知道的菜谱做不出来,也不清楚冰箱里有什么。
RAG则相当于"给厨师一本菜谱,再告诉他冰箱里有什么食材,然后让他做菜"。厨师可以一边翻菜谱,一边用现有食材做出最合适的菜。
"Retrieval"、"Augmented"、"Generation"各自的角色
| 单词 | 含义 | 在RAG中的角色 |
|---|---|---|
| Retrieval | 检索・取回 | 从数据库中取出与问题相关的文档 |
| Augmented | 增强・扩展 | 把取回的信息加进提示词,再交给LLM |
| Generation | 生成 | LLM参考检索结果生成最终回答 |
关键在于,并不是重新训练LLM本身,而是每次提问时把"必要的知识"从外部喂进去。这是RAG与下文要讲的微调最根本的区别。
2. 为什么需要RAG——LLM自身的3个局限
仅靠ChatGPT、Claude这样的LLM,有3个问题难以解决。
局限1:知识截止(信息时效性)
LLM是基于"截止某个时间点的数据"训练的,对训练之后的最新信息一无所知。例如GPT-4的初版只掌握到2023年4月之前的信息。
- "昨天发布的新产品讲讲"→ 答不上来
- "上周出的新法规具体是什么"→ 答不上来
- "今天的汇率是多少"→ 答不上来
有了RAG,就可以从最新的新闻、数据库、API中调取信息再回答。
局限2:幻觉(看似合理的胡编)
LLM被问到不知道的事情时,常常会编出看起来很可信的答案。这就是所谓的幻觉(hallucination)。
例如问:"贵公司员工手册里年假是多少天?"——LLM其实不知道,却可能回答"一般是10到20天"。这种答案根本无法用在实际业务里。
RAG会去检索真实的员工手册文档作为参考,从而得到有依据的回答。还能附带"出自哪份文档第几页"的引用来源。
局限3:无法访问公司内部数据与私有数据
LLM的训练数据里不包含你公司的工作手册、合同、客户信息。把机密信息直接交给LLM训练也不现实(有信息泄露风险,成本也高)。
RAG的做法是把公司文档存进自己的向量数据库,每次提问时只取相关片段交给LLM,既保住了安全又能利用公司内部数据。
3. 工作原理——3步运转的RAG
RAG的运行可以分为"预处理(建索引)"和"运行时(问答)"两个阶段。
预处理阶段——把文档向量化并保存
- 收集文档:PDF、Word、HTML、Markdown等,把要用到的文档收集起来
- 分块切分:把文档切成合适的长度(如500~1000字)
- 嵌入(Embedding):用嵌入模型(如OpenAI text-embedding-3-small)把每个分块转成1536维等的向量(数值数组)
- 存入向量数据库:把分块和对应的向量存进专用的向量库(Pinecone、Qdrant等)
这一步在文档新增或更新时执行。
运行时阶段——回答问题的3个步骤
用户提问到来时,处理流程如下。
- Step 1: Retrieval(检索)
- 用同一个嵌入模型把问题文本向量化
- 在向量数据库中取出与"问题向量最相近"的Top-K个分块(通常3~10个)
- 相似度计算常用cosine similarity(余弦相似度)
- Step 2: Augmented(增强)
- 把取出的分块作为"参考信息"嵌入提示词
- 形如:"请基于以下信息回答问题:[检索结果] 问题:[用户提问]"
- Step 3: Generation(生成)
- 由LLM(GPT-4、Claude、Gemini等)基于参考信息生成回答
- 必要时附带"参考了哪份文档"的引用
具体例子:在ChatGPT里查询公司员工手册
"年假有几天?"这一提问的流程:
- 问题被嵌入模型转成向量 → [0.12, -0.45, 0.78, ...]
- 从向量库中取出与"假期"、"年假"相关的3个分块
- 取出的分块如:"第15条 年休假:入职满6个月的员工享有10天..."、"根据工龄最多20天..."等
- 组装提示词:"参考信息:第15条... 问题:年假有几天?"
- LLM回答:"入职6个月起10天,根据工龄最多20天(参见员工手册第15条)"
4. RAG的核心组件
下面看构成RAG的5大组件。
① 嵌入模型(Embedding Model)
用来把文本转成数值向量的AI模型。它经过训练,能保证"语义相近的文本,在向量空间里也彼此靠近"。
| 模型 | 提供方 | 特点 |
|---|---|---|
| text-embedding-3-small | OpenAI | 便宜且性能不错,1536维 |
| text-embedding-3-large | OpenAI | 更高精度,3072维 |
| voyage-3 | Voyage AI | Anthropic推荐,高精度 |
| Cohere Embed v3 | Cohere | 多语言能力强,中文表现也不错 |
| multilingual-e5-large | 微软(开源) | 可本地部署,免费 |
| BGE-M3 | BAAI(开源) | 支持100+语言,开源里的天花板 |
② 向量数据库
用来存储大量向量,并能快速找出"最相近向量"的专用数据库。下一节会详细讲。
③ 检索引擎(Retriever)
除了向量检索,常常还会结合关键词检索(如BM25)或混合检索一起使用。
④ LLM(生成端)
负责生成最终回答的大语言模型。GPT-4、Claude、Gemini、Llama 3等。商用API或开源本地模型都能跑。
⑤ 提示词模板
把检索结果和用户提问拼起来交给LLM的模板。它对RAG的精度有举足轻重的影响。
你是一名熟悉公司规章的助手。
请仅根据以下参考信息回答问题。
若参考信息中没有答案,请回答"暂无相关信息"。
【参考信息】
{retrieved_chunks}
【问题】
{user_question}
【回答】
5. 什么是向量数据库
向量数据库与传统关系型数据库(MySQL等)不同,它专门用于"在高维向量空间中快速找到最近邻(最相似的向量)"。
主流向量数据库对比
| 数据库 | 类型 | 特点 | 价格 |
|---|---|---|---|
| Pinecone | 托管SaaS | 业界标准,配置极简 | 有免费额度,$70/月起 |
| Weaviate | 开源+云 | GraphQL API,混合检索 | 开源免费,云$25起 |
| Qdrant | 开源+云 | Rust编写,高速,过滤功能强 | 开源免费,云有免费额度 |
| Chroma | 开源 | 轻量,Python一行代码就能用 | 免费(自托管) |
| pgvector | PostgreSQL扩展 | 能直接用现有的PostgreSQL | 免费(开源扩展) |
| Milvus | 开源+云 | 大规模场景,能撑数十亿向量 | 开源免费,Zilliz Cloud |
| Elasticsearch | 搜索引擎 | 支持向量检索,可与现有运维整合 | 开源免费,有托管版 |
| Vertex AI Vector Search | Google Cloud | 与GCP生态深度整合 | 按量计费 |
该选哪个
- 先试一试:Chroma(pip install就能跑)
- 已经在用PostgreSQL:pgvector(数据库可以合并管理)
- 正式上线、运维负担最低:Pinecone(开箱即用)
- 开源正式部署:Qdrant 或 Weaviate
- 数亿~数十亿条的大规模:Milvus
顺便一提,如果你在为部署位置犯愁,可以参考 PaaS(Vercel等)与共享主机、VPS、云的对比。
6. 主要用途——RAG用在哪里
自2023年以来,RAG已是企业AI落地中采用最广的技术之一。下面介绍代表性的几类用途。
用途1:公司内部文档QA(知识库)
把员工手册、业务手册、技术规格书、会议纪要、销售资料等做成RAG,员工可以像用ChatGPT一样向其提问。Microsoft 365 Copilot针对SharePoint文档也用了RAG。
用途2:客服自动化
把FAQ与历史工单做成RAG,由聊天机器人完成一线响应。人工客服可以集中处理复杂问题。
用途3:法律、医疗等专业问答
把判例库、医学论文、诊疗指南等做成RAG,为律师与医生提供日常使用的查询系统。因为可以标注引用来源,特别适合需要凭据的专业领域。
用途4:研究论文检索与摘要
把arXiv、PubMed、Google Scholar等论文库做成RAG,回答"这一研究方向的最新进展是什么?"、"XX方法有哪些类似研究?"。Elicit、Perplexity都很有名。
用途5:电商网站的商品检索与FAQ
把商品手册、评论、退换政策等整合成RAG。"这款吸尘器对宠物毛发友好吗?"这样的自然语言检索就能跑通。
用途6:面向开发者的文档对话
把第三方库的官方文档做成RAG,回答"AWS Lambda想这样写,有没有示例?"这类问题。Stripe、Vercel、Supabase都已采用。
用途7:公司代码库的检索与解释
把GitHub代码做成RAG,提供"这个函数怎么用?"、"实现类似逻辑的文件有哪些?"等开发者工具。GitHub Copilot Chat、Cursor、Claude Code等开发AI 内部也都用了类似RAG的手法。
用途8:llms.txt等新型AI优化
用于让网页信息被AI正确引用的 llms.txt 与RAG也很搭,站点运营方可以把希望AI读取的信息以结构化方式提供。
7. RAG vs 微调——该如何选择
"让LLM拥有专属知识"的方法中,与RAG并列被反复讨论的是 微调(Fine-tuning)。两者的思路从根本上就不同。
根本差异
| 维度 | RAG | 微调 |
|---|---|---|
| 方法 | 运行时从外部加载信息 | 事先重新训练模型本身 |
| 知识更新 | 只更新数据库(即时) | 需要重新训练(耗时耗钱) |
| 初期成本 | 低(只搭数据库) | 高(要准备训练数据与算力) |
| 运维成本 | 检索 + LLM API费用 | 仅推理(拥有自有模型) |
| 幻觉 | 低(有引用源) | 中(凭学到的内容回答) |
| 引用源标注 | 容易 | 困难 |
| 学习文体口吻 | 不擅长 | 擅长 |
| 应对动态数据 | 擅长(实时信息也行) | 不擅长(需重新训练) |
| 机密数据处理 | 可全程在本地 | 同左(但更重) |
RAG适合的场景
- 知识更新频繁(新闻、内部文档、商品信息)
- 必须标注回答依据(法律、医疗、金融)
- 文档量极大(全部塞进训练并不现实)
- 想立即上手(缩短开发周期)
微调适合的场景
- 想让回答带特定文体或语气(企业品牌、人设)
- 想让模型掌握专业领域的语言风格(医学、法律措辞)
- 想降低推理成本(提示词可变短)
- 已经积累了大量训练数据
两者结合最强
其实 RAG与微调并非对立关系,而是可以叠加。文体用微调学习,最新知识由RAG实时供给——这种组合在生产环境中很常见。
不过 初学者还是先从RAG开始 是铁律。相比微调,搭建与运维都要轻松得多。
8. 实现方法——用LangChain搭建RAG
先介绍主流的RAG实现框架,再给出Python的最小示例代码。
主流框架
| 框架 | 语言 | 特点 |
|---|---|---|
| LangChain | Python / JS | 业界最普及,集成丰富 |
| LlamaIndex | Python | 专精数据接入与索引 |
| Haystack | Python | 面向企业,控制粒度细 |
| Semantic Kernel | C# / Python | 微软出品,对.NET友好 |
| DSPy | Python | 提示词自动优化 |
| 自行实现 | 任意 | 简单的RAG用100行也能写出来 |
用LangChain写一个最小的RAG
用LangChain实现一个对员工手册PDF回答问题的RAG,30行左右的代码就能搞定。
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA
# 1. 加载文档
loader = PyPDFLoader("handbook.pdf")
docs = loader.load()
# 2. 分块切分
splitter = RecursiveCharacterTextSplitter(
chunk_size=500, chunk_overlap=50
)
chunks = splitter.split_documents(docs)
# 3. 嵌入 + 构建向量库
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(chunks, embeddings)
# 4. 构建RAG链
llm = ChatOpenAI(model="gpt-4o-mini")
qa = RetrievalQA.from_chain_type(
llm=llm,
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
return_source_documents=True,
)
# 5. 提问
result = qa.invoke({"query": "年假有几天?"})
print(result["result"])
print("引用源:", [d.metadata for d in result["source_documents"]])
跑这段代码,就能从员工手册PDF中检索相关段落,由GPT-4o-mini生成回答。还能拿到引用源的页码,从而向用户附带"参见第15条"这样的引用作答。
面向生产环境的扩展
- 分块切分的优化(语义切分、层级切分等)
- 混合检索(向量 + 关键词BM25组合)
- 重排(rerank)(用Cohere Rerank、voyage-rerank等对检索结果重新排序)
- 查询改写(HyDE、Multi-Query等提升检索精度)
- 评估管线(用RAGAS做自动评估)
9. RAG的挑战与对策
RAG很强大,但实际部署中也会遇到下列挑战。
挑战1:分块切分的难题
如何切分文档,会显著影响检索精度。切得太短上下文会丢,切得太长检索精度又会下降。
对策:
- 语义切分(按意义单元切)
- 设置重叠(让相邻分块部分重合)
- 层级切分(父子结构存储,检索用子,引用用父)
挑战2:Retrieval(检索)精度
会取到看似相关其实不同的分块、漏掉重要信息等。
对策:
- 混合检索(向量 + BM25关键词)
- 用重排模型在检索后重新排序
- 多查询生成(用不同表述对同一问题检索)
挑战3:上下文长度限制
能传给LLM的token数有上限,无法塞入大量分块。
对策:
- 限制K值(取Top 3~5)
- 先做摘要再传入
- 使用长上下文LLM(Claude 200K、Gemini 1M等)
挑战4:评估困难
RAG回答的质量很难客观度量,标注数据怎么做也是难题。
对策:
- 使用 RAGAS(专门做RAG评估的开源框架)
- 自动计算回答正确性、回答相关性、检索忠实度等指标
- LLM-as-a-Judge(用另一个LLM打分)
挑战5:多语言与多模态
中英文混排的文档、含图PDF、表格图表等都不好处理。
对策:
- 多语言嵌入模型(BGE-M3、Cohere Multilingual)
- 把图像与表格预先用LLM转成文本(OCR + VLM)
- 多模态嵌入(CLIP、Nomic等)
10. 主要工具与服务一览
下面把构建RAG常用的工具按类别汇总。
框架与库
- LangChain——最普及的RAG框架
- LlamaIndex——专注数据接入
- Haystack——面向企业
- DSPy——提示词自动优化
向量数据库(托管)
- Pinecone——业界标准
- Weaviate Cloud——支持GraphQL
- Qdrant Cloud——高性能
- Zilliz Cloud——Milvus的托管版
向量数据库(开源・自托管)
- Chroma——轻量,Python即开即用
- Qdrant——Rust编写,高速
- Weaviate——开源版
- Milvus——大规模场景
- pgvector——PostgreSQL扩展
嵌入模型
- OpenAI text-embedding-3——经典且便宜
- Voyage AI——Anthropic推荐
- Cohere Embed v3——多语言
- BGE-M3——开源高性能
无代码 / 托管RAG服务
- ChatGPT Projects / Custom GPTs——OpenAI的RAG功能
- Claude Projects——Anthropic的RAG功能
- Notion AI——Notion内文档检索
- Microsoft Copilot (Microsoft 365)——跨SharePoint与Teams文档检索
- Dify——开源的无代码AI构建平台
- Vertex AI Agent Builder——Google Cloud的RAG构建服务
- Amazon Bedrock Knowledge Bases——AWS的托管RAG
评估工具
- RAGAS——开源RAG评估框架
- TruLens——综合评估LLM应用
- LangSmith——LangChain官方的追踪与评估工具
常见问题
Q. ChatGPT能用RAG吗?
可以。在ChatGPT的"Projects"或"Custom GPTs"中上传文件,背后就以RAG的方式工作(OpenAI官方称为"File Search")。开发者想通过API使用RAG时,可以用OpenAI Assistants API的"File Search"工具,或自行用LangChain等搭建。Claude的"Projects"功能同理。
Q. RAG的运维成本大概多少?
规模不同差异很大。个人到小型规模(文档1万条以下、月1000次查询左右)用Chroma + OpenAI API就能压在每月几十美元。中型(10万条、月10万查询)使用Pinecone + GPT-4o则在每月几百到几千美元。大型企业级有时月度成本超过几万美元。主要花在"嵌入API"、"向量库"、"LLM API"三块上。
Q. RAG和往ChatGPT里上传文件有什么区别?
本质上都是"检索增强生成"。ChatGPT上传文件的功能底层就是RAG。区别有:(1) ChatGPT通常只能放几个到几十个文件(Projects更多),自建RAG可达数百万条;(2) ChatGPT是黑盒,自建RAG可精细控制检索算法;(3) ChatGPT在OpenAI服务器上,自建RAG可以放到本地。企业级正式场合通常会自建RAG。
Q. 用RAG就能彻底消除幻觉吗?
不能完全消除。即使用RAG,也会因为(1) 没检索到相关文档;(2) 有检索结果但LLM理解错误;(3) 检索结果之间互相矛盾——而出错。对策包括加上"参考信息中没有就回答没有"的提示词约束、明示引用源、用RAGAS等做持续评估。即便如此,也无法做到100%准确,医疗、法律等关键场景必须保留人工复核。
Q. 如何处理中文文档?
中文支持主要看3点:(1) 嵌入模型选用支持多语言的(OpenAI text-embedding-3、Cohere Multilingual、BGE-M3等);(2) 分块切分时考虑中文的标点与语言特性;(3) LLM也选擅长中文的(GPT-4o、Claude、Gemini等,国产可考虑通义千问、文心一言等)。OpenAI text-embedding-3对中文已经够用,但要追求中文极致,BGE-M3或Cohere更稳。
Q. RAG和Agent(智能体)的区别是什么?
RAG是"检索后再生成回答"的固定流程;Agent则是"根据目标自主选择工具并执行"的动态机制。RAG更多是Agent能调用的工具之一。比如"内部信息检索(RAG)"、"网页搜索"、"计算"、"发邮件"——这些工具按情况切换才是Agent,RAG是它的一个组件。如今也出现了所谓的Agentic RAG,"由LLM自己决定检索策略"。
Q. 安全性怎么办?不想把机密信息给AI看到
有几种应对方式:(1) 把向量库与嵌入处理放在本地或VPC内(Qdrant、pgvector等自托管);(2) LLM也用可本地推理的开源模型(Llama 3、Qwen等);(3) 用API时也可以与OpenAI或Azure OpenAI签"不用作训练"的合约;(4) 给分块加上访问权限的元数据,按机密级别在检索时过滤。完全本地的RAG在技术上完全可行,金融、医疗机构也越来越多在用。
Q. 搭建RAG需要多长时间和什么技能?
原型阶段,Python初学者几小时到一天 就能搭起来(Chroma + OpenAI API约30行代码)。生产环境则在分块、混合检索、重排、评估管线上的打磨,往往需要 1~3个月。所需技能是"Python基础"、"会用LLM API"、"基本的数据库操作"。不需要高深的机器学习知识,软件工程师比AI工程师更容易上手。
本文基于2026年4月的信息撰写。RAG相关的工具与模型迭代很快,落地实施时请以各服务的最新文档为准。