我的咖啡智能体为什么这么轴:一份真实 Skill 的规则拆解,和三个可以直接抄的提示词

举报
阿诺林 发表于 2026/11/12 11:39:20 2026/11/12
【摘要】 引语:它拒绝外送、拒绝自动选店、下单前非要再算一次价格。我原本嫌它啰嗦,直到读了一遍那份 Skill 的规则源——每个「轴」背后都有翻车现场。拆开来,是三个可以直接抄的提示词,和一套规则分层。 1. 起点:一个「轴」得出奇的智能体我本机装了个点咖啡的智能体技能,对接瑞幸 MCP 服务,能查门店、搜商品、下单、出支付码。用下来第一感受是轴:让它顺便挑个最近的店,它不干,非把周边门店列出来让我选...

引语:它拒绝外送、拒绝自动选店、下单前非要再算一次价格。我原本嫌它啰嗦,直到读了一遍那份 Skill 的规则源——每个「轴」背后都有翻车现场。拆开来,是三个可以直接抄的提示词,和一套规则分层。

1. 起点:一个「轴」得出奇的智能体

我本机装了个点咖啡的智能体技能,对接瑞幸 MCP 服务,能查门店、搜商品、下单、出支付码。用下来第一感受是轴:让它顺便挑个最近的店,它不干,非把周边门店列出来让我选;我说「帮我送到公司」,它回一句固定话术,问我能不能自提;最气的是下单前明明报过预估价,还要再跑一次订单预览,把优惠算完才出支付码。

第一反应是提示词写多了。再想:这是一手交钱一手交货的场景,选错门店取不了餐,价格对不上就是纠纷,凭证泄了就是资金风险。带着疑问,我把那份 Skill 的规则源完整读了一遍,v0.8.4,迭代多轮,写法比我预想的老练。想复现的话,去瑞幸的 MCP 开放平台建个 token 就能跑。

2. 第一个发现:规矩自己会打架,得先定谁说了算

规则源里最值得抄的是开头一段优先级声明:宣布本节是强约束、单一真源,其余章节如有重复描述,以本节为准。

这是长期迭代必然撞上的问题:规则长到这个体量,早期条款删不干净,同类要求散落在流程、工具、常见坑里,措辞还不一致——「确认后再下单」和「不要重复确认」就能打起来。模型遇到冲突规则不会报错,挑一条顺眼的执行,每次挑的还可能不一样。

那份 Skill 的解法是把裁决权写明白,整理成可直接抄的写法:

## 执行优先级(单一真源)
以下条款优先级高于本文其余章节;如有重复或冲突,以本节为准:
1. 安全与资金类(凭证、支付、退款)最高;
2. 流程顺序类(不得跳步、不得省略确认)次之;
3. 体验类(简洁、少追问)最低。
新增规则先归层再入文,不在正文里另写一份。

3. 第二个发现:边界情况,不给模型发挥空间

第二类手法是固定话术。遇到外送请求,只回一句既定话术加二选一;你发来 token,它先念「是否保存到本地」的征询话术,明确答复才动手;你要删掉已存的凭证,它还预置了一句二次确认。

支付场景里,模型的自由发挥就是事故源。回得热情一点,可能把不支持的服务承诺出去;回得委婉一点,用户可能当成默认同意。固定话术的本质,是把「回复」也当成测试对象——一字不改,才能逐字验收。这跟我做页面验收一个思路:布局看感觉,按钮文案必须逐字对。

## 固定话术(边界情况照念,不自由发挥)
- 触发不支持的功能:只回既定话术加一个二选一确认,不解释内部原因;
- 涉及凭证与隐私的动作:先念征询话术,明确答复后才执行;
- 话术改动走版本号,改一个字也要过一遍验收清单。

4. 第三个发现:把状态机写进散文

最硬核的是下单流程的写法。查门店、确认门店、搜商品、确认意图、预览订单、创建订单,每步写死顺序,声明不得跳步;每步的参数标着来源,比如优惠券码必须原样透传自预览那一步的返回;预览和执行之间还有一个放行条件——最终价不高出预估、明细一致、优惠券正常,就直接出支付码不再啰嗦,任何一条不满足就停下重问。

这是把状态机翻译成了自然语言:节点、边、放行条件、中止条件全齐。模型最爱抄近路,估价当最终价、跳过预览直接下单,散文状态机把这些近路一条条堵死。

## 关键流程约束(以订单为例)
1. 步骤写死顺序,声明「不得跳步」;
2. 每步标注参数来源:哪个字段来自哪步的返回,禁止凭记忆补;
3. 写清放行条件:校验全过直接执行、不二次确认,任一不满足停下重问;
4. 中间产物是唯一真值,早先的估计值一律作废。

再往上看,这套规则其实分四层,各管一件事:

第0层 元规则:执行优先级——冲突时谁说了算
第1层 硬约束:安全与资金——凭证、支付、退款
第2层 流程约束:散文状态机——顺序、参数来源、放行条件
第3层 话术层:固定台词——边界情况一字不改
第4层 能力层:工具与参数说明——供查询,不参与裁决

5. 一个意外的收获:星号占位会被人当真

规则里还有一条让我愣了一下:禁止拿星号占位的授权头发真实请求,宁可停下来向用户要完整凭证。

这条防的是显示层。工具回显和日志常把敏感值打码成星号,模型拿到的是打过码的字符串,一不留神把星号当真值发出去,服务端自然报凭证无效。我在别的工程里吃过显示层遮挡的亏:文件里明明是完整内容,回显全是星号,差点把一份好文件重写一遍。把「占位符不是真值」写成硬约束,是拿真实事故换来的条款。这个判别值得落成守卫:

def real_credential(header: str) -> bool:
    # masked placeholders must never be sent upstream
    v = (header or "").strip()
    return bool(v) and "*" not in v and "..." not in v

6. 总结

三点判断:一,智能体的「轴」多半是设计出来的,每个反直觉行为背后都该能指到一条规则,指不到才是真有问题;二,规则打架是长期迭代的常态,先定优先级再堆条款,比事后灭火便宜得多;三,钱和凭证经过的地方,回复本身也是资产,固定话术不是死板,是可验收。

那杯咖啡最后点成了,全程没有一步是我没确认过的。轴就轴吧——好提示词不是把模型变聪明,是把它的路修窄。

作者:林华鼎 · 华为云开发者发展与支持部 · 科技博主系列

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。