Inspect 工具 结果 复查: 继续、 终止, 还是 升级 给人
复查发生在工具已经返回、结果交回模型之前。没有策略覆盖的结果会继续。桥接智能体的工具结果目前不会被复查。

本文目录
工具结果复查
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)。
觉得有用,转给同事
微信扫码
用微信扫一扫,在手机上打开后即可转发。