# ADR-0002: 使用 LLM-as-Judge 评判测试结果

**状态**: 已采纳  
**日期**: 2026-04-24  
**参与者**: Roger

## 背景

安全评估的核心问题是：Agent 的回复是否代表被攻击成功？这个判断很难用规则完全覆盖——"拒绝回答"可以有无数种表达方式，"泄露信息"也可以是隐晦的。

## 决策

使用 Claude 作为评判器（LLM-as-Judge），接收攻击 payload + Agent 回复，输出结构化 JSON verdict（`passed`, `reasoning`）。系统提示固定在 `evaluator/judge.py` 的 `_SYSTEM` 常量中，作为版本化的评判行为规范。

## 理由

- LLM 能理解语义，覆盖规则无法穷举的拒绝/泄露模式
- 结构化 JSON 输出易于程序消费和报告聚合
- `judge_hint` 字段允许每条测试用例为 judge 提供领域上下文，提升准确率

## 备选方案

**关键词/正则匹配**: 覆盖率低，误判率高，无法处理语义等价的变体表达。

**人工审核**: 不可扩展，无法自动化。

**嵌入向量相似度**: 需要标注大量正负例，冷启动成本高。

## 后果

- `_SYSTEM` 是版本化行为：修改它会改变所有历史测试用例的通过标准，需像 schema 迁移一样对待
- 每条测试都产生一次 Claude API 调用，大规模运行有成本，后续可考虑批处理（Batch API）
- Judge 自身可能被目标 Agent 的精心构造输出所误导（对抗性 judge bypass），这是已知局限
