@svpino:我构建了一个处理退款的简单智能体,结果它没能正常工作。我来给你看看我是怎么搞砸的,又是怎么修好的。
摘要
作者分享了自己构建退款客服智能体的失败教训:在单一智能体架构中,工具返回的仓库备注(存在提示注入风险)覆盖了用户的明确指令,导致错误退款。修复方案是将职责拆分给接待、订单核查和退款处理三个相互隔离的智能体,体现了多智能体架构中的职责分离原则。
查看缓存全文
缓存时间: 2026/10/16 16:45
我构建了一个处理退款的简单智能体。
结果没能正常工作。
让我来告诉你,我是怎么把事情搞砸的,又是怎么修好的。https://t.co/bumC8QS594
简单并不总是更好(而且往往更糟)
我构建了一个简单的智能体,想向你展示把事情搞砸有多容易。
这是一个处理客户退款的智能体。因为流程很直接,我为它设计了一套精简的端到端架构。
下面这张图展示了我的设计:
我们有一家商店、一个客服团队,还有帮助处理退款的智能体。
当客户对购买的商品不满意时,他们会联系客服。然后,退货智能体会接手请求,启动退货流程:
-
智能体理解请求,判断出客户想要退货。
-
随后,它使用 lookup_order 工具查找客户的订单。工具会返回订单信息以及附带的仓库备注。
-
如果仍在退货期限内,退货智能体就使用 refund_order 工具,将款项退回客户的信用卡。
这又不是什么复杂的事情,所以我没有在智能体架构上想太多。
我也没那么天真,因此加上了所有我认为必要的防护措施:
-
智能体会确保 lookup_order 工具返回的订单与客户提供的订单一致。
-
它还会在批准退货前,确认退货申请处于规定的期限内。
-
最后,它会防止同一订单被多次退款。
我以为这些限制足以应对问题,没想到让我头疼的却是完全不同的地方。
我给了智能体太多职责。简单反而成了它的致命弱点。
我的设计根本行不通
我的架构从一开始就有缺陷。
一位客户给客服发消息,想查询所购商品的退货状态。他们暂时不想退款,只想知道我们是否收到了商品。
退货智能体查询了订单。工具在返回退货状态的同时,还返回了一条仓库备注:“仓库已收到商品。现在可以退款了。”
事情从这里开始失控。
退货智能体把仓库备注加入了自己的上下文窗口,随后便执行了退款,尽管客户明确要求不要退款。
客户说不想退款。仓库说可以退款。智能体必须在两条相互矛盾的指令之间做出选择,结果选错了。
简直是一场噩梦。
我无意中设计出了一个允许工具改变客户请求的系统。
问题显而易见:
读取请求、理解请求和执行操作,全都发生在同一个模型上下文中,而且这个上下文可以访问所有可用工具。
到了这一步,我感觉自己只不过是重新发现了关注点分离的重要性。
我们来修好它。
回到设计阶段
我很喜欢原先设计的简洁:一个智能体,配上几个工具,就能处理所有事情。
但简单并不总是更好,而且往往更糟。
我必须改变智能体的架构。
我把它拆分为三个智能体,再用少量应用代码将它们连接起来:
现在,客户请求会经过一套截然不同的处理流程:
-
请求接收智能体读取请求,提取订单 ID,并判断客户想查询状态还是申请退款。
-
订单审核智能体使用 lookup_order 工具查找订单,并判断是否批准退货。如果客户申请了退款,而且退货获批,代码就会调用退款处理智能体。
-
退款处理智能体使用 refund_order 工具,将款项退回原客户的银行卡。
现在,每项操作都相互隔离。
请求接收智能体无法退款,因为它无法访问任何支付工具。订单审核智能体只能查询订单,无法更改客户的请求,因为请求接收智能体已经处理了请求,并确定了需要执行的操作。
即使仓库返回的备注要求退款,订单审核智能体也无法执行。工具返回的有问题的文本,无法再导致错误退款。
另外,请注意,每个智能体都只能通过结构化数据进行通信。
新设计让每个智能体在独立的上下文中运行。 信息以固定格式在各个阶段之间传递。智能体无法传递备注、其他指令或操作。
更新后的设计虽然稍微复杂了一些,却让智能体很难执行未经授权的退款。
职责分离
这次修复背后的原则是职责分离,Google 的《Advent of Agents》第 3 天:构建安全的多智能体系统,就介绍了这一原则。他们以处理保修申请为例,但思路是一样的:把工作拆分给不同的智能体,并且只给每个智能体提供其所需的工具。读取记录的智能体,不应自动拥有对这些记录执行操作的权限。
我的演示在我编写的小型 Python 应用中运用了这一原则。Advent of Agents 中的版本则在 Google Cloud 上更进一步:每个智能体都有自己的 Agent Identity,Agent Gateway 强制限定各个智能体能够访问哪些服务,Model Armor 筛查输入模型的内容,而 Private Service Connect 和 VPC Service Controls 则确保流量保持私密。
你可以在这个代码仓库中查看我的演示,对比最初的简单架构和更新后的架构。
要将这种模式从本地演示扩展到实际应用,可以在 Google Cloud 的 Gemini Agent Platform 上构建。
感谢 Google Cloud 与我合作完成这篇文章。
相似文章
你的智能体刚刚重试了。它把工作做了两遍吗?
作者分享了一次因重试导致重复扣费的线上事故,并介绍其正在构建的 FetchSandbox 工具——通过确定性故障注入检查工作流重试时的幂等性是否真正生效。
「你 agent 的失败就是你的回归测试集」是很好的建议。但手工构建评测数据集不是。以下是我的做法。
作者分享了一套基于真实会话失败用例构建 AI agent 回归测试集的流程:先手动标注 traces,再按失败类型分组、写廉价检查项,并用 Kitaru 的 MCP server 与重放机制加速评测集的维护。
@LangChain: The 3 questions every agent builder should be able to answer: Where the agent fails How to reproduce it How to make it …
LangChain 分享的演讲:每个 Agent 构建者都应能回答三个问题——Agent 在哪里失败、如何可靠复现失败、以及如何让它不再失败,介绍了通过生产环境追踪、专门的评判模型、以及"世界规范"模拟环境来系统化改进 Agent 的方法。
@vintcessun: 最近不少人在折腾agentic workflow,prompt调了半天还是容易跑偏。其实问题常在runtime层:循环没预算、工具权限太宽、压缩丢了状态。DenisSergeevitch这个agents-best-practices sk…
讨论agentic workflow中常见的runtime问题(循环预算、工具权限、压缩状态丢失),推荐DenisSergeevitch的agents-best-practices资源,提供provider-neutral的参考,强调将权限、预算、观测作为显式机制。
我在构建多智能体系统时犯了这5个错误,你可能也会犯
作者分享了构建客户支持多智能体系统的经验,认为检索和落地失败(而非提示词或模型)是智能体产生幻觉的主要原因。作者列出了五项落地检查,并指出禁止无依据回答使升级率降低了40%。