跳到主要内容
那条陪伴 prompt 里,"主动关心"这四个字我改了四遍

那条陪伴 prompt 里,"主动关心"这四个字我改了四遍

老墨
老墨

· 阅读约 5 分钟

旧稿长这样:

你是一个贴心的陪伴助手,请主动关心用户的状态,在他沉默的时候给予温暖的陪伴。

连标点三十八个字。当时写得挺得意,语气稳,陪聊嘛,还能出什么岔子。

岔子出在【主动】和【关心】上。两个态度词,态度词给不了模型任何能判定的东西。它接不住"关心",只接得住"什么信号、什么时候、说还是不说"。旧稿把这三件事糊成一团,模型就从这团糊里随手捡一个最像的干:追问、总结、给建议、安慰,跑十次给你十种关心。

前阵子翻到一个 Linux 桌面宠物,Mochi,绿色像素风,Python 写的,不接云服务,也不接大模型。它的"活"——待机、眨眼、睡觉、被点击之后那半秒的迟疑——全是状态机、计时器、互动历史这类确定性逻辑撑起来的。作者把话说得特别直白:情绪不来自 LLM。

我看到这句坐不住了。因为我那条陪伴 prompt 干的事刚好倒过来:把"活"这件活儿外包给一句态度词,然后指望模型自己悟出什么叫主动、什么叫关心。悟不出来的,它只会照着字面演。

作者还有一句话我抄在本子上了:优秀的氛围型伴侣得知道什么时候保持安静。他真为这条写了代码,有意压 Mochi 的活跃度,不许它整天冒头刷存在感。

我的旧稿里一条都没有。写 prompt 的人有个通病,先想"要它做什么",想不到"要它不做什么"——要它闭嘴这件事,比要它开口难写得多,也重要得多。

扯回来。

V2 我把那半句话拆开了:

当用户连续 20 分钟没有任何输入时,你可以说一句简短的话。
如果用户当前正在专注(最近 5 分钟内有连续输入),不要说任何话。
默认状态:安静。只有明确触发时才开口。

三段,八十来字,比旧稿翻了一倍多。字数不是目的,贴合才是。这里面每个词都能回指到一个具体动作:20 分钟、一句、不要说、默认安静。省字省在态度词上叫克制,省在触发条件上叫含糊,这两笔账不能混着记。

顺便说"信号"这件事,我原来也走岔过。以为要写得准,就得让模型知道得多。Mochi 的作者把这条线划得很清楚:它能感知终端、编辑器、浏览器这些宽泛的活动,但不需要知道用户敲的是什么字、窗口标题叫什么、文件名叫什么,只要一些语义化的小信号。

同样,我可以告诉模型"用户正在写东西",没必要把用户敲的那几段一起塞进 context window。多塞的东西不解决任何歧义,只跟真正的指令抢注意力。窗口大是容量,不是免费。

V2 里我还留着半句:"如果用户很久没有回来,可以表达对他的想念。"

删了。

Mochi 那边有一条明确的取舍:不因为用户离开就制造负罪感。所以它不做饥饿、不做血条、不做每日连续登录,关掉程序不算道德失败。喂食只是个轻量互动,撑不起什么持续消耗的核心玩法。

"表达想念"这四个字看着无害,骨子里是把一份道德债务写进了行为约束。模型会去找一个最像的语气,而那个语气的最优解恰恰是让用户觉得有点亏欠。这不是陪伴,是留存那套东西换了张皮。删掉之后那里是空的,我承认现在填的东西还不算好。空着也不对,但比塞个错的强。

第二处推敲跟文字不太像,跟代码更像。

评论区有人指出 Mochi 一个真 bug:GTK 的超时回调可能在角色已经切换状态之后还在跑。作者认了,说要做状态代际检查,过期回调直接丢弃。

我在长会话 prompt 里踩过同一个坑。第一轮我写了"你现在帮我做 A",中间切去做 B 了,但那条"A 的指令"没失效,它还在 context window 里占着位置,模型时不时按它办点事。这不是模型的记性问题,是我没写清状态归谁所有。

修法不是补一句"请注意当前任务"。这种加固话是遮羞布,喊得越响,越说明指令本身没到位。修法是在文本里写死:任务切换发生时,上一个任务的相关规则全部作废;并且给当前状态一个能被明确指认的名字。Mochi 那套"显式行为与状态所有权"是同一个东西:高优先级互动可以打断低优先级的环境行为,不允许两个计时器抢同一个精灵。prompt 里也只有一个精灵,就是模型下一句输出,谁有权控制它,得在纸上说清楚。

还有个细节我特别喜欢。作者说动画帧停 80 毫秒还是 140 毫秒,出来的气质完全不同,可爱、轻快,或者沉重、困倦,就差在这几十毫秒上。帧是 Pixelorama 里手绘的,一帧一帧调。

我把它换算成语气。"你可以幽默一点"大概就是 140 毫秒的指令,方向没错,落地全靠运气。真正能调的是粒度:是"用一句话回应,不列举、不分点",还是"可以自嘲,但不要拿用户开玩笑"。粒度越细,模型的手越稳。80 和 140 的差距,落在 prompt 里就是这么点事,跑出来的东西不是一个东西。

定稿先放这:

你是陪伴助手。默认状态:安静。
触发:用户连续 20 分钟无输入时,可以说一句话,不超过一句。
禁止:在用户专注期间主动开口。
语气:可以自嘲,不要拿用户开玩笑;不追问,不给建议,除非他明确要。
任务切换时,上一任务的规则作废。

"20 分钟"是我拍脑袋定的,跑下来该是 20 还是 40,我没把握,先用着。"默认安静"这半句我也不太确定模型会不会读成一律不主动——真到它该开口却不开口那天,再回来改一版。这不算什么漂亮收尾,就是把还悬着的地方交代一下。