摘要:作者认为 80% 的软件交互即将通过 agent 完成,产品需重新为「人通过 agent」而设计。三个实操原则:把使用说明写进 tool description、用 rationale 与反馈机制让看不见的 chat 漏出用户意图、双方各贡献独有 context 而非把决策推回上游。

原文:《Designing for Agents》
发布:2026-04-23
作者:@teddy_riker — Ramp 产品经理 (Agents 平台)
授权:未获明确授权,仅作学习交流,如有异议请联系删除

teddy_riker_454584_1

如果你和我刷的是 X 上同一个角落——一路划过「How I built a second brain with Obsidian」和「Anthropic just KILLED [某个行业] FOREVER」这类帖——你大概也见过这个判断:UI 已死。除非一个产品能被 agent 通过 MCP、API、CLI 或介于其间的什么东西用上,否则它撑不下去。

这个趋势在 Ramp 是真的。过去三个月,我们 MCP 的周活用户涨了 10 倍——越来越多客户通过 Claude、ChatGPT 和其他 agent 在使用产品。

上周,Salesforce 成了最早开始押注这个判断的老牌厂商之一。

引自 VentureBeat

Salesforce 周三公布了它 27 年历史上最雄心的架构变革,推出「Headless 360 」——一项覆盖全栈的举措,把它平台上的每一项能力都暴露为 API、MCP tool 或 CLI 命令,好让 AI agent 不打开浏览器就能操作整个系统。

这则消息是在 Salesforce 在旧金山举办的年度 TDX 开发者大会 上发布的,一次性发布了 100 多个新 tool 和 skill,开发者立即可用。这是对悬在企业软件头顶那个生死攸关的问题的一次决断性回应:在 AI agent 能推理、能规划、能执行的世界里,一家公司还需不需要一套带 GUI 的 CRM?

Salesforce 的回答:不需要——而这恰恰就是要点。

这是 Salesforce 一次聪明的动作,我难以想象做这个决定有多不容易。问大多数销售,他们会告诉你他们有多不想用 Salesforce。但这个产品之所以无处不在,是因为它的 UX 大家都用熟了。销售老大们没兴趣让团队上手新技术——一致性常常压过功能性。

Benioff 和他的团队正在承认这条护城河在被侵蚀,并接纳一个现实:未来大多数使用量会由 Claude、ChatGPT 这类 agent,以及其他用户根本看不到的后台进程驱动。

我不认为 UI 在死掉。人类仍然想去点击、想看自己的配置、想验证已经完成的工作。但 80/20 已经翻转了:新的那 80% 的软件交互会通过 agent 完成。这不仅改变了你要造什么,也改变了你怎么造。

新的交互模式

过去二十年,人们与软件交互的主要方式一直是:

User → Interface → Database

你打开一个产品、到处点点、把事做完。界面就是你对软件的体验。对大多数人来说,界面 就是 产品。

随着 agent 接手更多工作,一个新的层出现了:

User → User’s Agent (e.g. Claude) → Database

Agent 代表用户行动。它替用户去读、去写、在产品里跳转。突然之间,界面消失了——agent 直接和底下的系统对话。

但这一层也在快速变。软件公司正在(也应该)设计自己的 agent 与能力。所以新的模式更像是这样:

User → User’s Agent → Software’s Agent → Database

在这个模式里,软件方的 agent 替用户方的 agent 处理复杂性:应用业务逻辑、强制执行规则、补上对方没有的 context。两个 LLM 协作推动一个结果落地。

教 agent 怎么把事做成

我大多数头脑风暴、写作和构思都是和 LLM 一起完成的。一份草稿到了可以拿出来分享的状态,我就通过 Notion 的 MCP server 推过去。多年来我都是 Google Docs 死忠;Notion 的 MCP 把我策反了。

作为 Notion MCP 的用户,我特别欣赏的一点是:每次让 agent 写点什么,它都能搞定。表格、要点、斜体、列表——你说得出的格式,agent 从不翻车。

这是有意为之的。

notion-create-pages 这个 tool 的描述开头就写着:「For the complete Markdown specification, always first fetch the MCP resource at notion://docs/enhanced-markdown-spec. Do NOT guess or hallucinate Markdown syntax.」当我让 agent 往一个 page 写东西时,它第一件做的就是这个:先取规范,再写。每一个 Notion 自家的约定都被明确标出来,盖过通用模型的默认行为。

在旧的世界里,这份规范本来会躺在 API 文档里,做集成的开发者会去读、消化、再写一个转换层。现在 Notion 把规范直接交给 agent,正好在它需要的时候。

如果你用过 Slack 的 MCP,你大概体验过相反的情形。你的 agent 默认按标准 markdown 来写,根本不知道要遵守 Slack 自家的格式约定。最后你花在改格式上的时间,比你直接写正文还多:

teddy_riker_454584_2

当然,那些格式规范都在网上能查到,你可以存下来再教 agent 怎么用。但这太烦了——这本就不该是必要的事。

想想你的 agent 的调用方需要知道什么才能把事做成,然后主动给到它。不要让它自己摸索。

建反馈回路

我们在 Ramp 第一次上线 MCP 的时候,可观测性是我们最大的问题。我们能看到 tool call 的总量,但看不到产生这些 call 的 chat context。只看总量,根本说不清什么在 work、什么在 break、人们到底想达成什么。

我们用几种方式解决了这个问题:

  1. 每次 tool call 都强制带一个 rationale。所有 MCP 或 CLI 的 tool call 都要求 agent 带一个 rationale 参数,解释它为什么发起这个请求。我们看不到 chat,但 rationale 把意图重建了出来。rationale 里反复出现的模式会告诉我们人们到底想做什么。
  2. 一个 feedback tool。我们上线了一个独立的 tool,agent 卡住了或者撞上一个跑不通的模式时可以调用它。agent 提交它想做什么、试过什么、卡在哪。
  3. Tool 级别的 seed 参数。我们在单个 tool 上加了一些专门设计的参数,用来抓住后面会想要的 context:那些 agent 本来就有、但我们之后只能靠推断才能拿到的信息。

想象你在做一个客户支持平台,对外提供 tool 让客户拉取 ticket。慢慢地,你在 rationale 日志里看到同一些短语反复出现:「building an incident report」、「drafting incident summary」、「gathering tickets for an outage postmortem」。

这就是一个新的产品功能!一个 build-incident-report 的 tool 可以识别相关 ticket、评估严重程度、拉出受影响的客户群、再按一种强约束的格式起草摘要。

一旦它上线,你可能开始收到关于它的反馈:「the report pulled in tickets from three days ago that weren’t part of this incident」,或「it keeps including tickets from free-tier users who don’t belong in postmortems」。突然之间,你拥有了一群 agent 在告诉你的 agent 该建什么。Agent 会出现幻觉,没错。但它们的反馈也比你曾经面向过的大多数人类更具体、更稳定。

报告拉了无关的 ticket?加一个时间范围参数。不该包含免费版客户?加一个客户分段过滤。每一个反馈回路都成了产品改进的新通道。

留心 context gap

任何 agent 间的交互里,你的系统拥有调用方 agent 没有的 context,调用方 agent 也拥有你的系统没有的 context。设计这类交互时,你应该对「谁在哪一块占优」有自己的判断。

假设 Diego 出差去了。Diego 的 AI chief of staff 在 Slack 上收到差旅报销系统 agent 的提醒:他这趟出差还有报销没填完。现在两个 agent 同时指向同一个目标:把这些报销正确地提交。

这两个 agent 各自带了自己的 context。

Diego 的 chief of staff 带来的:

  • Diego 的日程:知道哪些会议发生过、在什么时候、跟谁
  • Diego 的邮箱:附件里有酒店和航班的确认信
  • Diego 的 Slack:可以把 Kokkari 那顿饭和他邀请 Acme 团队的某条 thread 关联起来
  • Diego 的发票(从邮件附件和相册里拉来)

报销系统带来的:

  • 原始交易数据(商户、交易时间等)
  • 公司关于提交的政策
  • 公司的 GL 账户
  • 公司历史上的入账模式

传统的 API 会把问题甩回给用户:「这有一笔交易需要一个 GL code。用这个 endpoint 去拉那 150 个 GL code 选项,然后挑一个。」

一个设计得好的 agent 交互把这翻过来——它不要 GL code。它要 context:这是客户餐、团队餐,还是个人出行?chief of staff agent 从一条日历条目或一条 Slack thread 里把答案拉出来。报销系统拿到它原本缺的 context,自己套上正确的 code。

Diego 和他的 agent 从头到尾不需要知道 GL code 是什么,财务团队拿到的也是准确的归类。两边各贡献自己知道的,交付一个对 Diego——也对他会计——都更好的结果。

当你在设计这种 agent-to-agent 的交互时,留心那个 context gap。承认你的 agent 在哪些地方差点意思是没问题的——你们两边在服务同一个用户。

界面以前坐在 Diego 和他的报销系统中间。现在它坐在他的 agent 和你的 agent 中间。

这一个转变重新定义了产品团队的工作。你过去是在为这样的人设计:他想跑得快、想避免出错、想亲眼看见自己的工作。现在你还在为同一个人设计,但隔着一个中间人——这个中间人的直觉、context 和限制都和那个人不一样。教 agent 怎么把事做成、建反馈回路、留心 context gap,问的都是同一个底层问题:你 agent 的调用方需要什么才能把它的活干好,你给到它了吗?

多数公司会发一个 MCP、把那一栏打个勾、然后就走了。它们的使用量会涨几个季度,然后停滞。时间一长,客户会绕到那些把细节做扎实了的产品上去,绕开没做的。

用你曾经对待人类的那份用心去为 agent 设计。等你回过神来,签支票的就是它了。