优化端到端对话延迟
在和智能体对话场景中,延迟是影响用户体验的关键因素。本文帮助你理解和优化与对话式智能体的端到端对话延迟,从而提升用户体验。
理解延迟构成
使用 ASR、LLM、TTS 三段式(Cascaded)架构时,端到端延迟由以下部分组成:
端到端延迟 = RTC 延迟 + 算法前处理延迟 + ASR 延迟 + LLM 延迟 + TTS 延迟 (+ 数字人延迟)
各模块延迟说明
根据实际测试数据,各模块的典型延迟范围如下:
| 模块 | 延迟指标 | 说明 | 典型延迟范围 |
|---|---|---|---|
| RTC | 音视频延迟 | 包括音频采集、编码、网络传输、解码、播放等环节 | 150-300 ms |
| 算法前处理 | 前处理延迟 | 包括 VAD(语音活动检测)、优雅打断(AIVAD)等算法处理时间 | 560-940 ms |
| ASR | asr_ttlw | Time To Last Word,从用户说话结束到 ASR 输出最后一个词的延迟 | 400-700 ms |
| LLM | llm_ttfb / llm_ttfs | TTFB: Time To First Byte,首字节延迟 TTFS: Time To First Sentence,首句延迟 | 250-1000 ms |
| TTS | tts_ttfb | Time To First Byte,从 TTS 请求开始到收到第一个字节的响应延迟 | 100-350 ms |
| 数字人 | 渲染延迟 | 数字人模块收到 TTS 音频第一帧到数字人生成并对齐音视频第一帧的延迟(如启用) | 50-200 ms |
真实延迟示例
以下是一次实际对话中三个对话轮次的延迟数据,来自声网消息通知服务的 111 agent metrics 事件:
{
"metrics": [
{
"turn_id": 1,
"tts_ttfb": 61
},
{
"turn_id": 2,
"asr_ttlw": 141,
"llm_ttfb": 270,
"llm_ttfs": 482,
"tts_ttfb": 90,
},
{
"turn_id": 3,
"asr_ttlw": 103,
"llm_ttfb": 306,
"llm_ttfs": 948,
"tts_ttfb": 106,
}
]
}
查看延迟指标
对话式 AI 引擎提供了两种方式查看每个对话轮次的延迟指标:
方式一:通过客户端组件监听
如果你使用客户端组件(Android/iOS/Web),可以通过注册 onAgentMetrics 回调来实时监听智能体性能指标。
- Android
- iOS
- Web
api.addHandler(object : IConversationalAIAPIEventHandler {
override fun onAgentMetrics(agentUserId: String, metric: Metric) {
when (metric.type) {
ModuleType.ASR -> {
Log.d("Metrics", "ASR TTLW: ${metric.value}ms")
}
ModuleType.LLM -> {
// metric.name 可能是 "ttfb" 或 "ttfs"
Log.d("Metrics", "LLM ${metric.name}: ${metric.value}ms")
}
ModuleType.TTS -> {
Log.d("Metrics", "TTS TTFB: ${metric.value}ms")
}
ModuleType.TOTAL -> {
Log.d("Metrics", "Total Delay: ${metric.value}ms")
}
else -> {
Log.d("Metrics", "${metric.type}: ${metric.name} = ${metric.value}ms")
}
}
}
})
func onAgentMetrics(agentUserId: String, metrics: Metric) {
switch metrics.type {
case .asr:
print("ASR TTLW: \(metrics.value)ms")
case .llm:
print("LLM \(metrics.name): \(metrics.value)ms")
case .tts:
print("TTS TTFB: \(metrics.value)ms")
case .total:
print("Total Delay: \(metrics.value)ms")
case .unknown:
print("Unknown metric: \(metrics.name) = \(metrics.value)ms")
}
}
conversationalAIAPI.on(
EConversationalAIAPIEvents.AGENT_METRICS,
(agentUserId: string, metrics: Metric) => {
console.log(`[${metrics.type}] ${metrics.name}: ${metrics.value}ms`);
if (metrics.type === 'TOTAL') {
console.log(`Total delay for turn: ${metrics.value}ms`);
}
}
);
详细的集成步骤和 API 参考请见监听智能体事件。
方式二:通过消息通知服务(NCS)
如果你开通了声网消息通知服务,可以通过接收 eventType 为 111 的 agent metrics 事件来获取智能体性能指标。
事件回调示例
{
"noticeId": "2000001428:4330:107",
"productId": 17,
"eventType": 111,
"notifyMs": 1611566412672,
"payload": {
"agent_id": "A42AC47Hxxxxxxxx4PK27ND25E",
"start_ts": 1000,
"stop_ts": 1672531200,
"channel": "test-channel",
"metrics": [
{
"turn_id": 1,
"tts_ttfb": 61
},
{
"turn_id": 2,
"asr_ttlw": 141,
"llm_ttfb": 270,
"llm_ttfs": 482,
"tts_ttfb": 90,
}
]
}
}
详细的事件字段说明请见事件类型 - 111 agent metrics。
优化三段式架构延迟
1. 优化 LLM/ASR/TTS 模块
LLM 通常是延迟贡献最高的模块。优化 LLM 可以显著降低整体延迟。
选择低延迟的供应商
不同的 LLM/ASR/TTS 供应商和模型在响应速度上存在显著差异。你可以参考对话式 AI 引擎适配各主流模型的实时性能数据来比较不同 ASR/LLM/TTS 供应商的性能指标。
优化参数配置
在创建智能体时,可通过阅读 ASR/LLM/TTS 供应商文档,了解供应商提供的参数,结合实际场景进行参数调优。以下为一些通用的优化思路:
- LLM
- 选择小型模型: 如
gpt-4o-mini、claude-3-haiku等,通常比大型模型响应更快。 - 限制 max_tokens: 减少生成的最大 Token 数可以降低 TTFS(首句延迟)。
- 选择小型模型: 如
- ASR
- 使用供应商推荐的采样率: 使用供应商推荐的采样率(如 16kHz),避免不必要的重采样。
- 限制语言模型: 使用
phrases或context参数提供领域特定词汇,提高识别速度。 - 禁用非必要功能:部分供应商提供输出标点符号、语气等高级参数,可根据实际场景禁用以提高响应速度。
- TTS
- 选择更快的模式: 部分 TTS 提供
turbo或low-latency等模式,通常比默认模式响应更快。 - 选择更快的音色: 部分 TTS 提供不同复杂度的输出音色可选,选择复杂度较低的音色可以减少生成时间。
- 禁用非必要功能:部分供应商提供语气、情感高级参数,可根据实际场景禁用以提高响应速度。
- 选择更快的模式: 部分 TTS 提供
以下为优化 LLM 参数的示例:
{
"properties": {
"llm": {
"url": "https://api.openai.com/v1/chat/completions",
"api_key": "your_api_key",
"params": {
"model": "gpt-4o-mini", // 选择响应更快的模型
"temperature": 0.7,
"max_tokens": 150, // 限制生成长度以减少延迟
"stream": true // 启用流式响应
}
}
}
}
2. 优化 RTC 模块延迟
RTC 延迟包括音频采集、编码、网络传输、解码、播放等环节。优化 RTC 延迟需要在客户端进行音频设置。
使用 AI 对话场景
声网 RTC SDK 4.5.1 及以上版本支持 AI 对话场景(AUDIO_SCENARIO_AI_CLIENT),该场景针对 AI 对话进行了专门优化,包括:
- 优化的音频 3A 算法(回声消除、降噪、增益控制)
- 更低的音频采集和播放延迟
- 针对 AI 语音特征的音频处理
- Android
- iOS
// 方式一:使用客户端组件 API(推荐)
val config = ConversationalAIAPIConfig(
rtcEngine = rtcEngineInstance,
rtmClient = rtmClientInstance,
enableLog = true
)
val api = ConversationalAIAPIImpl(config)
// 加载最佳音频设置
api.loadAudioSettings()
// 方式二:直接设置 RTC SDK
val config = RtcEngineConfig()
config.mAudioScenario = Constants.AUDIO_SCENARIO_AI_CLIENT
rtcEngine = RtcEngine.create(config)
// 方式一:使用客户端组件 API(推荐)
let config = ConversationalAIAPIConfig(
rtcEngine: rtcEngine,
rtmEngine: rtmEngine,
enableLog: true
)
convoAIAPI = ConversationalAIAPIImpl(config: config)
// 加载最佳音频设置
convoAIAPI.loadAudioSettings()
// 方式二:直接设置 RTC SDK
let config = AgoraRtcEngineConfig()
config.audioScenario = .aiClient
rtcEngine = AgoraRtcEngineKit.sharedEngine(with: config, delegate: delegate)
详细的优化音频设置请见优化音频设置。
延迟优化检查清单
使用以下检查清单来系统性地优化你的对话式智能体延迟:
服务端优化
- 选择低延迟的 LLM 模型: 参考对话式 AI 引擎适配各主流模型的实时性能数据选择延迟表现优秀的模型
- 启用流式响应: 确保
stream: true - 选择低延迟的 ASR/TTS 供应商: 使用
turbo或low-latency等模式 - 优化地理部署: 将 ASR、LLM、TTS 部署在同一区域
- 配置区域访问限制: 使用
geofence参数锁定最佳区域
客户端优化
- 使用 AI 对话场景: 设置
AUDIO_SCENARIO_AI_CLIENT(RTC SDK 4.5.1+) - 加载最佳音频设置: 调用客户端组件的
loadAudioSettings()方法 - 集成必需的音频插件: 确保集成 AI 降噪和 AI 回声消除插件
- 优化网络条件: 确保用户网络连接稳定,考虑使用 SD-RTN™ 优化网络传输
监控和分析
- 实时监听延迟指标: 通过客户端组件或 NCS 获取每轮对话的延迟数据
- 识别延迟瓶颈: 分析哪个模块的延迟贡献最大
- 持续优化: 根据实际数据调整配置,进行 A/B 测试
延迟与质量的权衡
在优化延迟时,需要在响应速度和对话质量之间找到平衡:
| 优化策略 | 延迟影响 | 质量影响 | 建议场景 |
|---|---|---|---|
| 使用小型 LLM 模型 | ✅ 显著降低 | ⚠️ 可能降低 | 对延迟敏感、对话相对简单的场景 |
| 限制 max_tokens | ✅ 适度降低 | ⚠️ 可能影响完整性 | 需要简短回复的场景 |
| 区域访问限制 | ✅ 适度降低 | ➖ 无影响 | 用户集中在特定区域 |
| 优化 RTC 设置 | ✅ 适度降低 | ➖ 无影响 | 所有场景 |
建议先通过监听延迟指标识别瓶颈,然后针对性地优化贡献最大的模块,而不是盲目追求极致的低延迟。