扯掉路由器的遮羞布,交接信息才是那条命脉
· 阅读约 2 分钟
先贴结构。
{
"reproduction_steps": [
"make test_repro",
"ASSERT core_dump == false"
],
"validated_in_sandbox": true,
"target_module": "src/skiplist.c"
}
这是一个 7B 搜索器探索完仓库后吐出来的交接信息。它的复现声明会被扔进沙盒里跑一遍,跑不通的直接砍掉。
arXiv 上一篇叫 Scrouting 的论文(2608.04804),搞了个 SuperScout 系统,核心就是这玩意儿。一个 7B 模型充当侦察兵,去扒拉代码仓库,生成结构化的交接报告。这报告喂给谁呢?四个昂贵的前沿修复器之一。
这论文最实诚的地方在于,他们自己把自己的核心卖点给干掉了。
SuperScout 号称有个牛逼的路由器,结合隐藏状态和任务文本做流量分配。在 266 个任务的 Python 子集上,它解决了 159 个,最强单一模型解决 158 个。而且单次解决成本只有最强模型的大约五分之一。
听起来路由器立大功了对吧?
扯淡。作者老老实实做了个消融实验:把路由器干掉,不管三七二十一,所有任务全扔给最便宜的那个修复器,只保留交接信息。结果呢?跟完整路由系统表现持平。
复杂度全在路由器那。删了。
真正起作用的,是那个 7B 搜索器吐出来的几百个字节的上下文。它提升了三个便宜修复器的能力,虽然稍微拖累了最强修复器,但这绝对是笔划算的买卖。这玩意儿每任务增加的 GPU 计算成本还不到 0.5 美分。
这恰恰是现在 vibe coding 最缺的环节。我看着 LLM 生成的代码,通篇都是看起来对的废话。模型默认给什么都覆盖的方案。比如前两天我让它写个跳表的范围删除:
/* 模型给的 */
int skiplist_delete_range(skiplist *sl, double min, double max,
void (*cb)(void*), struct locker *lock);
功能上没错。问题是我根本没要回调,也没要并发锁。
工程师的活是往回砍。往回砍的前提,是你得给模型喂干净的上下文。它在不知道仓库死活的情况下,只能保留所有可能性。
我后来让它先读一遍我手头那个玩具存储引擎的结构,再写。砍成了这样:
int skiplist_delete_range(skiplist *sl, double min, double max);
一个函数,三个参数。
别急着上架构。先让一个便宜的小模型把仓库的交接信息扒干净,喂给大模型。把上下文窗口里的噪音砍掉,比折腾什么花里胡哨的路由器管用得多。