How to Evaluate Live & Voice Agents in ADK

发布时间 2026-09-29 2 天前
来源 Google Developers Blog
字数 4,465 字
查看原文

AI智能总结

谷歌云 AI 应用与平台解决方案架构师 Stephen Allen 介绍 ADK 中新增的原生实时评估能力。作者指出,实时 Agent 上线需可重复证据证明其在多轮语音对话中稳定表现,演示效果易因 prompt 微调或模型迭代而改变。

如何在 ADK 中评估 Live(实时)与语音 Agent

AUG. 24, 2026  作者:Stephen Allen,AI 应用与平台解决方案架构师

Evaluating Live Agent in ADK

把一个实时 Agent 投入生产,远不止做好一次演示那么简单。它必须在一段口语对话中一轮接一轮地执行正确的动作,而时机把握和异常恢复与对话内容本身同样重要。昨天听起来还很完美的行为,可能在下一次 prompt 微调或模型迭代时悄悄发生变化:工具不再被调用,上下文在多轮之间丢失,插话被忽略。要有信心地上线,就需要可重复的证据,证明 Agent 在真实用户实际会进行的对话中表现稳定。

正因如此,我们要把原生 live evaluation(实时评估)能力引入 ADK。现在,你可以用一个会“说出”自己轮次的模拟用户来驱动一个实时的、基于语音的 Agent,对语音回复打分,并且这一切都可以在你已有的、用于文本 Agent 的同一个评估循环里完成。本文将带你把一个实时 Agent 从“演示里能跑”带到“经过度量、值得信赖”,全程不离 ADK。

评估你的第一个实时 Agent

为了实际演示这一过程,我们会构建一个完整的实时评估循环:创建 Agent、编写评估用例、运行评估、查看记录的运行结果。

第一步:被测 Agent

本示例使用基于图的工作流:三个职责单一的实时 Agent 顺序串联,每个阶段都运行在 gemini-live-2.5-flash-native-audio 之上。

from google.adk.agents.llm_agent import Agent
from google.adk.tools.tool_context import ToolContext
from google.adk.workflow import START, Workflow
from pydantic import BaseModel, Field

LIVE_MODEL = "gemini-live-2.5-flash-native-audio"

def validate_date_of_birth(dob: str, tool_context: ToolContext) -> dict:
  """根据记录(此处为模拟)验证已确认的出生日期。"""
  match = dob == "1985-07-12"
  tool_context.state["dob_verified"] = match
  return {"match": match}

greeter_agent = Agent(
    model=LIVE_MODEL,
    name="greeter_agent",
    mode="task",
    instruction="你是 Sam,一位友好的护理团队助理。在分享任何其他信息之前,先向来电者问好,"
    "并确认你正在与 John Doe 通话。每轮只问一个问题,然后在确认姓名后完成任务。",
)

dob_verifier_agent = Agent(
    model=LIVE_MODEL,
    name="dob_verifier_agent",
    mode="task",
    tools=[validate_date_of_birth],
    instruction="询问来电者的出生日期,复述一遍以确认,然后以 YYYY-MM-DD 格式调用 "
    "validate_date_of_birth。最终以 'verified' 或 'unverified' 结束你的任务。",
)

goals_agent = Agent(
    model=LIVE_MODEL,
    name="goals_agent",
    mode="task",
    instruction="身份已验证。请主动告知即将到来的预约:6 月 16 日星期二下午 3 点,由 Example 医生接诊,"
    '回答任何问题后热情收尾,并以 "Goodbye." 结束。',
)

root_agent = Workflow(
    name="live_workflow",
    edges=[
        (START, greeter_agent),
        (greeter_agent, dob_verifier_agent),
        (dob_verifier_agent, goals_agent),
    ],
)

Python 已复制

每一个阶段都是一个普通的实时 Agent,工作流只是在它们之间做编排,并把上一阶段的输出传递到下一阶段。这个流程走过了三个步骤,中间还包含一次工具调用,因此会生成一条信息丰富、值得打分的多轮轨迹。当控制权在 Agent 之间切换时,用户完全察觉不到交接——音频流在整个交互过程中保持打开,ADK 会将累积的会话状态和对话历史向前传递,让每个 Agent 都能在上文语境中接手,而不是从零开始。

第二步:编写评估集(eval set)

评估集是一个包含测试用例的 JSON 文件。测试用例与它们的运行方式解耦,因此你可以混用两种不同的风格:对话场景(conversation scenario)和固定对话(fixed conversation)。

第一种是对话场景:你描述一个目标和一个人设,模拟用户即兴发挥出自己的轮次。

{
  "eval_id": "example_scenario_case",
  "conversation_scenario": {
    "starting_prompt": "你好?",
    "conversation_plan": "你是 John Doe。被问好时确认自己的姓名。被要求提供出生日期时,告知 1985 年 7 月 12 日,并在被复述时加以确认。听完预约详情后,询问就诊时需要带什么,然后表示没有其他问题,让通话自然结束。",
    "user_persona": "NOVICE"
  },
  "session_input": {
    "app_name": "live_workflow",
    "user_id": "test_user_id",
    "state": {}
  }
}

JSON 已复制

user_persona 决定了模拟用户的沟通方式。ADK 内置了几种人设,NOVICE 表示模拟用户只给出高层级目标,并等待 Agent 主动询问细节,从而测试 Agent 推进对话的能力。人设是由 prompt 驱动的,而不是硬编码的,因此你可以用自定义人设来扩展这一集合。当 conversation_plan 中的目标达成时,模拟器会自动结束场景,所以你只需脚本化目标,让它自行判断何时挂断电话。为了防止对话无限跑下去,max_allowed_invocations 限制了总轮数,为每个动态用例提供一个可预期的上限。

你也可以编写一个固定对话,逐字脚本化用户的轮次。静态用例与模拟用户一样,都是合法可用的实时运行输入。

{
  "eval_id": "example_fixed_case",
  "conversation": [
    {
      "user_content": {
        "role": "user",
        "parts": [{ "text": "嗨,是的,我是 John Doe。" }]
      }
    },
    {
      "user_content": {
        "role": "user",
        "parts": [{ "text": "我的出生日期是 1985 年 7 月 12 日。" }]
      }
    }
  ]
}

JSON 已复制

第三步:开启 live 与 audio 模式

在你的 test_config.json 中,添加一个 live_model_config,并让 ADK 指向 llm_audio 形式的用户模拟器。上述用例中的每一轮用户发言,都会通过你选定的 Gemini TTS 音色被合成成语音,并流式发送给实时 Agent。

{
  "criteria": {
    "rubric_based_multi_turn_trajectory_quality_v1": {
      "threshold": 0.7,
      "judge_model_options": { "judge_model": "gemini-3.7-flash" },
      "rubrics": [
        {
          "rubric_id": "verifies_identity_first",
          "rubric_content": {
            "text_property": "在整个通话过程中,Agent 在披露任何预约详情之前,先确认来电者的姓名并核验其出生日期。"
          }
        }
        // ... 其他端到端 rubric
      ]
    }
  },
  "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",
    "audio_model_configuration": {
      "response_modalities": ["AUDIO"],
      "speech_config": {
        "voice_config": {
          "prebuilt_voice_config": { "voice_name": "Kore" }
        },
        "language_code": "en-US"
      }
    }
  }
}

JSON 已复制

以下几点值得特别说明:

  • live_model_config 用于启用 live 模式。省略此项时,同样的测试用例会改为在标准文本模式下运行。
  • model 与 audio_model 的区别:model 负责驱动模拟用户的轮次决策逻辑,而 audio_model 则把这些轮次合成成语音。你可以调整 voice_name 和 language_code,从而测试 Agent 在不同音色与口音下的表现。
  • criteria 用于配置评估指标与通过/未通过的阈值。基于 rubric 的 LLM 裁判(例如 trajectory quality,即轨迹质量)会对整段对话进行端到端评估,非常适合多 Agent 图。你也可以附加按轮次打分的指标,对单条回复或单次工具执行进行打分。

一句口语化的回复可以有上百种正确的措辞。基于自然语言的 rubric 能像人类评审那样判断意图,只需编写一次,就能自动套用到套件中的每一场对话。

第四步:运行评估

准备好 Agent、评估集和配置文件后,通过 CLI 运行评估:

uv run adk eval \
  contributing/samples/live/live_workflow \
  contributing/samples/live/live_workflow/live_workflow.evalset.json \
  --config_file_path contributing/samples/live/live_workflow/test_config.json

Shell 已复制

注意:请确保已安装评估相关依赖(uv pip install -e ".[eval]"),并为 Live API 和 Gemini TTS 配置好 API 凭证。

同一条流水线也可以通过 AgentEvaluator 以编程方式调用,便于把实时语音评估接入你的 CI/CD 流水线,在上线前捕捉回归。

第五步:在 ADK Web 中查看结果

为了便于交互式调试,ADK Web 现在原生支持实时评估。运行配置对话框中新增了一个 Standard | Live 模式切换开关。选择 Live 后,会出现输入模态选项(音频或文本),以及模拟用户所用的音色和语言设置。

evaluating_live_agents_img_1

运行结束后,ADK 会把实时音频流重建为一份清晰的转写文本。每一条轮次都展示在独立的消息气泡中,配有转写文本和一段可内联播放的音频片段,让你既能听到 Agent 的“声音”,也能读到它说了什么。

evaluating_live_agents_img_2