资讯动态

Key 分离后看 GAUGE,TaoToken 帮 LLM judge 去偏

发布时间:2026/9/17 20:02:02 来源:尧图企业网站定制
1. 从一次 judge 评分漂移说起Key 分离后先看 GAUGE在 Claude Code 或 Codex 里跑任务型智能体评测时如果你把 Agent Key 和 Judge Key 混在一起评分漂移会很难归因用 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentgauge_intro 拿到独立 Key 后Base URL 填 https://taotoken.net/api再去看 GAUGE 论文里的满意度陷阱链路会清楚很多。很多评测架构师第一次遇到这类问题不是模型突然变差而是调用记录里缺少“谁在评谁”的边界Agent 用一套 Key 跑任务Judge 又用同一套 Key 打分限流、并发、上下文缓存、甚至路由到的模型版本都可能混在一起。于是同一个轨迹上午判 pass下午判 fail你只能看到总分波动看不到 judge 那条独立调用到底输入了什么、输出置信度是多少、有没有被模拟用户的“满意”语气带偏。GAUGE 论文讨论的正是这个关卡LLM 模拟用户加上 LLM judge能不能可靠判断任务型智能体是否完成客户任务。结论并不乐观。满意度不等于任务成功被标为满意的对话里有相当比例实际没有完成任务当两个智能体能力接近时评估关卡还有不低的概率把奖励更低的一方选成更优。对评测架构师来说这意味着 judge 不能被视为一个黑盒裁判而要被视为一条需要隔离、记录、对照和去偏的评测管线。本文不会停在论文摘要层面而是从 Key 分离开始给出一条可跟做的接入与排障路径先准备 TaoToken Key再配置 Claude Code、Codex 和 CC Switch最后跑出 Key 分离调用记录与去偏前后对照表。2. GAUGE 的核心提醒满意度信号为什么会在任务型评测里失真Amazon GAUGE 的研究对象是“LLM 模拟用户 LLM judge”这一套评估关卡。它的工作方式是用一个 LLM 扮演用户与任务型智能体对话再用一个 LLM judge 阅读对话轨迹判断智能体是否完成了用户任务或者给出偏好奖励。这个设计看起来很自然因为人工评测成本高模拟用户和自动 judge 可以规模化。问题在于模拟用户表达的是“感受”judge 需要判断的是“任务状态”两者不是一回事。论文里有一个非常关键的数字在被评为满意的对话中57.5% 实际未完成客户任务。也就是说用户模拟器说“谢谢这解决了我的问题”时任务可能只完成了一半或者只是表面应答正确实际约束没有满足。Judge 如果过度依赖对话语气、礼貌程度、用户反馈就会把“满意”误读为“成功”。这就像在代码评审里作者回复“已修复”但测试并没有通过如果评审员只看回复语气就会给出错误通过。更隐蔽的是能力相近智能体之间的配对比较。GAUGE 发现当两个智能体水平接近时这个 LLM judge 关卡有 31% 的配对选出了奖励更低的一方而当两者能力差距明显时错误配对的概率降到不足 1%。这说明 judge 在“一眼能看出谁强”的场景里还有用在“需要精细区分”的场景里非常不可靠。对评测架构师来说这直接推翻了“只要加一个 LLM judge 就能做 A/B 测试”的简化思路。能力接近的模型或策略之间恰恰是最需要评测精度的地方也是 judge 偏差最容易被放大的地方。从架构上看偏差至少有四个来源。第一用户模拟器偏差模拟用户可能过早满意、过度配合、或者没有把真实约束说全。第二judge 偏差judge 可能偏好长回答、礼貌回答、格式漂亮的回答而不是真正完成任务的回答。第三任务完成信号缺失如果轨迹里没有可验证的状态变化judge 只能靠文本推测。第四调用链路污染Agent 和 Judge 共用 Key、共用限流、共用日志导致你无法判断波动来自模型还是来自评测管线。Key 分离不能直接消除前三个偏差但它能让第四个偏差可观测并为前三个偏差的去偏实验提供干净记录。3. 评测架构师视角把 Judge 调用从 Agent 链路里拆出来Key 分离不是单纯“再申请一个 Key”而是把评测系统拆成两个可独立审计的调用面Agent 调用面和 Judge 调用面。Agent 调用面负责执行任务、调用工具、产生轨迹Judge 调用面负责读取轨迹、应用 rubric、输出评分和理由。两者可以共用同一个 Base URL但必须使用不同的 Key、不同的日志标签、不同的限流池。对 TaoToken 的接入来说Base URL 统一填 https://taotoken.net/apiKey 占位符用 YOUR_API_KEY但实际使用时建议 Agent 和 Judge 各拿一个 Key。在分离 Key 调用 judge 之前先到 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentkey_split 获取 TaoToken Key。官网里可以看到模型对话、Coding Plan、API Keys 等入口如果你只是先做小规模 judge 去偏实验可以从模型对话或 API Keys 进入确认 Key 可用后再接入自动化脚本。不要在其他来路不明的页面填 Key也不要把 Agent 的 Key 直接复制给 Judge 脚本。Key 分离的第一条纪律是Judge 的 Key 不进入 Agent 的运行环境Agent 的 Key 不进入 Judge 的评分脚本。一个最小可用的分离架构可以写成这样agent-runner/ .env.agent # Agent 专用 Key只负责执行任务 traces/ task-001.jsonl # 轨迹、工具调用、最终状态 judge-runner/ .env.judge # Judge 专用 Key只负责评分 rubric/ task-success.md # 任务完成判定标准 records/ judge-before.csv # 去偏前记录 judge-after.csv # 去偏后记录Agent 侧环境变量示例export AGENT_BASE_URLhttps://taotoken.net/api export AGENT_API_KEYYOUR_API_KEY export AGENT_MODELclaude-sonnet-4-5Judge 侧环境变量示例export JUDGE_BASE_URLhttps://taotoken.net/api export JUDGE_API_KEYYOUR_API_KEY export JUDGE_MODELclaude-sonnet-4-5 export JUDGE_TAGgauge-debias-run-001这里两个 Key 都用 YOUR_API_KEY 占位实际落地时要替换成不同 Key。分离后你至少能在日志里回答四个问题这次评分是谁调的、用了哪个模型、读到哪条轨迹、输出理由是什么。没有这四个字段去偏前后对照就没有意义。4. Claude Code 侧配置settings.json 与 ANTHROPIC_* 的隔离写法如果你用 Claude Code 作为任务型智能体的执行端配置入口通常是 settings.json 或项目级环境变量。这里要区分两件事Claude Code 自己的模型调用配置以及 Judge 脚本的模型调用配置。Claude Code 可以用 ANTHROPIC_* 系列变量指向 TaoToken 的 Base URLJudge 脚本建议单独用 JUDGE_* 变量不要和 Claude Code 的 ANTHROPIC_* 混在一起。一个 Claude Code settings.json 示例{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: YOUR_API_KEY, ANTHROPIC_MODEL: claude-sonnet-4-5, ANTHROPIC_SMALL_FAST_MODEL: claude-haiku-4-5 }, permissions: { allow: [ Read, Write, Bash(git status), Bash(python -m pytest:*) ] } }这个配置只服务 Agent 执行面。不要把 Judge 的 Key 写进同一个 settings.json也不要在 Judge 脚本里复用 ANTHROPIC_API_KEY。Judge 脚本可以这样初始化import os from openai import OpenAI judge_client OpenAI( api_keyos.environ[JUDGE_API_KEY], base_urlos.environ.get(JUDGE_BASE_URL, https://taotoken.net/api), ) agent_client OpenAI( api_keyos.environ[AGENT_API_KEY], base_urlos.environ.get(AGENT_BASE_URL, https://taotoken.net/api), )注意Claude Code 使用 ANTHROPIC_* 是合理的但 Codex 不应该套用 ANTHROPIC_。下一节会单独写 Codex 的 config.toml。很多“评分漂移”其实来自配置串用Agent 用 Claude Code 的 ANTHROPIC_Judge 脚本也从同一个 shell 继承了 ANTHROPIC_API_KEY结果两个调用面在网关侧看起来是同一个 Key限流和日志完全分不开。分离做法是给 Judge 脚本单独开 shell或者在启动脚本里显式 unset ANTHROPIC 变量只保留 JUDGE_*。5. Codex 侧配置config.toml 里不要套 ANTHROPIC_*Codex 的配置体系和 Claude Code 不同。Claude Code 用 ANTHROPIC_Codex 通常用 config.toml 或对应 provider 配置。这里最容易犯的错误是看到 Base URL 都是 https://taotoken.net/api就把 ANTHROPIC_抄到 Codex 配置里。Codex 不认这套变量轻则读不到 Key重则回退到其他 provider导致你以为在做 judge 去偏实际调用链路已经变了。一个 Codex config.toml 示例model gpt-5-codex model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY [profiles.agent] model gpt-5-codex model_provider taotoken [profiles.judge] model gpt-5 model_provider taotoken对应的环境变量export TAOTOKEN_API_KEYYOUR_API_KEY如果 Agent 和 Judge 都要走 Codex建议用 profile 区分但 Key 仍然建议分开。比如 Agent 启动时用 AGENT_API_KEYJudge 启动时用 JUDGE_API_KEY然后在包装脚本里映射到 TAOTOKEN_API_KEY# Agent 启动包装 export TAOTOKEN_API_KEY$AGENT_API_KEY codex --profile agent # Judge 启动包装独立 shell export TAOTOKEN_API_KEY$JUDGE_API_KEY codex --profile judge这样做的目的是让每个调用面在网关侧有独立 Key同时又不让 Codex 去读 ANTHROPIC_*。如果你在 Codex 里看到 401 或 provider 不存在优先检查三件事config.toml 的 provider 名称是否和 profile 一致、env_key 是否指向实际存在的环境变量、base_url 是否写成 https://taotoken.net/api 而不是带路径的地址。修正后再跑一条最小 judge 调用确认返回内容里没有回退到其他模型。6. CC Switch 三件套Agent、Judge、Review 配置分仓当项目里同时存在 Claude Code、Codex 和多个 Judge 脚本时手工切换环境变量很容易出错。CC Switch 适合把不同配置分仓管理。这里的“三件套”不是三个插件而是三类配置Agent 配置、Judge 配置、Review 配置。Agent 配置负责执行任务Judge 配置负责自动评分Review 配置负责人工抽检、偏差标注和对照表生成。三者的 Key 和 Base URL 可以都指向 TaoToken但必须可追踪。一个可落地的目录结构cc-switch-workspace/ agent/ claude-settings.json codex-config.toml judge/ .env.judge judge_pipeline.py rubric/ task-success.md style-bias.md review/ .env.review sample-review.csv compare-report.md在 CC Switch 里可以把 Agent 配置切到claude-settings.json或codex-config.toml把 Judge 配置切到.env.judge把 Review 配置切到人工抽检脚本。TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentcc_switch 提供了 API Keys 入口建议在分仓时为 Agent、Judge、Review 分别创建 Key并在 Key 备注里写清用途。这样即使某个 Key 触发限流你也能快速判断是执行任务导致的还是批量 judge 导致的。CC Switch 三件套的核心价值是“切换不串味”。Agent 配置里不要出现 JUDGE_API_KEYJudge 配置里不要出现 ANTHROPIC_API_KEYReview 配置只读轨迹和评分结果不直接调用 Agent 工具。每次切换后先运行一条健康检查curl -s https://taotoken.net/api/models \ -H Authorization: Bearer $JUDGE_API_KEY \ | head -n 20如果这条命令返回模型列表或权限提示说明 Key 和 Base URL 基本可用。如果返回 401先检查 Key 是否拼错、是否多了空格如果返回 404检查 base_url 是否误写成 https://taotoken.net/api/v1 或带上了多余路径。健康检查通过后再运行 judge 脚本这样可以把接入问题和评分问题分开。7. 可复现产出Key 分离调用记录与去偏前后对照表这一节给出一条可复现的最小实验。目标不是复现论文全部结论而是产出你自己的“Key 分离调用记录”和“去偏前后对照”。准备 20 到 50 条任务轨迹每条包含用户目标、工具调用、最终回答、可验证状态。然后跑两轮 judge第一轮用单 judge、单 Key、直接问“用户满意吗任务成功吗”第二轮用分离 Key、显式 rubric、位置交换、双 judge 一致性检查。两轮结果写入 CSV对比 pass/fail 和奖励方向。Judge 脚本示例import csv import json import os import time from openai import OpenAI client OpenAI( api_keyos.environ[JUDGE_API_KEY], base_urlos.environ.get(JUDGE_BASE_URL, https://taotoken.net/api), ) RUBRIC 你是任务完成度评审不是语气评审。 只根据以下条件判断 1. 用户目标是否被逐条满足 2. 工具调用是否产生了可验证状态 3. 最终回答是否包含未完成事项 4. 如果信息不足输出 UNKNOWN不要猜。 输出 JSON{task_success: true/false/unknown, reason: ..., confidence: 0-1} def load_traces(path): with open(path, r, encodingutf-8) as f: for line in f: if line.strip(): yield json.loads(line) def judge_trace(trace, rubricRUBRIC): prompt f{rubric}\n\n轨迹\n{json.dumps(trace, ensure_asciiFalse)} resp client.chat.completions.create( modelos.environ.get(JUDGE_MODEL, claude-sonnet-4-5), messages[{role: user, content: prompt}], temperature0, ) content resp.choices[0].message.content return content def run(input_path, output_csv, tag): with open(output_csv, w, newline, encodingutf-8) as f: writer csv.writer(f) writer.writerow([trace_id, tag, task_success, confidence, reason, raw]) for i, trace in enumerate(load_traces(input_path)): raw judge_trace(trace) try: parsed json.loads(raw) writer.writerow([ trace.get(id, ftrace-{i}), tag, parsed.get(task_success), parsed.get(confidence), parsed.get(reason, ), raw.replace(\n, )[:500], ]) except Exception: writer.writerow([ trace.get(id, ftrace-{i}), tag, parse_error, , , raw.replace(\n, )[:500], ]) time.sleep(0.2) if __name__ __main__: run(traces/task-001.jsonl, judge-runner/records/judge-before.csv, before)去偏后版本做三件事第一用独立 JUDGE_API_KEY第二把轨迹顺序交换后再评一次检查偏好是否稳定第三把“用户满意”字段从 judge 主提示中移除只保留任务完成 rubric。对照表可以这样设计trace_id,before_success,after_judge_a,after_judge_b,agreement,final_success,note task-001,true,false,false,一致,false,满意度高但未完成约束 task-002,false,true,true,一致,true,首轮judge漏读工具结果 task-003,true,true,false,不一致,unknown,需人工抽检这张表的价值在于你能看到哪些样本从 true 翻成 false哪些从 false 翻成 true哪些双 judge 不一致。翻成 false 的样本往往正是 GAUGE 提到的“满意但未完成”翻成 true 的样本可能是首轮 judge 漏读了工具返回不一致样本则应该进入人工抽检。Key 分离调用记录要保留 Key 标签、模型名、时间戳、轨迹 ID不要只保存总分。只有记录足够细去偏前后才能解释差异而不是换一个模型重新猜。8. 去偏策略清单从单 Judge 到多 Judge 一致性检查如果你确认 LLM judge 在能力相近的智能体之间容易反转就不要把单次 judge 当最终结论。以下清单可以作为评测架构师的日常检查项。第一显式任务完成 rubric。把“用户是否满意”和“任务是否完成”拆成两个字段。满意度只作为辅助信号不作为通过依据。第二工具状态优先。如果轨迹里有文件写入、测试通过、API 返回成功等可验证状态judge 必须先看这些再看自然语言总结。第三位置交换。配对比较时把 A/B 顺序交换一次两次偏好不一致就标记为不确定。第四多 judge 投票。用两个不同模型或两个不同 Key 调用的 judge 做一致性检查但注意不要把同一 Key 的两次调用当成两个独立 judge。第五置信度阈值。低置信度样本不进入自动结论进入人工抽检。第六长度和格式偏差控制。在 rubric 里明确“回答更长、格式更漂亮、语气更礼貌都不加分”。第七用户模拟器审计。检查模拟用户是否过早表达满意是否遗漏约束。第八保留原始调用记录。每次 judge 的输入、输出、模型、Key 标签、时间戳都要落盘。这些策略不能保证 judge 完全无偏但能让偏差可见、可对照、可复现。特别是 Key 分离后你可以单独统计 Judge Key 的调用量、失败率、平均延迟和评分分布把它和 Agent Key 的指标分开看。如果 Judge Key 的失败率突然升高评分漂移可能来自限流或超时而不是模型判断变化。如果 Judge Key 正常但评分分布整体偏移才需要检查 rubric、模型版本或提示词变更。9. 常见报错与排查401、模型名、Base URL 与超时Key 分离接入 TaoToken 时常见问题集中在四类。第一类401 未授权。优先检查 Key 是否复制完整、是否有多余空格、是否用了已失效的 Key。可以在本地执行curl -i https://taotoken.net/api/models \ -H Authorization: Bearer YOUR_API_KEY如果这里就 401不要继续查 Python 脚本。先到 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contenttroubleshooting 的 API Keys 入口确认 Key 状态再检查 Base URL 是否写成 https://taotoken.net/api。注意Base URL 不带 UTM 参数代码里也不应该把 UTM 拼到 API 请求上。第二类404 或 model not found。通常是模型名写错或者把 Claude Code 的模型名直接套到 Codex profile 里。Claude Code 用 ANTHROPIC_* 时模型名可以按 Claude 系列写Codex 的 config.toml 则要使用对应 provider 支持的模型名。不要把 ANTHROPIC_MODEL 写进 Codex config.toml。第三类超时。批量 judge 时很容易触发并发限制建议在脚本里加退避重试并把 Judge Key 和 Agent Key 分开限流。第四类评分结果解析失败。如果 judge 返回自然语言而不是 JSON检查提示词是否明确要求 JSON如果仍然失败在脚本里保留 raw 字段后续人工修正不要直接丢弃。排查时建议按“先连通、再单条、再批量”的顺序先用 curl 验证 Key 和 Base URL再用单条轨迹跑一次 judge检查输入输出最后才跑 20 条以上批量对照。很多所谓“GAUGE 偏差”其实是接入配置错误比如 Judge 脚本继承了 Agent 的 ANTHROPIC_API_KEY或者 Codex 配置里没有生效 provider导致实际调用的模型和日志里记录的不一致。Key 分离、日志标签、Base URL 核对这三步能把大部分接入噪声排除掉。10. 把去偏流程固化从模型对话到 Coding Plan 的 CTA 路径把 Key 分离和 GAUGE 去偏做成日常流程核心不是记住论文数字而是让每次 judge 调用都有独立身份、每次评分都有对照记录、每次配对比较都有一致性检查。你可以从一个小实验开始拿 20 条轨迹先用单 judge 跑 before再用分离 Key 加 rubric 跑 after最后比较翻转样本和不一致样本。只要这张对照表能稳定产出你就已经比“直接信任 LLM judge”前进了一大步。如果你还没有 TaoToken Key可以按下面路径接入模型对话https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentcta_chatCoding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcta_plan创建 API Keyhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentcta_keysClaude Code 文档https://taotoken.net/doc/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentcta_claude_code拿到 Key 后把 Base URL 统一设为 https://taotoken.net/apiAgent 和 Judge 分别使用不同 Key。Claude Code 侧检查 settings.json 里的 ANTHROPIC_* 是否只服务执行面Codex 侧检查 config.toml 的 provider 和 env_key不要把 ANTHROPIC_* 抄进去CC Switch 侧把 Agent、Judge、Review 三套配置分仓。最后跑一遍你的 judge-before.csv 和 judge-after.csv看看哪些样本从满意但未完成变成 false哪些样本从误判变成 true。Key 分离不是终点但它是让 LLM judge 去偏可观测、可复现、可审计的起点。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价