跳到主要内容

为"低、高、最大"这三个字,推敲了一下午

老墨
老墨

· 阅读约 4 分钟

旧稿是这样写的:

请仔细分析这份日志,选择推理深度:低/高/最大。

十六个字。看着没什么问题。"分析日志"是个明确动作,"低/高/最大"是个明确选择。但模型跑出来的结果,三档的边界是糊的——低档输出的东西和高档几乎没区别,全都往"努力分析"上靠。

问题出在【请仔细分析】这五个字上。"仔细"是态度词,不是指令。模型不会因为被夸就多长一个心眼,也不会因为"仔细"二字就把边界情况都列一遍。它只会往"认真"这个方向上使劲,而"认真"在两档之间的区分度约等于零。

V1 我想着给三档配上具体的行为描述。低档对应"只报结论",高对应"列出所有边界情况后再给结论",最大对应"额外给出每条边界情况的处理建议"。写出来长这样:

分析这份日志。推理深度:低(只给出结论);高(列出所有边界情况后再给结论);最大(列出边界情况并给出每条的处理建议)。

四十八个字。问题是清楚了,但像是把说明书塞进了 system prompt。模型读懂了,可整条 prompt 的重心被扯到"那个长长的括号说明"上去了——用户真正关心的"哪一行是根因"反而被挤到后面。

V2 砍掉括号,把档位和指令揉到一起:

分析这份日志。不要展开,只报结论。

这样低档是有了,但高档和最大档去哪了?我又不能让用户手动改 system prompt 来切换档位——那等于没做。

V3 才想明白一件事:问题不在档位字本身,在"推理深度"这个词和模型预期之间的落差。模型没见过"推理深度"这个抽象名词,它见过的更多是"think step by step"这种具体动作。抽象名词对模型来说就是一个待猜测的变量,猜对了算运气好。

所以我把档位名整个换掉。低、高、最大,改成"快、细、穷尽"。

分析这份日志。回答模式:快(三句话内给结论);细(把边界情况列完再给结论);穷尽(列出边界情况,并标注哪些没有数据支撑)。

"快"是速度预期,"细"是覆盖预期,"穷尽"是极限预期。三个字全是动词性的形容词,不需要模型去额外解码"推理深度"这个抽象层次。

为什么"穷尽"而不是"最大"?"最大"是程度词,模型不知道最大到什么程度为止;"穷尽"是动作,暗示着"把所有可能的边界情况都找出来",还把"没有数据支撑的判断"也捎带上了。这一个字的替换,把"尽量"变成了"到底"。

这时候想到缓存。Telnyx 给 Kimi K3 默认开了前缀缓存,缓存输入一百万 token 只要 0.27 美元,正常输入是 2.70 美元——十倍价差。一条 system prompt 改得再长,只要长在前缀里,反复请求的边际成本几乎可忽略。但这不是让"长"免责,是你长出来的每个字都得有明确的活儿要干。"细"和"穷尽"是两个字,各自扛了一档行为差异,值这个位置。上一版那个括号里"如果有多个边界情况请全部列出"这种话,才是真的冗字。

扯一句题外话。"推敲"这个词本身,据说是有人为诗句里用"推"还是"敲"在驴背上想了半天,撞进了别人仪仗队。为一个字纠结到不看路,放在 prompt 上一点没变——模型对"穷尽"和"最大"的语义感知差距,在 token 空间里可能就隔了一个向量维度,但输出差得远了。

说到"最大"又想起一个岔子。V3 改完后我顺手试了把档位名换成全英文的 "fast, thorough, exhaustive",因为指令风格更贴英文语料。结果模型倒是接得很顺——这也印证了刚才的判断:它认知的不是档位的名分,是档位字背后那个具体行为的轮廓。中英文都行,说明这个方向是对的。

最后定稿:

分析这份日志。回答模式:快(三句话内给结论);细(把边界情况列完再给结论);穷尽(列出边界情况,并标注哪些没有数据支撑)。

从最初十六个字改成四十多个字,变长了,但这次每多出来的字都有它要干的活。"请仔细"没了,换成三个具体档位的行为描述;"深度"没了,换成"回答模式"这个模型更容易接住的词;"最大"没了,换成"穷尽"这个把行为逼到极限的动词。

不敢说这就是终版。"穷尽"这两个字,我拿不准它是不是在所有场景下都贴合,万一模型把它理解成"把所有字都写完"就麻烦了。先这么用着,哪天它理解岔了,再改一版,不丢人。