收藏!小白程序员轻松入门RAG,让大模型“查资料再回答“的超实用技术
本文详细介绍了RAG(Retrieval-Augmented Generation)技术,解释了它如何通过检索外部知识库来增强大模型生成内容的准确性和时效性。文章将大模型比作学生,通过"开卷考试"的比喻,生动解释了RAG的工作原理。RAG的核心价值在于解决大模型知识局限性问题,如知识过时、缺乏专业领域知识等。文章还深入剖析了RAG的工作流程、核心组成部分,并提供了企业知识库问答系统、智能客服系统、学术论文助手等实用案例,帮助读者理解和应用RAG技术。
今天我们来学习 RAG(Retrieval-Augmented Generation)检索增强生成
一句话核心: RAG 是一种让大模型能够"查资料再回答"的技术,通过检索外部知识库来增强生成内容的准确性和时效性。
通俗地讲,如果把大模型比作一个学生,传统模型就像"闭卷考试"——只能凭借训练时记住的知识回答问题。而 RAG 就像"开卷考试"——遇到问题时,可以先翻书查资料,然后基于查到的内容给出更准确的答案。
需要注意的是,RAG 并不是让模型"记住"新知识,而是在回答问题时动态地从外部知识库中检索相关信息,然后将这些信息作为上下文提供给模型。
它的核心价值在于解决大模型的知识局限性:包括知识过时、缺乏专业领域知识、容易产生幻觉(编造不存在的信息)等问题。通过 RAG,我们可以让模型访问最新的、专业的、私有的知识,而无需重新训练模型。
是什么

通过一张图来理解 RAG 的工作原理:

RAG 工作流程说明:
这个流程的核心在于,用户的问题会经过两个关键阶段:
1. 离线阶段(知识库构建):
- 将原始文档进行文本提取和分块处理
- 使用 Embedding 模型将文本块转换为向量
- 存储到向量数据库中,这个过程只需要执行一次
2. 在线阶段(检索增强生成):
- 用户提问后,先将问题向量化
- 在向量数据库中进行语义检索,找到最相关的文档块
- 将检索到的文档和原始问题一起构建提示词
- 输入大模型生成最终答案,并附带引用来源
RAG 的核心组成
一个完整的 RAG 系统通常包含以下几个关键部分:
1. 知识库构建
文档处理流程:
原始文档 → 文本提取 → 分块(Chunking) → 向量化(Embedding) → 存入向量数据库
- 文档加载:支持 PDF、Word、网页、Markdown 等多种格式
- 文本分块:将长文档切分成小块,便于检索和处理
- 向量化:使用 Embedding 模型将文本转换为向量
- 向量存储:将向量存入专门的向量数据库
2. 检索系统
- 语义检索:基于问题的语义含义找到相关文档
- 混合检索:结合关键词检索和语义检索
- 重排序(Reranking):对检索结果进行二次排序,提高相关性
3. 生成系统
- 提示词工程:设计合适的 Prompt 模板
- 上下文管理:控制输入大模型的文档长度
- 答案生成:基于检索内容生成最终回答
RAG vs 其他方法对比
| 维度 | 传统大模型 | Fine-tuning | RAG |
|---|---|---|---|
| 知识更新 | 需要重新训练 | 需要重新微调 | 实时更新文档即可 |
| 成本 | 推理成本 | 训练成本高 | 中等(检索+推理) |
| 准确性 | 可能产生幻觉 | 较准确但固化 | 基于真实文档,可追溯 |
| 专业知识 | 通用知识 | 可定制 | 灵活添加专业文档 |
| 可解释性 | 黑盒 | 黑盒 | 可追溯到源文档 |
怎么做
下面我们通过几个案例来理解 RAG 的使用场景和实现方式。
案例 1:企业知识库问答系统
这是 RAG 最经典的应用场景,帮助员工快速查询公司内部文档。
场景描述:
- 公司有大量内部文档:产品手册、技术文档、规章制度等
- 员工需要快速找到相关信息
- 传统搜索只能找到文档,还需要人工阅读
RAG 解决方案:
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 1. 文档准备阶段(离线处理)
documents = [
"公司年假政策:员工入职满一年享有5天年假...",
"报销流程:员工需在费用发生后30天内提交...",
"技术栈规范:前端统一使用 React + TypeScript..."
]
# 2. 文本分块
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
chunks = text_splitter.create_documents(documents)
# 3. 文档向量化并存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(chunks, embeddings)
# 4. 用户提问
question = "我入职半年了,可以请年假吗?"
# 5. 检索相关文档
relevant_docs = vectorstore.similarity_search(question, k=3)
# 6. 构建提示词
prompt = f"""
基于以下文档内容回答问题:
文档内容:
{relevant_docs[0].page_content}
用户问题:{question}
请基于文档内容准确回答,如果文档中没有相关信息,请明确说明。
"""
# 7. 调用大模型生成答案
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": prompt}]
)
print(response.choices[0].message.content)
# 输出:根据公司年假政策,员工需要入职满一年才能享有年假。
# 您目前入职半年,暂时还不符合年假申请条件。
案例 2:智能客服系统
场景:电商平台需要自动回答用户关于商品、物流、售后的问题。
实现要点:
- 知识库:商品信息、常见问题、物流政策、售后流程
- 检索策略:混合检索(关键词 + 语义)
- 答案生成:友好的对话式回答
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
# 创建 RAG 链
qa_chain = RetrievalQA.from_chain_type(
llm=OpenAI(temperature=0),
chain_type="stuff", # 将所有检索文档一次性输入
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
return_source_documents=True # 返回源文档
)
# 用户提问
result = qa_chain({"query": "iPhone 15 Pro 支持哪些颜色?"})
print(f"答案:{result['result']}")
print(f"来源:{result['source_documents'][0].metadata['source']}")
案例 3:学术论文助手
场景:研究人员需要快速查询和理解大量学术论文。
技术亮点:
- 文档分块策略:按段落或固定长度分块
- 元数据管理:保存论文标题、作者、发表时间等
- 引用追踪:显示答案来自哪篇论文的哪个部分
from langchain.document_loaders import PyPDFLoader
# 1. 加载 PDF 论文
loader = PyPDFLoader("research_paper.pdf")
documents = loader.load()
# 2. 智能分块
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, # 每块最大字符数
chunk_overlap=200, # 块之间重叠字符数
separators=["/n/n", "/n", "。", "!", "?", " ", ""]
)
chunks = text_splitter.split_documents(documents)
# 3. 添加元数据
for i, chunk in enumerate(chunks):
chunk.metadata.update({
"source": "research_paper.pdf",
"page": chunk.metadata.get("page", 0),
"chunk_id": i
})
# 4. 存入向量数据库
vectorstore = Chroma.from_documents(chunks, embeddings)
实战案例:完整的 RAG 系统
下面我们用 LangChain 实现一个完整的 RAG 系统:
from langchain.document_loaders import DirectoryLoader, 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
# ========== 第一步:文档加载 ==========
print("正在加载文档...")
loader = DirectoryLoader(
'./knowledge_base/', # 知识库目录
glob="/*.txt", # 加载所有 txt 文件
loader_cls=TextLoader
)
documents = loader.load()
print(f"已加载 {len(documents)} 个文档")
# ========== 第二步:文档分块 ==========
print("正在分块处理...")
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
chunks = text_splitter.split_documents(documents)
print(f"已分割为 {len(chunks)} 个文本块")
# ========== 第三步:向量化并存储 ==========
print("正在向量化...")
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db" # 持久化存储
)
print("向量数据库已创建")
# ========== 第四步:创建 RAG 链 ==========
qa_chain = RetrievalQA.from_chain_type(
llm=OpenAI(temperature=0, model="gpt-4"),
chain_type="stuff",
retriever=vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 3} # 检索最相关的 3 个文档块
),
return_source_documents=True
)
# ========== 第五步:交互式问答 ==========
print("/n知识库问答系统已启动!输入 'quit' 退出/n")
while True:
question = input("请输入问题:")
if question.lower() == 'quit':
break
result = qa_chain({"query": question})
print(f"/n答案:{result['result']}/n")
print("参考来源:")
for i, doc in enumerate(result['source_documents'], 1):
print(f"{i}. {doc.metadata.get('source', '未知来源')}")
print("-" * 50 + "/n")
进阶技巧
1. 混合检索(Hybrid Search)
结合关键词检索和语义检索,提高准确率:
from langchain.retrievers import BM25Retriever, EnsembleRetriever
# 关键词检索器
bm25_retriever = BM25Retriever.from_documents(chunks)
bm25_retriever.k = 3
# 语义检索器
semantic_retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
# 混合检索器
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, semantic_retriever],
weights=[0.5, 0.5] # 各占 50% 权重
)
2. 重排序(Reranking)
对检索结果进行二次排序,提高相关性:
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CohereRerank
# 使用 Cohere 的重排序模型
compressor = CohereRerank(model="rerank-english-v2.0")
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=vectorstore.as_retriever()
)
3. 多查询检索(Multi-Query Retrieval)
自动生成多个相关查询,扩大检索范围:
from langchain.retrievers.multi_query import MultiQueryRetriever
multi_query_retriever = MultiQueryRetriever.from_llm(
retriever=vectorstore.as_retriever(),
llm=OpenAI(temperature=0)
)
# 会自动生成多个相关问题进行检索
results = multi_query_retriever.get_relevant_documents(
"什么是 RAG?"
)
❄️ 冷知识
1. 分块大小很关键:chunk_size 太小会丢失上下文,太大会引入噪音。一般建议 500-1000 字符,具体取决于文档类型。中文文档通常比英文需要更小的 chunk_size。
2. Overlap 不是越大越好:chunk_overlap(重叠部分)是为了避免重要信息被切断,但过大会导致重复内容过多,影响检索效率。一般设置为 chunk_size 的 10-20%。
3. 向量数据库的选择:
- Chroma:轻量级,适合原型开发
- Pinecone:云服务,适合生产环境
- Milvus:开源,适合大规模部署
- Weaviate:支持混合检索,功能强大
4. Embedding 模型的影响:不同的 Embedding 模型会显著影响检索效果。OpenAI 的 text-embedding-3-large 效果好但成本高,国产模型如智谱的 embedding-2 性价比更高。
5. RAG 的"幻觉"问题:虽然 RAG 能减少幻觉,但如果检索到的文档不相关,模型仍可能基于错误信息生成答案。因此检索质量是 RAG 系统的核心。
6. 与 Function Calling 的关系:RAG 可以看作是一种特殊的 Function Calling,其中"函数"就是"检索知识库"。实际应用中,两者常常结合使用:用 Function Calling 决定何时需要检索,用 RAG 执行检索和生成。
7. GraphRAG 的兴起:微软提出的 GraphRAG 将知识库构建为知识图谱,能够更好地理解实体关系和复杂查询,是 RAG 技术的重要发展方向。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】


为什么要学习大模型?
我国在A大模型领域面临人才短缺,数量与质量均落后于发达国家。2023年,人才缺口已超百万,凸显培养不足。随着AI技术飞速发展,预计到2026年,这一缺口将急剧扩大至400万,严重制约我国AI产业的创新步伐。加强人才培养,优化教育体系,国际合作并进是破解困局、推动AI发展的关键。


大模型入门到实战全套学习大礼包
1、大模型系统化学习路线
作为学习AI大模型技术的新手,方向至关重要。 正确的学习路线可以为你节省时间,少走弯路;方向不对,努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划,带你从零基础入门到精通!

2、大模型学习书籍&文档
学习AI大模型离不开书籍文档,我精选了一系列大模型技术的书籍和学习文档(电子版),它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。

3、AI大模型最新行业报告
2025最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

4、大模型项目实战&配套源码
学以致用,在项目实战中检验和巩固你所学到的知识,同时为你找工作就业和职业发展打下坚实的基础。

5、大模型大厂面试真题
面试不仅是技术的较量,更需要充分的准备。在你已经掌握了大模型技术之后,就需要开始准备面试,我精心整理了一份大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

适用人群

第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)