Agent学习--RAG--BM25+倒排索引

在上一篇RAG文章中,我们回顾了RAG的核心思想,主要是分块策略以及检索中关于向量数据库的匹配规则。 现在我们来重点回顾一下检索的BM25和倒排索引

BM25

我们知道BM25的公式是:,其中 () 代表查询词在文档中的次数,IDF用来衡量词语的稀有度,D是文档的长度,avgdl是文档集合的平均长度。但是我认为其中有三个认知是需要引起重视的:

  1. 对于参数的理解,结合公式和实际上的作用我们可以更好地去理解。比如,对于词频,我们平时可能只会下意识地认为要关注词语出现的频率,但是,词语出现10次,会比其出现1次更重要或者说起到的作用更大吗?显然不是,一篇文章里同一个词重复太多遍,往往只是风格问题,而不是主题相关。所以函数里用了一个饱和函数使得词频超过一定阈值后收益递减。

  2. 公式里我们做了文档的长度归一化,意思就是对于平均长度以外的文档做出惩罚。短文档有惩罚很好理解,内容更少,关键词也少,自然起到的作用不大。但对于长文档,虽然其更容易包含关键词,但是相关性不一定更高(比如搜索某些公式,有的长文档,只是做了一个示例的提出和解释,由于文字比较多,如果没有惩罚系数,其得分会比单纯解释公式的短文档高,但是这显然不符合实际)

  3. 很多词语只是简单地起到一个连贯作用,甚至只是语气词,但是受限于文档的风格,比如文档是自然语言,那么"的","了","然后"等词语的出现频率会很高,但这些词语会让文档的区分度变低,所以引入了逆文档频率这个参数来限制

当然,BM25的缺点也很明显,除了无法理解语义,导致近义词无法匹配之外(搜索苹果手机找不到iphone,搜索汽车找不到轿车等),只做关键词匹配意味着其会忽略语序这个重要的语法概念,从而给予有些看似相似实则天差地别的文档块相同的得分(比如说猫捉老鼠和老鼠捉猫的得分相同)

倒排索引

我们知道倒排索引跟我们看书本目录查知识一样,先查有哪些关键词,再去看属于哪些文档。

但实际上,如果在跟"词典"中的词语进行匹配时,还是线性扫描的话,效率其实跟我们不用倒排是差不多的。而实际上,这一部分我们会用哈希表,B+树或者FST这类来实现,这三者分别是精确查询,范围查询以及压缩版的精确查询。一般我们会用FST,因为其存储方式里,有一个很重要的特点:共享前缀,以单词举例,car,cat,他们都共享"ca"这个前缀,查询时会先查ca,然后再查后缀,既节省了空间,又提升了速度。

另外,用户给的问题通常都不是一个单一的词语,即使是过滤掉一些日用语,像"人工智能"和"算法",是需要同时取出倒排列表去做交集的。我们一般会默认搜索到的列表是按顺序排列,这并不是为了好看,而是为了可以实现一个很简单,但是又非常实用的效果"归并处理"。这听起来就是我们小学学到的合并同类项,实际上起到的作用类似,但是重点是在归并上,我们要做的是取交集,但是如果一个个地去遍历,我们的工作量会非常大,而如果两者的文档列表都是按顺序排列,那么只需要上下去比对数字,通过数字大小,就可以快速地定位文档,提升速度

相关推荐
行者无疆_ty5 小时前
如何在个人电脑部署大模型实现Token自由
人工智能·大模型·agent
神火星跳伞队队长6 小时前
OpenClaw 源码拆解:一个开源 Coding Agent 的架构全景
ai·架构·开源·agent
一个处女座的程序猿6 小时前
Agent之skills:colleague-skill的简介、安装和使用方法、案例应用之详细攻略
agent·skill· llms·colleague-skill
sun_tao111 小时前
生产级的复杂RAG系统流程
rag·rerank·hyde
prog_610311 小时前
【笔记】用cursor手搓cursor(五)再见claude
人工智能·笔记·大语言模型·agent
AI自动化工坊11 小时前
HiClaw多Agent协同实战:基于Matrix协议的透明化AI团队架构
人工智能·ai·架构·agent·matrix·hiclaw
Candle_light12 小时前
Openclaw报错unauthorized: gateway token mismatch
agent
ZGi.ai12 小时前
企业AI的运行底座是什么?和AI工具有什么本质区别?
人工智能·rag·大模型落地·企业ai·ai底座
G皮T13 小时前
【OpenClaw】思路转变:从 “传统UI测试” 到 “AI驱动的UI测试”
自动化测试·人工智能·ai·agent·测试·ui测试·openclaw