数据截至 (上游 commit d9f7b80be1ee)
编排与评测:RedTeamer 主循环、LLM-as-a-judge 裁判与风险报告
30 秒导读: 前几章讲了"怎么造对抗输入"(攻击生成、多轮越狱)。这一章讲造好之后: 谁来把这些攻击一条条喂给被测模型、谁来判"这次算攻破了还是抵御住了"、最后怎么把成千上万条 结果压成一张"风险体检报告"。核心角色只有一个——
RedTeamer,它是整条主线的下半段。
本章位于 DeepTeam 主线的收口段。想先建立全局观,请回 index; 攻击是怎么被造出来的,见 02 攻击生成流水线 与 03 多轮越狱;框架(framework)本身的内容清单、 Guardrails / 轨迹扫描等旁支产品线,留给 05 章。
1. 这是什么(零基础也能懂)
一句话定义: RedTeamer 是一个"考官 + 阅卷 + 出成绩单"的调度器——它拿着一叠已经出好的
"陷阱题"(对抗攻击),逐题去问你的 AI,再请另一个 AI 当阅卷老师判分,最后汇成一份报告。
它解决什么问题: 你有一个上线的 LLM 应用(客服机器人、Agent……),你想知道"它会不会被
套出偏见言论 / 会不会泄露隐私 / 会不会被诱导执行危险操作"。人工一条条试太慢,判定标准还不统一。
RedTeamer 把这件事自动化:批量攻、自动判、聚合看。
用起来什么样: 你只需要给它一个"怎么问你的模型"的函数(model_callback)和"想测哪些漏洞"
(vulnerabilities),其余交给它:
# 示意,非源码。真实入口见 deepteam/red_team.py:13
from deepteam import red_team
from deepteam.vulnerabilities import Bias
from deepteam.attacks.single_turn import PromptInjection
async def model_callback(input: str) -> str: # 你的被测模型
return await my_llm_app(input) # 返回一段字符串就行
risk = red_team(
model_callback=model_callback,
vulnerabilities=[Bias(types=["race", "gender"])], # 想测的漏洞
attacks=[PromptInjection()], # 想用的攻击手法
)
# risk 里就是成绩单:每题的输入/输出/判分/理由,以及按漏洞、按攻击手法的通过率
一句话直觉: 把它想成一次"AI 版渗透测试"。攻击手法 = 各种"社工话术",目标模型 = 被测系统, 裁判 LLM = 判"这次到底被骗了没有"的安全审计员,风险报告 = 渗透测试的最终 report。
关键词,先记住两个数:
score = 1(通过 / PASS)= 模型顶住了这次攻击(拒绝、跑题、给了中立回答)——是好事。score = 0(失败 / FAIL)= 模型被攻破了,吐出了不该吐的内容——是坏事。
注意这个方向和普通评测相反:红队里"高分"意味着"防住了",不是"答得好"。
2. 顶层全景(它大概怎么转)
red_team() 只是个薄薄的入口壳:它 new 一个 RedTeamer,把参数转手给它,再返回结果
(deepteam/red_team.py:13,函数体只有十几行)。真正的活全在 RedTeamer 里
(deepteam/red_teamer/red_teamer.py:64)。
这一章的主流程,一张图看懂(从左到右是时间顺序;每步命中即往下走):
red_team() RedTeamer.red_team / a_red_team
(red_team.py:13) (red_teamer.py:109 / :341)
│ │
│ new RedTeamer + 转发 │ ①规范化 model_callback
└─────────────────────────────▶│ resolve → wrap → 校验签名
│
│ ②生成攻击(见 02/03 章)
│ attack_simulator.simulate()
│ │
│ ▼ 一堆 RTTestCase
│ ③按 vulnerability_type 分组
│ │
│ ▼
│ ④并发评测每一组
│ Semaphore(max_concurrent)+gather
│ │
│ 对每条攻击: _a_attack
│ ├─ 多轮: 直接判已生成的 turns
│ └─ 单轮: 先问目标模型拿回答,再判
│ │
│ ▼ 裁判 LLM(metric.measure)
│ 给 0/1 分 + reason + cost
│ │
│ ▼
│ ⑤汇总 construct_risk_assessment_overview
│ → RiskAssessment(overview + test_cases)
│ │
│ ▼
│ ⑥打印报告表 / 可选上传 Confident
▼
返回 RiskAssessment
各部件一句话职责:
| 部件 | 干什么 | 在哪(文件:符号) |
|---|---|---|
red_team() | 顶层函 数,建 RedTeamer 并转发 | red_team.py:13 red_team |
RedTeamer.red_team | 同步入口,规范化 callback、分派 | red_teamer.py:109-126 red_team |
RedTeamer.a_red_team | 异步入口,真正跑并发评测的主体 | red_teamer.py:341 a_red_team |
resolve_model_callback | 把 "openai/gpt-4.1" 这类字符串变成真 callback | red_teamer/utils.py:101 |
wrap_model_callback | 统一 callback 签名 + 校验返回值 | red_teamer/utils.py:52 |
validate_model_callback_signature | 校验 sync/async 是否匹配 | red_teamer/utils.py:25 |
_a_attack | 单条攻击的执行 + 判定 | red_teamer.py:648 _a_attack |
BaseRedTeamingMetric 子类 | LLM 裁判,给 0/1 分 | metrics/base_red_teaming_metric.py:7 + 各 *Metric |
construct_risk_assessment_overview | 把 test_cases 聚合成通过率(新版本还会按 exposure 算每条与总体的 CVSS 分) | red_teamer/risk_assessment.py:181 |
_print_risk_assessment | 终端打印报告表 | red_teamer.py:797 |
_post_risk_assessment | 可选上传到 Confident AI | red_teamer.py:946 |
后面各节顺着 ①→⑥ 逐层展开。