教程

ADK 语音 Agent Eval:把“听起来不错”变成 CI 可测

Google 在 8 月 24 日为 Agent Development Kit(ADK)介绍了原生 Live Evaluation:开发者现在可以让一个 LLM 驱动的模拟用户直接“说话”给语音 Agent,完成多轮真实音频对话,再用自然语言 Rubric、逐轮指标和 Tool Execution 结果进行评分。官方示例使用三个 `gemini-live-2.5-flash-native-audio` Agent 串成一个 Graph Workflow,用 `gemini-3.7-flash` 控制模拟用户的对话逻辑,用 `gemini-3.1-flash-tts-preview` 合成用户音频,并可以通过 `AgentEvaluator` 接入 CI/CD。对实时语音 Agent 来说,这意味着测试终于从“人工听 Demo”进入可回归、可自动化的工程阶段。

# ADK 语音 Agent Eval:把“听起来不错”变成 CI 可测 ## 文章摘要 Google 在 8 月 24 日为 Agent Development Kit(ADK)介绍了原生 Live Evaluation:开发者现在可以让一个 LLM 驱动的模拟用户直接“说话”给语音 Agent,完成多轮真实音频对话,再用自然语言 Rubric、逐轮指标和 Tool Execution 结果进行评分。官方示例使用三个 `gemini-live-2.5-flash-native-audio` Agent 串成一个 Graph Workflow,用 `gemini-3.7-flash` 控制模拟用户的对话逻辑,用 `gemini-3.1-flash-tts-preview` 合成用户音频,并可以通过 `AgentEvaluator` 接入 CI/CD。对实时语音 Agent 来说,这意味着测试终于从“人工听 Demo”进入可回归、可自动化的工程阶段。 --- 语音 Agent 最危险的错觉是: > “我刚刚打了一通电话,效果挺自然。” 这不叫测试。 因为实时语音系统可能在下一次: - Prompt 改了一句话; - 模型换了一个版本; - Tool Description 改了; - 多 Agent Handoff 顺序变化; 以后突然出现: - 不调用工具; - 忘记上一轮上下文; - 用户插话时继续说; - 身份没验证就泄露信息; - 错过结束条件; - 语音里把日期说错。 文本 Agent 可以比较字符串。 语音 Agent 需要测试的是: > **整个多轮行为轨迹。** ## Google ADK 的 Live Eval 到底测什么? 官方示例不是单 Agent Chatbot。 而是一个三阶段 Workflow: ```text Greeter Agent ↓ DOB Verifier Agent ↓ Goals Agent ``` 中间还有 Tool Call: ```text validate_date_of_birth() ``` 整个过程使用: ```text gemini-live-2.5-flash-native-audio ``` 音频流持续打开。 ADK 会保留: - Session State; - Conversation History; - Agent Handoff 上下文。 用户听起来像是在和一个 Agent 连续对话。 ## 语音 Agent 的 Eval 不应该只看最后一句 例如医疗预约场景。 最终 Agent 说: > “你周二下午3点有预约。” 这句话本身可能完全正确。 但如果它在: ```text 没确认姓名 没验证生日 ``` 之前就说出来,整个流程仍然失败。 所以 Google 示例使用的是: ```text rubric_based_multi_turn_trajectory_quality_v1 ``` 评的是: > 整条对话轨迹是否满足业务规则。 ## 一个关键 Rubric:先身份验证,再披露信息 官方示例中的 Rule 类似: ```text Across the call, the agent confirms the caller's name and validates date of birth before disclosing appointment details. ``` 这比: ```text expected_output = "Tuesday 3 PM" ``` 成熟得多。 因为真实业务真正关心的是: ```text 顺序 权限 工具调用 信息披露 最终结果 ``` ## 两种测试方式:Scenario 和 Fixed Conversation ADK 支持两种思路。 ### Conversation Scenario 只描述: - Persona; - Goal; - Conversation Plan。 模拟用户自己决定每轮怎么说。 例如: ```json { "starting_prompt": "Hello?", "conversation_plan": "Confirm your identity, provide DOB, ask what to bring...", "user_persona": "NOVICE" } ``` 这种方式适合测试: > Agent 是否真的会主动推动对话。 ### Fixed Conversation 你把用户每轮话写死: ```text Turn 1: Hi, this is John Doe. Turn 2: My DOB is July 12, 1985. ``` 适合: - 精确回归; - 已知 Bug; - Compliance Case。 ## 为什么 Scenario 比固定脚本更接近真实用户? 因为真人不会按 Test Case 说话。 同一个目标可能说: ```text “我生日是85年7月12号。” ``` 也可能说: ```text “July twelfth, eighty-five.” ``` 或者: ```text “等一下,我身份证上是12号。” ``` 如果只测试固定字符串,系统很容易: > 测试全部通过,真实电话大量失败。 ## Persona 是一个非常有价值的变量 Google 示例中的: ```text NOVICE ``` 模拟用户不会一次把所有必要信息全说完。 它只提供高层目标,等 Agent 主动追问。 企业可以继续增加: ```text IMPATIENT ELDERLY INTERRUPTING NON_NATIVE ANGRY CONFUSED FAST_SPEAKER ``` 不一定是官方内置 Persona。 可以通过 Prompt 驱动扩展。 ## 用户模拟模型和音频模型是分开的 这是架构里一个很聪明的设计。 例如: ```text model = gemini-3.7-flash ``` 负责: > “下一轮用户应该说什么?” 而: ```text audio_model = gemini-3.1-flash-tts-preview ``` 负责: > “把这句话说出来。” 因此可以独立改变: - Voice; - Language; - Accent; - User Behavior。 这让 Eval 组合更丰富。 ## 一个最小 Live Eval 配置 核心结构大致是: ```json { "criteria": { "rubric_based_multi_turn_trajectory_quality_v1": { "threshold": 0.7, "judge_model_options": { "judge_model": "gemini-3.7-flash" } } }, "live_model_config": { "timeout_seconds": 300 }, "user_simulator_config": { "type": "llm_audio", "model": "gemini-3.7-flash", "max_allowed_invocations": 10, "audio_model": "gemini-3.1-flash-tts-preview" } } ``` 这几个字段都很重要。 ## `max_allowed_invocations` 为什么必须有? 动态模拟用户可能出现: ```text Agent 不结束 ↓ Simulator 继续说 ↓ Agent 再说 ↓ 无限循环 ``` 所以必须给测试: > 上限。 例如: ```text 10 Turns ``` 超过就失败。 生产环境同样需要类似: - Max Turns; - Max Duration; - Max Tool Calls; - Max Cost。 ## 语音 Eval 应该分五层指标 ### 1. Content Correctness 内容是否正确。 ### 2. Workflow Correctness 有没有按正确顺序完成业务步骤。 ### 3. Tool Correctness 工具是否: - 该调时调; - 参数正确; - 不重复调。 ### 4. Conversation Quality 是否: - 一次只问一个问题; - 不机械; - 不重复; - 能处理澄清。 ### 5. Realtime Behavior 是否: - 插话能停; - 恢复正确; - 沉默不过长; - Handoff 不突兀。 ## 文本测试通过,语音仍然可能失败 同一套 Case,如果不配置 `live_model_config`,可以按文本模式运行。 这非常有价值。 企业可以做: ```text Text Eval ↓ 通过 ↓ Live Audio Eval ↓ 通过 ↓ Release ``` 如果文本通过、语音失败,说明问题可能在: - ASR/TTS; - Turn-taking; - Realtime State; - Barge-in; - Audio Timing。 而不是业务逻辑。 ## 如何把它接进 CI/CD? Google 明确表示可以通过: ```text AgentEvaluator ``` 程序化调用同一套 Pipeline。 可以设计: ```text Pull Request ↓ Unit Test ↓ Agent Text Eval ↓ Agent Live Eval ↓ Threshold Gate ↓ Merge ``` 当然,语音测试成本通常高于普通 Unit Test。 所以可以分层。 ## 推荐的 CI 分层 ### 每个 PR 跑: ```text 10 个核心 Text Eval 3 个核心 Live Eval ``` ### Nightly 跑: ```text 50~100 个 Persona / Scenario ``` ### Release Candidate 跑: ```text 全量 Voice Regression 多语言 不同声音 中断 网络波动 Tool Failure ``` 这样成本更合理。 ## ADK Web 为什么也很重要? 自动 Score 不是全部。 ADK Web 可以把 Live Run 重建成: - Transcript; - 每轮消息; - 可播放的 Audio Clip。 也就是说,当 Eval 失败时,开发者可以: > 直接听出问题。 这对语音系统非常重要。 很多失败看文字没问题,听起来却非常糟糕。 例如: - 语速奇怪; - 句子断裂; - Handoff 突然换风格; - 用户插话后 Agent 又接着说旧内容。 ## 语音 Agent 还应该额外测哪些指标? Google 示例主要展示 ADK 原生功能。 生产环境建议再增加: ```text First Audio Latency Turn Latency Silence Time Barge-in Stop Latency Tool P95 Call Completion Rate Abandonment Rate Escalation Accuracy ``` 尤其是: > **Silence Time。** 用户最讨厌的不一定是模型慢。 而是电话里出现 4 秒死寂。 ## 如何设计一个真正有用的 Eval Set? 不要只写 Happy Path。 至少包含: ### 正常用户 ### 用户说错后纠正 ### 用户插话 ### 用户答非所问 ### Tool Timeout ### Tool 返回空结果 ### 身份验证失败 ### 用户要求越权信息 ### 通话中改变目标 ### Agent Handoff ### 多语言 / 口音 ### 长对话后回忆前文 这才接近真实生产。 ## 最终判断 Google ADK 的 Live Evaluation 最重要的意义不是“多了一个测试命令”。 而是实时语音 Agent 终于可以从: ```text 人工 Demo ``` 变成: ```text Scenario + Synthetic Audio User + Rubric + Tool Metrics + Regression + CI Gate ``` 任何准备把语音 Agent 放进: - 客服; - 医疗预约; - 销售; - 银行; - 企业内部热线; 的团队,都不应该再把: > “听起来挺自然” 当作上线标准。 更成熟的标准应该是: > **每次 Prompt、模型和工具变化,都能自动证明关键多轮行为没有退化。** 想继续了解 Gemini Live、Google ADK、语音 Agent 和生产级 Eval,可以访问 **智元选**:https://www.zyentorpicks.com/。我们会持续发布可直接落地的 AI 工程实践。

提示:AI 生成内容建议人工检查后使用。免费版可能有使用次数限制。