Agent Basic / 14
多模态与实时交互 Agent
前面十三篇讲的 Agent 几乎都在处理文本:文本输入、文本推理、文本输出。但 2026 年的现实是,用户越来越多地期望 Agent 能听、能看、能操作界面——而不只是读写文字。
这篇文章覆盖两大方向:
- Voice Agent:语音输入/输出的实时对话系统
- Computer Use / GUI Agent:直接操作图形界面的自主 Agent
以及它们共享的核心工程原则:快慢解耦。
为什么多模态 Agent 在 2026 年成为刚需
从 2023 年到 2026 年,Agent 的交互界面经历了三个阶段:
Text-only Agent → Voice/Vision 增强 → 多模态原生 Agent
(CLI/API) (加个语音接口) (感知-决策-执行 全链路多模态)
驱动这个变化的不是技术酷炫度,而是三个工程现实:
- 用户场景要求:客服、车载、智能家居——用户的手和眼睛被占用,文本交互不可行
- 任务复杂度要求:自动化操作网页/桌面软件,纯 API 集成覆盖不了长尾应用
- 模型能力到位:多模态模型在 2025-2026 年密集发布,延迟和成本降到可用水平
关键认知:多模态不是”给文本 Agent 加个语音前端”,而是需要重新设计 Agent 的感知-决策-执行循环。延迟约束、信息密度、错误恢复方式都完全不同。
Voice Agent 三种架构范式
Cascaded 级联架构
最经典的 pipeline 方案:
flowchart LR
A[用户语音] --> B[VAD]
B --> C[ASR]
C --> D[LLM]
D --> E[TTS]
E --> F[语音输出]
- VAD(Voice Activity Detection):检测用户是否在说话
- ASR(Automatic Speech Recognition):语音转文本
- LLM:文本推理,生成回复
- TTS(Text-to-Speech):文本转语音
工程特点:
- 每个环节独立优化、独立替换
- LLM 部分和文本 Agent 完全复用,工具调用、记忆管理等已有方案直接适用
- 延迟是各环节之和:VAD(~200ms) + ASR(~300ms) + LLM(~500ms) + TTS(~300ms) = 1.3s+
- 语调、情感等副语言信息在 ASR 阶段丢失
Omni 端到端架构
单一多模态模型直接处理音频输入、产生音频输出:
flowchart LR
A[用户语音] --> B[Omni Model]
B --> C[语音输出]
B --> D[工具调用/文本]
工程特点:
- 延迟极低(模型直接从音频 token 生成音频 token,无中间转换)
- 保留副语言信息:语调、情感、说话速度
- 可控性差:难以约束模型的回复格式、工具调用逻辑
- 调试困难:中间没有文本表示,无法 log 模型”想了什么”
- 成本高:音频 token 数量远大于等价文本
Full-duplex 全双工架构
模拟人类对话:可以被打断、可以边听边说、可以在对方说话时思考。
flowchart TB
subgraph 输入通道
A[持续监听] --> B[语音理解]
end
subgraph 输出通道
C[语音生成] --> D[持续播放]
end
subgraph 控制层
E[打断检测]
F[轮次管理]
G[并行推理]
end
B --> G
G --> C
E --> C
工程特点:
- 最接近自然人类对话体验
- 需要处理”同时说话”的冲突
- 打断检测本身就是一个独立的模型/规则模块
- 需要流式生成 + 流式播放 + 随时取消的基础设施
三种范式对比
| 维度 | Cascaded 级联 | Omni 端到端 | Full-duplex 全双工 |
|---|---|---|---|
| 端到端延迟 | 1.3s+ | 300-500ms | 500-800ms |
| 可控性 | 高(文本中间层可审计) | 低(黑盒) | 中(混合架构) |
| 工具调用支持 | 成熟 | 有限 | 成熟 |
| 情感/语调保留 | 丢失 | 保留 | 部分保留 |
| 工程复杂度 | 低 | 中 | 高 |
| 成本(相同对话量) | 低 | 高 | 中 |
| 适用场景 | 客服、内部工具 | 陪伴、娱乐 | 实时助手、电话场景 |
实际工程中,很多团队采用混合方案:用 Omni 做快速响应的”嗯、好的”等短回复,用 Cascaded 做需要工具调用的复杂回复。
Computer Use / GUI Agent
GUI Agent 的目标:让 AI 像人类用户一样操作图形界面——点击按钮、输入文字、滚动页面、读取屏幕内容。
动作空间设计
GUI Agent 需要定义一组有限的动作原语:
# 典型动作空间
actions = {
"click": {"x": int, "y": int, "button": "left|right"},
"type": {"text": str},
"scroll": {"direction": "up|down|left|right", "amount": int},
"key": {"keys": str}, # 如 "ctrl+c"
"screenshot": {}, # 获取当前屏幕截图
"wait": {"seconds": float}, # 等待页面加载
"drag": {"from_x": int, "from_y": int, "to_x": int, "to_y": int},
}
设计原则:
- 原子性:每个动作是最小操作单元,组合出复杂行为
- 可逆性标注:区分可逆操作(滚动、切换标签页)和不可逆操作(删除、提交、发送)
- 等待机制:UI 操作后需要等待渲染完成再截图验证
视觉定位方法
模型看到截图后,如何指定”点击哪里”?两种主流方案:
方案 A:Set-of-Mark(SoM)标注选择
截图 → 视觉模型检测可交互元素 → 标注编号 → 发给 LLM
LLM 回复:"点击标记 [7] 的按钮"
优点:LLM 只需选 ID,不需要空间推理能力;定位精确。 缺点:多一步检测;遗漏元素时无法操作。
方案 B:坐标定位
截图 → 直接发给多模态 LLM
LLM 回复:"click(324, 178)"
优点:无需额外检测步骤;能操作任何可见元素。 缺点:坐标精度依赖模型视觉能力;分辨率变化时坐标失效。
实践建议:优先用 SoM(稳定性高),对 SoM 覆盖不到的元素 fallback 到坐标定位。
安全边界
GUI Agent 直接操作用户界面,安全问题比 API 调用严重得多:
flowchart TD
A[Agent 规划动作] --> B{动作分类}
B -->|可逆| C[直接执行]
B -->|不可逆| D{风险等级}
D -->|低风险| E[执行 + 记录]
D -->|高风险| F[暂停 + 人工确认]
C --> G[截图验证]
E --> G
F -->|确认| E
F -->|拒绝| H[回滚/取消]
关键安全措施:
| 层次 | 措施 | 说明 |
|---|---|---|
| 环境隔离 | 沙箱/虚拟机 | Agent 在隔离环境中操作,不影响宿主机 |
| 权限收窄 | 白名单应用 | 只允许操作指定应用,禁止访问敏感区域 |
| 操作审批 | 不可逆操作确认 | 删除、发送、付款等动作需人工确认 |
| 执行限速 | 动作频率限制 | 防止失控循环高频点击 |
| 状态验证 | 操作后截图对比 | 确认动作产生了预期效果 |
当前落地的代表产品
- Claude Computer Use:Anthropic 提供的 API 能力,模型直接接收截图、输出鼠标/键盘动作坐标
- Open Interpreter / OS-Copilot:开源方案,组合视觉模型 + 动作执行层
- 各类 RPA 增强:传统 RPA 工具接入 LLM 做决策层,保留原有的元素定位和操作基础设施
- 浏览器自动化:基于 Playwright/Puppeteer + 视觉理解,处理网页交互
共同的架构模式:
截图/DOM → 理解当前状态 → 规划下一步动作 → 执行 → 验证 → 循环
快慢解耦:跨模态的共性设计原则
Voice Agent 和 GUI Agent 看起来是完全不同的场景,但它们面临同一个核心矛盾:
用户期望实时响应(快),但深度推理需要时间(慢)。
解决方案是同一个:把实时响应通道和深度推理通道分离,并行运行。
Voice Agent 中的快慢解耦
flowchart LR
subgraph 快通道
A[用户说话] --> B[即时响应]
B --> C["嗯/好的/我想想"]
end
subgraph 慢通道
A --> D[完整理解]
D --> E[工具调用/推理]
E --> F[完整回复]
end
C -.->|争取时间| F
- 快通道:识别到用户说完,立即给出填充词或短确认,维持对话节奏
- 慢通道:同时启动完整的语义理解、工具调用、回复生成
- 快通道为慢通道”争取时间”,用户感知延迟从实际推理时间降到填充词的响应时间
GUI Agent 中的快慢解耦
flowchart LR
subgraph 快通道
A[截图] --> B[识别下一步动作]
B --> C[执行点击/输入]
end
subgraph 慢通道
A --> D[全局状态评估]
D --> E[重新规划路径]
E --> F[更新动作队列]
end
C --> G{每 N 步}
G -->|触发| D
G -->|继续| B
- 快通道:按已有计划快速执行下一个动作(不重新思考整体策略)
- 慢通道:每隔 N 步或检测到异常时,做全局状态评估,必要时重新规划
- 避免”每一步都做完整推理”带来的延迟爆炸
核心思想总结
| 维度 | 快通道 | 慢通道 |
|---|---|---|
| 职责 | 维持交互节奏 | 保证决策质量 |
| 延迟要求 | <200ms | 可接受 1-5s |
| 模型规模 | 小模型/规则 | 大模型/多步推理 |
| 触发条件 | 每次交互 | 定期/异常时 |
| 失败代价 | 低(填充词/单步动作) | 高(整体策略错误) |
这个模式在系统设计中并不新鲜——它本质上就是缓存 + 后台刷新的交互版本。
工程挑战
延迟预算管理
多模态 Agent 的延迟是硬约束,不像文本 Agent 可以”多想一会儿”。
Voice Agent 延迟预算示例:
总预算 = 800ms(超过则用户感知"卡顿")
分配:
- 网络传输:100ms
- 语音理解:150ms
- LLM 推理:350ms(含首 token 时间)
- 语音合成:150ms
- 播放缓冲:50ms
工程手段:
- 流式处理:LLM 生成第一个句子时就开始 TTS,不等全部生成完
- 预计算:根据对话上下文预测可能的回复方向,提前准备
- 分级降级:延迟超标时,降级到模板回复或短确认
多模态信息对齐
不同模态的信息需要在时间和语义上对齐:
- Voice:用户说”就是那个”时,”那个”指代什么?需要对话历史 + 可能的视觉上下文
- GUI:截图中的文字内容需要和操作记忆对齐——”我刚才填的那个表单”在哪里?
对齐策略:
- 统一时间轴:所有模态的事件按时间戳排序,形成统一上下文
- 显式引用消解:在 prompt 中把指代关系解析为具体对象
- 状态快照:关键时刻保存完整状态(截图 + 文本 + 音频片段),供后续引用
错误恢复
多模态场景的错误恢复比文本场景复杂得多:
Voice Agent 错误恢复:
检测到错误 → 主动确认
"您是说要转到人工客服,还是查询账户余额?"
- ASR 识别不确定时,主动向用户确认
- 工具调用失败时,用自然语言解释并给出替代方案
- 关键操作前复述确认:”我将为您转账 500 元到 XXX 账户,确认吗?”
GUI Agent 错误恢复:
执行动作 → 截图验证 → 不符合预期 → 回退/重试
- 每次动作后截图,对比预期状态和实际状态
- 页面未响应:等待 + 重试
- 导航到错误页面:检测到后回退
- 操作产生错误弹窗:识别弹窗内容,决定如何处理
共同原则:检测-确认-恢复三步循环,而不是盲目重试。
小结
多模态 Agent 不是”给文本 Agent 加个语音/视觉接口”,而是需要重新设计感知-决策-执行循环。
核心要点:
- Voice Agent 三种范式各有适用场景:Cascaded 可控性最高,Omni 延迟最低,Full-duplex 体验最好
- GUI Agent 的核心挑战是动作空间设计、视觉定位、安全边界三个维度
- 快慢解耦是跨模态的通用设计原则——把实时响应和深度推理分成并行通道
- 延迟预算是硬约束,需要流式处理、预计算、分级降级等工程手段
- 错误恢复需要”检测-确认-恢复”循环,而不是简单重试
对于开发者的实践建议:
- 如果你在做 Voice Agent,从 Cascaded 起步(可控、可调试),需要低延迟时再引入 Omni 混合
- 如果你在做 GUI Agent,从 SoM + 沙箱环境起步,建立完善的截图验证机制
- 无论哪种模态,都优先实现快慢解耦——这是用户体验和系统可靠性的关键
延伸:Embodied Agent 与机器人控制
Voice 和 GUI 之后,多模态的下一个边界是物理世界——让 Agent 控制机械臂、移动机器人或具身智能体。这比屏幕操作多了连续控制、物理安全和感知延迟等新维度。
双层架构:规划与控制分离
Embodied Agent 通常把系统拆成两层:
┌──────────────────────────────────────┐
│ 高层规划(VLM / LLM) │
│ · 理解自然语言指令 │
│ · 把目标分解为子任务序列 │
│ · 周期性重新评估(秒级) │
├──────────────────────────────────────┤
│ 底层控制(VLA / Policy Network) │
│ · 把子任务转为连续动作轨迹 │
│ · 毫秒级实时执行 │
│ · 处理物理反馈和安全约束 │
└──────────────────────────────────────┘
这本质上就是”快慢解耦”在物理世界的体现:
- 慢通道(规划层):用大模型理解任务语义、做长程规划,允许几百毫秒延迟
- 快通道(控制层):用轻量策略网络高频输出动作指令,必须实时
VLA(Vision-Language-Action)模型
VLA 是把视觉、语言和动作统一到一个模型中的方向:
- 输入:摄像头画面 + 自然语言指令
- 输出:机器人关节动作序列
代表工作:RT-2、Octo、OpenVLA 等。核心思路是把动作 token 化,让语言模型直接”生成”动作序列,复用预训练的视觉-语言能力。
Action Chunking:弥补频率鸿沟
LLM 推理一次需要几十到几百毫秒,但机器人控制通常需要 50-200Hz 的频率。解决方案是 Action Chunking——模型一次预测 0.5-1 秒的动作序列(chunk),控制器按频率逐步执行:
模型推理(200ms)→ 输出 10 个动作步(覆盖 500ms)→ 控制器 50Hz 回放
→ 下一次推理在回放结束前开始(pipeline)
这让模型推理频率降到 2-5Hz 而控制仍保持高频。
Sim2Real:仿真到真实的迁移
在真实机器人上收集数据成本极高。主流做法是先在仿真环境中训练,再迁移到真实世界:
| 阶段 | 做什么 | 关键挑战 |
|---|---|---|
| 仿真训练 | 在物理模拟器中大量生成交互轨迹 | 仿真器的物理精度有限 |
| Domain Randomization | 随机化纹理、光照、物理参数 | 让策略不依赖特定视觉/物理特征 |
| Real-world Fine-tune | 用少量真实数据微调 | 真实数据昂贵但必不可少 |
核心原则:在仿真中获得泛化,在真实中获得精度。
安全是物理 Agent 的第一约束
与软件 Agent 不同,物理 Agent 的错误可能造成真实伤害:
- 力矩限制:关节力不能超过安全阈值
- 碰撞检测:实时监测与人/物的距离
- 紧急停止:任何异常立即触发硬件级别的安全停止
- 行为约束:高层规划的动作必须通过安全验证才能下发给控制层
这也是为什么双层架构中,控制层往往不直接使用大模型输出,而是经过安全过滤器。
对软件 Agent 工程师的启示
即使你不做机器人,Embodied AI 的工程模式也有迁移价值:
- 双层架构的思想适用于任何”规划慢但执行要快”的场景
- Action Chunking 的思想适用于高频决策场景(如实时交易、游戏 AI)
- Sim2Real 的思想适用于”用模拟环境训练、在真实环境部署”的任何 Agent 系统
- 安全第一的原则在所有有副作用的 Agent 中都应遵守
参考资料
- 李博杰《深入理解 AI Agent:设计原理与工程实践》,第九章:多模态 Agent,固定提交
e3883f8c。本文按本仓库基础教程定位重新组织结构和表述,聚焦工程模式层面。 - OpenAI Realtime API 文档:Voice Agent 的 Full-duplex 参考实现
- Anthropic Claude Computer Use 文档:GUI Agent 的 API 设计参考
- WebArena / OSWorld benchmark:GUI Agent 的评测基准