多意图 Agent 的延迟优化:并行不是为了快,是为了让用户感觉快

0 评论 60 浏览 0 收藏 16 分钟

当用户的Agent产品同时处理三个需求时,速度再快也难逃体验崩盘的命运。本文直击多意图交互的核心痛点,揭示90%的延迟问题并非源自技术调度,而是反馈节奏的错位。从独立型与依赖型任务的精准拆解,到锚定话术的巧妙编排,再到异常处理的智能兜底,6大实战方法论教你如何用产品思维重塑用户感知速度。

做过 Agent 产品的同学应该都遇到过这种场景:用户一句话甩过来三个需求,「帮我查一下最近的订单物流、收货地的派送政策,再顺便看看附近有没有合适的自提点」,然后你的 Agent 就开始转菊花了。

转 5 秒,用户骂娘。转 8 秒,用户关掉 App。

那怎么办?很多人的第一反应是:上并行。把三个子任务同时发出去,总耗时就从 t1+t2+t3 压缩到 max(t1,t2,t3),问题解决。

听起来很美。但你真上线一跑就会发现,用户根本不买账——速度是快了,可反馈乱七八糟,先问的事最后回,后问的事先回,用户感觉自己在跟一个嘴碎的实习生说话,体验比串行还糟糕。

这篇就来聊聊这个事儿。多意图交互里 90% 的延迟体验问题,根子不在「调度多快」,而在「反馈节奏怎么排」。你优化的目标从来不是真实耗时,而是用户感知到的耗时。 这两件事压根不是一回事。

下面 6 个小节,从最简单的情况一步步往上加变量,把这套方法论拆透。

01 用户感知的「快」,和你的服务端日志没关系

我们先把一个基础事实立起来:用户对「快慢」的判断,和你 grafana 上那条 P95 曲线不是一回事。

普通人衡量一次交互快不快,只看两个东西:

  • 第一次反馈来得快不快(行业里通常说 2 秒是焦虑阈值,超过 3 秒大部分人就想放弃了)
  • 整个过程有没有「在动」的感觉(哪怕只是个 loading 文字,也比黑屏强一万倍)

至于你后台总耗时是 4 秒还是 6 秒,用户其实不在乎——只要他一直能看到东西在更新,就觉得不慢

这事在生活里太常见了。你点外卖,骑手实际送了 35 分钟,但 App 每隔 3 分钟更新一次「正在取餐 / 已取餐 / 距离您还有 X 公里」,你就觉得很顺。换一个 App 全程黑屏,最后 30 分钟「咣」给你送到,你立刻一星差评。速度一样,体验差十倍。

所以处理多意图,第一件事不是想着怎么调度更快,而是想清楚一件事:

我能不能在 2 秒内,让用户看到点东西?

把这个目标钉死了, 后面所有的设计都是在围着它转。

02 拆意图:分独立型和依赖型,不要一锅端

回到那个三任务的例子。要做并行,第一步得知道哪些能并行、哪些不能。

子意图分两类,一类能各干各的,一类必须排队:

  • 独立型:彼此之间不互相依赖,可以同时发起。比如「查派送政策」和「推荐自提点」,只要拿到收货地,两个查询完全独立,谁先回谁的。
  • 依赖型:后面那个必须吃前面的输出。比如「先查我未完成的订单,再查这些订单的物流」——订单号还没出来,物流查个寂寞。

这一步看起来很简单,但实际工程里栽跟头最多的也是这里。两个常见误判:

误判一:把弱关联当强依赖。 用户说「查物流和派送政策」,有人想当然觉得「派送政策得先知道物流到哪了」,于是串行。其实派送政策只依赖收货地,订单一查出来收货地就拿到了,根本不用等物流接口返回。

误判二:把弱关联当无关联。 用户说「查物流,再推荐附近的自提点」——「附近」是指收货地附近还是用户当前位置附近?如果是收货地,那就依赖订单查询;如果是当前位置,独立。这种语义模糊不能猜,要么用上下文兜,要么开口问。

说白了,判断依赖的标准只有一个:后面那个任务的入参,是不是必须等前面那个的输出。是就串行,不是就并行。别拍脑袋。

03 编排:并行调度 + 锚定话术,体验和速度两头都要

知道哪些能并行,调度本身不是难事——线程池一开,Promise.all 一裹,搞定。难的是接下来这一步:结果回来的时候,用户看到的顺序怎么排?

这就是开头说的那个问题。三个任务同时发出去:政策接口最快(1.5 秒回),物流稍慢(3.5 秒),自提点最慢(5 秒)。结果回来的顺序,和用户提问的顺序,是反的。

这时候很多团队的做法是:等!等所有任务都回来了,再按用户提问顺序拼好一起返回。

听起来很负责任,对吧?但你这一等,首字反馈就奔着 5 秒去了,前面所有并行优化全部白费——用户等的不是完整答案,是任何一个有用的反馈

正确的做法是:用「锚定话术」把并行的速度优势,包装成符合用户提问顺序的叙事节奏。还是那三个任务,体验应该是这样的:

  • 1.5 秒(首次反馈):「正在为你查询订单物流,同时已经查到收货地的派送政策:XX 区域正常派送,无管控限制。」
  • 3.5 秒(增量更新):「物流信息已更新:快件已到达转运中心,预计今日内派送。接下来为你匹配附近自提点。」
  • 5 秒(完整收尾):「附近推荐:XX 便利店,距离收货地 800 米,营业时间 8:00-22:00。」

注意这里的关键技巧:第一次反馈出来时,物流接口其实还没回,但话术里把它前置——「正在查询订单物流,同时……」。这一句「正在」起到了两个作用:

  1. 锚住了用户的提问顺序,让用户觉得「我先问的事你先在做」
  2. 给后面的接口争取了 2 秒的窗口期,等真的回来了再补上

整个过程并行没变,速度没让,但用户感觉到的节奏完全是按他的提问顺序来的。这就是开头那句话:并行不是为了真的快,是为了让用户感觉快。

04 参数收集:缺什么一次性问完,别像查户口

并行调度这事讲完了。但实际场景里还有个高频踩坑点——参数缺失

用户说「帮我查物流和派送政策」,问题来了:订单号没给,收货地也没给。你打算怎么问?

错误示范是这样的:

Agent:请提供订单号。

用户:12345……

Agent:请提供收货地。

用户:(已经有点不耐烦)北京。

Agent:请提供详细到区的收货地。

用户:(卒)

这就是把多意图交互硬生生干成了查户口。每多一轮追问,用户的耐心条就掉一截,三轮之后基本就放弃了。

正确做法只有一句话:主 Agent 在调度之前,统一扫描所有子任务的必填参数,缺啥一次性问完

Agent:需要你提供 12 位订单号,以及详细到区/街道的收货地址,我会同步查询物流进度和对应区域的派送政策。

一次问完,用户一次回完,工程链路压成一轮。

这里还有个工程细节值得提一句:参数校验放客户端,别让服务端兜底。订单号 12 位数字,用户输了 11 位,客户端立刻提示「订单号应为 12 位数字」,不要等请求打到子 Agent 失败了才报错——一次失败就是又一次往返延迟,体验上等于又转了 2 秒菊花。

说白了,多意图场景下,追问轮数比单轮耗时更影响留存。意图识别错了,用户最多重新说一遍;被来回追问三次参数,用户直接走人。这个工程优先级,很多团队搞反了。

05 异常兜底:一个子任务挂了,整体不能瘫

到这儿核心方法论讲完了。但真实生产里还得面对一类问题:接口会失败、会超时、会抽风

并行调度的好处是速度快,坏处是容错复杂——三个任务里有一个挂了,整体怎么办?

主流做法有两种,对应不同场景:

第一种,独立型任务挂了 → 降级返回。 三个任务里物流挂了,政策和自提点都好的,那就老实告诉用户:

「物流信息暂时无法查询,已为你同步收货地派送政策与自提点推荐:XXX」

注意这里要明确说「暂时无法查询」,不要藏着掖着。用户看到诚实的报错,反而比看到一份缺胳膊少腿的「完整答案」更有信任感。

第二种,依赖型任务挂了 → 链路中断 + 兜底建议。 比如「先查未完成订单,再查物流」,结果订单查询接口挂了——后面那步根本没法做。这种情况要主动给一个兜底动作:

「订单查询暂时不可用,建议你直接告诉我具体订单号,我可以帮你单独查物流。」

把死链路引到一个用户能继续走的活路上,这一步很多 Agent 都没做,硬生生卡死在那儿

还有一类是「时效冲突」——用户明确要求 2 秒内出结果,但你的接口确实需要 5 秒。这时候就用「占位反馈」:

「物流正在加急查询,预计 3 秒内更新。先把已经查到的派送政策给你:XXX」

先抛出能给的,告诉用户更慢的那个还在路上。用户讨厌的从来不是慢,是不告诉他还要多久

06 一个不是技术问题的问题:用户提问顺序到底要不要尊重

最后说个有点反直觉的事。

并行调度本身是个工程问题,但「按什么顺序返回结果」其实是个产品问题——而且这个产品问题,比工程问题难解得多。

你可能会觉得:当然要按用户提问顺序来啊,不然用户找不到对应关系。但实际场景没这么简单。

比如用户问「查物流、查派送政策、推荐自提点」,假设物流接口挂了 10 秒还没回。你是:

  • A. 死等物流,按顺序返回?
  • B. 先返回后两个,物流回来再补?
  • C. 直接告诉用户物流暂时不行,重新规划?

不同 Agent 产品的选择不一样。我倾向于 B,因为它最大化保住了「2 秒内必有反馈」这个底线。但 B 也有代价:用户提问的第一件事变成了最后回来的事,认知负担其实更重了

所以这事没有绝对正确答案,取决于你这个产品的核心价值主张是什么。是「最快出信息」(选 B),还是「最完整的有序答案」(选 A),还是「最透明的进度同步」(选 C),不同选择背后是不同的产品定位。

我见过太多团队在这个分叉点拍脑袋选,然后 A/B 测试都不做就上线了。多意图交互真正的差距,往往就藏在这种没人讨论的分叉点里。

总结

我们梳理一下这套多意图编排的核心要点:

  1. 你优化的是用户感知耗时,不是服务端总耗时——首字反馈卡死 2 秒线比什么都重要
  2. 拆意图先分独立型和依赖型,依赖判断的唯一标准是「入参是否必须等前序输出」,别拍脑袋
  3. 并行调度配合锚定话术——正在……同时已经……,让并行的速度服务于符合提问顺序的叙事
  4. 参数缺失一次性问完,追问轮数比单轮耗时更影响留存,校验逻辑能放客户端就放客户端
  5. 异常兜底要给活路:独立任务降级返回,依赖任务给替代方案,时效冲突用占位反馈

说到底,多意图交互这事,模型只解决了 60% 的问题,剩下 40% 是产品节奏感。模型再强也只是把「怎么并发执行」搞定了,可「怎么让并发出来的结果对用户友好」,是个纯产品问题——它考验的不是参数量,而是你对用户心智节奏的理解。

这也是为什么大模型时代,产品经理的活儿其实比以前更重要了。你以为模型把活全干了,其实模型只是给你提供了更多变量,至于这些变量怎么排列组合成用户感受得到的「好用」,从来都是产品的活

最后留个问题:你们做多意图交互时,有没有发生过「技术指标全绿,用户体验全红」的情况?是怎么排查到症结的?欢迎在评论区聊聊。

本文由 @姬小光 原创发布于人人都是产品经理。未经作者许可,禁止转载

题图来自Unsplash,基于CC0协议

更多精彩内容,请关注人人都是产品经理微信公众号或下载App
评论
评论请登录
  1. 目前还没评论,等你发挥!