结论先说:多数“结果变了”不是工具本身在随机变化,而是输入文本、分词粒度、词典版本、查询时刻这四个条件里至少有一个没被固定。把每次查询都写成一份可复现的条件记录,让所有角色对同一份文本、同一组参数、同一时间点核对,分歧才能从“谁记得对”变成“哪一项条件不同”。这套做法在词典或模型更新后就会失效,届时必须重新建立基线。
多个角色说“查的是同一个东西”时,往往各指一层。第一层是原始文本,比如一段产品描述;第二层是预处理后的可查询文本,比如去掉标点、统一全半角之后的字符串;第三层是查询参数,包括分词粒度、是否保留停用词、是否启用自定义词典。三层中任意一层不同,输出就会不同。
核对时不要口头描述,直接落成字段:原始文本的完整内容、预处理规则、粒度选项、词典标识、查询时间。谁改动了哪一层,就在记录里标明改动人和改动原因。这样下一次结果再变,能立刻定位到是文本被编辑、参数被切换,还是词典发生了更新。
一个可执行的动作是:为同一对象建立一份“冻结查询单”,把原始文本和参数一次性写死,之后所有查询都从这份单子复制,而不是各自重新输入。冻结之后,第一次查询结果就作为基线保存。
这个动作的结果直接影响下一步:如果冻结后多次查询结果一致,说明此前的波动来自操作差异,团队可以直接沿用这份条件单;如果冻结后结果仍然变化,才需要把怀疑方向转向词典或模型版本、服务端更新,此时再去找工具方核对版本信息才有意义。顺序反了,就会在参数没统一的情况下反复追问工具,浪费沟通成本。
假设某团队已经把文本和参数全部冻结,连续一周查询结果稳定。第二周工具方更新了词典或分词模型,同一份冻结查询单的输出就可能变化。此时“条件固定”并不保证“结果永久不变”,它只保证在词典版本不变的前提下可复现。
所以冻结查询单里必须留一栏词典或版本标识,并在每次查询时记录。一旦发现版本号变化,正确做法不是继续对比新旧结果,而是把版本变化前后的结果分别归档,作为两套基线。把两套基线混在一起比较,会得出“工具不稳定”的错误结论。
不需要复杂系统,一份字段固定的记录就能承担核对功能:
当两个角色结果不一致时,逐字段比对,第一个出现差异的字段就是分歧根源。这比争论“我查过没问题”要快得多。
如果查询本身依赖实时数据或在线服务状态,比如结果会随服务端缓存或临时故障变化,那么冻结条件只能减少变量,不能完全消除波动。此时应把“服务状态”也作为一个记录字段,并在结果异常时先确认服务是否正常,再判断是条件问题还是服务问题。请求量或结果条数归零,不能单独证明是条件设置正确还是服务中断,需要结合服务状态一起看。
下一步动作很明确:先为当前这个对象建一份冻结查询单,跑两次并记录全部字段。如果两次一致,把这份单子作为团队基线分发;如果不一致,优先核对词典或版本标识,再决定是否联系工具方。