1. 项目背景与核心挑战
在构建现代智能助理系统时,我们经常遇到一个典型场景:用户需要一边通过语音与系统交流,一边在电脑上完成表单填写等操作。传统单Agent架构在处理这类多模态并发任务时,往往会遇到两个致命问题:
首先是实时性冲突。当系统正在处理网页截图、规划点击路径等计算密集型任务时,语音采集和处理链路会被阻塞,导致用户感受到明显的交互延迟。想象一下你在打电话时,对方突然长时间沉默的场景 - 这种"假死"体验会严重影响用户体验。
其次是上下文污染。将用户的口语化对话记录与庞大的网页DOM树混合在同一个Prompt上下文中,会导致大模型注意力分散。这就好比让一个人同时听电话会议和阅读技术文档,很容易产生理解错误。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 双Agent并行架构
我们设计的解决方案采用了职责解耦的思路,将系统划分为两个独立运行的智能体:
- Voice Agent:专注于低延迟语音交互
- Computer Agent:负责网页状态维护和操作
这两个Agent运行在独立的线程/进程中,通过线程安全队列进行全双工通信。这种设计类似于现代操作系统中"生产者-消费者"模式,每个组件专注自己的核心职责。
2.2 通信机制
系统采用非阻塞的消息总线机制:
- 下行任务(Task Link):Voice Agent将提取的表单字段封装为JSON投递到q1_queue
- 上行回调(Callback Link):Computer Agent执行完成后将状态信息打上标签投递到q2_queue
这种设计确保了即使在Computer Agent执行耗时操作时,Voice Agent仍能保持响应。
3. Voice Agent实现细节
3.1 语音活动检测
我们采用ONNX引擎驱动的Silero VAD(16kHz, 32ms帧)进行实时语音端点检测。这个轻量级模型能在边缘设备高效运行,确保及时捕捉用户语音输入。
对于打断处理,我们引入了一个创新机制:使用本地部署的轻量级模型(deepseek-v3-qwen2.5)作为"安检员",区分有效打断意图和无意义声音(如咳嗽声)。
python复制def _is_valid_interrupt(self, text: str) -> bool:
# 请求本地小模型判定是否为有效打断意图
response = self.small_llm_client.chat.completions.create(
model=config.SMALL_LLM_MODEL,
messages=[{"role": "user", "content": prompt}],
max_tokens=10,
timeout=3 # 硬超时设置
)
return "interrupt" in response.choices[0].message.content.strip().lower()
3.2 意图状态机
Voice Agent的核心是一个四步状态机:
- 场景观察:探测当前可填字段
- 信息采集:向用户询问缺失字段
- 指令下发:规范化处理后发送给Computer Agent
- 提交确认:表单完备后发起最终提交
为防止"工具风暴"(Tool Storm),我们在处理完工具结果后会禁止当次会话的级联调用。
3.3 TTS优化
直接推送短碎片Token到TTS会导致断顿感。我们实现了一个缓冲队列,利用句末标点切分完整语义块,确保播报语气连贯。
4. Computer Agent实现细节
4.1 渐进式操作策略
UI控制需要在准确率和速度间权衡。我们设计了渐进式操作降级策略:
- Fast-Path:优先使用JS注入直接操作DOM
javascript复制// 基于Label文本查找并填充Input
const labels = Array.from(document.querySelectorAll('label'));
for (const lab of labels) {
const txt = (lab.textContent || '').replace(/\s/g, '');
if (txt.includes(targetLabelText)) {
input.value = value;
input.dispatchEvent(new Event('input', {bubbles: true}));
input.dispatchEvent(new Event('change', {bubbles: true}));
break;
}
}
- Slow-Path:失败时回退到Browser-use多模态处理
4.2 历史记录优化
为避免主Agent上下文压力,我们对冗长的操作历史开辟了独立的摘要清洗链路进行数据瘦身。
5. 并发控制机制
系统集成了多种并发协调技术:
threading.Event:实现零CPU轮询的打断通知threading.RLock:保护共享数据免受竞争- 动态协程隔离:Playwright组件运行在独立的asyncio事件循环中
6. 系统部署与使用
6.1 环境准备
建议使用Python 3.13+虚拟环境:
bash复制pip install -r requirements.txt
playwright install
6.2 模型配置
需要准备:
- Silero VAD模型(silero_vad.onnx)
- 配置.env文件:
code复制OPENAI_API_KEY=sk-xxxxxx
SMALL_LLM_URL=http://localhost:11434/v1
6.3 启动流程
- 启动守护程序:
bash复制python main.py
- 打开前端页面(Frontend/index.html)
- 通过自然语言发起任务
7. 性能优化建议
在实际部署中,我们总结了以下优化经验:
- VAD参数调优:根据环境噪音调整Silero的阈值和窗口大小
- 队列容量监控:避免任务积压导致延迟
- 错误恢复机制:为每个Agent设计独立的心跳和重启策略
- 资源隔离:为计算密集型操作分配专用CPU核心
8. 典型问题排查
以下是我们在开发中遇到的常见问题及解决方案:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 语音识别延迟高 | VAD灵敏度设置不当 | 调整Silero阈值或更换更灵敏的麦克风 |
| DOM操作失败 | 页面动态加载未完成 | 增加等待时间或实现重试机制 |
| 上下文混乱 | 消息队列积压 | 实施背压机制或增加消费者线程 |
| TTS卡顿 | 缓冲区大小不合适 | 根据网络状况动态调整缓冲策略 |
9. 实际应用案例
在低空飞行计划申报场景中,系统展现了显著优势:
- 用户只需口述信息:"明天上午10点,在朝阳公园飞无人机"
- Voice Agent实时提取关键字段
- Computer Agent同步填写表单
- 整个过程无需用户手动操作界面
实测表明,相比传统串行架构,该方案将单次流程平均耗时缩短了35-40%,有效消除了系统假死感。
10. 扩展与演进
基于当前架构,我们规划了以下演进方向:
- 多Agent协作:引入Orchestrator Agent协调更多专用Agent
- 自适应负载均衡:根据系统负载动态调整处理策略
- 跨平台支持:扩展移动端和桌面应用场景
- 增强容错能力:实现更健壮的错误恢复机制
这个架构的核心价值在于其通用性 - 它不仅适用于表单填写场景,还可以扩展到任何需要并发处理语音和UI操作的智能助理应用中。
