它开始用英文念报错
直播间里传出来一句英文,音色是我训练的可不,内容却在念:
The `vts_get_expressions` function was called too frequently consecutively.
第一次我以为听错了。发第二条弹幕,念的是:
Current datetime is 2026-09-29 18:04, which is a Tuesday. How can I assist you t...
第三条:
The function `vts_get_expressions` has been called consecutively 5 times with th...
三条回复,全是这种东西。
先怀疑提示词
我的第一反应是提示词没写好——是不是没跟模型说清楚"你只输出台词"。翻出来看,那份提示词其实写得挺细:人设、说话风格、口头禅都写了,就是没有一条关于输出格式的约束。
我补了一段"输出铁律"进去:
- 只输出【要说给观众听的中文台词】,除此之外一个字都不要有
- 绝对禁止输出英文、函数名、代码、日期时间、系统提示、工具调用结果、内部报错
(像 "The function was called..."、"Current datetime is..." 这类内容一个字都不许出现)
特意把那两句原话都写进禁令里了。重启,发弹幕。
念出来的还是报错。
把三次文本摆一起
到这时候我才认真做了一件早就该做的事:把 TTS 日志里实际合成的文本全部捞出来,一条条并排看。
已生成直播自动回应 TTS: ... text= 后面跟着的就是要念的内容。三次的文本长度差不多,句式也像,最关键的——里面反复出现同一个函数名:vts_get_expressions。
vts_get_expressions 是插件注册给模型的一个工具,作用是把 VTS 里当前模型可用的表情列出来。我那个 Live2D 模型没有配表情文件,所以这工具每次调用都返回"没有可用表情"。
模型想做表情,调一次,拿到空结果,不死心,再调。连续调了 5 次之后,AstrBot 的工具有个连续调用保护,直接拦下来,返回一句:
The `vts_get_expressions` function was called too frequently consecutively.
这句拦截提示是发给模型的,模型把它当成"该说的话",转手输出了。 后面 TTS 照念。
所以问题根本不在提示词——提示词是写给"内容生成"的,而报错是混在模型的输入里的。模型分不清哪部分是"背景信息"、哪部分是"我要说的话"。3b 这种小模型尤其分不清,这正是它的典型弱点。
把惹事的工具收走
知道根因之后解法就直白了:让这个工具别被调用。
AstrBot 的停用列表存在 data_v4.db 的 preferences 表里:
scope='global' scope_id='global'
key='inactivated_llm_tools'
value='{"val": ["vts_get_expressions", "vts_set_expression", ...]}'
我把插件注册的 8 个 VTS 工具全禁了——表情、热键、移动模型、参数注入、模型信息,一个不剩。反正我这个模型没表情文件,它们全是无效调用。重启后验证:
本轮注册的 vts 工具数: 0
再发弹幕,念的是正常的台词了。
两次白改
改提示词那次我其实是拿"AI 味"的思路在解一个"上下文污染"的问题——模型不是不知道该说什么,是输入里混了东西。判断依据事后看很简单:连续三次念的内容都指向同一个来源,那就不是生成逻辑的问题,是那个来源本身在往上下文里灌垃圾。
现在再遇到"输出不对劲",我第一件事是去日志里翻实际进 TTS 的文本,而不是先改提示词。