前言

前几章我们把Agent的工具体系搭清楚了:Function Calling让大模型能开口下指令,MCP让工具标准化接入,Skills让专业知识按需加载。

到这里,Agent能干活了,工具也能跑起来了。

但有一个根本问题,前面几章都没正面回答:大模型压根看不到你的私有数据,怎么办?

  • 你的公司内部有几千页运维手册

  • 几百个历史故障报告

  • 一套只有内部才知道的排查SOP

这些大模型从来没见过。你让它帮你做OnCall排查,它能给出很通用的思路,但就是没法给出针对你们系统的精准答案

这就是RAG要解决的核心问题。


一、大模型为什么「看不到」你的数据?

咱们先把问题说清楚,有三类「看不到」,每一类的原因都不同。

第一类:知识截止日期

大模型是用历史数据训练的,训练完之后它的知识就冻结了。

比如Claude的训练数据截止到2025年某个时间点,之后发生的事情它一概不知。你去问它「我们系统今天凌晨发生了什么故障」,它根本没有这份信息,只能瞎猜。

第二类:私有数据

你们公司的内部文档、产品设计方案、运维手册、客服问答库,这些都是保密的,不可能出现在大模型的训练数据里。

模型从没见过这些内容,自然没法基于它们来回答问题。

第三类:实时数据

今天刚写完的技术方案、刚产生的bug日志、刚更新的配置文件——这些是动态变化的,即便大模型更新了训练数据也追不上。

你的Agent需要访问的,往往就是这类「最新鲜」的数据。

三类问题的共同点

大模型的知识是静态的、封闭的,但你的业务数据是动态的、私有的。


二、暴力解法为什么行不通?

遇到这个问题,很多同学第一反应是:直接把数据塞进Prompt里不就行了?

听起来很直接,但这个方案有三个致命问题。

问题一:Context Window有上限

大模型一次能处理的文本是有限的,这个限制叫做Context Window(上下文窗口)

就算是目前最大的模型,一次也只能处理几十万token,换算成中文大概是几十万个字。

你们公司的内部文档可能有几百个文件,光是运维手册就几十万字,根本塞不进去。更别提那些有几千个历史工单的故障数据库了。

问题二:费钱又慢

Token是要花钱的。你塞进去10万token的背景资料,每次提问都要花那10万token的钱。一天问几百次,成本直接爆炸。

而且token越多,模型推理越慢,用户等待时间越长。

问题三:注意力稀释

这是最容易被忽视的问题。

大模型处理很长的上下文时,注意力会被稀释。相关内容埋在几万字的堆料里,模型很可能找不到重点,反而表现变差。

你塞进去越多,有时候回答质量越低。


三、RAG的核心思路:先检索,再回答

直接塞数据行不通,那RAG到底怎么解决这个问题?

核心思路其实非常简单,一句话就能说明白

不把所有数据都塞进Prompt,而是在每次回答之前,先去找到最相关的那几段,再把这几段塞进Prompt。

这就是RAG名字的含义:

字母 全称 含义
R Retrieval 检索:从知识库里找出和当前问题最相关的内容
A Augmented 增强:把检索到的内容加进Prompt,增强大模型的上下文
G Generation 生成:大模型基于增强后的上下文生成回答

打个比方

你考试的时候不需要把整本字典背下来,你只需要知道去字典里查哪个词,查到了那一页,看完再写答案。

RAG就是这个思路:大模型不需要「记住」所有知识,它只需要在需要的时候,从知识库里检索到相关内容,然后基于这些内容来回答。


四、RAG的两大阶段

RAG的整个工作流程分两个阶段:离线建库 和 在线检索生成

离线建库是一次性的准备工作(数据更新时重做),在线检索是每次用户提问时触发的实时流程。

离线阶段(建库)

这个阶段的目标是:把你的私有数据,处理成大模型能快速检索的格式,存进向量数据库。

Step 1:加载文档

把你的数据源统一接入进来:

  • PDF文档、Word文件、Markdown笔记

  • 网页内容、数据库记录、代码文件

各种格式的数据,统一解析成纯文本。

Step 2:文本切块(Chunking)

拿到文本之后,不能直接整篇存起来,要先切成小块

为什么要切?

原因 说明
粒度控制 一篇文档几千字,里面涉及多个主题,检索时很可能只需要其中一个主题的内容
向量精度 每个chunk要转化成向量存起来,chunk太长,向量就无法精确代表那段文字的核心含义

切块就像图书馆整理书籍:不是把整本书放一个标签,而是按章节、按小节分别标注。这样读者想找某个具体知识点,能直接找到那几页,而不用翻整本书。

Step 3:向量化(Embedding)

这是RAG里最难理解的一步,咱们重点讲。

切好的每个chunk,要通过一个「Embedding模型」转化成一串数字,这串数字就叫做向量(Vector)

这串数字有什么神奇之处?

编码了这段文字的语义含义。意思相近的文字,转化出来的向量在数学空间里距离也相近。

用城市坐标来类比

  • 每个城市都有经度和纬度

  • 北京大约是北纬40°、东经116°

  • 天津大约是北纬39°、东经117°

  • 两组坐标数字很接近,在地图上两座城市确实挨着

  • 广州是北纬23°、东经113°,坐标差别大,在地图上和北京也确实很远

向量就是文字的「语义坐标」

  • 「数据库响应慢」和「查询性能问题」——虽然词语不同,但意思相近,向量距离近

  • 「数据库响应慢」和「今天天气不错」——意思毫不相关,向量距离很远

Step 4:存入向量数据库

转化好的向量,连同对应的原文,一起存进向量数据库(如Milvus、Pinecone、Weaviate等)。

向量数据库专门优化了「在海量向量里找最近邻」这个操作,能在几毫秒内从百万级向量里找出最相似的几条。


在线阶段(查询)

每次用户提问,实时触发以下四步:

Step 1:问题向量化

同一个Embedding模型,把用户的问题也转化成向量。

Step 2:语义搜索

拿着问题的向量,去向量数据库里找「最相似的几个chunk的向量」。

找到之后,把对应的原文chunk取出来,通常取3-5个最相关的片段。

⚠️ 注意:这里找的不是「包含相同关键词」的内容,而是「语义最相近」的内容。这是语义搜索和传统关键词搜索的本质区别。

Step 3:构造增强Prompt

把检索回来的几段原文,加上用户的原始问题,拼成一个增强后的Prompt:

text

以下是相关背景资料:

[检索到的chunk 1]
[检索到的chunk 2]
[检索到的chunk 3]

根据以上资料,请回答:[用户的原始问题]
Step 4:大模型生成回答

把这个Prompt发给大模型,大模型基于提供的背景资料生成有据可查的精准回答。


五、关键概念再讲透:语义搜索 vs 关键词搜索

这里展开说一下语义搜索,因为这是RAG能工作的核心,也是最容易搞混的地方。

搜索类型 原理 示例
关键词搜索 逐字匹配 搜「数据库慢」,只找包含这几个字的文档。文档写「query performance degradation」就找不到
语义搜索 找意思相近的 搜「数据库慢」,能找到「查询性能问题」「SQL响应延迟」「慢查询优化」等语义相关的片段

对比例子

用户的问题 文档里的原文 关键词搜索能找到? 语义搜索能找到?
数据库连接失败 connection pool exhausted ❌(没有相同关键词) ✅(语义相关)
如何重启服务 service restart procedure
昨晚报警原因 2024-01-15 23:00 alert: high latency ✅(如果时间能对上)

语义搜索让RAG能真正「理解」问题,而不只是机械地找字符串。

这也是为什么RAG系统的检索准确率通常比普通关键词搜索高得多。


六、完整流程图

text

┌─────────────────────────────────────────────────────────────────────┐
│                         离线阶段(建库)                              │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  私有数据 ──→ 加载文档 ──→ 文本切块 ──→ 向量化 ──→ 存入向量数据库    │
│  (PDF/Word/   (解析成      (分成小     (Embedding   (Milvus/        │
│   Markdown)   纯文本)      片段)        模型)        Pinecone)       │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘
                                    ↓
┌─────────────────────────────────────────────────────────────────────┐
│                         在线阶段(查询)                              │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  用户提问 ──→ 问题向量化 ──→ 语义搜索 ──→ 构造增强Prompt ──→ 生成回答 │
│              (Embedding    (找最相似的   (背景资料+    (大模型基于    │
│               模型)         3-5个片段)    用户问题)     资料回答)     │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘


七、RAG在Agent里处于什么位置?

学完RAG的原理,你可能会问:它和我们之前学的Agent、MCP、Function Calling是什么关系?

其实非常简单:RAG本质上就是一个特殊的工具。

还记得Agent章节讲的吗?Agent = 大模型(大脑)+ 工具(双手)+ 执行循环

「查询知识库」这个动作,被封装成了Agent里的一个Tool

工作流程

text

用户提问(需要私有知识)
    ↓
大模型通过Function Calling下达指令
「调用知识库检索工具,查询:XXX」
    ↓
Agent执行这个工具调用,触发RAG的在线流程
    ↓
检索结果回传给大模型
    ↓
大模型基于检索结果继续推理或生成回答

这就是在MCP和Agent章节里预告RAG时说的:「把知识库检索封装成工具」


八、一张表看懂:没有RAG vs 有RAG

对比维度 没有RAG 有RAG
私有数据访问 无法访问,模型只有通用知识 ✅ 可以访问,基于私有知识库生成回答
知识更新 需要重新训练模型,慢且贵 ✅ 更新文档重新建库即可,快速生效
Token消耗 要么全量塞入(超限),要么放弃 ✅ 只召回相关的几段,token消耗极低
回答准确性 依赖训练数据,私有领域容易瞎编 ✅ 基于检索到的真实文档,有据可查
可追溯性 无法知道回答依据是什么 ✅ 每个回答都可以附上来源文档
扩展性 知识库扩大 = 重新训练 ✅ 直接往向量数据库里加数据即可

九、总结

整理一下这一章的核心认知:

1. RAG是什么?

Retrieval-Augmented Generation,检索增强生成。

先从知识库里找到相关内容,再把这些内容加进Prompt,让大模型基于私有数据生成有据可查的回答。

2. 为什么需要它?

问题 暴力解法(全量塞入) RAG解法
知识截止日期 ❌ 无法解决 ✅ 检索最新文档
私有数据 ❌ 模型没见过 ✅ 接入私有知识库
实时数据 ❌ 训练追不上 ✅ 实时检索
Context限制 ❌ 超限或放弃 ✅ 只检索相关片段
成本 ❌ 全量塞入很贵 ✅ 只消耗少量token
注意力 ❌ 长文本注意力稀释 ✅ 只给相关内容

3. 两大阶段

阶段 步骤 产出
离线建库 加载文档 → 文本切块 → 向量化 → 存入向量数据库 可检索的知识库
在线查询 问题向量化 → 语义搜索 → 构造增强Prompt → 大模型生成回答 精准回答

4. 核心概念

概念 一句话解释
向量化 把文字转化成代表语义的数字坐标(向量)
语义搜索 找意思相近的内容,不要求字面相同
向量数据库 专门用于高效查找相似向量的数据库

5. 在Agent中的位置

RAG就是一个特殊的工具,「检索知识库」被封装成一次Function Call,是Agent能力体系的重要组成部分。


思维导图(文字版)

text

RAG(检索增强生成)
│
├── 解决什么问题?
│   ├── 大模型看不到私有数据
│   ├── 大模型知识有截止日期
│   └── 暴力塞Prompt行不通(超限、费钱、注意力稀释)
│
├── 核心思路
│   └── 先检索,再回答(不塞全部,只塞相关)
│
├── 两大阶段
│   ├── 离线建库
│   │   ├── 加载文档
│   │   ├── 文本切块
│   │   ├── 向量化(Embedding)
│   │   └── 存入向量数据库
│   └── 在线查询
│       ├── 问题向量化
│       ├── 语义搜索
│       ├── 构造增强Prompt
│       └── 大模型生成回答
│
└── 在Agent中的位置
    └── RAG = 一个特殊的Tool(知识库检索工具)
Logo

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

更多推荐