1. 先把"交互方式"拆开看:Agent 到底在和谁交换什么
这个问题我在几次内部评审上都碰到过,每次都能吵起来,原因几乎一模一样:大家说的"交互"根本不是同一件事。有人脑子里想的是用户对着输入框打字,有人想的是模型调用接口传 JSON,还有人想的是界面上那个"确认执行"的按钮。三种东西混在一个句子里讨论,结论必然是各说各话。所以我不打算直接给"是"或"不是",而是先把这个词拆开,看看自然语言到底占了多少份额。
我自己的判断是:自然语言是人向 Agent 表达意图时最通用的一种方式,但它既不是唯一方式,也不是所有环节的最优方式。一个能跑起来的 Agent 系统里,自然语言大概只覆盖了从"人"到"Agent"这一段链条的前半截,剩下的部分——澄清、规划、执行、回执——大量依赖结构化数据和图形界面。谁把这一段当成全部,做出来的东西往往在演示阶段惊艳,上线两周就被用户骂回去。
1.1 三类经常被混为一谈的交互对象
把任何一个人机协作系统拆开,至少存在三条交互链路,每条的"语言"完全不同。
第一条是人 → Agent,也就是用户把自己的想法告诉系统。这条链路的天然形态确实偏向自然语言,因为人的想法本来就是模糊的、带上下文的、不完整的。你要让用户先想清楚"我要的是 refund_rate 字段按 region 分组后取 top3",那是强人所难。
第二条是Agent → 工具/系统,也就是 Agent 去真正干活。这条链路几乎不存在自然语言的空间。你去调一个订单查询接口,传的是结构化的查询条件和分页参数;你去改一条数据库记录,传的是主键和字段值。中间就算有自然语言,也只是"生成参数"这个动作的中间产物,最终落地必须是可校验的结构。
第三条是Agent → 人,也就是汇报结果、请求确认、报错求助。这条链路是最容易被忽视的,也是决定产品手感的关键。纯文本汇报在简单任务上没问题,一旦涉及表格、图表、多个候选方案对比,纯文字描述会迅速变得难以阅读——你试试用一段话描述一个 20 行的对比表,用户会直接放弃。
讨论"自然语言是不是唯一交互方式"之前,先明确你问的是哪条链路。人机之间、机机之间、机人之间,答案完全不同。
1.2 自然语言只覆盖了链条中的"意图输入"一段
我习惯把一个完整的 Agent 任务拆成五段:意图输入、意图澄清、计划生成、动作执行、结果呈现。自然语言在头两段和最后一段有绝对优势,在中间两段基本只能当"生成器",最终产物必须收敛成结构化形式。
举个具体的例子。用户说"帮我把上周那批退款异常的订单捞出来,能退的退掉,退不了的整理成表给我"。这句话进来之后,系统要做的事情是:先判断"上周"是自然周还是滚动七天,"退款异常"对应哪个业务口径,"能退的"需要满足哪些前置条件。这些澄清如果全靠对话来回问,三四轮下去用户就烦了;但如果系统能从上下文和历史偏好里推断出默认值,然后用一个结构化摘要让用户确认——"时间范围 3 月 4 日至 3 月 10 日,口径为支付成功且 7 日内未发货,共 128 单,其中 96 单可自动退,32 单需人工,确认执行?"——体验会好得多。
你看,用户输入的是自然语言,系统内部流转的是结构化的查询条件和动作列表,最后呈现的是一个带数字的确认卡片。自然语言在这里是入口,不是全部。
1.3 一个反直觉的现象:全对话框产品的用户会自己造按钮
这一点是我在实际项目里观察到的,后来在好几个不同产品上都验证过。当一个工具只提供对话框、不提供任何快捷入口时,重度用户的行为会发生一种很有意思的退化:他们开始用固定的句式反复输入同样的指令。
比如"查一下今天的待处理工单",第一次是完整说一遍,第二次缩短成"今日工单",第十次就变成了"gw"这种只有自己看得懂的缩写。本质上,用户在心里把自然语言压缩成了一条命令别名。这说明什么?说明高频场景下,自然语言的表达自由度是一种负担,用户自己都嫌累,主动把它退化成宏命令。
这个现象给我的启发很大。后来再做类似产品,我会主动把这些被用户"固化"下来的句式收集起来,做成可点击的快捷指令或者提示词模板,甚至做成侧边栏的按钮。用户的自然语言输入被系统吸收、沉淀、再结构化,形成一个正向循环。这件事如果你不做,用户会自己用复制粘贴做,体验更差。
2. 自然语言的三张王牌,以及每张牌背后的账单
说自然语言重要,不能只喊口号,得说清楚它到底赢在哪里。我总结下来是三件事:能兜住长尾、表达上限高、容错性好。但这三张牌每一张都有对应的成本,而且这些成本在 Demo 阶段基本看不见,等上线量起来之后才会一笔一笔找上门。做技术选型的时候如果只算收益不算账单,后面大概率要返工。
2.1 长尾意图兜底:没有菜单可点的时候才见真章
传统软件设计交互的基本假设是:开发者能穷举用户想干什么。所以有了菜单、有了按钮、有了表单字段。这个假设在功能收敛的软件里成立,比如一个计算器,你不需要它理解"帮我算个税"。
但 Agent 面对的往往是开放式系统。我之前接触过一个内部数据查询工具,底层有几百个字段、几十张表,业务方每天的问题五花八门:"上个月华东区退款率最高的三个品类是哪些""哪个仓库的履约时长连续三周在涨""把去年 Q4 客单价超过 500 且复购两次以上的用户拉出来"。你要为这些查询做按钮,做到明年也做不完,而且大部分按钮一辈子只被点一次。
自然语言在这里的价值就体现出来了:它不需要你预先枚举,用户想到什么说什么,系统尽力去映射。哪怕映射成功率只有七成,剩下三成走人工,也远比"没有这个功能"要好。这就是长尾兜底的真实含义——它不是替代菜单,而是覆盖菜单覆盖不到的那部分。
2.2 表达上限高,代价是把解析成本从用户转移到系统
自然语言能表达的复杂度确实高。一句话里可以塞进时间范围、筛选条件、排序规则、输出格式,用户写起来很自然。但这份自由度不是免费的,它被转移成了系统侧的三类成本。
第一类是推理成本。一句三四十个字的意图描述,模型要消耗几十到上百个 token 去解析,还要做意图分类、槽位填充。相比一次点击产生的"一个枚举值",差了两三个数量级。如果这个操作一天要被触发上万次,成本差异会非常直观。
第二类是延迟成本。一次完整的对话往返,从用户按下回车到看到结果,通常在一秒到数秒之间。单次看不出来,但如果用户一天要做两百次操作,每次多等两秒,一天就是将近七分钟。对于坐席、运营这类高频岗位,这个数字会被放大到无法接受。
第三类是不确定性成本。同样的输入,两次可能给出不同的解析结果。用户第一次觉得"真聪明",第五次遇到"怎么又理解错了"就开始不信任。为了压住这种不确定性,你得加确认步骤、加约束解码、加兜底规则,而这些又反过来拉长了链路。
判断一个场景该不该用自然语言,我的土办法是:算一下这个操作一天被触发多少次,再乘以单次解析的额外开销。如果省下来的界面开发成本覆盖不了这个开销,就别硬上。
2.3 模糊性带来的容错,也是事故的温床
自然语言最迷人的地方是它能容忍不完整。用户说"订个会议室",系统不需要用户填完八个字段才能办事,可以先用默认值顶上,再逐步补全。这种"先做再问"的体验,是表单永远给不了的。
但同样这份模糊性,在另一类场景里就是灾难。涉及金额、权限、删除操作的时候,"大概""差不多""你看着办"这种表述必须被强行打断并要求明确确认。我见过一个内部工具,用户说"把测试环境那批脏数据清一下",Agent 很勤快地把整个测试库的表都截断了——它确实"理解了意图",只是理解得过于宽泛。
我的处理原则是给不同的动作分级:只读类动作可以容忍模糊,写操作必须要求精确参数,破坏性操作必须二次确认并且展示影响范围。这个分级不是写在文档里的,是写进执行器的硬约束,模型说了不算。
模糊性还有一层隐形成本:歧义收敛的责任归属。用户说"上周",到底是自然周还是滚动七天,这个歧义由谁来解决?如果每次都追问,体验差;如果每次都猜,猜错了责任在系统。比较务实的做法是猜一个默认值,但在结果里显式回显这个假设,让用户有机会纠正。这比追问省事,比闷头执行安全。
3. 四类高确定性任务里,对话式交互几乎必输
前面说了自然语言的好话,这一节说难听的。有些团队拿到 Agent 能力之后,第一反应是把所有功能都塞进对话框,觉得这样最"未来"。我实测下来的结论恰恰相反:有四类任务,对话式交互从效率、准确率、可维护性上全面落后于传统交互,硬上就是给自己找麻烦。
3.1 高精度参数:数字、时间、金额、坐标
自然语言在传递精确数值时的可靠性,比大多数人想象的低。语音输入尤其明显,"十四"和"四十"、"幺"和"一"、"一五零"和"一百五",识别错一位数,后面全错。文字输入好一些,但"下周三下午三点半"这种表述依然要经过时区、相对日期、工作日定义的层层解析才能落地。
我的做法是:凡是参数精度要求高的字段,必须走结构化控件或者结构化回显。用户可以用自然语言说"约下周三下午",系统解析完之后弹一个明确的时间选择器,显示"2024-03-13 15:00 - 16:00(周三)",用户点确认。这样既保留了自然语言的便利,又把最终参数的确定权交回给了精确控件。
金额、账号、订单号这类字段更是如此。这些字段的共同特点是错一位就全错,而且错误不可自愈。我见过的比较靠谱的实现,是识别出这类实体之后直接在界面上高亮显示并等待确认,而不是解析完就闷头去执行。多花一次点击,省掉一次事故。
3.2 高频重复动作:一次点击和一句三十个字的差别
这一条最容易被做产品的同学忽略。对于每天只用三五次的用户,对话式确实更省事;但对于每天用两百次的一线岗位,对话式的效率是灾难性的。
算一笔粗账:一次点击大约需要 0.5 秒的物理动作时间,加上可以忽略的认知负荷;一句三十个字的自然语言,说出来大约五到八秒,打完字更慢,加上系统的解析和渲染延迟,实际耗时在两到五秒。也就是说,单次操作对话式要比点击慢四到十倍。
这还没算上熟练度曲线。点击操作熟练之后可以形成肌肉记忆,闭着眼睛都能摸到按钮;对话式每次都要重新组织语言,认知负荷始终在线,累了就容易说错。所以凡是高频、固定的操作,我坚持给按钮、给快捷键、给批量入口,自然语言只作为"我不记得按钮在哪"时候的兜底通道。
3.3 需要"看得见的中间态":状态可审阅为什么重要
Agent 处理复杂任务时往往是多步的:先查、再算、再改、再通知。整个过程如果完全藏在一个对话框后面,用户看到的就是一个转圈的加载图标,然后突然冒出一个结果。出问题的时候,用户不知道哪一步错了,也不知道该从哪一步重来。
结构化界面在这里的优势是中间态可见。任务被拆成若干步骤列在界面上,每一步有自己的状态,可以单独重试、单独取消、单独查看详情。用户对系统的信任来自"我能看见它在干什么",而不是"它说它做完了"。
这一点在涉及外部副作用的时候尤其重要。比如批量发通知,用户需要看到"将向 86 个联系人发送",并且能在发送前取消。纯对话式的实现往往是"好的,已经帮您发送完毕",这时候用户想反悔都来不及。中间态不只是体验问题,它是一条安全绳。
3.4 可审计与可回滚:结构化动作天生带日志
合规要求比较高的场景里,每一个写操作都要能回答三个问题:谁做的、什么时候做的、改了什么。结构化动作天然能回答,因为它本来就是"一个动词加一组参数",日志里存下动词、参数快照、前后 diff 就完事了。
自然语言动作在这一块天生吃亏。日志里存一句"把客户等级调高一点",事后谁也不知道调到了几级、依据是什么。要让它可审计,你得把自然语言先解析成结构化动作,再记录解析结果——那还不如一开始就走结构化。
回滚也是一样。结构化动作能算出逆操作:加了 100 就减 100,改了状态就改回去。自然语言的逆操作要靠模型再推测一次,可靠性直接打对折。所以涉及资金、权限、库存这类动一下就有后果的操作,我的建议一律走结构化通道,自然语言只作为"发起"的入口,不作为"执行"的载体。
4. 除了说话,Agent 还能怎么接活:五条通道的带宽与代价
如果把视野放开,"Agent 的交互方式"其实有五六种,自然语言只是其中最通用的一种。不同通道的差别不是风格差异,而是在带宽、确定性、覆盖广度、实现成本这几个维度上的结构性差异。选错了通道,后面花十倍力气也补不回来。
4.1 直接操作图形界面:能力最广,也最脆
让 Agent 像人一样看屏幕、点按钮、填表单,覆盖面是最广的——理论上只要人能用的系统,它都能用,包括那些根本没有开放接口的老系统。这个思路在迁移、录入、跨系统搬运数据这类场景里非常实用。
代价是脆弱。界面上的元素定位依赖结构特征,页面改个版、按钮换个位置、弹窗多一层,定位就可能失效。而且这类操作的失败往往不是明确报错,而是点了没反应或者点错了地方,排查起来很费劲。加载时序也是老大难,网络慢一点就会点空。
我的经验是把它定位成兜底通道和一次性任务工具,而不是主力通道。如果是长期稳定的业务流程,哪怕多花点时间推动对方开放接口,也比长期维护一套界面脚本划算。如果确实只能用界面,那就必须加上元素存在性检查、操作后状态校验、失败重试和全流程录屏,否则出了问题根本没法定位。
4.2 结构化协议与工具调用:确定性最高,覆盖最窄
这是目前最可靠的执行通道。每个工具声明自己的名字、参数结构和返回格式,Agent 的职责是选对工具、填对参数,剩下的交给确定性代码。参数的合法性在进入执行前就被 schema 校验过一遍,类型不对、必填缺失、取值范围越界,都会在门口被拦住。
它的局限也很清楚:你得先有接口。接口没开放、权限拿不到、字段口径不统一,这条路就走不通。而且工具描述的质量直接决定调用成功率,描述写得含糊,模型就会选错工具或者填错参数。我见过最常见的失败不是模型笨,而是工具有两个名字很像、功能有重叠,模型分不清该用哪个。
所以工具设计的第一原则是边界清晰、互不重叠。宁可拆成两个语义明确的工具,也不要做一个参数一大堆、什么都能干的万能工具。后者的参数填错率会高得离谱。
4.3 多模态感知:截图、语音、文件、传感器
自然语言之外,用户还可以直接给"东西"。截图说"这个报错是什么意思",丢一个 PDF 说"把里面的关键条款提取出来",传一个 Excel 说"按这个格式重排"。这些输入方式在信息密度上远高于文字描述,因为很多信息用文字描述起来极其笨拙。
语音是另一条重要通道,它的优势在于解放双手,适合移动场景和操作不便的场景。但语音的信息密度低、纠错成本高,适合短指令不适合长参数。我的做法是语音只负责"说出意图",落到具体参数时切换到可视化确认。
文件和小票这类输入的价值在于原始信息保真。用户口述一个发票号,十个数字可能错两个;拍张照,一个都不会错。凡是涉及复制粘贴的环节,能用图片就用图片,能用文件就用文件。
4.4 隐式触发:事件、订阅、环境变化
还有一种交互形态完全没有"用户主动输入"这个动作:系统盯着某个条件,条件满足就自己动。库存低于阈值自动补货、监控指标异常自动拉群、合同到期前三十天自动提醒。这种交互方式在讨论"是不是自然语言"的时候经常被漏掉,但它在实际系统里占比不低。
隐式触发的关键是阈值和边界的定义要足够精确,因为它没有人在现场把关。触发条件写松了会天天误报,写紧了又会漏。我的建议是上线初期一律先做成"只提醒不执行",让用户看一段时间误报率,稳定了再逐步放开自动执行权限。
4.5 五条通道横向对比与选型建议
把上面几条放在一起对比,结构差异就很清楚了。下面这张表是我自己做选型时用的,维度是按实际踩坑经验挑的。
| 通道 | 信息带宽 | 确定性 | 覆盖广度 | 实现成本 | 主要失败模式 |
|---|---|---|---|---|---|
| 自然语言对话 | 中高 | 中低 | 极广 | 中 | 歧义、解析偏差、幻觉参数 |
| 结构化工具调用 | 低(但精确) | 高 | 窄(需接口) | 低到中 | 选错工具、参数越界 |
| 图形界面操作 | 低 | 低 | 极广 | 高 | 元素失配、时序错乱 |
| 多模态输入 | 高 | 中 | 中 | 中 | 识别误差、格式异常 |
| 隐式事件触发 | 极低 | 高 | 窄 | 低 | 阈值失准、误报扰民 |
选型的大致顺序是:能走结构化接口的一律走接口,接口覆盖不到的用自然语言兜底,自然语言兜不住或者需要人工现场判断的才上界面操作,全程用多模态提升输入保真度,把隐式触发当作长期优化项而不是起点。这个顺序不是绝对真理,但它能帮你避开最常见的一类错误——把最脆弱的通道当成主通道。
5. 工程上真正可行的答案:分层混合,而不是二选一
讨论到这一步,"自然语言是不是唯一交互方式"这个问题本身就有点站不住了。真正的工程答案不是二选一,而是分层:不同的层次用不同的表达方式,层与层之间的接口定义清楚。这一节我把这个分层模型、降级路径和实现骨架摊开讲,都是可以直接照着搭的。
5.1 分层模型:意图层松散,执行层严格
我把系统分成三层,每层用的"语言"不一样。
意图层负责接住用户的原话,允许松散、允许不完整、允许带口语。这一层的产出不是动作,而是一个候选的意图表示:想做什么事、涉及哪些实体、有哪些约束条件。这一层可以用模型去做,因为它面对的是开放输入,规则写不完。
计划层负责把意图翻译成步骤,并且必须是人能看懂的结构。这一层的产出应该是一个可展示的任务清单,每一步写着要调什么、传什么参数、预期产出是什么。用户能在这个清单上改、能删步骤、能调顺序。这一步是整套设计的关键,它把模型的"黑箱"变成了"白箱"。
执行层只认严格的结构化指令。参数类型、取值范围、权限校验、幂等键,全部在这一层硬性把关。模型在这一层没有自由发挥的空间,它只能提交一个待校验的请求,校验不过就打回。
分层的好处是每一层都能独立演进。换模型不影响执行层,加工具不影响意图层,改界面不影响业务逻辑。坏处是链路变长,需要多写一些转换代码,但对于任何要上生产的系统,这点成本是值得的。
5.2 失败降级路径:从自然语言退到表单,再退到人
一个成熟的系统必须有明确的降级路径,而且降级过程要让用户感知到,不能悄悄降级。
第一级是置信度判断。解析出来的意图如果置信度足够高、参数完整、动作风险低,直接执行并给出结果。这一级要尽量宽,因为大部分常规操作都应该在这里被消化掉。
第二级是结构化补全。意图识别出来了,但缺几个关键参数,或者参数有歧义。这时候不要用对话去一个个追问,而是弹一个预填好的表单,把已经确定的字段填上,把待确认的字段高亮,用户改完点确认。这一步比追问快得多,而且用户能看到全貌。
第三级是转人工。涉及高风险动作、或者用户明确表示不满、或者连续两次解析失败,直接转人工并带上完整的上下文记录。转人工不是失败,是设计的一部分,关键是转过去的时候人工能立刻接手,而不是让用户从头再说一遍。
| 触发条件 | 降级动作 | 用户感知 |
|---|---|---|
| 置信度高、参数全、低风险 | 直接执行 | 秒回结果 |
| 参数缺失或存在歧义 | 结构化补全表单 | 看到预填内容并确认 |
| 高风险写操作 | 影响范围预览 + 二次确认 | 明确知道要改什么 |
| 连续两次解析失败 | 转人工,附上下文 | 人工直接接手,无需重述 |
5.3 一个可以照着搭的混合交互骨架
下面这段是伪代码,思路比语法重要。核心是把"选通道"这个决策显式化,而不是让所有请求都涌进同一个对话框。
def handle_request(user_input, context): # 第一层:意图解析,允许松散输入 intent = parse_intent(user_input, context) # 高风险意图一律不走自动执行 if intent.risk_level == "high": return render_confirmation_card( action=intent.action, affected_scope=estimate_scope(intent), # 影响范围必须算出来给人看 params=intent.params ) # 第二层:判断参数是否完整、是否有歧义 missing = find_missing_slots(intent) ambiguous = find_ambiguous_slots(intent) if missing or ambiguous: return render_prefilled_form( filled=intent.params, highlight=missing + ambiguous ) # 第三层:选择执行通道 channel = pick_channel(intent) if channel == "tool": # 结构化通道,参数必须过 schema 校验 if not validate_schema(intent.action, intent.params): return render_error_with_hint(intent) return execute_tool(intent.action, intent.params) elif channel == "gui": # 界面通道,必须有元素检查与状态回验 return execute_gui_with_guard(intent.action, intent.params) else: return fallback_to_human(intent, context)这段骨架里我觉得最值得抄的是两个地方。一是risk_level的判断放在最前面,任何高风险动作在进入执行前就被人为截断,不给模型犯错的机会。二是estimate_scope这个函数,它要求在执行前先算出影响范围,这既是给用户看的,也是系统自己的一道保险——如果算出来的范围明显异常,就应该中止。
5.4 两个我踩过的坑:过度对话化与过度结构化
第一个坑是过度对话化。早年做的一个工具,所有功能都做成了对话入口,界面上除了一个输入框什么都没有。上线之后数据很难看:新用户第一次打开不知道能干什么,老用户嫌慢开始自己写脚本调接口。问题的本质是我们把"发现功能"这件事完全交给了用户的语言能力,而用户根本不知道系统能干什么,自然也就问不出好问题。
补救的办法是加了一层"能力清单",把常用的能力做成可见的卡片,同时保留对话框作为补充入口。改完之后新用户的首次成功率明显上来了。这件事让我记住一条:自然语言负责"表达",但不能负责"发现",发现功能这件事必须靠可见的界面。
第二个坑是过度结构化。吃了第一个坑的亏之后,我在另一个项目里矫枉过正,把 Agent 做成了一个特别复杂的表单系统,字段一大堆,用户填完才能提交。结果是长尾需求全部死掉了——用户遇到的稍微特殊一点的情况,表单里根本没有对应字段,只能放弃。最后这个系统退化成了一个普通的查询工具,Agent 那套能力纯属摆设。
两次踩坑之后我形成了一个比较稳的判断:主路径用结构化,旁支用自然语言,两者之间要有平滑的转换通道。用户从卡片点进来是结构化,从输入框进来是自然语言,但最终都会汇到同一套执行层。中间那个转换层是整件事的技术核心,也是最值得投入的地方。
6. 往前看:交互方式会往哪个方向收敛
预测未来这件事我一向谨慎,因为技术演进的路径依赖太强,很多时候不是最优解胜出,而是先跑通的那个胜出。但有一些结构性的东西是可以判断的,因为它们不依赖于具体模型的能力上限,而是由人本身的认知特点决定的。
6.1 真正的评价指标是"意图表达成本"
不管交互形式怎么变,有一个指标是不变的:用户从"心里有个想法"到"系统正确理解"之间,要付出多少成本。这个成本包含四部分——输入的字数或操作次数、组织语言的认知负荷、系统响应等待的时间、以及理解错了之后的纠错成本。
用这个指标去衡量,你会发现很多结论会翻转。语音输入看似最自然,但纠错成本极高,说错一个字要整句重来;点击看似最笨,但认知负荷接近零,熟练后可以盲操作;自然语言的输入成本低但纠错成本高,结构化的输入成本高但纠错成本低。
所以未来的方向不是"哪种方式取代哪种方式",而是让系统自动选择当前场景下意图表达成本最低的通道。用户想快就点击,想说就说话,想给就给张图,系统负责把这些都接住并归一到同一种内部表示。这才是"未来交互"该有的样子。
6.2 别把赌注押在单一入口上,押在意图可迁移
如果你正在做 Agent 产品,我建议把架构重心放在意图的标准化表示上,而不是某一种具体的输入方式。因为输入方式会变——今天流行对话框,明天可能流行侧边栏,后天可能是某种嵌入式的触发——但用户想做的事情本身是稳定的。
意图可迁移的意思是:不管用户是从对话进来的、从按钮进来的、还是从一条通知点进来的,系统内部拿到的都是同一份意图描述,走的是同一套执行和审计逻辑。这样换入口的成本就是换一层皮,而不是重写系统。
这件事还有一个隐性收益:用户的行为可以沉淀。用户在对话里反复表达的同一种需求,系统可以识别出来并建议"要不要把它存成一个快捷方式"。存下来的不是一段自然语言,而是一个参数化的结构化模板。下次用户点一下就能跑,需要改参数的时候再改。这就把自然语言的长尾能力和结构化的高效率接上了。
6.3 给正在做 Agent 的人几句不太好听的话
最后说几句实操层面的体会,可能不太好听,但都是踩过之后总结的。
先算清意图空间有多大,再决定交互形态。如果你的系统只支持十种操作,做对话式是浪费,做菜单就够了;如果支持一千种操作,做菜单是自嗨,必须上自然语言。中间地带才是混合设计真正发力地方,也是最能体现设计功力的地方。
确认环节一定要做成结构化的回显,不要做成对话追问。追问三次以上用户就会烦,而一次结构化的确认卡片可以在一屏内解决所有歧义。这个差别在数据上非常明显。
日志要能重放。每一层之间的输入输出都要落盘,包括模型的原始输出、解析后的结构化结果、实际执行的参数。出了问题的时候,能靠日志把整条链路重现一遍,比什么都强。我见过太多系统出问题之后只能靠猜。
别把多模态当噱头。截图理解、文件解析这些能力,只有在你真的解决了用户"懒得打字"或者"信息在纸上"的问题时才有价值。为了演示效果好而硬加一个上传图片的入口,用户试两次就不会再用了。
给熟练用户留一条快速通道。任何交互设计都会在熟练用户身上失效,因为他们已经形成了自己的肌肉记忆。快捷键、命令行、批量接口、可保存的模板,这些东西看起来不"未来",但它们决定了重度用户会不会流失。我个人的经验是,重度用户贡献的价值往往是普通用户的十几倍,为他们的效率做优化,投入产出比最高。
至于自然语言会不会是唯一交互方式,我的答案是不会,而且我不希望它是。单一通道意味着单一故障点,意味着所有场景都被迫适配同一种表达方式,那才是真正的倒退。多种通道并存、由系统智能调度、底层意图统一表示——这条路更慢,但走得远。