CodexQA

Industry & PracticeTools & Frameworks

Inspect 扫描器:在评测记录里找拒绝、评测意识和奖励破解

CodexQA 团队4 min read

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

In this piece

扫描器

概述

扫描器(scanner)阅读评测记录,找出可能削弱结果的问题,例如拒绝回答、评测意识、环境配错、运行错误、奖励破解等。评测意识(evaluation awareness)是模型察觉自己正在被评测并因此改变行为。奖励破解(reward hacking)是模型走捷径拿到分数,却没有完成任务本来要求的事。Kirgis 等认为,这种日志分析对可信的 AI 评测是必要的,因为仅看通过或失败会掩盖捷径、基准里的人为痕迹和不安全行为。Dubois 等提出了一套做这件事的标准化方法。

扫描器和评分器类似,但有两点不同:

  1. 评分器给每个样本返回一个分数,用来给任务是否成功打分;扫描器常常只在发现问题时才返回结果,所以发现通常是稀疏的。
  1. 扫描器的发现写到评测日志旁边单独的 scans/ 目录,不嵌进日志本身。因此可以一起查看多次评测的扫描结果,扫描器也可以在评测进行时用、事后离线再跑,或两种都做。

扫描器用 Inspect Scout 包来写。本页讲三种把它接进 Inspect AI 评测的方式:

  • 离线扫描:对已有的评测日志目录运行 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 文档:

  • Workflow:扫描器开发、验证和部署的完整周期。
  • Validation:对照人工标注的记录衡量扫描器准确度。
  • Transcripts:读取和过滤记录,包括非 Inspect 来源。

关于 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)

Found it useful? Pass it on

WeChat

Scan with WeChat to open it on your phone and forward it.

Subscribe via RSS

Submit a correction