Files
AgentLab/docs/zh-CN/evaluation-and-ledger.md
T

10 KiB

English | 简体中文

回归评测与口径账本

这篇讲两件事:回归评测(换模型、改提示词、改目录之后,问数据还答得对不对)和口径账本(问数据答案里的数和已发布的口径对不对得上)。给搭建者和管理员看。

回归评测

评测在导航的「评测」里,搭建者以上可见(快捷键 ⌥0)。

题集

每道题是一个问题加期望答案。期望可以是:

  • 一条 SQL:选格或列,每次评测重算,不冻结数值;查到遮罩列的拒收。
  • 一份已发布口径的指标。
  • 从某次问数据运行里认定的查询。
  • 「没有数据」,或者期望反问。
  • 一个变化的主要来源(贡献):期望 SQL 加一次变化拆解的参数。模式选可加、比率或乘积,参数名和分析工具的一样,另写点名前几段(1–10,缺省 1);期望是算出的主要来源和方向。
  • 一个判定:期望 SQL 加波动基线、趋势判断、差异检验(要写模式)或可比性检查的参数;期望是算出的判定类——常规波动还是超出,上升、下降还是没有明显趋势,差异站得住还是不足以下结论,可比还是不可比(见五种分析)。

规则:

  • 数值不许人填。贡献、判定两种期望里的段、方向、判定同样不许人填:在期望 SQL 的快照上,用和作答同一套分析算出来,作答前后各算一次。
  • 贡献、判定的参数里不写输入(就是期望 SQL 的结果)、总数、下钻和阈值;文字参数可以带定时变量 {{ schedule.* }}。期望 SQL 只返回两期时可以不写基期、本期:先的一期是基期。口径题、期望反问的题配不了这两种。
  • 阈值用这次评测开评时拍下的分析设置:算期望、各臂作答都按这一份,记进评测的指纹(「分析设置」)。期望算不了(历史不够、本期不完整……)的这一项不能评分,写明原因。
  • 文字要点由裁判判,单列,不计入准确率。
  • 口径升版后,用到它的题在顶部提示。每道题三选一:改为固定新版本、新旧两版各算一份期望、旧题归档另建新题。处置之前,评测时跳过这道题。
  • 题集能导入导出。
  • 仓库带一份分析题用的虚构零售库和题集:在 backend 目录下运行 python -m tests.fixtures.acceptance.retail_trends <库文件> [--today YYYY-MM-DD],生成截止昨天的 26 周订单(随机数种子固定),登记成名为 retail_trends 的只读数据源,再导入 tests/fixtures/eval/analysis_suite.json(八题,每个埋下的效应一题)。

发起评测

  1. 选变体:助手模型、写作模型、裁判开关、目录(当前 / 快照 / 只用已核实的 / 关)、重复几次。
  2. 看预估花费,确认发起。「目录贡献」预设一次跑「当前 vs 关」。
  • 评测在后台跑,每题怎么走和用户在问数据里拿到的一样(建图、运行、复核)。停在审批上的不代批,照实记。
  • 助手只给了思考、一个操作都没给时,自动重来一次。
  • 并发、每题时限、单次和每日金额都有上限,在「设置 → 偏好设置 → 评测」里改。评测的花费单独记账。
  • 每题的时限不算排队的时间。满载时评测会排在问数据后面(见运行并发)。
  • 能停,能只重试没做完的题。服务重启时标成中断,不会自己续跑。

看结果

  • 总览:准确率与可追溯准确率(带 Wilson 区间)、路径和出具档位的分布、按角色的用量与成本、耗时分位。
  • 逐题表:结论、期望和答案里的数、SQL 差在哪、看了几次表、花费;点开去看运行。
  • 对比:和上一次或基线比,看逐题转移与归因。
  • A/B 配对表:精确 McNemar 检验,只展示,不卡门。

贡献、判定两种期望这样评:

  • 对且可追溯:答案引用了判定对得上的分析结论(同一种分析,主要来源点名的是期望的那几段、方向一致);引用它的那句话却写反了的算错。
  • 对但没引用:没引用对得上的结论,但正文按说法表写对了(同一套判断词和绑定规则,见分析说法核对)。可比性没有对应的判断词,只能靠引用。
  • 错:引用的结论判定对不上、正文写反了(把常规波动说成异常、把上升说成下降、主要来源说成别的段)、做了分析没说,或者根本没做。
  • 不能评分:期望算不了。

系统写的「分析范围」不算答案的引用。答案引用分析结论时,逐题 E1 按它的输入查询比。

评测运行不进使用统计。评分规则现在是第 3 版(加了贡献、判定两种期望);老评测可以在评测详情里按新规则重评(只读封存,不调模型)。助手提示词的指纹包含分析方法和写作者的分析规则,和上一次比时这些改了会标「提示词变了」。

定时评测

定时任务的目标可以选题集。有一道题从通过变成不通过,就推「定时评测有退步」;消息里只有题集名、通过数、退步题数和链接。以题集为目标的定时任务不收 Webhook(回 422)。

口径账本

口径账本把问数据答案里的数,和已发布的口径对上。口径是一个指标怎么取数、怎么算的约定,固定在口径卡里。

逐个数标口径

探索运行封存后,系统在后台把答案和已发布的口径比对,给每个数标一种口径:

标签 含义
「等价已证明」 SQL 被证明和口径等价
「助手选用」 助手选用口径拼出来的
「相关口径」 用到同一张表却不等价,写明差在哪
「这次的推理」 和哪份口径都不沾边
  • 证据面板的出处链最上面多一步「口径」;问数据每一轮底下有一行摘要。比对还没出结果时,写「正在比对口径」并按退避重取。
  • 比对结果是一条封存后追加的事件 ledger.matched,出现在时间线和可验证报告的「封存后追加」里,不在封存范围内。启动时会补比最近 7 天的运行(跟着 AGENTLAB_SCHEDULER 开关)。
  • 逐个数判:报告引用了一条查询的几列(例如销售额、订单数、首末日)时,每个数按它那一列单独和口径的指标列比,多查的列不影响这个数。只在去掉别的列不会改变这个数时才这样比;有 DISTINCT、按别的列排序后截断、多出来分组列的,照旧整条比。
  • 多行查询没有 ORDER BY 时,引用其中一格不算「来自口径」,召回和对账里照实标「行序不定」。
  • 整题要每个来自数据的数都被证明来自同一份口径,才自动出具。
  • 分析结论里的数(占比、变化、波动范围)是从查询结果派生的,不比对、不标口径,摘要行也不计它们。

写口径的取数 SQL 时,最好不要取整(ROUND(SUM(x), 2)),也不要套 COALESCE(…, 0)。取整和缺省值交给口径卡的小数位和展示;否则问数据里没取整的写法永远认不成等价(差在哪会照实写出来)。

按口径正式出具

整题等价于一份已发布的受管口径时(SQL 被证明等价、版本受管、图里没有人工节点和写入),系统按口径自动发起一次正式运行,来源记为「按口径正式出具」。

  • 「设置」里的 ledger 一组可以关掉自动出具(auto_issue)。
  • 自动和一键出具合计每天最多 20 次。
  • 标「助手选用」的答案给一键出具。
  • 画布试跑、个人应用刷新这类不是问数据答案的运行,不自动出具。
  • 使用者按口径正式出具,只限他有权使用的应用固定着的口径版本。

对账

对标「相关口径」的数,点「看差多少」发起一次只读的对账运行:这次的数、口径的数和差值,各自点得开出处。

  • 对账的说明有没有用,可以反馈。
  • 使用者也能对账。
  • 要人选对照指标时,按逐个数核对过的那几列预选。

沉淀

同一类问题反复出现时,它会进工作流选择里的「可沉淀的问题」。判断标准:同一形状的查询 ≥3 次、来自 ≥2 段对话;或者问题聚成一类;或者答案被反复导出、做成应用。

可沉淀的问题可以固化成口径草稿:引用的查询变成取数节点,跨轮变化的字面量自动成为参数。审过再发布。

召回

受管口径发布新版本后,系统在后台反查用过旧版的问数据回答、正式运行、固定它的应用和导出,按参数分组,在同一份数据上重算两版之差(来源为「口径召回」的探索运行,差值在召回卡里算)。

  • 只有数真变了,才给答案的主人开「召回」待办,并推 ledger.recall。待办里旧值、新值、差值和原答案当时的值都点得开,可以按新版重新出具。
  • 没变的只记账,在原答案上记「已按 vN 核对,不影响」。
  • 全部指标都行序不定的,结论写「核对不了」并开待办。
  • 每次发布最多重算 ledger.recall_limit 组(缺省 50;0 表示只列不算),超出的在版本历史里点「接着算」。发布弹窗先预告规模。
  • 发布后自动的那一批,以及启动时接着做,都跟着 AGENTLAB_SCHEDULER 开关。
  • 数变了时可以推通知「口径升版,答案的数变了」(全局渠道、答案主人的个人渠道),消息里不放数字。
  • 目录或表结构的变化也会让答案标「依据有变」(见数据目录);只有按新目录新出现错误级问题的答案才开待办。

统计

四项统计由 GET /api/ledger/stats 现算:等价命中、对账、问题重复度、召回(E1–E4)。评测页的「口径命中与重复度」页签画趋势。

评测、口径对账、口径召回是系统代为发起的运行,不进使用统计,记录页默认不列。