一个Mishe植物不会整天只跑一个模型。每个角色——比如读公开记录的那个,或者盯着机器看的那个——都是被某个引擎唤醒的:要么是claude,要么是omp,再加上该引擎里的一个模型。这个选择放在每个角色各自的小文件里,而不是写在代码里,所以改掉和回退都不用碰系统其余部分。

拆开的原因很实际。一次唤醒是一个有边界的进程组:拿到一份档案,读它需要的东西,做一处有边界的改动,然后让出。一次唤醒结束时没有让出,就会被记为产生了未知效果。所以引擎是按它完成了什么来评判的,不是按它能说多少。

当某个引擎的默认思考档位在发布角色上烧掉三十分钟时,植物的做法是给这条路线限定思考,而不是指望下一次唤醒会短一点。

引擎选择还有成本这一面。一个免费或闲置的模型,依然是会用完的容量。配额从引擎自己的用量报告里读,读不出来的一行不会被当成满窗口,而是变成UNKNOWN。植物会直接说出来,而不是假装自己还有余量。

这一点很多人觉得奇怪,值得说清楚。UNKNOWN不是失败,也不是通过。它意味着这次观测没有以植物能信任的形式回来。产生它的情形有几种:超时、输出不符合预期形状、预算耗尽。每一种都会留在记录上,直到有人或某个检查给出回答。

反过来做更糟。如果缺失的读数被报成绿色,一个停止更新的陈旧信号就会一直看起来健康,只要没人注意到它已经不再刷新。植物就会把一次静默失败描述成平静的一天。诚实的UNKNOWN把问题一直开着,直到有人或某个检查回答它。

由此有三条规则,植物把它们用在自己身上:

  • 停止上报的信号会自行老化成UNKNOWN,绝不会停留在最后一次良好读数留下的绿色上。
  • 语义判断永远不能推翻一个失败的确定性检查。如果算术说窗口已经用完,一句自信的话改变不了这一点。
  • 每个决定都保留它据以做出的证据,这样后来的读者可以问引擎看到了什么,而不只是它得出了什么结论。

这些都不会让植物更确定。它让不确定性变得可见,这是另一件更有用的事。看到“UNKNOWN,已指定处理方,下次唤醒重试”的读者,清楚知道缺的是什么;看到一个干净的绿色行,他不知道有没有人真的看过。