旧稿我拟的是这样:
你是一个懂理财的助手,根据用户的银行流水,判断他这个月能不能撑到发工资,并给出每天最多能花多少钱。
一句话塞两件活:判断,加建议。这种句子模型必定自己算,它没有别的地方可去。【懂理财】是标签,标签只调语气,不调行为。
V2 我加否定:
……不要自己计算,不要编造数字,所有数字必须来自工具返回的结果。
没用。它绕开“计算”这个词,改口叫“根据经验估算”,换个说法照样给你编一个每日额度。否定式约束的通病就在这:只说别做什么,不说该做什么,它只好自己找条路走,你堵的那条它绕着过。何况这是个 1B 的模型,三位数减法都靠猜,让它“基于流水判断”,本来就是请它编。
这里岔一句。“不许”类的禁令有个反作用:你越点明某样东西不准碰,越等于告诉它那样东西在场、而且重要。第二版我以为是话说得不够狠,其实是我把数字又提了一遍。
扯回来。V3 换方向:把数字从它视野里拿走。
你在一个离线预算工具里负责写一句话。
你会收到一行已经算好的结论,例如“本月撑到发薪日的概率是 85%”。
你只能针对这行结论写一句不超过二十字的反应。
你看不到流水、余额和每日额度,也不要向用户索要。
如果那行结论是空的,你什么都不写。
诗眼在【只能】和【看不到】。写“不要使用这些数字”是请求,写“你看不到”是描述环境。请求可以权衡,环境没得商量——一个是跟它商量,一个是给它换了个房间,房间里根本没那些材料,它想编也没东西可编。这条改到第三版才算站住。
代码里做得比我写得还绝:数值那层整个甩给 TabPFN,每日分位、五百条未来路径、异常概率、交易归类,全在那边跑完,Gemma 只接一行结论,既不许看见也不许产出数字。
这条里我破了一次自己的规矩。【语气像朋友】是态度词,平时见一个删一个。留着,因为它在这句话里唯一的活就是语域——删掉,模型给你一句公文体,这行字就白写了。删客套字是为了不占位置,不是因为它有态度。规矩得看这个字在这条 prompt 里干不干活。
反方向上的那个选择更有意思。分类那一步,作者是先给 LLM 派活,再撤回来的。
五百六十九行模拟流水,规则匹配归位八成,剩一百一十四行没处放。加上 Gemma,整体到 82.3%。两个多百分点,听着像涨了。拆开看:那一百一十四行里 Gemma 只对了十三行。
平均数专门用来藏这种细节。82.3 和 80.0 的差全落在没归位的那一小撮上,凑出一个勉强比乱猜强一点的成绩。为它要多背一个模型、多一条降级路径。撤了,人对人那类支付直接丢给用户自己勾一个名单。
有些活不该靠措辞救。想让它分清“转给同学”和“买菜”,改 prompt 是白费劲——不是句子没说清,是这件事本身不该交给它。这条界线比任何一条 system prompt 都值钱。顺带说,容量也是钉死的:TabPFN 那版分类器支持 10 类,这个学生一个月能花出 14 类,最后压成 9 类加一个【其他】。这不是措辞问题,再怎么写也变不出第十一个格子来。
回到那句反应。
默认挂 1B,检测到有 5GB 空闲内存才换 4B,不够就那句反应不出现——勾选框还在原地,只是后面没有 AI 写的那行了。
这等于在代码层面承认:那句话是可选的,功能不依赖它。我看过的离线工具,多数把模型摆在正中间,一降级就残废。这里一降级就等于闭嘴,反而是最体面的降级方式。
而且它掉的东西确实不多。整轮预测四十多秒,大头是拟合和五百条路径;那句反应按每秒二十二个 token 的速度生成,连时间预算的零头都算不上。砍掉它,损失的不是性能,是一句人情味。
判据就清楚了:给 LLM 派活之前先问一句,砍掉它掉的是什么。掉的是数字,别派;掉的是一句人话,可以派,但只给它留一条很窄的缝,别开门。
定稿放这:
你在一个离线预算工具里只负责一句话。
输入是一行已经算好的结论,例如“本月撑
