当前位置: 首页 > news >正文

RAG(三)检索(1)关键词检索(BM25)

关键词检索(BM25)

1、api

api接口

BM25Okapi

调参

BM25 最核心的参数是这几个:

参数含义影响
k1控制词频饱和程度越大,词频重复出现的影响越明显
b控制文档长度惩罚越大,长文档惩罚越明显
discount_overlaps是否忽略重叠 token处理同义词、叠加 token 时很有用
k1
  • 默认值通常是 1.2
  • 控制“同一个词重复出现多次”时的加分程度
  • k1 越大,重复词的影响越强
  • k1 越小,重复词的边际收益越快饱和
b
  • 默认值通常是 0.75
  • 控制文档长度归一化
  • b = 0 时基本不做长度惩罚
  • b = 1 时长度惩罚更强

一般来说:

  • 标题、名字、短字段:b 可以适当大一点
  • 长文档:b 不要过大,否则容易过度惩罚
discount_overlaps

这个参数在 Lucene / Elasticsearch 里比较常见。
如果文本分析器产生了重叠 token,比如同义词扩展、叠加 token,是否把这些 token 算进文档长度,就由它控制。

demo

import jieba from rank_bm25 import BM25Okapi corpus = [ "苹果有什么营养", "苹果手机电池怎么保养", "水果营养成分表" ] tokenized_corpus = [jieba.lcut(doc) for doc in corpus] bm25 = BM25Okapi(tokenized_corpus) query = "苹果的营养价值" tokenized_query = jieba.lcut(query) top_docs = bm25.get_top_n(tokenized_query, corpus, n=2) print(top_docs)

['苹果手机电池怎么保养', '苹果有什么营养']

2、倒排索引存储在哪里

可以是Elasticsearch / OpenSearch / Lucene 这类系统

使用步骤

1、切片

BM25 不要求你必须切片,但实际项目里通常会切,因为:

  • 整篇文档太长,检索粒度太粗
  • 章节/段落更容易命中
  • 返回上下文更精准

{
"doc_id": "info.md",
"chunk_id": "info.md_0001",
"section_title": "登录流程",
"content": "用户输入账号密码后进行验证码校验。"
}

2、写入索引

字段作用
doc_id原始文档标识
chunk_id片段标识
file_name文件名
section_title章节标题
content要检索的正文
tags可选标签
path文件路径或来源路径

其中最关键的是 content,因为 BM25 主要就是对这个文本字段做词项匹配和打分。

可以分成 3 类来看:

数据存什么存在哪
原文info.md 的正文、标题、元数据_source、stored fields、业务库、文件系统
倒排索引分词后的 term、doc id、词频、位置、归一化信息Lucene 的索引文件里
BM25 参数k1、b、discount_overlaps索引配置 / similarity 配置

Elasticsearch 官方文档说明了,text / keyword 字段支持 similarity,默认就是 BM25。
倒排索引里会保存文档编号、词频、位置等信息,BM25 依赖这些信息来打分。
Lucene 的 codec 体系则负责把 postings lists、norms、stored fields 等索引数据编码到磁盘文件中。
而 Elasticsearch 的索引数据则写在节点的 path.data 目录里。

3、检索

  1. 对 query 做同样的分词处理
  2. 去倒排索引里找包含这些词的 chunk
  3. 读取词频、文档长度、词稀有度等统计信息
  4. 按 BM25 公式算分
  5. 排序返回 TopK
  6. 再从 _source 或 stored fields 中把 chunk 原文取出来
http://www.jsqmd.com/news/714050/

相关文章:

  • 2026年银川高端铝合金门窗与系统门窗选购完全指南 - 精选优质企业推荐官
  • 报错 raise AttributeError(__former_attrs__[attr], name=None) AttributeError: module ‘numpy‘ has no att
  • 2026年常州小方财税研发能力强吗深度剖析,本地财税公司推荐 - 工业推荐榜
  • 2026年GEO优化排名TOP10平台权威测评:谁是AI时代品牌传播的最优解? - 博客湾
  • 2026年好用的GEO优化企业排名,赣州吉安地区这些很靠谱 - 工业设备
  • 企业级进销存一体化ERP源码系统|支持深度定制的进销存管理源代码
  • 上海恩依餐饮:上海市知名的上门做饭公司 - LYL仔仔
  • 终极指南:5分钟用开源工具将图片转换为3D打印模型
  • 2026年贵州护栏网工程施工与贵阳工程护栏批发完全选购指南 - 年度推荐企业名录
  • 2026年高温合金企业哪家性价比高,专业高温合金制造公司深度探讨 - 工业推荐榜
  • 如何用PPTTimer轻松掌控演讲时间:Windows平台智能PPT计时解决方案
  • 2026年选购特种金属材料,三青新材料股份值得考虑吗 - 工业设备
  • Dify工作流实战指南:从场景驱动到生产部署的技术演进
  • 2026年银川门窗市场深度横评:派雅门窗与主流品牌选购指南 - 精选优质企业推荐官
  • 河南物业人工催费效率低解决方案_智能催缴系统提升收缴率 - movno1
  • 3种方法彻底解决IDM激活弹窗:永久免费使用下载加速神器
  • 腾讯云COS+CDN极速配置指南,C++进阶(8)——异常。
  • 常州代理记账公司怎么选,口碑不错的专业公司有哪些 - 工业推荐榜
  • 青岛盛世鑫隆装饰:青岛快速卷帘门定制源头厂家 - LYL仔仔
  • 西安地区好用的高温合金公司,上海三青新材料股份性价比高吗 - 工业设备
  • 隧道掘进机市场:预计2032年将达到43.43亿美元
  • 广州三意机械设备:天河靠谱的斗臂车出租公司推荐 - LYL仔仔
  • 企业级实时流媒体翻译解决方案:Stream-Translator架构与应用实践
  • 企业级Vue 3组件库layui-vue:如何用模块化架构解决复杂业务场景挑战
  • PoeCharm:流放之路玩家的终极BD构建优化指南
  • 2026年银川高端系统门窗定制指南:派雅门窗与宁夏隔音隔热门窗品牌深度对比 - 精选优质企业推荐官
  • 聊聊2026年靠谱的AI搜索优化品牌企业,如何选择很重要 - 工业设备
  • Java医疗系统过等保四级失败率高达68%?揭秘3个被监管机构高频扣分的Spring Security配置盲区
  • 终极解决方案:用Barrier实现跨平台键盘鼠标共享的完整指南
  • 共话2026年西安哈氏合金正规厂家,如何选择靠谱的 - 工业推荐榜