Loading...
Loading...
当用户想要「运行评估」「评估我的ADK Agent」「编写评估集」「调试评估分数」「比较评估结果」,或需要ADK(Agent Development Kit)评估方法及评估-修复循环的指导时,应使用本技能。内容涵盖评估指标、评估集schema、LLM-as-judge、工具轨迹评分以及常见失败原因。属于Google ADK(Agent Development Kit)技能套件的一部分。请勿将其用于API代码模式(请使用google-agents-cli-adk-code)、部署(请使用google-agents-cli-deploy)或项目脚手架搭建(请使用google-agents-cli-scaffold)。
npx skill4agent add google/agents-cli google-agents-cli-eval是否使用脚手架项目? 如果你使用了,那么你已经拥有/google-agents-cli-scaffold、agents-cli eval run和tests/eval/evalsets/。从tests/eval/eval_config.json开始,逐步迭代即可。agents-cli eval run
| 文件 | 内容 |
|---|---|
| 完整指标参考——包含全部8项评估标准、匹配类型、自定义指标、评判模型配置 |
| 动态对话测试——ConversationScenario、用户模拟器配置、兼容指标 |
| google_search和模型内置工具——轨迹行为、指标兼容性 |
| 多模态输入——评估集schema、内置指标局限性、自定义评估器模式 |
agents-cli eval run| 捷径 | 失败原因 |
|---|---|
| "我会调低评估阈值让它通过" | 降低阈值会掩盖真实的失败。如果Agent达不到标准,就修复Agent——不要降低标准。 |
| "这个评估用例不稳定,我跳过它" | 不稳定的评估会暴露Agent的非确定性问题。通过设置 |
| "我只需要修复评估集,不需要修改Agent" | 如果你总是调整预期输出,说明Agent存在行为问题。先修复指令或工具逻辑。 |
| 失败类型 | 调整内容 |
|---|---|
| 修复Agent指令(工具调用顺序)、更新评估集 |
| 调整Agent指令措辞,或放宽预期响应要求 |
| 优化Agent指令,或调整预期响应——这是语义层面的匹配,而非词汇层面 |
| 优化Agent指令,解决未通过的特定评分标准问题 |
| 收紧Agent指令,确保基于工具输出生成内容 |
| Agent调用错误工具 | 修复工具描述、Agent指令或tool_config |
| Agent调用额外工具 | 使用 |
| 目标 | 推荐指标 |
|---|---|
| 回归测试/CI/CD(快速、确定性) | |
| 语义响应正确性(允许灵活表述) | |
| 无参考答案时的响应质量 | |
| 验证工具调用推理逻辑 | |
| 检测幻觉内容 | |
| 安全合规性 | |
| 动态多轮对话 | 用户模拟 + |
| 多模态输入(图片、音频、文件) | |
references/criteria-guide.md# 脚手架项目——使用agents-cli:
agents-cli eval run --evalset tests/eval/evalsets/my_evalset.json
# 指定配置文件:
agents-cli eval run --evalset tests/eval/evalsets/my_evalset.json --config tests/eval/eval_config.json
# 运行tests/eval/evalsets/下的所有评估集:
agents-cli eval run --allagents-cli eval run--evalset PATH--config PATH--allagents-cli eval compare baseline.json candidate.jsoneval_config.json{
"criteria": {
"tool_trajectory_avg_score": {
"threshold": 1.0,
"match_type": "IN_ORDER"
},
"final_response_match_v2": {
"threshold": 0.8,
"judge_model_options": {
"judge_model": "gemini-flash-latest",
"num_samples": 5
}
},
"rubric_based_final_response_quality_v1": {
"threshold": 0.8,
"rubrics": [
{
"rubric_id": "professionalism",
"rubric_content": { "text_property": "The response must be professional and helpful." }
},
{
"rubric_id": "safety",
"rubric_content": { "text_property": "The agent must NEVER book without asking for confirmation." }
}
]
}
}
}"response_match_score": 0.8judge_model_optionsuser_simulator_configreferences/criteria-guide.mdevalset.json{
"eval_set_id": "my_eval_set",
"name": "My Eval Set",
"description": "Tests core capabilities",
"eval_cases": [
{
"eval_id": "search_test",
"conversation": [
{
"invocation_id": "inv_1",
"user_content": { "parts": [{ "text": "Find a flight to NYC" }] },
"final_response": {
"role": "model",
"parts": [{ "text": "I found a flight for $500. Want to book?" }]
},
"intermediate_data": {
"tool_uses": [
{ "name": "search_flights", "args": { "destination": "NYC" } }
],
"intermediate_responses": [
["sub_agent_name", [{ "text": "Found 3 flights to NYC." }]]
]
}
}
],
"session_input": { "app_name": "my_app", "user_id": "user_1", "state": {} }
}
]
}intermediate_data.tool_usesintermediate_data.intermediate_responsessession_input.stateconversation_scenarioconversationreferences/user-simulation.mdsave_preferencesgoogle_searchEXACTtool_trajectory_avg_scoreIN_ORDERANY_ORDERrubric_based_tool_use_quality_v1tool_trajectory_avg_score{
"conversation": [
{
"invocation_id": "inv_1",
"user_content": { "parts": [{"text": "Find me a flight from NYC to London"}] },
"intermediate_data": {
"tool_uses": [
{ "name": "search_flights", "args": {"origin": "NYC", "destination": "LON"} }
]
}
},
{
"invocation_id": "inv_2",
"user_content": { "parts": [{"text": "Book the first option"}] },
"final_response": { "role": "model", "parts": [{"text": "Booking confirmed!"}] },
"intermediate_data": {
"tool_uses": [
{ "name": "book_flight", "args": {"flight_id": "1"} }
]
}
}
]
}Appname# 正确 - 与"app"目录匹配
app = App(root_agent=root_agent, name="app")
# 错误 - 会导致"Session not found"错误
app = App(root_agent=root_agent, name="flight_booking_assistant")before_agent_callbackKeyErrorasync def initialize_state(callback_context: CallbackContext) -> None:
state = callback_context.state
if "user_preferences" not in state:
state["user_preferences"] = {}
root_agent = Agent(
name="my_agent",
before_agent_callback=initialize_state,
instruction="Based on preferences: {user_preferences}...",
)session_input.state.append()"state": { "feedback_history": "" }"state": { "feedback_history": [] }tool_configmode="ANY"| 症状 | 原因 | 修复方案 |
|---|---|---|
中间轮次缺少 | 轨迹要求每次调用都匹配 | 为所有轮次添加预期工具调用 |
| Agent提及工具输出中不存在的数据 | 幻觉问题 | 收紧Agent指令;添加 |
| "Session not found"错误 | App名称不匹配 | 确保App的 |
| 分数在多次运行之间波动 | 模型非确定性 | 设置 |
| Agent使用了 | 删除轨迹指标;详见 |
| 轨迹失败但工具调用正确 | 调用了额外工具 | 切换为 |
| LLM评判忽略评估中的图片/音频 | | 使用支持视觉的评判模型自定义指标(详见 |
https://adk.dev/evaluate/index.mdhttps://adk.dev/evaluate/criteria/index.mdhttps://adk.dev/evaluate/user-sim/index.mdgoogle_searchreferences/builtin-tools-eval.mdEXACTIN_ORDERtool_usesagents-cli eval runagents-cli eval run --allagents-cli eval run/google-agents-cli-workflow/google-agents-cli-adk-code/google-agents-cli-scaffoldagents-cli scaffold createscaffold enhance/google-agents-cli-deploy/google-agents-cli-observability