介绍如何量化 Agent 是否选对了技能并正确执行,为 Agent 应用提供可度量的质量保障方法。
通用智能体可以处理广泛的任务,但你仍然需要它们遵循驱动你业务的流程:合规检查、文档处理工作流、升级策略、工程规范。将所有这些编码到一个系统提示或应用逻辑中会变得难以维护和更新。技能(Skills)是一种模块化的替代方案。技能是一组可重用的指令,通常存储在 SKILL.md 文件中,用于教智能体完成特定领域的任务,如编辑合同、对账发票或遵循团队的拉取请求规范。由于技能遵循开放的 Agent Skills 标准,它们可以在兼容的测试框架之间移植,智能体在运行时只加载所需的技能,而不是在其核心指令中携带所有流程。
技能将一个或多个工具与智能体正确使用它们所需的上下文打包在一起:
这种模块化方法帮助团队更快地专门化智能体、在不同智能体和工作流之间重用经过验证的流程、保持行为一致性,以及在不微调底层模型或重写智能体核心逻辑的情况下更新特定领域指导。
智能体中的这种技能可组合性引入了两种通用输出质量指标可能无法发现的故障模式:智能体调用了不适合任务的技能,以及智能体调用了正确的技能但跳过或仅部分遵循其指令。这两种故障都可能产生流畅、看似合理的响应,而没有使用你预先确定的领域知识。因此,评估不能只检查最终响应。
为了使这些故障可衡量,Strands Evals SDK 和 Amazon Bedrock AgentCore Evaluations(Amazon Bedrock AgentCore 的一项功能)添加了以技能为中心的评估器:
此外,在 Strands Evals 上,技能已调用(Skill Invoked) 是对命名技能是否已成功加载的确定性检查。
在这篇文章中,你将学习如何从记录的轨迹中评估技能选择和指令遵循、在测试套件中添加确定性路由检查、使用 AgentCore Evaluations 从 OpenTelemetry 跟踪中评估技能行为,以及解释每个技能的结果以选择正确的修复方法,所有这些都是通过 AgentCore CLI 完成的。
智能体接收任务和技能目录,选择技能,加载它,然后执行。运行被记录为 Strands Evals 中的轨迹或你可观测性层中的 OpenTelemetry 跟踪。现在可以将此记录用于所有三个技能评估器。技能选择准确性检查每个调用的技能是否适合任务,以及智能体是否调用了正确的技能。下图显示了智能体如何从提供给它的 1:n 个技能中选择技能。然后技能选择准确性对所选技能是否是任务的正确选择进行评分。你可以在提示模板文档中找到此评估器的提示模板和评分标准。
图 1:技能选择准确性检查智能体是否为任务选择了合适的技能
技能指令遵循询问智能体遵循该技能规定步骤的完整程度。你可以在提示模板文档中找到此评估器的提示模板和评分标准。
图 2:技能指令遵循衡量智能体遵循技能步骤的完整程度
SkillInvoked 是确定性的。它不调用模型,且为 Strands Evals 特有。
这三个技能评估器的概述如下图所示。
图 3:三个技能评估器概述
考虑一个具备请假(PTO)规划和员工福利讨论技能的 HR 助手智能体。员工询问他们的牙科和视力福利。如果智能体调用福利技能,它可能会产生更完善的响应。但如果工具调用成功而智能体选择了错误的剧本,技能选择准确性会隔离该路由决策。
现在假设智能体为相关请求正确调用了 PTO 规划技能。该技能指示智能体识别 employee_id、检查 PTO 余额、根据最新 HR 政策检查滚动规则,然后在条件允许的情况下提交 PTO 请求。如果智能体检查了 PTO 余额但跳过了滚动规则,智能体可能仍然返回看似合理的响应,同时违反了规定的流程。技能指令遵循隔离了该执行故障并识别了跳过的步骤。
这两类故障需要不同的修复方法。不合适的选择通常指向重叠或模糊的技能描述。指令遵循不完整可能需要更清晰的步骤、不同的技能结构或更有能力的智能体模型。
由于基于评判的评估器返回每个调用技能的结果,多技能运行仍然可以诊断:你可以识别哪个选择或指令遵循结果降低了总分。如果没有调用技能,基于评判的评估器不会产生分数。当回归测试有已知路由要求时,将它们与 SkillInvoked 配对使用。
Python 3.10 或更高版本。
一个具有 Amazon Bedrock 访问权限的 AWS 账户,以及具有调用模型权限的凭据。
要跟随 Strands Evals 部分,请安装 SDK:
pip install strands-agents-evals strands-agents
你还需要一个记录的智能体运行。技能评估器接受 Strands Evals Session 或原始消息列表作为轨迹。在启动时,技能提取从 Strands AgentSkills 插件、Claude Code、Claude Agent SDK、OpenAI Agents SDK、Codex、Gemini CLI、OpenHands、Google ADK 和通用 SKILL.md 文件读取中识别信号。
要跟随 AgentCore Evaluations 部分,你需要:
托管在 Amazon Bedrock AgentCore 运行时或其他位置的智能体。我们将使用 HR 助手智能体作为示例,你可以在自己的账户中部署。
为该智能体启用的可观测性,以便它将遥测数据传送到 Amazon CloudWatch。
在 CloudWatch 中启用的交易搜索。
这篇文章中的示例使用 AgentCore CLI:
npm install -g @aws/agentcore
当你控制测试用例并可以在开发或持续集成期间重新运行智能体时,Strands Evals 很有用。在完整代码示例中查看为 HR 助手智能体创建的完整 Strands Evals 代码示例。
from strands_evals import Case, Experiment
from strands_evals.evaluators import (
SkillInstructionFollowingEvaluator,
SkillInvoked,
SkillSelectionAccuracyEvaluator,
)
case = Case(
name="q3-revenue-tables",
input="Summarize the revenue tables in q3-report.pdf",
)
evaluators = [
SkillSelectionAccuracyEvaluator(),
SkillInstructionFollowingEvaluator(),
SkillInvoked(skill_name="pdf-table-extraction"),
]
技能评估器读取运行的轨迹。TracedHandler 收集智能体的跨度并将它们附加为轨迹:
from strands import Agent
from strands_evals import TracedHandler, eval_task
@eval_task(TracedHandler())
def task_function():
return Agent(...) # 你的配备技能的智能体
experiment = Experiment(cases=[case], evaluators=evaluators)
report = experiment.run_evaluations(task_function)
report.run_display()
假设智能体加载了 pdf-table-extraction,运行了 pdftotext -layout,但从未打开提取的文件或定位表边界。简化报告:
SkillSelectionAccuracyEvaluator: score=1.00, pass=True
pdf-table-extraction: The skill directly matches the request.
SkillInstructionFollowingEvaluator: score=0.50, pass=False
pdf-table-extraction: The extraction phase was completed,
the table-boundary phase was skipped.
Steps:
- Extract text with layout preservation: covered
- Locate table boundaries: skipped
- Summarize each table's headline figure: partial
SkillInvoked: score=1.00, pass=True
skill 'pdf-table-extraction' was invoked
Skill Instruction Following 使用五级评分:完全遵循(1.0)、大部分遵循(0.75)、部分遵循(0.5)、最小程度遵循(0.25)和未遵循(0.0)。通过标准为大部分遵循或更好。
将检查项转换为部署关卡
为每个关键技能添加 SkillInvoked,即特定回归用例必须调用的技能。由于不调用模型,因此是一个快速的路由断言。
以 report.test_passes 作为构建关卡:if not all(report.test_passes): raise SystemExit(1)。
使用聚合分数跟踪更广泛的趋势,但在强制执行前根据你自己的用例校准阈值。
使用 AgentCore Evaluations 评估生产追踪
AgentCore Evaluations 直接与现有的 OpenTelemetry 追踪配合工作,支持按需评估、存储会话的批处理以及实时流量的持续采样。遥测数据按会话、追踪和跨度组织。由于技能评估器在工具调用级别运行,每个结果都包含 spanContext,包含已识别技能调用的 sessionId、traceId 和 spanId。
技能调用通过 SKILL.md 文件系统读取(跨框架工作)或 Strands Agents、LangGraph Deep Agents、Google ADK 或 Claude Agent SDK 中的原生技能加载工具来识别。
自定义评估器的追踪占位符
AgentCore Evaluations 包含两个内置的基于评判的技能评估器。若要为内置评估器未覆盖的内容打分,请在 TOOL_CALL 级别创建自定义评估器。工具级模板可以引用技能占位符:
例如,检查技能运行中某个特定属性的模板:
## Skill instructions
{skill_content}
## Conversation record
{context}
## Evaluation Question
Did the agent complete every numbered step in the skill instructions above, in the order given? Answer Yes or No.
你引用的占位符也决定了评估器的运行时机。包含 {invoked_skill} 的模板仅在技能调用跨度上运行,而包含 {skill_content} 的模板还需要加载的内容体。
以下命令针对支持技能启用的独立运行时。将 skills-evaluation/agent_config.json 中的运行时名称(agent_id 或 agent_arn)替换 <skill-runtime>。Strands.SkillInvoked 仅为客户端使用,无 CLI 等效项。
运行按需评估
使用按需评估来调查某个会话、验证最近的变更或评估预发布流量:
agentcore run eval \
--runtime <skill-runtime> \
--evaluator Builtin.SkillSelectionAccuracy Builtin.SkillInstructionFollowing \
--session-id <session-id>
运行批量评估
使用批量评估来一次评分多个存储的会话,例如在技能目录变更前建立基线:
agentcore run batch-evaluation \
--runtime <skill-runtime> \
--evaluator Builtin.SkillSelectionAccuracy Builtin.SkillInstructionFollowing
配置持续在线评估
在线评估对实时流量进行采样,以便检测精心策划的测试集未预见到的行为:
agentcore add online-eval \
--name HRSkillsProductionEval \
--runtime <skill-runtime> \
--evaluator Builtin.SkillSelectionAccuracy Builtin.SkillInstructionFollowing \
--sampling-rate 100 \
--enable-on-create
然后部署以配置在线评估:
agentcore deploy
持续评估对于检测目录漂移(新技能与现有描述重叠时)、未预见的措辞(真实请求与策划的测试提示不同)以及长会话失败(指令遵循随上下文增长而退化时)特别有用。
评估智能体技能时,首先要内化的是路由和执行是两种不同的失败模式,你的评估策略需要将它们清晰地分开。如果你看到高选择分数但低指令遵循分数,这表明路由器选择了正确的技能但未完全执行。相反的模式意味着如果该技能被调用,它本来可以正常工作。将这两个评估一起运行,而不是将它们折叠成一个通过/失败的数字,正是让你能够区分这两种情况的原因。在构建任何自定义内容之前,先从内置评估器开始建立基线,这样你之后添加的任何自定义逻辑都可以覆盖基线实际遗漏的部分。对于你已经知道正确路由行为的需求,不要依赖评判模型来捕获它。为每个必须触发的技能添加确定性 SkillInvoked 断言。
运行评估后,不要只看聚合分数。每步证据才是真正诊断发生的地方。它告诉你指令是被完全覆盖、部分完成还是完全跳过,这种详细程度是将失败评估转化为可操作修复的关键。这也是为什么你应该在每个生命周期阶段进行评估,而不是等到最终输出。末尾的失败不能告诉你路由器是将请求发送到了错误的地方还是正确的技能执行不佳,你需要两个信号才能知道要修复什么。
技能级和端到端评估应该配对使用,因为一个技能可以完美执行但对于面前的请求仍然是错误的技能。通过编写真正具有区分性的技能描述,你可以在上游减少大量这种歧义。同样的逻辑也适用于技能的范围。一个技能被构建来处理六个不相关的函数,就没有单一的正确行为定义,这使得它几乎无法一致地评估。
明确说明只应评估给定运行中实际采取的路径,否则未采取的分支会被错误计为跳过的步骤,并悄悄破坏你的通过率。在信任任何这些分数之前,验证你的提取管道是否在实际追踪上正常工作。
随着你在工具间扩展,阈值可能无法完全迁移。每个评估表面都需要根据其自身的条款进行校准,因为在 Strands Evals 上的通过分数和在 AgentCore Evaluations 上的通过分数不一定意味着相同的事情。最终,这些都不应该存在于你的部署管道之外。技能质量回归需要像失败的单元测试一样阻止发布,否则你在此前完成的评估工作实际上并没有保护生产环境。
技能使智能体的专门化变得经济,但一个看似合理的最终答案并不能证明智能体选择了正确的程序或遵循了它。Skill Selection Accuracy 和 Skill Instruction Following 分开了这些失败模式,并为每个调用的技能返回证据。在 Strands Evals 中,SkillInvoked 为已知路由需求添加了确定性护栏。在 AgentCore Evaluations 中,两个基于评判的指标可以针对特定会话按需运行,作为存储会话的批量运行,或在采样流量上持续运行。
当你有可以重新运行的测试用例和记录的轨迹时使用 Strands Evals。当你想要评估来自预发布或生产智能体的 OpenTelemetry 追踪时使用 AgentCore Evaluations。许多团队会同时使用两者:部署前的确定性和基于评判的关卡,然后是生产中的基于追踪的监控。
Strands Evals 快速入门。
Strands Evals 仓库。
Amazon Bedrock AgentCore Evaluations 开发者指南。
评估 AI 智能体博客文章。
感谢 Ritvika Pillai、Vincent Chen、Qiaoxuan Xue 和 Shoaib Javed 对 AgentCore Evaluations 的实现,感谢 Po-Shin Chen 对 Strands Evals 的审核,感谢 Anwesan Pal 关于技能评估的早期讨论,感谢 Ben Coombs 的产品指导,以及所有其他使这项工作成为可能的人。