RAG(检索增强生成)原理详解
为什么需要 RAG?
大语言模型(LLM)有两个核心问题:
| 问题 | 说明 |
|---|---|
| 知识截止 | 模型训练后无法获取新信息(如 2024 年的新闻) |
| 幻觉(Hallucination) | 模型会"编造"看似合理但实际错误的信息 |
RAG 的解决思路:让模型在回答问题前,先去查资料(检索),再基于查到的资料来回答(生成),就像开卷考试。
Retrieve(检索)
| 步骤 | 组件 | 作用 | 技术细节 |
|---|---|---|---|
| 输入 | Query | 用户的自然语言问题 | |
| 编码 | Embedding 模型 | 将文本转为向量 | 如 BGE、OpenAI text-embedding-3 |
| 检索 | Vector Database(向量数据库) | 相似度搜索 | FAISS、Chroma、Milvus |
| 输出 | Context(检索结果) | 召回的相关文档片段 | Top-K 个最相关的 chunk(文本块) |
Augment(增强/组装)
为什么叫"增强"?
因为用户的原始问题(Query)是"单薄"的,通过拼接检索到的上下文(Context),形成了一个"信息更丰富"的完整提示,让 LLM 有依据可答。
| 来源 | 内容 | 作用 |
|---|---|---|
| 固定模板系统指令 + 格式要求(System Message) | 角色设定、回答规则、格式要求 | 约束 LLM 行为 |
| Context(检索到的上下文) | 从向量库检索到的相关文档 | 提供事实依据 |
| Query(检索到的上下文) | 用户的原始问题 | 明确回答目标 |
固定模版:eg:"你是一个专业分析师,请根据以下资料回答问题..."
Generate(生成)
| 特性 | 说明 |
|---|---|
| 条件生成 | LLM 不是自由发挥,而是基于提供的 Context 生成 |
| 注意力机制 | 模型会重点关注 Context 中与 Query 相关的部分 |
| 约束遵循 | 如果 Prompt 中要求"不知道就说不知道",模型会遵守 |
RAG关键设计思想
为什么 Query 要同时走两条路?
Query ────▶ Embedding ──▶ 检索(找相关资料) 为了让机器"理解"问题,找到相关知识划定知识范围。
Query ────▶ Prompt──▶ 保留原始问题 为了让 LLM 知道用户"到底在问什么"
综上所述
RAG 是一种结合了检索(Retrieval)和生成(Generation)的技术架构。它在模型回答问题之前,先从海量的外部知识库中“查找”相关的辅助信息,然后将这些信息连同问题一起喂给大模型,让模型基于这些事实进行总结和回答。
纯 LLM:像一个闭卷考试的学生,只能靠记忆(预训练数据)回答问题,记错或没背过就容易瞎编。
RAG 模式:像一个开卷考试的学生,遇到问题先去翻书(检索知识库),找到依据后再作答。
RAG 的核心流程
一个典型的 RAG 系统包含以下三个关键步骤:
数据索引 (Indexing)
将企业的文档(PDF、Word、Markdown 等)切分成小块(Chunks)。
利用Embedding 模型将文本转化为向量(Vector),存储在向量数据库(如 Milvus, Pinecone, Chroma)中。
检索 (Retrieval)
当用户提问时,系统将问题也转化为向量。
在向量数据库中计算相似度,找出最相关的 top-K 个文档切片。
增强生成 (Generation)
将检索到的原文与用户问题拼接成一个增强后的提示词(Prompt)。
大模型阅读这些背景材料,输出准确的答案。
