产品检索的第一项任务不是找到“最像的一段话”,而是保留不能改动的型号和条件。本文的AX系列均为合成教学产品,不对应智核增长客户。实验用于解释工程选择,不还原任何商业AI平台的排序系统。
从倒排索引到BM25
倒排索引记录一个词出现在哪些文档中。查询中的词成为候选入口,BM25再综合词在文档中的频率、在语料中的稀有程度和文档长度。高频词重复很多次不会一直线性加分;长文也不应仅凭字多占优。相关数学背景可查Stanford信息检索教材。
理解参数之前,应先检查索引看到的是什么。页面写着完整型号,不代表分词器将其当作完整标识符;默认分词可能把连字符拆开。将AX-220写进标题可以改善可辨识性,但不是强制结果只返回这个型号。产品库还需要一个保存原始字符串的型号字段。
一组容易误判的产品记录
| 文档 | 型号 | 关键事实 | 不能推出的结论 |
|---|---|---|---|
| D1 | AX-220 | 220 V电源、20 L水箱、室内密封硬地面 | 不能推出兼容110 V |
| D2 | AX-110 | 110 V电源、20 L水箱 | 不能因系列相同替代D1 |
| D3 | AX-220B | 24 V电池、充电器输入220 V | 充电器电压不是电机电压 |
| D9 | AX-220-manual | AX-220说明书附录,换插头不改变电压 | 不等于另一个产品型号 |
D9说明了一个细节:严格按产品主表筛选可以保留身份,但如果把说明书当作独立型号,反而会排除有用证据。生产系统应建立“说明书属于哪个产品”的关系,而不是让文件名充当产品ID。示例程序没有自动推断这种关系,读者应把它当作扩展练习。
用SQLite建立可检查的词法基线
下载实验包)、合成语料与答案键和完整程序。程序调用SQLite FTS5,查询词采用OR组合,型号字段权重为4,正文权重为1。这些是教学配置,不是最优参数,也不是官网关键词密度要求。
CREATE VIRTUAL TABLE products USING fts5(id UNINDEXED, model, body);
SELECT id FROM products
WHERE products MATCH '"AX" OR "220"'
ORDER BY bm25(products, 0, 4, 1), id;
SQLite的BM25函数采用越小越好的排序约定,不能将其值直接解释为概率。FTS5官方文档给出了具体实现。本文程序对数据库使用参数绑定;不要把任意客户输入直接拼成SQL或FTS查询表达式。
手算词频饱和,而不是把重复型号当作诀窍
BM25中的一个词频因子可写成下面的形式,完整得分还包含逆文档频率等项。SQLite对返回分数采用越小越靠前的符号约定,因此不能直接把其他系统的正分值与它相加。
tf_factor = f * (k1 + 1) / (f + k1 * (1 - b + b * dl / avgdl))
f = 2, k1 = 1.2, dl = avgdl -> 4.4 / 3.2 = 1.375
f = 4, same lengths -> 8.8 / 5.2 = 1.6923
词频从2变成4,因子并没有翻倍;这说明饱和机制,而不是建议在网页里重复型号。上面只是忽略IDF的单项教学演算,不是本包某道查询的最终分数。正式分数还依赖整份语料的统计、分词和字段权重。改变文档集合后,分数发生变化并不必然说明页面质量变了,应先核对索引版本。
先用完整问题保存一个结果列表,再只输入型号作对照。若型号检索都失败,应查看分词、大小写、别名和索引字段;若型号正确、适配结论错误,应检查证据和约束,不能继续靠加关键词解决。
lexical_rank(documents, 'AX-220', exact_model=True)会把型号完全相等的记录放在前面。这是程序中显式加入的业务规则,不是BM25自己“理解”了产品。它也不保证该记录回答了保修、价格或认证问题。Q10询问保修和价格,而语料没有这些事实,即使D1排第一也应回答证据不足。
结果怎样复核而不是只挑成功案例
实际运行记录保存每个问题的完整排名、分组、前3位指标和耗时。答案键中D1与D9都能支持Q2的电压限制;只看到D1不等于证据检索已经完整。Q10没有相关答案,指标记为空值,不把它算成满分,也不从问题清单中消失。
本例只有9条英文记录和10个查询,包含一个中文压力测试。词法耗时包含临时建索引,不能与只计查询编码的向量耗时直接比较速度。要评估真实产品库,应固定训练与评测分组、补充多种型号格式,并单独核查未知问题的拒答行为。
实测反例:字段里有型号,为什么仍排错
本次Q1问“AX-220 supply voltage”,词法前3项是D9、D3、D2,D1没有进入前3。这里采用了OR连接的宽召回:出现AX、220、supply或voltage都可能进入候选。D3与D2有重叠词,型号字段加权也没有等价于产品身份约束。这个结果不是SQLite坏了,而是实验配置回答了“哪些文档含查询词”,尚未回答“哪些资料确实属于这个产品”。
对照Q5“BR-6204 bore diameter”,词法先返回D7,向量先返回D8。两个问题共同说明不能只选择一个成功例子宣布某种检索永远更好。改进时可依次比较:原始OR检索、型号精确过滤、说明书归属扩展、型号不确定时的澄清;一次只改一项,保存被过滤掉的证据。
如果读者将本例扩成真实目录,首先应增加一组未参与参数选择的型号难例,再确定字段权重。不要看到Q1失败后专门给AX-220硬编码加分,再拿同一道题证明系统提升。对于包含汉字的Q9,本程序的词法查询只提取ASCII字母和数字,属于明确的简化;它不能代表具备中文分词的生产检索系统。
官网编辑的对应动作是补齐型号归属、参数对象和说明书入口,而非把AX-220重复十遍。页面质量与内部索引配置应在报告中分开,防止把一次工程调参解释为外部搜索平台排名变化。
智核增长如何把检索问题落实到官网
对中国B2B出海企业,智核增长的工作落点是让型号、版本、单位、适用条件与说明书入口在公开网页上对应一致。检索实验帮助定位“缺信息”还是“信息不易区分”,不表示智核能调整Google、ChatGPT或Bing的内部权重。