为什么不能把资料整个塞给 AI — 两条流水线是怎么被逼出来的
这一章讲三件事: 你的 AI 助手为什么答不出你公司的事; 为什么「把资料全给它」这条最直白的路走不通; 以及走不通之后剩下的那条路长什么样。 读完你会拿到全书的骨架——后面六章都是在这个骨架的某一段上打磨。 不需要任何基础,遇到的生词都在当场解释。
1. 先看现象:它什么都懂,就是不懂你的事
你大概试过这样一件事:
- 问它「Python 怎么读 Excel」—— 答得又快又对;
- 问它「我们公司去年跟这家供应商签的合同里,违约金条款是怎么写的」—— 它要么说不知道,要么编一个看起来很像的答案给你。
这不是它笨,是它没见过。
这类会写字的 AI,行话叫大语言模型,英文缩写 LLM—— 指的就是 ChatGPT、Claude 这类读了海量文字之后学会接着往下写的程序。 它写出来的每一个字,都是照着它读过的那批文字接下去写的; 它没读过的东西,它写不出来,只能编。
它读那批文字的过程,行话叫训练。训练一停,它知道的东西就定死在那一刻了—— 之后你公司签的每一份合同,它一个字都没见过。
那你的合同在哪儿?按这本书开篇给的说法:传统公司里大约八成的信息不在任何数据库里, 而是埋在幻灯片、Word 文档、Excel 表、邮件和会议记录里1。
这一章要回答的就是:怎么把这八成弄到 AI 眼前。
2. 顶层全景:一句话链条
它没见过你的资料
└─ 那就把资料给它 ── 一次能给的量有上限,而且给得越多越慢越贵 ── 此路不通
└─ 那就只给相关的那几段 ── 可「相关」怎么找?关键词对不上
└─ 把文字变成一串数字,让意思近的数字也近 ── 于是「找」变成了「比远近」
└─ 数字要提前算好存起来 ── 整件事裂成两条流水线:入库(慢)+ 问答(快)
图说:每一层都是被上一层逼出来的,不是谁设计得巧。这一章从上到下走完这五层。
3. 第一条路为什么走不通:两堵墙
这一节回答:为什么不能干脆把整份资料贴进对话框。
第一堵墙:一次能读多少是有硬上限的
「上下文」就是这一次对话里,模型眼前能同时看到的全部文字—— 包括你的问题、你贴进去的资料、以及它自己已经写出来的部分。超出这个量的部分,它看不见。
书里的说法很干脆:每个模型都有一个最大的上下文尺寸, 它规定了这个模型在一次交互里能处理多少内容2。
顺便说一个后面会反复出现的计量单位:这个上限不是按「字数」算的, 是按标记(英文 token:模型把一段文字切开之后的一小片)算的。 标记就是模型能处理的最小单位,它可能是一个完整的词,也可能只是词的一小截。 英文里大致 1 个标记 ≈ 4 个字符,这个换算书里第 2 章用到过,后面第 05 章讲切分大小时还会用3。
这堵墙其实在慢慢后退——书里也承认上 限「越来越大」。所以它不是决定性的那一堵。
第二堵墙才是真正致命的:慢,和贵
先说清一个词:「提示」就是你最终发给模型的那一整段话——问题,加上你附带的所有资料。 它是模型唯一的输入。
同一句话里,作者紧接着说了真正的原因: 堆出巨大的提示会让模型响应时间变长,让应用又慢又贵2。
提示越长,模型要读的东西越多,吐第一个字之前你等得越久。
而钱是按量算的:这类模型的服务几乎都按「读进去多少 + 写出来多少」收费。 你每问一次就把整本手册贴进去,就是每问一次都为整本手册付一次钱。
把这堵墙钉死的是一句关于用户的话
作者写了一句我认为是全书最实在的话:
没人愿意为一个精心组织的答案等上 10 秒钟, 因为同样的信息从普通搜索引擎那里几乎是瞬间就能拿到4。
他的原话是:这类应用「仍然在和传统搜索引擎争夺用户的期待和耐心」。
你的竞品不是另一个 AI,是用户已经被搜索引擎养成的那点耐心。
判断(我们的,不是书里的): 这两堵墙的地位完全不同,值得分开记。 第一堵(读不下)是技术限制,在退;第二堵(慢和贵)是经济与体验限制,不会退。 就算哪天上限大到能塞下你整个知识库,先搜再答这件事也不会消失—— 因为塞进去的每一个字都要付钱、都要等。 如果错,会错在: 如果模型的处理速度和价格降到某个程度,让「整本塞进去」的代价小到可以忽略, 那这条推导就失效了,先搜再答会退化成一种可选的改良手段而不是必需品。 判据是:同样一个问题,整本塞和先搜再答,响应时间和花费差几倍——差得不明显那天,这条就该重写。
4. 插一句:那个「八成」的数字,打个折再用
这一节只做一件事:告诉你哪些数字不能直接引用。
先说清两个词:
| 词 | 是什么 |
|---|---|
| 结构化(排成了整齐行列、机器直接能查)的数据 | 数据库表、Excel 表格 |
| 非结构化(没有固定格式、机器不知道从哪儿下手)的数据 | 一篇报告、一封邮件、一段录音 |
上面那句「公司里八成信息是非结构化的」,你会在无数篇文章里看到。它来路不明。
这个「八成」能追到的最早出处,是 1998 年美林证券的一份材料,原话是 「非结构化数据占了一个组织中数据的绝大部分,某些估计高达 80%」—— 注意它自己就是转述别人的估计。而这个数字底下从来没有人找出过原始研究5。
判断(我们的,不是书里的): 这个数字方向是对的,那个具体数值是假的。 它统计的是字节(衡量数据体积的基本单位,一个英文字母大约占一个字节; 你在电脑上看到的文件大小,就是按它算的),而一段视频的体积能顶几百万行数据库记录—— 所以它几乎是自动成立的,却说明不了「你要用的信息在哪儿」。 用它来说明「值得做这件事」没问题,写进任何需要负责的材料里就别引它。 如果错,会错在: 如果确实存在一份我们没找到的原始统计,那这条提醒就过度谨慎了。 但即便如此,「按体积算」这个方法论问题依然在。
5. 剩下的那条路:先找,再答
这一节给出全书的核心动作。
既然不能全塞,那就只塞相关的那几段。
用户问一句
│
├─ 第一步:从你自己的资料里,搜出最相关的三五小段
│
├─ 第二步:把「这几段 + 用户的问题」拼成一段话,发给模型
│
└─ 第三步:模型照着这几段写答案
图说:模型的角色从「知识来源」降级成了「写作工具」。知识来自你的资料。
这套做法的名字是 RAG。三个英文单词的首字母,拆开是「检索增强的生成」:
- 检索:就是「搜」——从一堆资料里把相关的挑出来;
- 生成:就是「让模型写出来」;
- 增强:指搜到的东西被塞进提示里,用来给模型补课。
作者给的一句话定义最好记:
一个 RAG 系统 = 一个搜索引擎 + 一个大语言模型。 搜索引擎负责在你的数据库里找到最相关的信息,模型负责根据它写出答案。6
这个名字不是这本书起的。 它来自 2020 年 5 月的一篇论文,第一作者是 Patrick Lewis。
那篇论文的说法比「搜索 + 生成」这个通俗解释更准:一个模型手上其实有两份东西可用, 而 RAG 就是让它同时用上这两份6。
- 模型脑子里那份: 改不了、查不到来源,也不知道过没过期;
- 外挂那份: 可以随时更新,而且能指出这句话是从哪份文件的第几页来的。
为什么这个区分有用: 它说明了 RAG 到底改善了什么——不是让模型变聪明, 是给它换了一份能改、能查、能标出处的资料。
6. 补课:「搜」到底怎么搜 —— 把意思变成位置
这一节是我们补的,不是书给的。 书里管这一步叫「详见后文」,而后文正好不在我们这一版里—— 可是不讲它,后面六章全都悬空。所以在这里补到「够用」的程度。
先看问题出在哪
用户问:「去年欧洲业务为什么下滑?」 你的文档里写的是:「EMEA 区营收同比走弱,主因是渠道库存积压。」
一个关键词都对不上。 按关键词搜,这份文档永远搜不到。
所以要搜的不是字,是意思。 可「意思」这东西,机器怎么比?
办法:给每段文字发一个坐标
先想一件更笨的事。 假设我们只用两个数来描述一句话:第一个数记「这句话跟动物有多大关系」, 第二个数记「跟财务有多大关系」。那「小猫在睡觉」就落在(高,低)那个角, 「季度营收报表」落在(低,高)那个角——它俩自然就离得远; 而「猫咪打盹儿」会落在「小猫在睡觉」旁边,因为这两句在这两把尺子上给的分几乎一样。
真实的做法就是这件事,只是把两把尺子换成一千多把。 区别只有一处: 这一千多把尺子各管什么,不由人来定——而是让一个专门的模型 从海量文字里自己试出来,试到「意思近的两句话得分也近」为止。
所以下面这三串数不是凭空落下来的,它们就是同一句话在这一千多把尺子上的得分:
「小猫在睡觉」 ──→ [0.21, -0.05, 0.88, … ] 一串几百上千个数
「猫咪打盹儿」 ──→ [0.19, -0.07, 0.85, … ] ← 和上面几乎重合
「季度营收报表」──→ [-0.63, 0.44, 0.02, … ] ← 离得很远
图说:意思相近的句子,数字也相近。于是「像不像」变成了「离多远」。
这一串数有个名字,行话叫嵌入(英文 embedding:把一段文字嵌进一个由数字搭起来的空间里, 让它在里面占一个位置)。关于它,先记住两件事: 第一,它是算出来的,不是查表查来的——任何一句话,哪怕从没人写过,也能当场算出一串; 第二,意思越近的两段话,算出来的两串数也越近,上面那张图就是在说这件事。
这串数有多长?常见的是几百到几千个数,OpenAI 那个嵌入模型给的是 1536 个7。 数学上管这样一串按固定顺序排好的数叫向量——跟「嵌入」是同一样东西的另一个名字。
本文后面一律叫「嵌入」。
书里对负责这件事的模型有一句很到位的形容:所有人都在谈会写字的大模型, 可真正的无名英雄是嵌入模型——它把词句的意思变成多维的数, 分类(分类就是给东西贴标签)、聚类(聚类就是把相似的东西自动归堆)、 推荐这些活儿全靠它8。
「离多远」怎么算
最常用的一个办法叫余弦相似度——它只看两串数指的方向像不像,不看它们各自多长。 方向越接近,它给的分越高;所以余弦相似度是越大越像。 好处很直接——一句短话和一段长文,只要说的是一回事,方向就接近,不会因为长短悬殊被判成不像。
这里有一句桥必须当场搭上,不然后面两章会读拧。 这一行里有两个方向相反的说法,其实是同一件事的正反两面:
| 说法 | 方向 | 怎么读 |
|---|---|---|
| 相似度(余弦相似度就是一种) | 越大越像 | 「这两段有多像」 |
| 距离 | 越小越像 | 「这两段离多远」 |
相似度越大 = 距离越小,把「有多像」倒过来说就是「离多远」,换算而已,不是两件事。
本文后面一律说「距离」,因为书里就是这么说的——它在讲按意思切分文档时给了一句判据, 记住它就够用了:距离越小越相似,距离越大越不相似9。 至于具体用哪个公式,书里指向了不存在的后文。
存在哪儿
算好的嵌入要存起来,存的地方叫向量库(也叫向量数据库)。
它和普通数据库的区别只有一条: 普通数据库擅长回答「哪一行的编号等于 1024」, 向量库擅长回答「哪几条离我给的这串数最近」。
书里的说法是:入库阶段要把「我们所有可用的文本内容装进向量库」10。
7. 于是整件事裂成两条流水线
这一节是全书的骨架,后面六章都挂在它上面。
为什么必须裂成两条?因为算嵌入是要花时间和钱的。 你不可能等用户问了问题,再现场把整个知识库算一遍。必须提前算好。
提前算好的那条线,行话叫离线。注意这里的「离线」跟有没有联网毫无关系—— 它说的是「不在用户等着的时候跑」。所以它可以半夜跑,可以跑一整天, 也可以中途失败了明天重跑一遍,没有人会因此看着一个转圈的界面干等。
跟它对着的那条线叫在线:用户正 盯着屏幕等结果,每多花一秒都是他在等。
┌─ 入库线(离线跑:不在用户等着的时候跑,慢一点没关系,做一次管很久)─┐
│ │
│ 你的文件 → 读成文字 → 切成小块 → 每块算出嵌入 → 连同出处存进向量库 │
│ (第02-04章) (第05章) │
└──────────────────────────────────────────────────────────────────┘
┌─ 问答线(用户在等,必须快)────────────────────────────────────┐
│ │
│ 用户的问题 → 算出嵌 入 → 在向量库里找最近的几块 → 拼成提示 → 模型写答案 │
│ │
└────────────────────────────────────────────────────────────────┘
图说:两条线各三步,书里就是这么分的。注意两条线都有「算嵌入」这一步。
书里把这两条线分别列成了三步11:
| 入库线 | 问答线 |
|---|---|
| 加载:从 Word、PDF、Excel、数据库等各种地方把内容读出来 | 把问题变成嵌入 |
| 切分:切成小块,因为嵌入模型和大模型都有读不下的上限 | 找相似:在向量库里算距离,找出最像的几块 |
| 算嵌入:把每一小块变成一串数,这样才能算相似度 | 答题:模型根据找到的那几块内容作答 |