用本地决策模型做记忆搜索重排序:9B 模型可替代 27B 通用模型
Local decision model as memory search reranker
在 ConditionalQA 的 800 个问题上,9B 决策模型 nimble 单次调用取得 recall@5 0.94,与已上线的 27B 通用模型(qwen3.8)持平,速度约快三倍,重排序算力省约三分之二。
§ 研究 · 重排序 · ConditionalQA
2026-10-12 · 作者 Dennis Gubsky · 研究笔记 · 约 6 分钟阅读
如果你用过搜索引擎,你就知道结果的顺序很重要。如果你需要的东西排在第三位,你会往下滚动。如果它排在第十三位,你可能永远都看不到它。
许多现代搜索系统的背后是一个两步流程。第一步快速而粗略:它抓取一个可能回答问题的候选段落池,大约 20 个。第二步更慢也更聪明:它重新排列这 20 个,把最好的放在最前面。第二步叫做重排序器。它通常是整个流程中最昂贵的部分。
我们必须找到答案的问题是:我们能否在不损失质量的情况下让重排序器更便宜?
我们尝试了什么
我们在一个名为 ConditionalQA 的公开基准上测试了五种重排序搜索结果的方法。对于 800 个问题中的每一个,我们从搜索索引中抓取 20 个候选段落,并让五种方法之一对它们重新排序。本测试中的每个模型都通过 Ollama 在本地运行。这些数字中没有任何东西调用云 API。整个流程在我们自己的硬件上运行。
- 完全不重排序。直接采用搜索索引给出的候选池。这是下限。
- 我们目前上线的方法。一个通用语言模型(270 亿参数,名为
qwen3.8),它一起读取全部 20 个候选,并以散文形式写出新的顺序。 - 一个决策模型,每个问题一次调用。一个更小的模型(90 亿参数,名为
nimble)回答一道选择题:“这 20 个段落中哪一个最能回答这个问题?”它选出一个,并返回全部 20 个的概率。 - 同一个决策模型,每个问题 20 次调用。这次每个候选一次调用:“这个段落能回答这个问题吗?是或否。”然后按“是”的概率排序。
- 一个更小的决策模型。一个 40 亿参数的模型(
tev1)做同样的逐个处理。
决策模型背后的理念是它不写散文。它用一个固定集合上的概率来回答一个类型化的问题。它不会忘记回答。它不会编造输入中不存在的段落编号。它不会在答案周围加上评论。输出是一个数字向量,仅此而已。
我们得到了什么
我们测量了几件事。对搜索结果读者来说最重要的两件事是“我们是否把一个好答案放进了前 5 名?”(recall@5)和“我们是否把最好的答案放在了第一位?”(recall@1)。
以下是 800 个问题的汇总。
| 方法 | recall@1 | recall@5 | 每个问题耗时 |
|---|---|---|---|
| 不重排序 | 0.58 | 0.87 | 不适用 |
| 上线的 27B 模型(散文) | 0.81 | 0.94 | 约 4.4 秒 |
| 9B 决策模型,一次调用 | 0.78 | 0.94 | 约 1.5 秒 |
| 9B 决策模型,20 次调用 | 0.70 | 0.94 | 约 4.8 秒 |
| 4B 决策模型,20 次调用 | 0.62 | 0.88 | 约 4.7 秒 |
一次调用的 9B 模型(方法 3)在 recall@5 上追平了 27B 模型(方法 2)。两者都在约 94% 的情况下把一个好答案放进了前 5 名。在同一硬件上,9B 模型的速度大约快三倍。
每个问题 20 次调用的版本(方法 4)在 recall@5 上也追平了 27B 模型,但并没有更快,因为 20 次调用而不是一次,抵消了每次调用的速度优势。
4B 模型(方法 5)没有追平。它几乎只比完全不重排序好一点点。
所以标题是:一个没有文本输出、没有回复需要解析、没有幻觉出段落编号风险的决策模型,可以取代一个 27B 通用模型,并节省重排器约三分之二的计算量,而在正确答案是否位于前几个结果中这一点上没有可测量的损失。
较小模型失利之处
在 recall@1(即“把最佳答案放在第一位”的问题)上,9B 模型表现更差。78% 对 27B 的 81%。在 800 个问题上,这个差异是真实的。
为什么?当你问一个模型“这 20 个段落中哪一个最好?”并且它返回每个段落的概率时,这些概率构成一个 softmax。一个数值很大,其余都很小。该模型擅长从这些候选中选出一个赢家。但在赢家之下,那些小数值并不能很好地区分第二名和第三名。
相比之下,通用语言模型会将整个排序写成文本。在某种意义上,它是在把排序作为一个整体来思考。
对于一个会读取前三个或前五个结果并加以考虑的智能体来说,这种差异无关紧要。正确答案出现在这一小批结果中的比例相同。如果你的产品需要单个最佳结果并立即据此行动,那么较小的模型就是错误的选择。
决策模型无法检测弃答
我们还希望该模型能在 20 个候选中没有一个真正回答了问题时告诉我们。如果它们都没有回答,我们希望系统说“我不知道”,而不是返回一个糟糕的答案。该模型在每次选择时都会给出一个概率。我们以为这个数值可以作为信号:如果它太低,就弃答。
这没有奏效。我们直接测试了它。对于每个问题,我们构建了两个候选池:一个包含正确段落,一个不包含。我们检查了包含正确段落的候选池是否比不包含的候选池得分更高。确实如此,但只有 75% 的情况下如此。我们需要超过 85%。
原因是模型的置信度并未与现实校准。当它说自己有 97% 的把握时,实际上只有 42% 的时候是对的。当它说自己有 50% 到 90% 的把握时,正确率不到 15%。这些数值用于在候选之间排序是没问题的,但它们本身并没有意义。这个模型给出的 0.9 分并不意味着有 90% 的概率是正确的。
基准测试将每个问题的一个特定段落标记为“正确段落”,但有时候选池中的另一个段落也能回答。一些看起来像是过度自信的情况,其实是模型注意到了基准测试未标注的正确段落。真实数值可能好于 42%。但它仍然不足以用作门控。
目前,如果我们想要一个在没有任何内容匹配时弃答的系统,这些概率并不是信号。我们必须寻找另一个信号。
后续:两个更新的模型,同样的结论
在这次测试几天后,同一模型家族推出了两个更新的决策模型:clef(27B,多模态)和 clef-flash(9.1B)。我们在另一个基准测试(LoCoMo 记忆重排,300 个问题)上运行了一个较小的测试,看看它们中是否有任何一个能击败 nimble。
都没有。在 recall@5 上,nimble 得分为 0.750。clef 得分为 0.739,而延迟是前者的三倍多。clef-flash 得分为 0.711。更新、更大的模型在这里并没有更好。它们的校准不同(信心不足,而不是 nimble 的过度自信),但仍然不足以用作门控。
目前,nimble 是我们推荐用于重排序的模型。在一个包含 800 个问题的语料库上的结果并不能自动推广到所有语料库,但它们与我们在其他语料库上看到的结果一致。
这在实践中意味着什么
如果你正在构建一个对搜索结果进行重排序的系统,并且只有前几个结果重要,那么一个小型的类型化答案模型可以替代更大的通用模型,每次重排序大约节省三分之二的计算量,而正确答案是否在前五名中不会有可测量的损失。
如果你需要排在第一位的最佳答案,并且不能承受出错,那就保留更大的通用模型,或者将两者结合使用。
如果你想用这些模型的概率作为“我不知道,这个池子里没有任何东西能回答你的问题”的信号,那么它们目前的校准程度还不够好。底层的排序是好的;概率数值在绝对意义上没有意义。
来源:Hacker News · loomcycle.dev