有人让 Claude 写了个 BM25 提取器,现在他想知道这东西靠不靠谱
一份跑得挺顺的 BM25 抽句脚本,一堆看着合理的输出文件,加上几个大模型的一致点头。发帖人要的其实是一次技术上的真验证。
有位网友在 r/PromptEngineering 发帖,标题写得很直白:BM25 extractor (need technical validation)。他让 Claude 生成了一段 BM25 脚本,从索引里抽出跟实体最相关的句子。脚本跑完了,产出的文件看着也像模像样,句子确实是从 Sprawn 三部曲里抠出来的。他没法确认的是,这段代码是不是真的在做 BM25。
先交代背景。他要填一张 22 列的表,前 10 列放实体的配置项,剩下 12 列放从书里抽出的片段,当激活短语用。用他的说法,这是在表格里凑一个语义图谱。这部分他自己也说,是题外话。
真正想被检验的是脚本。按 DeepSeek 给出的拆解:
脚本把语料切成句子栈,把每句当成倒排索引里的一篇“文档”。对每个输入文件,它按 chars/100 估算要抽多少句,下限 50,上限是总句数的 20%。然后遍历主题索引里的实体(按文件识别出的书过滤),给每个实体拼一个查询,在文件加书的范围内跑 BM25,取分数最高的句子,每实体上限是 N_SENTENCES / n_entities。如果配额没用完,剩下的按聚合分数补齐。最后按 offset 排序、做逐字校验,为每个输入存一个 phrases_file_N.txt,内容是 [ref | sent_id | offset | book] 加正文。
这段描述很完整,但它只说清了代码做了什么,没说代码做对没有。作者自己也察觉到了味道不对:脚本两分钟就跑完,“快得像是没在生成 token,只凭直觉”。他之前把代码丢给几个大模型,回答都是“看起来没问题”,所以才跑到论坛上找懂行的人。
他放出的东西:
- 从三部曲里抠出来的人物表,他自己写的一个 bash 变通方案:https://github.com/pmotadeee/pmotadeee/tree/V2.0/ITEMS/Books/Sprawn/Raw/Context
- Claude 生成的算法:https://github.com/pmotadeee/pmotadeee/blob/V2.0/ITEMS/Books/Sprawn/Raw/Claude/bm25_extractor.py
- 跑完之后生成的文件,对话开头能看到它走过的步骤:https://github.com/pmotadeee/pmotadeee/tree/V2.0/ITEMS/Books/Sprawn/Raw/Claude
- Claude 对话记录,他的母语,建议开浏览器翻译:https://claude.ai/share/1799075d-bc93-4e12-99e0-771a7e259ca9
有两处值得懂行的人看一眼。第一,BM25 的分数在跨实体的配额分配里被当成可累加的量在用,gscore 就是各实体分数之和,这种加总在检索理论上没什么保证。第二,逐字校验只能证明句子确实在原书里出现过,证明不了它跟实体相关。这两点目前还没人回答。
发布时间: 2026-11-09 02:37