CodexQA

行业与实践工具与框架

Inspect 日志查看器:看消息、评分和实时评测

CodexQA 团队阅读约 11 分钟

默认在 127.0.0.1 的 7575 端口打开日志,第二个实例示例用 6565。S3 实时日志默认每 10 秒同步,可改成 30 秒。控制台默认打印 warning 及以上,样本记录默认收录 info 及以上。

本文目录

日志查看器

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

概述

Inspect View 用来查看评测日志(evaluation log,一次评测写下来的样本、分数和事件),包括钻进消息历史、评分决定,以及写进日志的额外元数据。一次评测日志的主界面是这样的:

日志查看器主界面:任务结果摘要,以及 8 个单独样本。

下面说明怎样用好 Inspect View。

这一节讲的是交互式查看日志文件。也可以用 EvalLog API 对日志做计算(例如对比多次运行,或更系统地遍历结果)。用代码处理日志,见 Eval Logs 和 Data Frames。

VS Code 扩展

如果在 VS Code 里用 Inspect,Inspect VS Code 扩展带有集成的日志查看。安装时,在 VS Code 扩展市场面板里搜索 “Inspect AI”。

VS Code 扩展市场正在搜索 Inspect AI,右侧是扩展概览。

Inspect 活动栏的 Logs 面板(下面显示在 IDE 左下角)列出日志文件。选中一份日志后,它会在编辑器窗格里用 Inspect 日志查看器打开:

Logs 面板列出日志文件。

点日志面板顶部的打开文件夹按钮,可以浏览任意目录,本地或远程都可以(例如 Amazon S3 上的日志):

每次任务结果的底部也会显示评测日志链接:

终端里的任务结果,底部是评测日志链接。

如果不想用日志面板浏览和查看,也可以用 Inspect: Inspect View… 命令,打开一个运行 inspect view 的新窗格。

查看命令

不用 VS Code 时,也可以从命令行用 inspect view 直接运行 Inspect View:

$ inspect view

默认情况下,inspect view 使用它所在环境配置的日志目录(例如 ./logs)。可以用 --log-dir 指定别的目录,例如:

$ inspect view --log-dir ./experiment-logs

默认在本机(127.0.0.1)的 7575 端口运行,并结束已经占用该端口的 inspect view。要同时跑两个实例,可以换端口:

$ inspect view --log-dir ./experiment-logs --port 6565

一次会话开始时只需运行一次 inspect view(有新评测跑完时,它会自动更新显示)。

如果日志里有不可信的输出(例如来自没有防护的模型),inspect view --no-trust-content 会把全部日志内容显示成纯文本。见 Untrusted Content。

远程访问

单用户访问远程机器上的查看器时,把查看器绑在回环地址(loopback,只接受本机连接的地址)上,再用 SSH 端口转发:

$ ssh -L 7575:127.0.0.1:7575 user@remote

在远程机器上照常运行 inspect view,然后在本地打开 http://127.0.0.1:7575。

如果本地 DNS 或 hosts 文件把一个自定义名字映射到回环地址,要声明浏览器实际使用的那个源(origin,协议、主机和端口合在一起):

$ inspect view --trusted-origin http://my-inspect:7575

查看器仍然绑在 127.0.0.1。--trusted-origin 可以重复指定,并且只接受精确的 http 或 https 源;它也允许匹配的 HTTP Host。没有配置的别名仍然会被拒绝。

绑到回环地址以外,需要请求授权。浏览器访问时,把查看器放在一个会注入已配置上游授权头的、带认证的反向代理(reverse proxy,替外部请求转发并补上头的服务)后面:

$ INSPECT_VIEW_AUTHORIZATION_TOKEN="$UPSTREAM_SECRET" \
    inspect view \
    --host 0.0.0.0 \
    --trusted-origin https://inspect.example.org

通过平时的密钥管理机制加载 UPSTREAM_SECRET,并把它设成完整的、期望中的 Authorization 头取值(例如 Bearer ...)。代理必须认证外部用户,保留配置好的公开 Host,从受信任的代理地址设置公开请求的协议,去掉客户端自己带来的那份上游授权头,再注入配置好的值。浏览器如果直接指向一个受授权保护的查看器,没法在第一次打开页面时加上这个头。

未经认证就暴露到网络上,只在明确确认之后才可用:

$ inspect view \
    --host 0.0.0.0 \
    --trusted-origin "http://$MACHINE_IP:7575" \
    --unsafe-allow-unauthenticated

这会允许任何能到达该地址的网络客户端调用查看器 API。精确的 Host 与浏览器源校验,以及防嵌入保护,仍然有效。--trusted-host 可以为非浏览器客户端或健康检查增加一个精确的 authority,但不会授权一个浏览器源。前端和 API 放在不同源上不受支持。

前端的 X-Inspect-View-Request 标记用来把它的变更请求和浏览器被动加载资源区分开。它是公开的纵深防御,不是授权,也不是同源密钥。

日志历史

可以用右上角菜单查看并在日志目录里全部评测的历史之间切换:

日志历史面板盖在主界面左侧,每份日志带结果摘要。

实时查看

Inspect View 可以实时看评测任务的状态。主界面显示哪些样本已经完成(并带增量的指标计算)。样本视图(下面会说)让你在事件发生时跟着看样本记录(transcript,这一次样本里按时间留下的消息和事件)和消息历史。

如果在跑 VS Code,可以在任务进度画面里点 View Log 链接,打开任务的实时视图:

任务进度画面上的 View Log 链接。

如果用的是 inspect view 命令行,可以用上面说的日志历史查看进行中任务的日志。

S3 日志

多个用户要看放在 Amazon S3(或任何共享文件系统)上的实时日志时,加上 --log-shared,表示实时日志信息也要写到共享文件系统:

inspect eval ctf.py --log-shared

这是必需的,因为实时查看依赖一个只在评测所在机器上可见的本地日志事件数据库。--log-shared 指定实时日志信息也写到共享文件系统。默认每 10 秒同步一次。给 --log-shared 传一个值可以改这个间隔:

 inspect eval ctf.py --log-shared 30

样本详情

点一个样本,可以钻进它的消息、评分和元数据。

消息

消息标签页显示消息历史。这个例子里,模型在回答之前做了两次工具调用(为了简短,最后一条助手消息没有完整显示):

展开的样本:用户、助手和工具消息。

仔细看消息历史(尤其是智能体或多轮求解器)对理解评测构造得好不好非常重要。求解器(solver)是驱动模型一步步完成样本的程序。

评分

评分标签页显示更多细节,包括完整输入,以及模型对答案的完整解释:

展开的样本:评分细节,含输入、目标、答案和解释。

元数据

元数据标签页显示求解器、工具和评分器提供的额外数据(这个例子里,web_search() 工具记下了它为取得额外上下文而访问的 URL):

展开的样本:网页搜索工具记下的 URL。

分数与答案

可靠、高质量的评分是每一次评测的关键部分,而写出能做到这一点的自定义评分器(scorer,给模型输出打分的函数)可能很难。一大困难在于模型输出是自由文本:要比对的目标很具体,有时还得从一大段文字里把答案挑出来。模型打分的输出又是另一套挑战。

对基于比较的评分,评分器通常做两件核心的事:

  1. 从模型输出里抽出答案;以及
  1. 把抽出的答案和目标比较。

评分器在这两步的任何一步都可能打错分。可能完全抽不出答案(例如正则不够灵活),也可能没能正确认出等价答案(例如把 “1,242” 看成和 “1242.00” 不同,或把 “Yes.” 看成和 “yes” 不同)。

可以用日志查看器抓住并检查这类问题。例如,这里能看见有几道被判错的题没有抽出答案:

若干样本里有 3 个被标为不正确。Answer 列是从模型输出抽出的答案。

这些答案有可能确实错了。也有可能正确答案就在模型输出里,只是格式和预期不完全一样。每种情况都要点进样本去查。

答案不会自己出现,评分器要在评分时产出它们。Inspect 内置的评分器都会这么做。自己写自定义评分器时,只要做得到,返回的 Score 对象里应始终带上 answer。例如:

return Score(
    value="C" if extracted == target.text else "I", 
    answer=extracted, 
    explanation=state.output.completion
)

如果只返回 “C” 或 “I” 的 value,打分时所比较的具体内容就丢了。

还有一个 explanation 字段:它同样重要,因为它让你看到抽出答案时所依据的全部上下文。

筛选与排序

按分数筛选日志条目常常有用(例如,查不正确的答案是评分器的问题,还是真的错)。用 Scores 选择器按具体分数筛选:

只显示不正确的样本,Scores 选择器选中了 Incorrect。

默认按样本顺序排列(一个轮次里的全部样本按顺序放在一起)。轮次(epoch)是同一批样本再跑一遍。也可以按分数排,或按样本排(这样能把同一个样本在所有轮次上的结果放在一起看)。用 Sort 选择器控制:

同一个样本在评测的 4 个轮次上的结果。

按样本查看对诊断不一致从哪来特别有用(并判断它是固有的,还是评测方法造成的假象)。上面能看见样本 1 在第 1 轮不正确,是因为模型在组成正确的函数调用时出了问题。

Python 日志

除了评测日志文件里的标准信息,开发调试时可能还要额外打控制台日志。Inspect 安装了一个日志处理器,把日志输出显示在评测进度上方,并写进评测日志文件。

如果按 Python logging 库的推荐做法取得 logger,日志会和 Inspect 配合得好。例如,这里在开发一个网页搜索工具,希望每次出现查询都记一笔:

# setup logger for this source file
logger = logging.getLogger(__name__)

# log each time we see a web query
logger.info(f"web query: {query}")

这些日志条目都会进样本记录。

日志级别

各级别及其适用场合如下(严重程度递增):

级别说明
debug详细信息,通常只在诊断问题时才关心。
trace显示运行时动作的跟踪消息(例如模型调用、子进程执行等)。
httpHTTP 诊断,包括请求和响应状态。
info确认事情在按预期工作。
warning或预示不久之后会出现某个问题(例如 “disk space low”)。软件仍在按预期工作。
error由于更严重的问题,软件没能完成某项功能。
critical严重错误,表示程序本身可能无法继续运行。

#### 默认级别

默认情况下,warning 及以上的消息打印到控制台,info 及以上的消息写进样本记录。这样可以在代码里放很多 logger.info(),默认不显示在控制台,需要时又能在日志查看器里看到。

如果也想在控制台看到 info 消息,使用 --log-level info:

$ inspect eval biology_qa.py --log-level info
终端里的任务显示,网页搜索工具的若干 info 日志打在任务显示上方。

用 --log-level-transcript 控制写进样本记录的级别:

$ inspect eval biology_qa.py --log-level-transcript http

也可以用环境变量 INSPECT_LOG_LEVEL 和 INSPECT_LOG_LEVEL_TRANSCRIPT 设置日志级别(它们常常写在 .env 配置文件里)。

外部文件

除了在一次评测结束时于日志查看器里看 Python 日志,也可以把 Python logger 条目写到外部文件。设置环境变量 INSPECT_PY_LOGGER_FILE:

export INSPECT_PY_LOGGER_FILE=/tmp/inspect.log

可以在 shell 里设,也可以写进全局 .env 文件。默认会把 info 及以上写进该日志文件。如果把主 --log-level 设得更低(例如 http),日志文件会跟着走。要给文件单独设级别,设置 INSPECT_PY_LOGGER_LEVEL。例如:

export INSPECT_PY_LOGGER_LEVEL=http

用 tail --follow 实时跟踪日志文件内容。例如:

tail --follow /tmp/inspect.log

日志格式

控制台日志可以用 rich(ANSI)、plain(非 ANSI)或 json 格式化。在非 TTY 的 CI、容器和日志汇聚里,可能想用 plain 或 json 得到单行日志。用环境变量 INSPECT_PY_LOGGER_FORMAT:

export INSPECT_PY_LOGGER_FORMAT=plain

任务信息

日志查看器的 Info 面板提供评测任务的额外元信息,包括数据集、求解器、评分器细节、git 修订,以及模型 token 用量:

Info 面板:数据集、求解器、评分器、git 修订和 token 用量。

发布

可以用命令 inspect view bundle(或 Python 的 bundle_log_dir())生成一个自包含目录,里面有日志查看器和一组要展示的日志。这个目录可以部署到任何支持 HTTP 范围请求(HTTP range request,只取文件某一段字节的请求)的静态网站服务器(例如 GitHub Pages、S3 存储桶或 Netlify),得到独立的查看器。例如,把 logs 目录打包到名为 logs-www 的目录:

$ inspect view bundle --log-dir logs --output-dir logs-www

或打包默认日志文件夹(从 INSPECT_LOG_DIR 读取):

$ inspect view bundle --output-dir logs-www

默认不会覆盖已有的输出目录。指定 --overwrite 才会删掉并替换已有输出目录:

$ inspect view bundle --output-dir logs-www --overwrite

把查看器和日志打包后,输出目录结构如下。原文代码块里的行号是页面排版带上的:

logs-www
1 └── index.html
2 └── robots.txt
3 └── assets
     └──  ..
4 └── logs
     └──  ..

把这个文件夹部署到静态网站服务器,即可发布日志查看器。

HuggingFace Spaces

把打包好的日志查看器直接发到 HuggingFace Spaces,只要输出目录以 hf/ 开头。例如,发到名为 my-org/my-eval-logs 的 space:

$ inspect view bundle --log-dir logs --output-dir hf/my-org/my-eval-logs

这个 space 会建成静态 space,日志立刻可以在 https://huggingface.co/spaces/my-org/my-eval-logs 打开。默认建成私有 space。要建公开 space,用 Python API:

from inspect_ai.log import bundle_log_dir

bundle_log_dir(
    log_dir="logs",
    output_dir="hf/my-org/my-eval-logs",
    fs_options={"private": False}
)

发布到 HuggingFace Spaces 需要 huggingface_hub 包,以及 HuggingFace 认证(通过 huggingface-cli login 或环境变量 HF_TOKEN)。

其他说明

  • 可以在 .env 文件里设置 INSPECT_VIEW_BUNDLE_OUTPUT_DIR,作为打包查看器的默认输出目录。
  • 可以把 S3 URL 当作打包视图的目标。配置 S3 的进一步说明见 Amazon S3。
  • 可以直接用 Python 函数 inspect_ai.log.bundle_log_dir,把查看器和日志打包进一个输出目录。
  • 打包后的查看器默认显示第一份日志文件。可以在链接里带上 log_file URL 参数,让查看器显示指定日志,例如:https://logs.example.com?log_file=<log_file>
  • 打包输出目录包含 robots.txt,用来阻止网络爬虫索引。如果把这个文件夹部署在网站根目录以外,就需要相应更新根目录的 robots.txt,把该文件夹排除出索引(因为网络爬虫只读网站根目录的 robots.txt,不读子目录)。
  • Inspect 日志查看器用 HTTP 范围请求来高效读取打包里提供的日志文件。请使用支持 HTTP 范围请求的服务器来提供这些静态打包文件。大多数 HTTP 服务器支持,但 Python 内置的 http.server 不支持。

出处:UK AI Security Institute,Log Viewer,文档页无单独发布日期(检索于 2026-11-02),https://inspect.aisi.org.uk/log-viewer.html ,MIT License(Copyright (c) 2024 UK AI Security Institute)。

觉得有用,转给同事

微信扫码

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

用 RSS 订阅

提交勘误