strands-evals 是面向 strands-agents-evals 软件包的评测编写技能,聚焦于如何用该包评估 AI Agent 与 LLM 应用。技能文档将仓库约定、贡献规则、提示词版本管理与评审清单交给仓库根目录的 AGENTS.md,自身只专注于评测编写。
用途 该技能用于编写评测:构建 Case 与 Experiment、选择评估器、模拟用户与工具、注入故障、进行红队测试,以及自动生成测试用例。它提供了按目标选择方案的“路由图”,从单次响应评分到多轮会话测试分别指向对应章节。
核心构建块 从 strands_evals 导入 Case 与 Experiment。Case 泛型接收输入与输出类型,可携带 metadata;Experiment 接收 cases 与 evaluators。调用 experiment.run_evaluations(task_function) 返回单个 EvaluationReport,再通过 report.run_display() 展示。task_function 接收 Case,返回字符串输出,或返回形如 {"output": ..., "trajectory": Session} 的字典以供基于痕迹的评估器使用。无论评估器数量多少,run_evaluations() 始终返回单个报告;多个评估器时结果被展平,每行通过 report.cases[i]["evaluator"] 标记来源。实验可通过 experiment.to_file("my_eval", "json") 持久化,并用 Experiment.from_file("./experiment_files/my_eval.json", "json") 载入。
评估器类型 OutputEvaluator 是基于评分细则的 LLM 裁判,适用于对自由文本按 rubric 打分且无需痕迹的场景,可设置 include_inputs 与裁判模型。TrajectoryEvaluator 评估工具与动作序列,文档强调始终提取轨迹而非传入完整的 agent.messages,以避免上下文溢出;可用内置打分器 exact_match_scorer、in_order_match_scorer、any_order_match_scorer,分别适用于严格流水线、顺序重要但允许交错、以及只关心工具集合的场景。
基于痕迹的评估器需要 Session。可用 StrandsEvalsTelemetry 设置内存导出器,收集 spans,再用 StrandsInMemorySessionMapper 将其映射为 Session。文档还提供了 @eval_task 与 TracedHandler 的快捷方式:被装饰函数可返回 Agent(自动以 case.input 调用)、字符串或字典。TracedHandler 在多次调用间共享一个内存导出器,适合顺序执行或 max_workers=1 的异步执行;并发(max_workers > 1)时应为每个 worker 提供独立的 handler 实例,或退回手动捕获模式。
按评估范围划分,工具级评估器包括 ToolSelectionAccuracyEvaluator 与 ToolParameterAccuracyEvaluator;技能级包括 SkillSelectionAccuracyEvaluator、SkillInstructionFollowingEvaluator 与确定性的 SkillInvoked;痕迹级(最后一轮)包括 CorrectnessEvaluator、HelpfulnessEvaluator、FaithfulnessEvaluator、CoherenceEvaluator、ConcisenessEvaluator、ResponseRelevanceEvaluator、HarmfulnessEvaluator、RefusalEvaluator、StereotypingEvaluator、InstructionFollowingEvaluator;会话级(完整对话)为 GoalSuccessRateEvaluator;多智能体交互与交接为 InteractionsEvaluator(基于输出)。文档说明了各评估器的评分档位:Helpfulness 使用七级量表,Correctness 在基础模式使用三级量规、在设置了 expected_assertion 的参考模式使用二元 CORRECT/INCORRECT,Conciseness 三级,Coherence 五级,Harmfulness、Refusal、Stereotyping、InstructionFollowing 为二元,SkillInstructionFollowing 为五级且每个被调用技能返回一条结果,SkillSelectionAccuracy 为二元且同样每个被调用技能返回一条结果。
对于外部系统的痕迹,可选择对应映射器:CloudWatchSessionMapper(搭配 CloudWatchProvider 与 CloudWatchLogsParser)、LangChainOtelSessionMapper、OpenInferenceSessionMapper、OpenSearchSessionMapper(搭配 OpenSearchProvider)以及用于从 Langfuse 获取数据的 LangfuseProvider。痕迹类型位于 strands_evals.types.trace,包括 Session、Trace 以及 SpanUnion = InferenceSpan | ToolExecutionSpan | AgentInvocationSpan。
多模态与确定性评估 多模态(图文)评测可使用 MultimodalCorrectnessEvaluator、MultimodalFaithfulnessEvaluator、MultimodalInstructionFollowingEvaluator、MultimodalOverallQualityEvaluator 与作为自定义多模态 rubric 基类的 MultimodalOutputEvaluator。Case 的输入使用 MultimodalInput,包含 ImageData 与 instruction。ImageData.source 接受文件路径、base64 字符串、data URL、HTTP URL、PIL Image 或原始字节。当设置了 expected_output 时自动选用基于参考的 rubric,否则使用无参考 rubric。
确定性评估器无需 LLM,快速、免费且精确,从 strands_evals.evaluators.deterministic 导入,包括输出检查的 Contains、Equals、StartsWith,轨迹检查的 ToolCalled,以及环境状态检查的 StateEquals。可作为 LLM 裁判之前的低成本预筛选或与其并用。
模拟器 ActorSimulator(UserSimulator 为其别名)用于多轮用户模拟,可经 ActorSimulator.from_case_for_user_simulator(case=case, max_turns=10) 创建,并通过 has_next() 循环推进、act() 获取用户消息,通常与 GoalSuccessRateEvaluator 搭配验证模拟用户是否达成目标。ToolSimulator 提供由 LLM 驱动的假工具:用 @tool_simulator.tool(...) 装饰函数并指定 share_state_id、initial_state_description 与 output_schema,被装饰函数体不会执行,LLM 生成符合 schema 校验的响应;共享同一 share_state_id 的工具看到一致状态,适合传感器与控制器配对,使读取反映此前的写入。
故障检测、混沌测试与红队 在 Experiment 中可附加 DiagnosisConfig,设置 trigger(ON_FAILURE 或 ALWAYS)与 confidence_threshold(LOW、MEDIUM、HIGH)。也可在 Session 上独立使用 strands_evals.detectors 的 detect_failures、analyze_root_cause 与 diagnose_session。报告可用 report.display(include_recommendations=True) 展示建议。
Chaos Testing 通过 Strands 原生 hook 系统注入确定性的工具故障与响应损坏,使用户任务体保持无混沌逻辑。需配合 @eval_task(TracedHandler()) 使混沌感知评估器有 Session 可评分。从 strands_evals.chaos 导入 ChaosCase、ChaosExperiment、ChaosPlugin 及效果类:pre-hook(执行前取消)的 Timeout、NetworkError、ExecutionError、ValidationError 各接受 error_message,首个 pre-hook 效果生效;post-hook(损坏响应)的 TruncateFields(max_length=...)、RemoveFields(remove_ratio=...)、CorruptValues(...) 按顺序应用于工具的字典响应。每个 ChaosCase 中每个工具只能有一个效果,否则抛出 ValueError;要测试同一工具的多个效果需使用不同的 ChaosCase 实例。ChaosCase.expand(base_cases, effect_maps, include_no_effect_baseline=True) 生成笛卡尔积并可选加入基线运行。ChaosPlugin 通过 ChaosExperiment 设置的 ContextVar 读取当前用例,不可在普通 Experiment 中手工实例化用例并期望效果触发。混沌感知评估器位于 strands_evals.evaluators.chaos,包括 FailureCommunicationEvaluator、PartialCompletionEvaluator、RecoveryStrategyEvaluator,三者均基于痕迹,需要 actual_trajectory 为 Session。
ToolSimulator 可与 Chaos 结合:ChaosPlugin 作用于 Strands @tool 调用,无论实现是真实的还是模拟的,因此可将模拟工具包在 ToolSimulator 中并照常传入 ChaosPlugin()。并行混沌运行方面,ChaosExperiment 继承 run_evaluations_async;@eval_task(TracedHandler()) 形式仅支持顺序执行,因为 TracedHandler.before() 会在共享内存导出器上调用 clear(),并发 worker 会互相清除在途 spans。max_workers > 1 时应手动捕获 spans,并让映射器按 session ID 分区;StrandsInMemorySessionMapper 在存在 session.id / gen_ai.conversation.id 属性时按这些属性过滤 spans,从而在共享导出器下实现按用例隔离。文档提示该方式不在用例间清除 spans,内存随用例数增长,典型评测可接受,扫过数千用例时需手动 flush。
Red Team 位于 strands_evals.experimental.redteam,针对目标 agent 运行 用例 × 策略 的叉积并生成 RedTeamReport。相关内容从 strands_evals.experimental.redteam 导入 RedTeamExperiment、AdversarialCaseGenerator、AttackSuccessEvaluator、CrescendoStrategy、GoatStrategy、PairStrategy、BadLikertJudgeStrategy、SequentialBreakStrategy、PromptStrategy、AttackGoal、RedTeamConfig、RISK_CATEGORIES。可用 AdversarialCaseGenerator(model=judge_model).generate_cases(agent=target, risk_categories=[...], num_cases=5) 生成针对目标的用例,或手工编写 RedTeamCase;再用 RedTeamExperiment 指定 cases、agent、attack_strategies、evaluators 等运行。
适用场景与限制 该技能适用于为 AI Agent 与 LLM 应用编写可复现评测:单次问答质量、工具调用序列、多轮会话、多智能体交接、图文多模态、故障韧性与安全对抗。文档中的运行方式包括顺序与异步并行;使用 TracedHandler 时需注意并发限制,使用共享导出器时需注意内存增长。部分内容(如 Red Team)标注为实验性。文档未提供有关收费、价格或支持平台的信息。