CodexQA

Industry & PracticeTools & Frameworks

Inspect 工具结果复查:继续、终止,还是升级给人

CodexQA 团队6 min read

复查发生在工具已经返回、结果交回模型之前。没有策略覆盖的结果会继续。桥接智能体的工具结果目前不会被复查。

In this piece

工具结果复查

UK AI Security Institute。Tool Result Review。文档页无单独发布日期(检索于 2026-11-03)。许可证:MIT License,Copyright (c) 2024 UK AI Security Institute。

概述

审批器(approver,决定一次工具调用能不能执行的函数)决定一次工具调用可不可以运行。复查器(reviewer,在工具已经返回之后看结果、决定这个样本还能不能继续的函数)看一次工具调用返回了什么,并决定样本(sample,评测里的一道题或一次运行)可不可以继续。结果一出现,复查器就在工具执行循环里运行,而且是在这个结果交回模型之前,所以它可以依据只存在于工具输出里的证据结束一个样本(例如,策略要求某条命令必须失败,它却成功了)。

复查器用复查策略(review policy,按顺序尝试的复查器列表)来配置,形态和审批策略一样:每条策略点名一个复查器以及它覆盖的工具,策略按顺序求值,第一个不升级的复查器做决定。升级(escalate,自己不拍板,把这一次交给下一个复查器)和审批器一样,复查器可以设在评测级,也可以设在任务级。

决定

复查器返回一个 Review,决定是下面三种之一:

决定效果
continue结果原样交回模型。
terminate样本结束,并记成一次操作者限制(operator limit,由操作者或策略主动停掉样本的那一类终止),和审批器的 terminate 完全一样。仍在跑的并行工具调用会被取消。
escalate由策略里下一个匹配的复查器做决定。

没有 reject,也没有 modify:调用已经跑完,没有东西可以拒绝或改写。没有任何策略覆盖的结果,或者每一个匹配的复查器都升级的结果,会继续。

只有真正执行过的调用才会被复查。被审批器拒绝的调用,或者因为参数解析失败、还没跑起来就失败的调用,没有产生结果,不会被复查。一次 handoff()(交接,把控制权交给另一个子智能体的工具调用)在子智能体返回之后,会像任何别的工具一样被复查:复查器看到的是这次交接调用(按它的工具名匹配,例如 transfer_to_helper)以及父模型收到的转移结果;子智能体自己的工具调用则在它们运行时被复查。

已执行工具报出的错误,只要本来会交回模型,就会被复查,包括从工具内部抛出的解析错误或审批错误。

人工复查器

human_reviewer() 把工具调用和它返回的结果一起给操作者看,并请求一个决定。界面和人工审批器相同:已连接的 ACP 客户端、全屏界面里的审批面板,或控制台。默认提供 continue 和 terminate;传入 choices 可以加上 escalate。这些界面就是审批用的界面,所以 continue 在那里显示成 “Approve”。操作者没做选择就把请求关掉,样本会被终止。

用 CLI 选项 --review human(或传给 eval() 的参数 review = "human")复查每一次工具调用的结果:

inspect eval browser.py --review human

把它放在策略的最后一个复查器,这样模型复查器可以把某一次调用的结果交给人(策略里最后一个复查器的 escalate 会继续,和任何没有人接住的升级一样):

reviewers:
  - name: output_monitor
    tools: "*"

  - name: human
    tools: "*"

自定义复查器

复查器是一个异步函数。它收到工具调用、调用结果和对话,返回一个 Review:

from inspect_ai.review import Review, Reviewer, reviewer
from inspect_ai.model import ChatMessage, ChatMessageTool
from inspect_ai.tool import ToolCall, ToolCallView, ToolResult

@reviewer
def no_network() -> Reviewer:
    async def review(
        message: str,
        call: ToolCall,
        result: ChatMessageTool,
        output: ToolResult,
        view: ToolCallView,
        history: list[ChatMessage],
    ) -> Review:
        if "HTTP/1.1 200" in str(output):
            return Review(
                decision="terminate",
                explanation="The agent reached the network.",
            )
        return Review(decision="continue")

    return review

参数是:

参数说明
message助手在这次工具调用旁边写出的文字。
call实际执行的那次调用(已经包含审批器做过的修改)。
result模型将要收到的 ChatMessageTool(工具消息,装工具结果、交给模型的那条消息)。长输出会先截到工具循环的 max_output(最大输出长度,过长结果被截断的上限),然后才生成这条消息。
output工具未经截断的返回值,所以从模型视野里裁掉的证据,复查器仍然看得到。
view这个工具可选的、给人读的调用渲染。
history到发出这次调用的那条助手消息为止的对话,含这条消息。

复查器抛出的异常会把样本以错误结束,和审批器抛异常一样。复查器自己发起的模型调用,不计入样本的 token 或回合限制。

工具调用的复查还没做完就取消这次调用,样本会以操作者限制停下。已经完成的工具结果留在记录里,并有一条信息事件记下复查被取消。如果样本因别的原因停下,未完成的复查器会被取消,它们那些工具已经完成的结果同样保留。被打断的复查不记录复查决定。

复查策略

策略可以写成 YAML,用 --review 传入:

reviewers:
  - name: no_network
    tools: ["bash", "python"]
inspect eval task.py --review review.yaml

写在你自己 Python 模块里的复查器,用它们的注册名来引用;用 @reviewer(name=...) 装饰器控制这个名字。tools 字段用和审批策略一样的 glob 语法,可以匹配工具名,也可以匹配工具名加上它的参数。

在 Python 里,传入一组 ReviewPolicy 对象:

from inspect_ai import eval
from inspect_ai.review import ReviewPolicy

eval(task, review=[ReviewPolicy(no_network(), tools=["bash", "python"])])

任务复查器

任务可以用 review 参数声明自己的复查器。它接受一个策略文件,或一组 ReviewPolicy 对象:

@task
def sandbox_task():
    return Task(
        dataset=dataset,
        solver=react(tools=[bash(), python()]),
        scorer=includes(),
        review=[ReviewPolicy(no_network(), tools="*")],
    )

传给 eval() 的 review,或 --review,会覆盖任务自己的复查器。

智能体复查器

execute_tools() 函数和 react() 智能体为方便也接受 review 参数,在工具执行期间应用复查策略:

from inspect_ai.model import execute_tools
from inspect_ai.review import ReviewPolicy

result = await execute_tools(
    messages, tools,
    review=[ReviewPolicy(no_network(), tools="*")]
)
from inspect_ai.agent import react
from inspect_ai.review import ReviewPolicy

agent = react(
    tools=[bash(), python()],
    review=[ReviewPolicy(no_network(), tools="*")]
)

这些策略在工具执行期间替换评测级和任务级复查器,执行结束时恢复之前的策略。替换是整个换掉:智能体自己的策略没有覆盖的工具不会被复查,即使评测级策略覆盖了它。把工作交接给另一个智能体的 react 智能体,会把自己的策略带进子智能体的工具调用。

桥接智能体

通过智能体桥(agent bridge,第三方智能体自己跑工具循环、Inspect 不执行那些工具的接入方式)接入的智能体自己跑工具循环,所以它们的工具结果从不经过 Inspect 的工具执行,也不会被复查。审批策略会作用在桥接智能体的工具调用上(见桥接智能体);复查这边对应的能力还没有实现。

记录

每一次决定在工具调用完成后记成一条 ReviewEvent(复查事件,记录里的一次复查决定),位置在它所复查的那次调用的 ToolEvent(工具事件,记下一次工具调用及其结果的记录)之后,也在这个工具自己发出的任何事件之后。这条事件记下复查器的名字、这次调用、决定,以及复查器的解释;结果和这次调用的视图在同一调用 id 的 ToolEvent 上。

出处:UK AI Security Institute,Tool Result Review,文档页无单独发布日期(检索于 2026-11-03),https://inspect.aisi.org.uk/review.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