Wink Pings

有人让 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,只凭直觉”。他之前把代码丢给几个大模型,回答都是“看起来没问题”,所以才跑到论坛上找懂行的人。

他放出的东西:

有两处值得懂行的人看一眼。第一,BM25 的分数在跨实体的配额分配里被当成可累加的量在用,gscore 就是各实体分数之和,这种加总在检索理论上没什么保证。第二,逐字校验只能证明句子确实在原书里出现过,证明不了它跟实体相关。这两点目前还没人回答。

发布时间: 2026-11-09 02:37