"想让ChatGPT读取公司的员工手册,自动回答员工提问"、"想检索最新论文数据库并自动总结"——这类需求越来越多。但ChatGPT的训练数据停留在过去某个时间点,机密的公司文档也不能直接拿去训练AI。

解决这个矛盾的技术,就是 RAG(Retrieval-Augmented Generation/检索增强生成)。自2023年起,它已成为企业AI落地中最重要的关键词之一,ChatGPT的"Custom GPTs"、"Projects"功能在底层也用了RAG。

本文将用3个步骤图解RAG的工作原理,从向量数据库、LangChain实现到与微调的区别,面向初学者讲清楚,但同时保持技术层面的准确性

RAG全景——检索增强生成

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的运行可以分为"预处理(建索引)"和"运行时(问答)"两个阶段。

RAG流水线全景图

预处理阶段——把文档向量化并保存

  1. 收集文档:PDF、Word、HTML、Markdown等,把要用到的文档收集起来
  2. 分块切分:把文档切成合适的长度(如500~1000字)
  3. 嵌入(Embedding):用嵌入模型(如OpenAI text-embedding-3-small)把每个分块转成1536维等的向量(数值数组)
  4. 存入向量数据库:把分块和对应的向量存进专用的向量库(Pinecone、Qdrant等)

这一步在文档新增或更新时执行。

运行时阶段——回答问题的3个步骤

用户提问到来时,处理流程如下。

  1. Step 1: Retrieval(检索)
    • 用同一个嵌入模型把问题文本向量化
    • 在向量数据库中取出与"问题向量最相近"的Top-K个分块(通常3~10个)
    • 相似度计算常用cosine similarity(余弦相似度)
  2. Step 2: Augmented(增强)
    • 把取出的分块作为"参考信息"嵌入提示词
    • 形如:"请基于以下信息回答问题:[检索结果] 问题:[用户提问]"
  3. Step 3: Generation(生成)
    • 由LLM(GPT-4、Claude、Gemini等)基于参考信息生成回答
    • 必要时附带"参考了哪份文档"的引用

具体例子:在ChatGPT里查询公司员工手册

"年假有几天?"这一提问的流程:

  1. 问题被嵌入模型转成向量 → [0.12, -0.45, 0.78, ...]
  2. 从向量库中取出与"假期"、"年假"相关的3个分块
  3. 取出的分块如:"第15条 年休假:入职满6个月的员工享有10天..."、"根据工龄最多20天..."等
  4. 组装提示词:"参考信息:第15条... 问题:年假有几天?"
  5. LLM回答:"入职6个月起10天,根据工龄最多20天(参见员工手册第15条)"

4. RAG的核心组件

下面看构成RAG的5大组件。

① 嵌入模型(Embedding Model)

用来把文本转成数值向量的AI模型。它经过训练,能保证"语义相近的文本,在向量空间里也彼此靠近"。

模型提供方特点
text-embedding-3-smallOpenAI便宜且性能不错,1536维
text-embedding-3-largeOpenAI更高精度,3072维
voyage-3Voyage AIAnthropic推荐,高精度
Cohere Embed v3Cohere多语言能力强,中文表现也不错
multilingual-e5-large微软(开源)可本地部署,免费
BGE-M3BAAI(开源)支持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一行代码就能用免费(自托管)
pgvectorPostgreSQL扩展能直接用现有的PostgreSQL免费(开源扩展)
Milvus开源+云大规模场景,能撑数十亿向量开源免费,Zilliz Cloud
Elasticsearch搜索引擎支持向量检索,可与现有运维整合开源免费,有托管版
Vertex AI Vector SearchGoogle Cloud与GCP生态深度整合按量计费

该选哪个

  • 先试一试Chroma(pip install就能跑)
  • 已经在用PostgreSQLpgvector(数据库可以合并管理)
  • 正式上线、运维负担最低Pinecone(开箱即用)
  • 开源正式部署QdrantWeaviate
  • 数亿~数十亿条的大规模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与微调的对比

根本差异

维度RAG微调
方法运行时从外部加载信息事先重新训练模型本身
知识更新只更新数据库(即时)需要重新训练(耗时耗钱)
初期成本低(只搭数据库)高(要准备训练数据与算力)
运维成本检索 + LLM API费用仅推理(拥有自有模型)
幻觉低(有引用源)中(凭学到的内容回答)
引用源标注容易困难
学习文体口吻不擅长擅长
应对动态数据擅长(实时信息也行)不擅长(需重新训练)
机密数据处理可全程在本地同左(但更重)

RAG适合的场景

  • 知识更新频繁(新闻、内部文档、商品信息)
  • 必须标注回答依据(法律、医疗、金融)
  • 文档量极大(全部塞进训练并不现实)
  • 想立即上手(缩短开发周期)

微调适合的场景

  • 想让回答带特定文体或语气(企业品牌、人设)
  • 想让模型掌握专业领域的语言风格(医学、法律措辞)
  • 想降低推理成本(提示词可变短)
  • 已经积累了大量训练数据

两者结合最强

其实 RAG与微调并非对立关系,而是可以叠加。文体用微调学习,最新知识由RAG实时供给——这种组合在生产环境中很常见。

不过 初学者还是先从RAG开始 是铁律。相比微调,搭建与运维都要轻松得多。

8. 实现方法——用LangChain搭建RAG

先介绍主流的RAG实现框架,再给出Python的最小示例代码。

主流框架

框架语言特点
LangChainPython / JS业界最普及,集成丰富
LlamaIndexPython专精数据接入与索引
HaystackPython面向企业,控制粒度细
Semantic KernelC# / Python微软出品,对.NET友好
DSPyPython提示词自动优化
自行实现任意简单的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相关的工具与模型迭代很快,落地实施时请以各服务的最新文档为准。