为什么你的智能体 UI 体验糟糕(以及如何修复它)
你已经发布了一个性能卓越的 Agent。底层模型很强大 —— 它能检索到正确的上下文,调用正确的工具,并生成连贯的输出。然后你观察一个用户第一次尝试它,整个会话就崩溃了。他们不知道 Agent 什么时候在工作,看不出它是否理解了自己的意思。他们会在任务执行中途打断它,因为长时间的沉默感觉像是死机了。他们最终选择了放弃,并拨打你的支持热线。
模型不是问题所在,界面才是。
这是工程师在构建第一个 Agent 产品后不断重新发现的模式:人机交互(human-agent interaction)层本身就是一门工程学科,而大多数团队都将其视为事后才考虑的事情。他们在检索质量和工具准确性上花费了数月时间,然后直接接一个聊天框作为界面,并奇怪为什么即使后端日志显示成功,产品用起来还是感觉不可靠。
Agent UI 失效的五个原因
在修复任何问题之前,了解为什么工程设计良好的 Agent 仍然会产生糟糕的用户体验是很有帮助的。通常有五种常见的失效模式。
不熟悉的范式问题(The unfamiliar paradigm problem)。 传统的软件会给用户提供线索(affordances):按钮、菜单、导航。Agent 则呈现一个空白的输入框,并说“随便问吧”。用户会感到犹豫,因为他们不知道什么是可能的、什么是范围内的,或者 Agent 期望什么样的输入格式。结构的缺失在任何 LLM 调用发生之前就产生了心理摩擦。
模糊的意图问题(The ambiguous intent problem)。 用户考虑的是目标(“整理我上周的邮件”),但 Agent 需要具体的指令才能在没有不断反复的情况下正确行动。过度确认的 Agent 让人觉得繁琐。确认不足的 Agent 会做出错误的假设并产生错误的输出。大多数实现要么偏向这一边,要么偏向那一边,而默认情况下这两种策略都不是正确的。
失去控制权的问题(The loss of control problem)。 当一个 Agent 在没有任何可见反馈的情况下运行 30 秒时,用户不会觉得自己是在授权 —— 他们会觉得自己对系统失去了控制。他们会打断、重启,或者在任务执行中途放弃。这种行为模式与用户在网页挂起时的表现如出一辙。Agent 可能正在做完全正确的事情;但界面没有给他们任何理由去信任这一点。
透明度真空(The transparency vacuum)。 Agent 在处理复杂任务时会做出几十个微观决策。当这些决策都没有显现出来时,用户就无法在不同的会话中建立信任。他们不知道为什么一次运行成功了而另一次失败了。他们无法判断 Agent 是有能力还是仅仅运气好。没有解释的不一致行为是削弱对功能正常的系统信心的最快方式。
架构失配(The architectural mismatch)。 大多数产品界面是为同步的人类工作流设计的:用户操作,系统响应,如此循环。Agent 工作流则是异步的、多步骤的且具有状态的 —— 这是一种从根本上不同的模型。将其包装在同步的聊天界面中,意味着每一个长时间运行的操作都会演变成一场 UX 危机。你正在试图将一个异步运行时强行塞进一个同步的外壳中。
将这五个失效模式作为一个整体来理解很重要,因为它们经常被误诊。当用户抱怨 Agent “不好用”时,真正的原因通常是这些交互设计上的失败 —— 而不是模型的输出质量。
流式传输 vs. 批处理:根据用户需求做出选择
流式传输还是批处理的决策通常被框架为一个性能问题,但实际上它是一个 UX 问题:当 Agent 工作时,用户需要做什么?
当用户在观察时使用流式传输。 如果用户看着响应生成 —— 边读边决定是否打断,或者构思下一个请求 —— 流式传输可以显著降低感知延迟。Token 在几毫秒内就开始交付,用户在响应完成之前就开始建立理解。对于对话式 Agent、面向客户的 Copilot 或任何交互式助手,流式传输应该是默认选择。
当需要展示多步骤工作的进度时使用流式传输。 在 Agent 完成步骤(检索文档、运行查询、撰写草案)时发送离散事件,可以让用户跟随进度,而不是盯着空白屏幕。这并不是要显示原始的 Token —— 而是实时地叙述有意义的里程碑。
当任务有明确边界且用户不在观察时使用批处理。 后台作业、定时分析、离线文档处理 —— 这些都不受益于流式传输,因为没有人正在等待它们。流式传输增加了开销,却没有任何 UX 收益。
当输出只有在完整时才有意义时使用批处理。 某些响应在完成之前无法被有效消费:结构化的 JSON、需要编译的代码、依赖于所有行都存在的表格。流式传输半构建的 JSON 响应会带来解析问题,而不是更好的体验。
大多数团队犯的错误是在所有地方都默认使用批处理,因为这样实现起来更简单,然后用进度条(spinners)来补救。进度条并没有解决问题 —— 它们只是承认了问题的存在而没有去处理它。流式传输那些让用户理解发生了什么的事件;批处理那些真正需要完整结果的工作。
一个具体的实现细节:在复杂的 Agent 工作流中,不要向用户流式传输原始的模型 Token。相反,应该流式传输结构化的生命周期事件 —— STEP_STARTED、TOOL_CALLED、STEP_FINISHED —— 并将这些事件渲染为有意义的 UI 更新。让用户去读内部推理链的单个 Token 并不是透明度;而是噪音。
如何在不淹没用户的情况下体现置信度
展示置信度分数的冲动是可以理解的 —— 智能体(Agent)知道自己的确定程度,用户理应也想知道。但在实践中,原始置信度数值(如 74.2% 的置信度)几乎总是适得其反。用户缺乏解释这些数值的参照系,这些数值在不同任务类型之间波动巨大,而且为每一个决策都显示数值会造成认知过载。
有效的方法是:通过语义和上下文而非分数来体现置信度。
对于智能体例行执行的高置信度操作,直接显示结果并隐含确定性信号 —— 带有来源的简洁回答本身就是一种信号。对于中等置信度的操作,即智能体虽然在继续执行但依据较弱时,应提供简短解释:“我找到了三条匹配记录,但日期并不完全一致 —— 标记出来供你查看。”对于低置信度的操作,在执行前暂停,并展示智能体不确定的具体内容,而不是一个百分比。
核心原则是展示置信度的驱动因素,而非置信度本身。“该日期范围的数据质量较低”比“62% 的置信度”更具可操作性。“此处适用三项政策异常”告诉了用户该检查什么。“这是第一次处理没有先例的要求”解释了为什么输出可能比平时粗糙。
一个在生产环境中运行良好的实用模式是:基于影响程度加权的置信度展示。大多数智能体任务涉及许多微决策。智能体不应叙述每一个决策。相反,应将可见的置信度标记保留给对结果有实质性影响的决策 —— 即那些出错后果很严重的环节。在这些地方体现不确定性;让其他环节保持不可见。用户通过系统标记不确定的案例来建立对系统自我意识的信任,而不是通过不断的百分比分数流。
渐进式披露:展示工作过程而不让用户淹没其中
渐进式披露是一种成熟的 UI 模式(先展示概览,根据需求揭示细节),它直接适用于智能体的工作流。实现的重点在于如何构建默认显示的内容与按需提供的内容。
一个实用的三层模型:
第一层 —— 默认可见:智能体当前正在做什么以及产出了什么。“搜索了三个数据库。找到 12 条匹配记录。这是摘要。”这一层始终存在。
第二层 —— 按需展开:重大决策背后的推理过程。为什么智能体选择了特定方法,考虑了哪些替代方案,哪里存在不确定性。需要审计或理解的用户可以展开此项;只想要结果的用户则不必理会。
第三层 —— 可用但不显露:完整的工具调用日志、原始检索结果、内部状态转换。这用于调试,而非正常使用。通过检查器或导出功能提供,但绝不要将其显示在主交互流中。
同样的模式也适用于工具调用的可见性。在发生时显示每一次工具调用在技术上是透明的,但对于非技术用户来说,在功能上是压倒性的。将相关的工具调用组合在一个有意义的步骤标签下(如“搜索了你的日历”),可以在减少噪音的同时,保留一种正在处理实事的真实感。
对于构建智能体 UI 的工程师:从一开始就实现生命周期事件(STEP_STARTED,STEP_FINISHED),并围绕这些事件设计渲染层 —— 而不是围绕原始 Token 输出。这为你提供了实现所有三层结构的基础设施,而无需在以后进行重构。
