RAG 是 Retrieval-Augmented Generation 的缩写,中文翻译为 “检索增强生成”。
可以把它理解为一个让大语言模型(LLM)实现“开卷考试”的智能系统。传统的 LLM 像一个记忆力超群但只能“闭卷考试”的学生,回答问题仅依赖于其训练时学到的内部知识。而 RAG 引擎则为这个学生配备了一个可以随时访问的、巨大的、可实时更新的外部资料库(知识库)。
1. RAG 推理引擎是什么?
RAG 推理引擎是一个集成了“信息检索”和“文本生成”两大能力的系统框架。它不是指某一个单一的模型,而是一套完整的工作流(Pipeline),其核心目标是在大语言模型生成答案之前,先从外部知识源中检索出最相关的信息,然后将这些信息作为上下文(Context)一并提供给模型,引导模型生成更准确、更可靠、更具时效性的回答。
举个栗子:
- 用户输入问题: 用户向系统提出一个问题,例如 “RAG推理引擎是什么?”。
- 检索阶段:
- RAG 引擎的 检索器 (Retriever) 接收到问题。
- 它将问题转换为一种适合搜索的格式(通常是向量)。
- 后在 外部知识库(可能是向量数据库、搜索引擎等)中进行快速匹配,找到与问题最相关的几段文本。
- 整合信息:检索器将找到的 相关信息 (Relevant Context) 提取出来。
- 生成阶段:RAG 引擎会将上一步检索到的相关信息,与用户的原始问题,组合成一个新的、信息量更丰富的提示(Prompt)。最后,大语言模型(LLM)会基于这个增强后的提示来生成答案。
2. 完整的RAG 推理模型生成信息流程
系统在能够提供服务之前,必须对知识库进行的数据预处理(或称为“索引构建”)
第一部分:离线数据索引 (只需做一次或在知识更新时做)
- 文档加载与切分 (Chunking): 系统首先加载所有原始文档(如 PDF, Word, HTML 等),并将它们切分成更小的、易于处理的文本块 (Chunks)。切分得当很关键,太长或太短都会影响检索效果。
- 文本嵌入 (Embedding): 使用一个专门的文本嵌入模型(如 text-embedding-ada-002),将每一个文本块转换成一个数学向量(一长串数字)。这个向量代表了文本块的语义信息。
- 构建索引: 将生成的向量及其对应的原始文本块存储到一个 向量数据库 中。这个数据库经过优化,可以进行超快速的向量相似度搜索。
为什么将每一个文本块转换成一个数学向量?
因为计算机不理解“文字”,但极其擅长“数学”。将文本块转换成数学向量,是为了让计算机能够用数学的方式来理解和比较文本的“含义”。并且实现语义搜索而非关键词搜索。
第二部分:在线推理 (每次提问时都会执行)
- 问题嵌入: 当用户提问时,系统使用同一个嵌入模型将用户的问题也转换成一个向量。
- 向量检索: 在向量数据库中,用问题向量去搜索与之在数学上最“接近”(即语义最相似)的文本块向量,返回最匹配的 Top-K 个结果。
Top-K:当你提问时,系统会在知识库里搜索,可能会找到几百个与你问题相关的文本片段 (Chunks)。系统会计算每个文本片段与你问题的“相关度分数”,并从高到低排序。Top-K 就是选择相关度分数最高的前 K 个文本片段作为大语言模型的参考资料。
Top-K 是一个筛选策略,目的是从海量的候选项中,高效地选出最重要、最顶尖的 K 个项目,以达到聚焦和降噪的效果。
选择一个合适的 K 值非常重要:
- K 太小,可能导致提供给 LLM 的信息不充分。
- K 太大,可能会引入无关的“噪音”信息,干扰 LLM 的判断。
- 增强生成:将检索到的文本块(上下文)和原始问题组合起来,构建一个精确的指令(Prompt),引导 LLM 完成一次有据可依的‘阅读理解’任务”
3. 组合后的提示词
“组合”并不是简单地把问题和上下文粘在一起。它是一个精心设计的 提示词工程 (Prompt Engineering) 过程。我们通常会创建一个提示词模板,这个模板就像一个“填空题”,有三个主要部分:
- 指令 (Instruction): 明确告诉 LLM 它应该做什么,扮演什么角色,以及需要遵守的规则。
- 上下文占位符 (Context Placeholder): 一个用来将来填入“检索到的文本块”的位置。
- 问题占位符 (Question Placeholder): 一个用来将来填入“用户原始问题”的位置。
举一个具体的例子:
- 用户原始问题 (Question): RAG模型如何减少AI幻觉?
- 检索到的文本块 (Context): “…RAG通过从外部知识库中检索事实信息来为生成过程提供依据。因为模型的回答被要求基于这些检索到的事实,而不是仅仅依赖其内部参数,这有效防止了模型凭空捏造信息,从而显著降低了产生幻觉的风险…”
模板可能长这样:
请你扮演一个AI技术专家。请严格根据下面提供的【上下文信息】,用简洁清晰的语言回答【用户问题】。
禁止使用【上下文信息】之外的任何知识。如果【上下文信息】无法回答问题,请直接回复:“根据所提供的资料,我无法回答该问题。”
---
【上下文信息】:
{这里将被替换为检索到的文本块}
---
【用户问题】:
{这里将被替换为用户的原始问题}
---
【你的回答】:
“组合”完成后的最终提示 (Final Prompt) 就是:
请你扮演一个AI技术专家。请严格根据下面提供的【上下文信息】,用简洁清晰的语言回答【用户问题】。
禁止使用【上下文信息】之外的任何知识。如果【上下文信息】无法回答问题,请直接回复:“根据所提供的资料,我无法回答该问题。”
---
【上下文信息】:
“...RAG通过从外部知识库中检索事实信息来为生成过程提供依据。因为模型的回答被要求基于这些检索到的事实,而不是仅仅依赖其内部参数,这有效防止了模型凭空捏造信息,从而显著降低了产生幻각的风险...”
---
【用户问题】:
RAG模型如何减少AI幻觉?
---
【你的回答】:
将上面构建好的、长长的最终提示 (Final Prompt) 字符串,作为一个完整的输入,发送给大语言模型(例如通过 API 调用)
通过一个结构化的提示词模板,将原本开放式的、依赖模型自身记忆的“问答任务”,强制转换成一个有范围、有约束的“阅读理解与信息归纳任务”。
它改变了 LLM 的工作模式:
- 之前 (没有RAG): LLM 是一个知识渊博但可能记错、也可能瞎编的“学生”。
- 之后 (有了RAG): LLM 成了一个拿着指定参考资料(上下文)回答问题的“阅读理解专家”。
4. 为什么 RAG 如此重要?
RAG 解决了传统大语言模型的几个核心痛点:
- 减少“幻觉” (Hallucination):因为答案是基于提供的现实世界资料生成的,而不是模型自己“编造”的,所以事实性错误会大大减少。
- 知识实时更新:大模型重新训练一次成本极高且耗时。而 RAG 允许我们通过更新外部知识库(比如添加最新的文档),就能让模型的回答跟上最新的知识,成本极低。
- 提高答案的透明度和可追溯性:一个好的 RAG 系统可以告诉你,它的回答是基于哪些源文档生成的(即“引用来源”),用户可以自行查证,增加了系统的可信度。
- 领域知识注入:可以轻松地让一个通用大模型具备特定领域的专业知识(如法律、金融、医疗),只需为其提供该领域的专业知识库即可,无需对模型本身做昂贵的微调。
其他相关博客:
🔗 AI提示怎么写最聪明?来自Google 的提示工程