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,然后再查后缀,既节省了空间,又提升了速度。

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

相关推荐
Eloudy6 小时前
ReAct 原理简介
前端·javascript·人工智能·react.js·agent·gpu
x866 小时前
Agent 的搜索引擎:Agentic Resource Discovery 规范,以及它解决不了的信任问题
搜索引擎·agent
苏灿烤鱼7 小时前
公司**不可计算,就自己做操作系统
rust·typescript·agent
程序猿DD7 小时前
OctaFuse Gateway 2.5.0:接入 Responses 端点、更易理解的路由配置
后端·agent
thesky1234568 小时前
27届大模型面试准备(三十二):RAG 进阶——从朴素 RAG 到 Agentic RAG 与多模态检索增强
大模型·rag·agentic rag·graph rag·进阶rag·self-rag·corrective rag
2601_956743688 小时前
工程方案拆解|上海 Agent 开发,技术路线、选型维度与落地能力全景解析
agent·开发经验·上海
武子康8 小时前
DeepSeek 把 Agent Core 也插件化了:Harness 的真正赌注
人工智能·llm·agent
canonical_entropy11 小时前
关于《Mission Driver:Loop Engineering 的一种通用参考实现》的补充说明
后端·agent·ai编程
冬奇Lab11 小时前
开源项目第187期:Pi — 哲学驱动的极简 AI Coding Agent,86k Stars,30+ LLM 提供商,无限扩展
人工智能·开源·agent