CodexQA

行业与实践工具与框架

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

CodexQA 团队阅读约 4 分钟

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

本文目录

扫描器

概述

扫描器(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)

觉得有用,转给同事

微信扫码

用微信扫一扫,在手机上打开后即可转发。

用 RSS 订阅

提交勘误