Inspect 扫描 器: 在 评 测 记录 里 找 拒绝、 评 测 意识 和 奖励 破解
英国 AI Security Institute 的 Inspect 文档:扫描器读评测记录,发现写到 scans/ 而不是嵌进日志。说明在线扫描、离线 scout scan、把扫描器当评分器,以及 llm_scanner 和 grep_scanner。

本文目录
扫描器
概述
扫描器(scanner)阅读评测记录,找出可能削弱结果的问题,例如拒绝回答、评测意识、环境配错、运行错误、奖励破解等。评测意识(evaluation awareness)是模型察觉自己正在被评测并因此改变行为。奖励破解(reward hacking)是模型走捷径拿到分数,却没有完成任务本来要求的事。Kirgis 等认为,这种日志分析对可信的 AI 评测是必要的,因为仅看通过或失败会掩盖捷径、基准里的人为痕迹和不安全行为。Dubois 等提出了一套做这件事的标准化方法。
扫描器和评分器类似,但有两点不同:
- 评分器给每个样本返回一个分数,用来给任务是否成功打分;扫描器常常只在发现问题时才返回结果,所以发现通常是稀疏的。
- 扫描器的发现写到评测日志旁边单独的
scans/目录,不嵌进日志本身。因此可以一起查看多次评测的扫描结果,扫描器也可以在评测进行时用、事后离线再跑,或两种都做。
扫描器用 Inspect Scout 包来写。本页讲三种把它接进 Inspect AI 评测的方式:
- 在线扫描:把扫描器挂到正在跑的 eval() 或 eval_set() 上。
- 离线扫描:对已有的评测日志目录运行
scout scan。
在线和离线扫描写到同一个 scans/ 目录,所以可以组合:评测时先挂上一些扫描器,之后再用 scout scan 追加,反过来也可以。
在线扫描
通过 scanner 参数把扫描器传给 eval() 或 eval_set()。样本一完成就扫描记录,结果写到 <log_dir>/scans/:
from inspect_ai import eval
from my_scanners import refusal, eval_awareness
eval(
"tasks/agentic_search.py",
model="openai/gpt-5",
scanner=[refusal(), eval_awareness()],
)scanner 可以是 Scanner 可调用对象的列表、{name: Scanner} 字典,或用于更细控制的 ScannerConfig(过滤子句、扫描侧模型、标签、输出位置)。例如,用一个和被评测模型不同的模型来跑扫描器:
from inspect_ai import ScannerConfig, eval
from my_scanners import refusal, eval_awareness
eval(
"tasks/agentic_search.py",
model="openai/gpt-5",
scanner=ScannerConfig(
scanners=[refusal(), eval_awareness()],
model="anthropic/claude-opus-4-7",
),
)同样的扫描器也可以在命令行用 --scanner 指定:
inspect eval tasks/agentic_search.py \
--model openai/gpt-5 \
--scanner my_scanners.py \
--scan-model anthropic/claude-opus-4-7在命令行上,--scanner 接受 YAML/JSON 配置文件、包含 @scanner 函数的 Python 文件(也可用 file.py@func 只选一个),或形如 pkgname/scanner_name 的注册表引用。
提示:
选一个适合扫描任务的模型,它不必和被评测的模型相同。扫描模型要通过
ScannerConfig(model=...)、命令行--scan-model,或环境变量SCOUT_SCAN_MODEL显式设置。
离线扫描
要对已有日志目录跑扫描器(例如跨多次评测查找评测意识),使用 scout scan 命令:
scout scan my_scanners.py -T ./logs --model openai/gpt-5结果写到 ./logs/scans/,和在线扫描同一位置。
离线扫描通常是迭代扫描器的地方:调整提示、对照已标注集合做验证,或把同一个扫描器跑到许多任务上。完整命令行、验证流程、结果结构和非 Inspect 记录来源,见 Inspect Scout 文档。
查看结果
在线和离线扫描共用 scans/ 目录,所以查看工具对两者都适用。用 Scout 查看器交互式浏览结果:
scout view要以程序方式读取,加载每个扫描器对应的 DataFrame:
from inspect_scout import scan_results_df
df = scan_results_df("logs/scans/scan_id=...")
eval_awareness_df = df.scanners["eval_awareness"]把扫描器当作评分器
扫描器也可以加进任务的评分器。例如,把奖励破解检查放进任务指标:
from inspect_ai import Task, task
from inspect_ai.scorer import match
from my_scanners import reward_hacking
@task
def my_task():
return Task(
dataset=...,
solver=...,
scorer=[match(), reward_hacking()],
)扫描器的 Result 会转成 Score,并由 @scanner(metrics=...) 挂上的指标汇总。输出落在评测日志的分数里(不在 scans/),汇总方式和别的评分器一样。
哪些 Result.value 形状是合法分值、如何给扫描器挂指标,见 Inspect Scout 文档。
编写扫描器
扫描器是一个用 @scanner 装饰的异步函数。它检查一份 Transcript(一次样本的对话与事件记录),返回 Result 或 None。许多应用可以直接用高层的 llm_scanner(),由模型来分析记录。例如:
scanner.py
from inspect_scout import Scanner, Transcript, llm_scanner, scanner
@scanner(messages="all")
def ctf_environment() -> Scanner[Transcript]:
return llm_scanner(
question="In the transcript above do you detect "
"instances of environment misconfiguration "
"preventing the agent from completing its task?",
answer="boolean"
)@scanner 的 messages= 控制扫描器能看到哪些消息角色('all'、'assistant'、'user',或角色列表)。
llm_scanner() 支持多种模型答案类型,包括布尔、数字、字符串、分类(单选或多选)和结构化 JSON。详见 LLM Scanner。
文本模式扫描
更细的判断往往要用大语言模型去搜记录。如果只是找文本模式,也可以用 grep_scanner()。例如,在助手消息里搜索可能表示秘密的短语:
from inspect_scout import Transcript, grep_scanner, scanner
@scanner(messages=["assistant"])
def secrets() -> Scanner[Transcript]:
return grep_scanner(["password", "secret", "token"])用法详见 Grep Scanner。
自定义扫描器
如果高层的 LLM 扫描器和 Grep 扫描器不够用,可以按需要写自定义扫描器。详见 Custom Scanners。
进一步阅读
Inspect Scout 文档:
- Inspect Scout:主文档站,含参考和教程。
- Workflow:扫描器开发、验证和部署的完整周期。
- Validation:对照人工标注的记录衡量扫描器准确度。
- Transcripts:读取和过滤记录,包括非 Inspect 来源。
关于 AI 评测日志分析的论文:
- Log analysis is necessary for credible evaluation of AI agents(Kirgis 等):说明为何需要日志分析,以及通过或失败会藏住什么。
- Seven simple steps for log analysis in AI systems(Dubois 等):分析 AI 评测日志的一套标准化方法。
UK AI Security Institute,Scanners,文档页无单独发布日期(检索于 2026-10-06),https://inspect.aisi.org.uk/scanners.html ,MIT License(Copyright (c) 2024 UK AI Security Institute)
觉得有用,转给同事
微信扫码
用微信扫一扫,在手机上打开后即可转发。