1.1 什么是RAG?
📌 本节目标
学完本节后,你将能够清晰地解释RAG(检索增强生成)是什么,理解它"先检索、后生成"的核心工作流程。更重要的是,你会明白为什么在面对需要实时知识或企业内部文档的问题时,RAG 比传统的纯生成式大模型更加可靠和强大。我们将一起画出RAG的基本流程图,为后续的动手实践打下坚实基础。
1. 核心概念讲解
什么是RAG?
RAG 是 Retrieval-Augmented Generation 的缩写,中文叫检索增强生成。听起来有点复杂,但拆开来看就很简单:
- 检索:像在图书馆里查书一样,先从你的知识库(比如产品手册、公司制度、技术文档)中找到与当前问题最相关的资料。
- 增强:把这些找到的资料作为"参考材料",提供给大语言模型。
- 生成:大语言模型根据你提供的参考材料和你提出的问题,生成一个准确、有依据的回答。
核心公式:RAG = 检索 + 生成
比如:假设你是一家公司的客服,客户问"我们公司今年的年假政策是什么?"
- 纯生成模型:只能凭记忆回答,如果记忆里没有(或者记忆是去年的政策),它可能会瞎编一个答案。
- RAG:先到公司HR的数据库中检索"2024年年假政策"这个文档,找到具体条款,然后把这段文字连同客户的问题一起发给大模型,让它参考这些文字来生成回答。这样答案就既准确又有据可查。
RAG 的工作流程(三步走)
RAG 的工作流程非常直观,我们可以用下面的伪代码来理解:
# 1. 检索阶段:从知识库中找到相关文档
query = "我们公司今年的年假政策是什么?"
relevant_documents = search_in_knowledge_base(query)
# 假设返回了 ["2024年年假规定.pdf - 第3条:员工每年享有15天年假"]
# 2. 增强阶段:将检索到的文档和原始问题拼在一起
enhanced_prompt = f"""
请根据以下参考材料回答用户的问题。
参考材料:
{relevant_documents[0]}
用户问题:
{query}
请基于参考材料给出准确回答:
"""
# 3. 生成阶段:让大模型基于增强后的提示词生成回答
answer = large_language_model.generate(enhanced_prompt)
# 输出:"根据公司2024年年假规定,员工每年享有15天年假。"
纯生成式模型 vs RAG
为了更好地理解两者的区别,我们来看一个对比表格:
| 维度 | 纯生成式模型(如 ChatGPT 直接对话) | RAG 架构 | |------|------------------------------------|----------| | 知识来源 | 依赖训练数据中的记忆(截止到某个时间点) | 实时检索外部知识库(文档、数据库、网页等) | | 知识更新 | 需要重新训练或微调,成本高、周期长 | 只需更新知识库中的文档,即插即用 | | 幻觉风险 | 高:容易编造事实,尤其是小众或新知识 | 低:回答有源可溯,模型被约束在参考材料内 | | 适用场景 | 通用对话、创意写作、代码生成 | 企业知识问答、客服系统、技术文档查询 | | 成本 | 调用一次模型即可 | 多一次检索步骤,但避免了昂贵的模型重训 |
2. 深入理解
为什么要用 RAG?
想象一下,你是一位技术主管,团队需要开发一个内部问答机器人,用来回答员工关于公司IT运维手册的问题。手册有500页,每周都在更新。
- 方案A(纯生成式):你需要把500页手册喂给大模型做微调,每次更新都要重新微调。不仅成本高昂,而且模型可能记不住所有细节,还会"自由发挥"。
- 方案B(RAG):你只需要把手册PDF存入向量数据库(一种专门做相似性搜索的数据库),每次提问时,系统自动检索最相关的3-5段文字,再让大模型据此回答。更新手册时,替换数据库里的文件即可。
RAG 的核心价值在于:让大模型成为一个"会查资料的好学生",而不是一个"死记硬背的考生"。
初学者常见的误区
-
误区一:RAG 就是简单的"搜索+拼接"
- 纠正:虽然流程看似简单,但实际工程中要考虑检索质量(如何找到最相关的内容)、提示词设计(如何让模型正确使用参考材料)、以及模型对长上下文的处理能力。不是把搜索到的所有内容都堆给模型就行。
-
误区二:RAG 可以完全消除幻觉
- 纠正:RAG 能大幅降低幻觉,但无法完全消除。如果检索到的文档本身有错误,或者模型错误理解/忽略了参考材料,仍然可能产生不准确的回答。好的RAG系统需要结合文档质量控制和结果验证。
-
误区三:RAG 只适合文本数据
- 纠正:RAG 可以处理各种模态的数据。比如你可以检索图片、表格、甚至代码片段,然后让多模态大模型来生成回答。关键在于如何将不同格式的数据转化为可检索的向量表示。
3. 实战演示
让我们用最简单的 Python 代码,模拟一个 RAG 的完整流程。这里我们不用任何外部API,只用标准库和简单的逻辑来演示思想。
场景:一个迷你知识库问答系统
假设我们有一个关于"水果"的小知识库,用户问"香蕉有什么好处?",系统需要先检索知识库,然后基于检索结果生成回答。
# 实战:手写一个最简RAG流程
# 第一步:准备知识库(通常是一个文档列表)
knowledge_base = [
"苹果富含维生素C,有助于增强免疫力。",
"香蕉富含钾元素,有助于调节血压,缓解疲劳。",
"蓝莓含有丰富的抗氧化剂,对眼睛健康有益。",
"橙子含有大量维生素C,有助于预防感冒。"
]
# 第二步:检索函数(这里用最简单的关键词匹配,实际工程中用向量检索)
def simple_retrieve(query, knowledge_base):
"""根据查询关键词,从知识库中找到最相关的文档"""
relevant_docs = []
query_words = query.lower().split() # 将查询拆成关键词
for doc in knowledge_base:
# 检查查询中的关键词是否出现在文档中
if any(word in doc.lower() for word in query_words):
relevant_docs.append(doc)
return relevant_docs
# 第三步:生成函数(模拟大模型,基于参考材料生成回答)
def simple_generate(query, context_docs):
"""模拟大模型生成回答"""
if not context_docs:
return "抱歉,我没有找到相关的信息。"
# 构造一个基于上下文的回答
combined_context = ";".join(context_docs)
# 这里模拟模型"理解"上下文并生成回答
answer = f"根据检索到的资料:{combined_context}。因此,{query.split('?')[0]}的答案是如上所述。"
return answer
# 第四步:完整的RAG流程
def rag_pipeline(query):
print(f"用户提问:{query}")
# 检索
relevant_docs = simple_retrieve(query, knowledge_base)
print(f"检索到的相关文档:{relevant_docs}")
# 增强并生成
answer = simple_generate(query, relevant_docs)
print(f"生成的回答:{answer}")
return answer
# 测试
rag_pipeline("香蕉有什么好处?")
print("\n--- 另一个测试 ---")
rag_pipeline("葡萄有什么功效?")
运行结果示例:
用户提问:香蕉有什么好处?
检索到的相关文档:['香蕉富含钾元素,有助于调节血压,缓解疲劳。']
生成的回答:根据检索到的资料:香蕉富含钾元素,有助于调节血压,缓解疲劳。因此,香蕉有什么好处?的答案是如上所述。
--- 另一个测试 ---
用户提问:葡萄有什么功效?
检索到的相关文档:[]
生成的回答:抱歉,我没有找到相关的信息。
这个例子告诉你:RAG 的核心思想就是"先找资料,再写答案"。真实工程中,检索用的是向量相似度搜索(而非关键词匹配),生成用的是真正的大模型(如GPT-4或本地模型),但流程骨架是完全一样的。
4. 关键要点
- RAG 的核心是"检索+生成":它让大模型不再依赖死记硬背,而是学会查阅外部资料来回答问题。
- 知识库是 RAG 的基石:知识库的质量和检索的准确性直接决定了最终回答的好坏。垃圾进,垃圾出。
- RAG 能有效降低幻觉:因为模型被约束在提供的参考材料内,编造事实的空间大大减小。
- RAG 架构灵活、成本低:更新知识只需更新文档库,无需重新训练模型,非常适合企业级应用。
- RAG 不是万能药:它依赖于检索质量、提示词设计以及模型对上下文的处理能力,需要系统性地优化各个环节。
✏️ 练习任务
任务1:画出RAG的基本流程图
练习方向:画出RAG的基本流程图
任务描述: 请用你喜欢的工具(纸笔、PPT、draw.io、Mermaid 等)画出 RAG 架构的基本流程图。流程需要包含以下关键节点和箭头:
- 输入:用户提问
- 处理节点1:检索模块(从知识库中检索相关文档)
- 处理节点2:增强模块(将检索到的文档和用户问题组合成提示词)
- 处理节点3:生成模块(大语言模型生成回答)
- 输出:最终回答
- 知识库:作为检索模块的数据来源
期望输出: 一张清晰的流程图,箭头方向正确,节点命名准确。如果你用 Mermaid 语法,可以参考下面的示例代码:
graph TD
A[用户提问] --> B[检索模块]
B --> C[知识库]
C --> B
B --> D[增强模块<br>组合提示词]
D --> E[大语言模型<br>生成模块]
E --> F[最终回答]
进阶挑战(选做): 在你的流程图中加入"反馈循环":如果生成的回答质量不高,系统如何自动调整检索策略(比如扩大检索范围或调整相似度阈值)?画出这个优化后的流程图。
💡 下一节我们将学习相关的进阶内容:深入拆解 RAG 的检索模块,了解什么是向量嵌入以及如何构建一个高效的知识库索引。
本节由 StudyAI8 AI 课程团队生成并审核。