- 作者
-
-
- 姓名
- Amit Shekhar
- 发布于
-
无向量 RAG 是一种从我们自己的文档中回答问题的方法,无需将文档转换为向量,也不需要任何向量数据库。相反,LLM 会像人类阅读一本书那样查看文档的结构,并决定打开哪一部分。
在这篇博客中,我们将学习无向量 RAG,这是一种从我们自己的文档中回答问题的方法,无需将这些文档转换为数字,也不使用任何向量数据库。我们还将了解普通 RAG 是如何工作的,为什么向量部分会带来问题,无向量 RAG 系统如何像人类阅读一本书那样读取文档,树结构和搜索如何逐步进行,有哪些优点和缺点,以及何时该使用哪一种。
我们将涵盖以下内容:
- 什么是 LLM?
- 什么是 RAG?
- 普通向量 RAG 是如何工作的
- 向量 RAG 的问题
- 什么是无向量 RAG?
- 无向量 RAG 是如何工作的
- 无向量 RAG 的示例
- 其他无向量的方法
- 无向量 RAG 的优点
- 无向量 RAG 的缺点
- 向量 RAG 与无向量 RAG 的对比
- 何时使用哪一种
我是 Amit Shekhar,Outcome School 的创始人,我教导和指导过许多开发者,他们的努力为他们赢得了高薪的技术工作,帮助许多科技公司解决了他们的独特问题,并创建了许多被顶级公司使用的开源库。我热衷于通过开源、博客和视频分享知识。
我在 Outcome School 教授 AI 和机器学习。
让我们开始吧。
什么是 LLM?
在进入无向量 RAG 之前,我们必须知道什么是 LLM。
LLM = 大语言模型。
简单来说,LLM 是一种 AI 模型,它阅读了海量的文本并学会了语言的运作方式。当我们向它提问时,它会一个词一个词地写出答案。
ChatGPT、Claude 和 Gemini 都是基于 LLM 的。
但有一个问题。LLM 只知道它在训练期间读过的内容。它从未见过我们的办公文档、我们的保险单、我们的公司手册,或者我们上周写的报告。
所以,如果我们向 LLM 提问关于我们自己文档的问题,它无法回答。它从未学过那些内容。
我们需要一个解决方案,RAG 就是为解决这个问题而引入的。
什么是 RAG?
RAG = 检索 + 增强 + 生成。
让我们用简单的语言来分解它:
- 检索:找到我们文档中有用的部分。
- 增强:将该部分添加到问题中。
- 生成:让 LLM 利用它写出答案。
所以,RAG 是一个非常简单的想法。我们不需要教模型任何新东西。我们只是在合适的时机把正确的页面交给它。
让我们举一个例子。
假设我们有一份 300 页的保险单。我们问:“牙科治疗是否在承保范围内?”
我们不把全部 300 页都发给 LLM,而是找到谈论牙科治疗的那两页,只把这两页连同我们的问题一起发送。
LLM 阅读这两页并给出答案。
可以把它想象成一场开卷考试。LLM 是学生,我们的文档是书本,检索就是找到正确页面的动作。
现在,一个问题随之而来:为什么我们不每次都直接把全部 300 页交出去呢?
有三个原因。第一,LLM 一次只能读取有限的文本量,一大堆文档永远放不下。第二,我们发送的每个字都要付费,所以为每个小问题都发送整本书会变得非常昂贵。第三,也是最重要的一个,当我们把有用的两页埋在 300 页之中时,模型会被干扰,答案质量会变差。
我们有一篇关于 LLM 中的“迷失在中间”问题 的详细博客,深入解释了这第三个原因。
所以,我们必须发送更少的文本,而且这些更少的文本必须是正确的文本。
现在的问题是,我们如何找到正确的页面?这正是两种方法的区别所在。
普通向量 RAG 是如何工作的
如今大多数 RAG 系统都使用向量。我们先来理解这一点,因为只有知道了 Vectorless RAG 取代的是什么,它才有意义。
在此之前,我们必须知道什么是向量。
向量就是一长串数字,类似于
[0.12, -0.88, 0.45, ...]
。这个列表中可能有成百上千个数字。
有一种特殊的模型叫做嵌入模型。我们给它一段文本,它返回一个向量。关键在于:含义相似的文本会得到相似的数字列表。
所以,“我爱狗”这句话和“我喜欢小狗”这句话会得到两个非常接近的数字列表。而“股市崩盘了”这句话得到的数字列表则与前两者相距甚远。
也就是说,句子的含义被转换成了一个位置。数字接近意味着含义接近。
这种按含义而非精确字词进行搜索的方式称为语义搜索。我们有一篇关于 语义搜索是如何工作的? 的详细博客,对此进行了端到端的讲解。
现在,我们来看看 Vector RAG 系统是如何构建的。它分为两个阶段。别担心,我们会详细了解每一个阶段。
阶段 1:准备文档。
首先,我们把 300 页的文档切成小块。每块通常是几百个词。这些小块被称为分块。
然后,我们把每个分块输入嵌入模型,为每个分块得到一个向量。
之后,我们将所有这些向量存储在一个向量数据库中。向量数据库是一种特殊的存储系统,它非常擅长一项工作:找出与给定向量最接近的向量。
现在,我们的文档已经可以用于搜索了。
阶段二:回答问题。
首先,用户提出一个问题。
然后,我们将这个问题通过同一个嵌入模型,得到该问题的向量。
之后,我们让向量数据库找出其向量与问题向量最接近的分块。通常我们会要求返回最接近的 5 个或 10 个分块。这个数字被称为 top-k。
最后,我们将这些分块和问题一起发送给大语言模型(LLM),由 LLM 撰写答案。
这就是向量 RAG 的工作原理。它是一种很好的方法,如今支撑着大量的产品。
计划转型进入 AI 领域?
无论你今天在哪个技术领域工作,只要付出努力,你都可以转型到以下这些角色:
- AI 工程师
- 前沿部署工程师
- AI Agent 工程师
- Harness 工程师
- 语音 AI 工程师
- AI 架构师
- LLM 工程师
- LLM 推理工程师
- 生成式 AI 工程师
- MLOps 工程师
- 机器学习工程师
- 深度学习工程师
Outcome School 的 AI 与机器学习课程将带你实现这一目标。
但会出现以下问题。
向量 RAG 的问题
问题一:分块破坏了语义。
我们按固定大小把文档切成小块。文档并不关心我们的固定大小。一个句子可能被切成两半。一个表格可能与它的标题分离。一条规则可能与它的例外情况分离。
假设保单在某一页上写着:“牙科治疗属于承保范围。”而在两页之后写着:“第 3 章中提到的所有治疗仅在一年的等待期之后适用。”
这两句话位于两个不同的分块中。系统可能只选中了第一个分块,而漏掉了第二个。答案就会是自信满满的错误答案。
问题二:相似不等于正确。
向量数据库找出的是听起来与问题相似的文本。听起来相似并不等于就是正确答案。
如果我们问:“哪份保单不承保牙科治疗?”,“不”这个词是一个很小的词。它几乎不会改变数值。因此,系统会欣然返回那些确实承保牙科治疗的保单相关的分块。
问题三:搜索过程中没有思考。
搜索是纯粹的数学运算。它测量距离。它不会推理。它无法说:“这个问题涉及一条规则及其例外情况,所以我必须查看两个不同的章节。”
问题四:我们无法解释结果。
当选中了错误的分块时,我们无法询问向量数据库为什么。它只返回数字。调试变得非常困难。
问题五:需要维护一整套系统。
我们需要一个嵌入模型、一个向量数据库、一种分块策略,以及一个在文档每次变化时都会运行的重新嵌入任务。如果我们想换一个更好的嵌入模型,就必须从头重建一切。
问题 6:特殊词汇和数字会受影响。
产品编码、发票号码、医学术语、法律条款编号和表格对嵌入模型来说没有太多含义。
Clause 14.2.b
和
Clause 14.3.b
看起来几乎一模一样。
问题 7:分块的数量是固定的。
我们一次性确定 top-k 的值,之后它对每个问题都保持不变。但有的问题可能只需要一行内容,而另一个问题可能需要六个完整的章节。固定的数量要么带来太少的内容,要么带来太多噪音。
于是,Vectorless RAG 应运而生,前来救场。
什么是无向量 RAG?
Vectorless RAG = 不使用向量的 RAG。
Vectorless RAG 是一种无需将文档转换为向量、也无需使用任何向量数据库的检索方式。它不通过数值相似度进行搜索,而是让 LLM 本身查看文档的结构并决定打开哪一部分,就像人类在书中查找答案一样。
简单来说,我们用阅读取代了数学,而且还不必把文档切成碎片。
让我们用一件我们每个人都做过的事情来理解这一点。
假设我们买了一台洗衣机,想了解保修事宜。我们拿到一本 200 页的说明书。
我们会怎么做?我们不会去测量任何东西的相似度。我们翻开前面的目录。我们浏览章节名称。我们看到“第 9 章:保修与服务”。我们直接跳到第 154 页。我们阅读它。我们得出答案。
就是这样。这就是 Vectorless RAG 的全部理念。
我们把目录交给 LLM,让它来选择页面。
注意: “Vectorless”这个词只是表示我们在搜索时不使用嵌入向量。我们仍然使用 LLM 来阅读并撰写最终答案。
要学习 RAG、向量数据库和嵌入,请查看 Outcome School 的 AI 与机器学习课程,我们还会从零开始构建一个 AI 导师。
无向量 RAG 是如何工作的
让我们一步步看看这是如何实现的。它同样包含两个阶段。
阶段 1:准备文档。
于是,树就登场了。我们不再把文档切成大小相同的碎片,而是用它构建一棵树。
这里的树和目录的含义相同。书在最顶层。章节隶属于书。小节隶属于章节。子小节隶属于小节。
对于这棵树的每个节点,我们存储三样东西:
- 该小节的标题,例如“3.4 牙科治疗”。
- 该小节内容的简短摘要,用一两行文字写成。
- 真实文本的位置,例如第 41 至 43 页。
我们不存储任何数字,不切分任何内容。原始文档保持原样,完整且未被改动。
构建这棵树是一次性的工作。如果文档已经有目录,我们可以直接使用。如果没有,我们就让 LLM 逐节阅读,为我们写出标题和摘要。
阶段二:回答问题。
第 1 步: 用户提出一个问题。
第 2 步: 我们只向 LLM 展示树的顶层,也就是章节名称及其一行摘要。这非常小,可能只有一页文本,即使对于一份 300 页的文档也是如此。所以,这一步依然便宜且快速。
第 3 步: 我们向 LLM 提一个简单的问题:“根据这些章节名称和摘要,哪些章节可能包含答案?”LLM 会选出一个或多个章节,并告诉我们它为什么选择它们。
第 4 步: 我们只打开被选中的章节,向 LLM 展示其中的小节。LLM 再次进行选择。
第 5 步: 我们继续逐层向下,直到到达实际的小节。这种沿树向下遍历的过程称为树搜索。
第 6 步: 现在我们提取这些被选中小节的完整原文。中间不会被截断,因为我们取的是完整的小节。
第 7 步: 我们把问题和那段完整文本发送给 LLM,它会写出最终答案,并附上它所使用的小节编号。
在这里,我们可以注意到一个美妙之处。每一步都是由一个思考型模型做出决策的,而且每一步它都告诉了我们原因。所以,如果答案错了,我们可以打开这条轨迹,确切地看到它在哪里走错了方向。
注意: 这也被称为基于推理的检索,因为系统是通过推理找到答案,而不是通过测量数字之间的距离。
给你的一个快速提示
无论你在哪个技术领域工作,都要熟悉这些主题:
- LLM
- RAG
- MCP
- Agent
- 微调
- 量化
我们把它们全部整合在一个视频中:
AI 工程详解:LLM、RAG、MCP、Agent、微调与量化
不必中断阅读——把它加入书签,等有空的时候再看。未来的你会感谢现在的你。
现在,让我们回到主题。
无向量 RAG 的示例
学习这个的最好方法就是举一个例子。
让我们回到那份 300 页的保险单。我们的问题是:“第一年是否承保牙科治疗?”
假设我们已经构建好了这份保单的树,为了便于理解,这里只保留简短版本,如下所示:
Insurance Policy | |-- Chapter 1: Definitions |-- Chapter 2: How to Buy the Policy |-- Chapter 3: What is Covered | |-- 3.1 Hospital Stay | |-- 3.2 Surgery | |-- 3.3 Eye Care | |-- 3.4 Dental Treatment |-- Chapter 4: What is Not Covered |-- Chapter 5: Waiting Periods |-- Chapter 6: How to Claim
我们先来看看向量 RAG 系统会怎么做。
它会寻找听起来像“牙科治疗 第一年 承保”的分块。“牙科”这个词在第 3 章中出现了很多次,所以它返回了来自
3.4 Dental Treatment
的五个分块。这五个分块都在讲牙科治疗是承保的。
第5章写道:“牙科治疗有12个月的等待期。”但这一行内容位于一段关于多种不同等待期的长文本块中,听起来与我们的问题不够贴近。
因此,LLM 只看到那些回答“是”的文本块,于是它回答:“是的,牙科治疗在承保范围内。”
这个答案是错误的。
现在,让我们看看 Vectorless RAG 系统会怎么做。
LLM 看到了六个章节名称。它这样思考:“用户问了两个问题。第一,牙科治疗是否在承保范围内。第二,第一年是否承保。第一部分在第3章。第二部分与时间有关,所以在第5章。”
它选择了第3章和第5章。
然后它在第3章内部向下深入一层,选择了
3.4 Dental Treatment
.
接着我们提取
3.4
的全文和第5章的全文,并把两者都发送给 LLM。
现在,LLM 面前有了完整的两方面真相,它回答:“牙科治疗在承保范围内,但第一年不承保。根据第5章,有12个月的等待期。”
答案是正确的。问题解决了!
在这里,我们可以看到真正的区别。向量系统搜索的是听起来相似的词。而 Vectorless 系统理解了问题,然后去寻找规则及其例外,就像一个细心的人会做的那样。
在 Vector RAG 中,我们用数学来搜索。在 Vectorless RAG 中,我们用阅读来搜索。
这样,我们就可以用 Vectorless RAG 来解决一个有趣的问题:找到同时藏在两个不同地方的答案。
如果你想深入了解如何设计 RAG 系统(与你的文档对话),以及 AI Agent 和 Agentic AI,请查看 Outcome School 的 AI 与机器学习课程。
其他无向量的方法
树搜索是最流行的方式,但它不是唯一的 Vectorless 方式。让我们再看几种。
关键词搜索。 这是匹配实际词语的老牌且可靠的方法,就像我们在文件内部搜索一样。如果用户查询
Invoice INV-2024-8891
,关键词搜索每次都能找到那个确切的字符串,而嵌入模型可能会返回一百个看起来相似的发票号码。
对结构化数据进行过滤。 如果我们的数据存储在一个普通数据库中,包含日期、城市和金额等列,我们根本不需要任何搜索。我们让 LLM 编写一个查询,运行它,然后把返回的行交给 LLM。用这种方式处理数字和日期非常完美。
提供完整文档。 现代 LLM 可以一次性阅读非常大量的文本。如果我们的文档足够小,可以直接把整个文档连同问题一起提供。这样根本不需要检索步骤。这是最简单的方法,对于单个合同或单个报告来说,效果非常好。
让模型浏览文件。 我们还可以给 LLM 提供一组工具,例如列出文件夹、打开文件以及在文件内搜索。然后 LLM 会自己探索我们的文件,一步一步地进行,就像开发者探索一个新的代码库一样。这通常被称为 Agentic 搜索。
以上这些都是无向量的。其中任何一种方法都不会创建任何向量。
编码 Agent 在我们的代码库中正是这样工作的。我们有一篇详细介绍 Claude Code 如何工作 的博客,解释了它如何在不创建任何嵌入的情况下找到正确的文件。
以上就是各种无向量方法的介绍。现在,让我们讨论无向量 RAG 的优点和缺点。
无向量 RAG 的优点
- 无需分块。 我们总是读取完整的章节,因此规则永远不会与其例外情况分离。
- 无需向量数据库和嵌入模型。 少了一个需要构建、付费和维护的系统。
- 更新简单。 当文档发生变化时,我们只需更新该章节的摘要。无需对任何内容重新嵌入。
- 我们可以看到推理过程。 在每一步,LLM 都会告诉我们它为什么打开某个特定章节。调试变得简单。
- 特殊词汇处理效果好。 条款编号、产品代码和医学术语会被作为真实词汇读取,而不是变成一串模糊的数字。
- 在长篇和结构化文档上回答更好。 报告、政策、手册和法律文件本身就有清晰的结构,这种方法利用了这些结构,而不是将其丢弃。
- 搜索过程中的真实推理。 系统可以决定查看两个相距很远的章节,因为问题需要两者兼顾。
简而言之,当文档很长且答案必须准确时,它能让我们的工作变得轻松。
保持更新: 订阅我们的 新闻通讯,将我们最新的 AI 和机器学习博客直接发送到您的收件箱。
无向量 RAG 的缺点
- 速度较慢。 沿树向下遍历需要多次 LLM 调用,每一层一次。而向量搜索可以在几毫秒内完成。
- 每个问题的成本更高。 每次 LLM 调用都要花钱。而向量搜索在向量存储之后几乎免费。
- 需要结构。 如果我们的数据是一千万条没有标题、没有章节的随机支持聊天消息,那就无法构建有意义的树。
- 质量取决于摘要。 如果某个章节的摘要写得不好,LLM 可能会跳过该章节。摘要承担了原来向量所做的工作。
- 本身无法扩展到数百万份文档。 在一份长文档内搜索很容易。但在五百万份文档之间进行选择,需要在树搜索开始之前先进行某种廉价的初步筛选。
向量 RAG 与无向量 RAG 的对比
既然我们已经了解了两者,现在是时候将它们放在一起比较了。
为了便于您更好地理解,我将 Vector RAG 与 Vectorless RAG 的区别整理成表格,以便您根据自身用例决定使用哪一种。
| Vector RAG | Vectorless RAG |
|---|---|
| 文档被转换为向量。 | 文档保持原样。 |
| 需要嵌入模型。 | 不需要嵌入模型。 |
| 需要向量数据库。 | 不需要向量数据库。 |
| 文档被切成固定大小的分块。 | 文档保持完整,逐节阅读。 |
| 搜索通过测量数字之间的距离来进行。 | 搜索由 LLM 阅读标题和摘要并进行选择来完成。 |
| 搜索过程中没有推理。 | 搜索的每一步都有推理。 |
| 非常快,毫秒级完成。 | 较慢,因为需要多次 LLM 调用。 |
| 每个问题的成本非常低。 | 每个问题的成本较高。 |
| 难以解释为什么选中了某个分块。 | 易于解释,因为 LLM 会给出理由。 |
| 可以很好地扩展到数百万份文档。 | 最适合长且结构良好的文档。 |
| 更新文档需要重新嵌入。 | 更新文档只需更新摘要。 |
| 难以处理精确的代码、数字和否定。 | 能很好地处理精确的代码、数字和否定。 |
何时使用哪一种
当我们拥有数量非常庞大的文档、问题只是简单的查找、速度非常重要,并且每个问题的成本必须保持极低时,我们必须使用 Vector RAG。一个拥有一百万篇短文章的帮助中心就是一个很好的例子。
当我们拥有已经具有清晰结构的长文档、错误答案的代价很高,并且问题需要在同一文档的不同部分之间进行推理时,我们必须使用 Vectorless RAG。保险单、法律合同、年度报告、医疗指南和技术手册都是很好的例子。
那么,现在我们知道了可以在哪里使用 Vectorless RAG。
许多强大的系统会同时使用两者。它们先用廉价的向量搜索或关键词搜索将五百万份文档缩小到二十份,然后在这二十份文档内使用树状搜索找到确切的部分。这被称为混合方法,我们既能获得前者的速度,又能获得后者的准确性。
现在,我们应该已经理解了 Vectorless RAG 是什么、它为何存在、如何工作,以及它适用于哪些场景。
常见问题
Vectorless RAG 仍然使用 LLM 吗?
是的。“Vectorless”一词仅表示我们在搜索中不使用嵌入向量。我们仍然使用 LLM 来阅读目录、选择正确的章节和小节,并撰写最终答案。实际上,正是 LLM 完成了找到文档正确部分的工作。
如果我们的文档没有目录,可以使用 Vectorless RAG 吗?
是的。如果文档已经有目录,我们可以直接用它来构建树。如果没有目录,我们就让 LLM 逐节阅读文档,为我们写出标题和简短摘要。构建这棵树是一次性的工作。
Vectorless RAG 和关键词搜索是一回事吗?
不是。关键词搜索只是无向量方法中的一种。最流行的无向量方法是树搜索,即 LLM 逐级沿着目录向下遍历。而关键词搜索匹配的是实际的词语,这使它非常擅长查找精确字符串,比如发票号码。
RAG 中总是需要检索步骤吗?
不需要。如果我们的文档足够小,能一次性放进 LLM 可读取的范围内,我们就可以直接把整个文档连同问题一起给出。完全不需要检索步骤。这是最简单的方法,对于单个合同或单个报告来说效果非常好。
为什么 Vectorless RAG 被称为基于推理的检索?
它被称为基于推理的检索,是因为系统通过推理得出答案,而不是测量数字之间的距离。在每一步,LLM 都会决定打开哪个部分,并告诉我们原因。因此,如果答案错了,我们可以打开这条推理轨迹,确切地看到它在哪里走错了方向。
今天就到这里。
谢谢
Amit Shekhar Outcome School 创始人
你可以通过以下方式与我联系:
关注 Outcome School: