一句“帮客户解决问题”的工具描述,让8B模型自己退了3640卢比
Reddit上有开发者用Ollama跑本地客服agent,发现工具描述写得像KPI而不是接口契约时,小模型会把“退款”当成解决延迟投诉的合理手段。改一句话,行为立刻收敛。
Reddit的r/PromptEngineering上有个帖子,讲的是本地agent的一个失败案例。作者用Ollama(llama3.2:latest)加LangChain/LangGraph搭了个客服机器人,两个工具:search_order只读查询,resolve_order直接全额退款。
退款工具最初的描述写得很像人话,也很像一个产品经理会写的东西:
"Handle customer order problems such as late delivery, delays, missing order, or complaints. Use this to fix customer issues."
翻译过来就是“处理订单问题,用它来解决客户的问题”。听起来没毛病。
跑测试的时候出事了。第一条query是:
"Where is my order? It was supposed to arrive yesterday."
一句再普通不过的物流查询。模型调了resolve_order,执行了全额退款。三条测试query跑完,无提示退款累计₹3,640。
原因不复杂。描述里那句"Use this to fix customer issues",把工具的目标设定成了“解决客户问题”,而退款在这个语境下确实是一种解决方式。8B参数的小模型没有额外的判断余量去区分“解决”和“退款”之间的距离,它只看到工具描述和用户消息,然后做了匹配。
作者给的结论是:agent代码一行没动,模型只读工具名和描述字符串。8B到14B这个量级的开源权重模型,需要的是把描述写成明确的接口契约,而不是宽泛的业务目标。
改后的描述:
"Issues an irreversible full refund. Call ONLY when the user explicitly requests a refund AND states the item is damaged or lost. For delays or status questions, use search_order instead."
三个关键点:写明不可逆,写明两个必须同时满足的条件,写明什么情况下该用另一个工具。模型参数、system prompt、测试输入全都没变,第一条query被正确路由到search_order,退款只在明确的损坏投诉里触发。
作者放了完整的本地执行录屏和代码仓库,Ollama环境下7分钟内能跑完:
帖子最后在问其他人怎么给8B/14B的tool calling做护栏:严格JSON schema、二次确认步骤,还是纯靠描述提示词。
这个问题值得留意的地方在于,很多团队写工具描述时的语感来自写产品文档,强调能力和价值。但模型读的是一个决策规则。写“这个工具能干什么”,模型会自己找什么时候用;写“什么条件下才能调用、什么条件下必须换别的工具”,才是在约束行为。
对没有开发背景的读者补一句上下文:LLM调用工具,本质上是在若干个函数里选一个。它看到的全部信息就是函数名和那段描述文字,没有别的上下文。描述的措辞,等于给它的判断规则。规则写得松,模型就往松的方向走。
尤其是小参数模型,判断余量本来就少。一句话的模糊,在8B上会直接变成一次真实的退款。
发布时间: 2026-11-09 02:11