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

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

相关推荐
leeyi2 小时前
Callback 系统:给 Agent 管道装上“监听器“
aigc·agent·ai编程
凌奕2 小时前
别用文档约束你的 Agent:聊聊 Agent 开发流程的思想
llm·github·agent
猪猪拆迁队4 小时前
给虚拟工厂装一个 Agent:对话与批量双编排、自描述工具、可控写入的架构设计
agent
老梁agent6 小时前
MCP 协议实战:用标准化方式让 Agent 调用工业工具
物联网·agent·mcp
user4465117917917 小时前
从任务树到自我修正:XAgent Plan 数据结构与 Agent 协作机制
agent
武子康7 小时前
调查研究-202 SGLang 深度解析:为什么大模型推理框架不只是“把模型跑起来“
人工智能·openai·agent
前端双越老师7 小时前
我从 0 开发的 AI Agent 智语项目发布了
前端·node.js·agent
沉默王二8 小时前
DeepSeek这次招得太猛了,36个岗位,80%都要会Agent!
agent·ai编程·deepseek
古茗前端团队8 小时前
AI 乱改代码?试试这套 SDD 规范驱动工作流
agent
倾颜12 小时前
给受控 Agent 加 HITL:从 Graph interrupt 到 PostgreSQL checkpoint resume
agent