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

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

相关推荐
一叶飘零_sweeeet14 小时前
AI Agent 深潜:六大核心模块的设计本质与 Java 实现
java·人工智能·agent
山顶夕景14 小时前
【Agent】Claude code架构和源码粗读分析
大模型·llm·agent·线程·通信协议
Luhui Dev15 小时前
高频使用 GPT-5.5 两天后的总结
ai·agent·luhuidev
大飞码农17 小时前
闲置旧手机千万别扔!一键打造零成本 7×24 小时在线 AI 助手
agent·ai编程
阿荻在肝了19 小时前
Agent学习七:LangGraph学习-持久化与记忆二
python·学习·agent
人工智能培训19 小时前
大模型部署资源不足?轻量化部署解决方案
人工智能·机器学习·prompt·agent·智能体
薛定谔的猫36919 小时前
深度解析 AI Agent 的未来:MCP 协议如何重塑大模型生态
ai·llm·agent·技术趋势·mcp
guslegend20 小时前
第17节:模型忽略关键实体怎么办?注意力权重分配机制引导生成拒绝重点
人工智能·大模型·rag
Thanks_ks20 小时前
从辅助编码到架构重塑:基于 LLM 的智能开发工作流落地实战
自动化测试·大模型·llm·研发效能·模型微调·rag·提示词工程
wuxinyan12320 小时前
Java面试题53:一文深入了解RAG(检索增强生成)核心概念
java·人工智能·机器学习·面试·rag