1. 内容评测为什么还在用一次性 Prompt 硬扛
先说一个我最近反复遇到的场景。团队里做内容评测的同学,每天的工作流大概是这样的:打开对话框,粘贴一段文案,敲一句“帮我评价这篇文案,打 1-10 分,说明理由”,等模型吐出一个分数,觉得不靠谱,再补一句“从 25 岁女性用户视角重新打分”,来回拉锯三四轮,最后人肉把几个分数抄进表格。整个过程人全程盯着,模型每输出一次就要人判断一次,人成了流水线上最慢的那一环。
这个姿势的问题不在于 Prompt 写得不好,而在于结构本身是错的。一次性 Prompt 的假设是“模型一次输出就能给出可信结论”,但内容评测这件事天然带有主观性和多维度,单次采样必然有方差。你问同一个模型同一篇文案两次,分数可能差 1.5 分;你换个视角问,结论可能完全反过来。人盯着看,只能靠直觉判断哪次更靠谱,这既不可复现,也扛不住量。
更麻烦的是“自己判自己的卷子”。如果你让同一个模型既生成评测意见又给自己打分,它会倾向于维护自己上一轮的判断,越改越自信,而不是越改越准。Claude Code 团队在工程实践里反复强调一个原则:拆卷子和判卷子不能是同一个人。写代码的模型和验收代码的模型要分开,评测内容也一样——生成评测的 Agent 和校验评测质量的 Agent 应该是两个独立角色,各自有独立的上下文和判断标准。
那 Loop 是什么?一句话:你不再亲手给 AI 下每一条指令,而是设计一个系统,让系统替你下指令、替你验收、不合格自己重来,直到活干完。你的角色从“写指令的人”变成“设计规则的人”。Agent 是干活的那只手,Loop 是让这只手不用你盯着也能持续干活的管理机制。落到内容评测上,就是把“写一条 Prompt 打分”改造成“设计一个 ReAct 式评测回路”:Agent 反复生成评测、自评、修正,直到满足停止条件才把结果交给你。
这篇要交付的就是这套回路怎么搭。核心是用 TaoToken 统一 Key 把模型通道收敛成一个入口,然后在 Claude Code 里用 settings.json 和 config.toml 把 Loop 的轮次、停止条件、模型分工固定下来,最后跑一轮真实评测验证结果。适合谁?适合已经在用 Claude Code 或类似 Agent 工具、想把内容评测从手工拉锯升级成自动回路的同学。下面所有配置都可以直接复制改。
2. TaoToken 统一 Key 与 API 通道前置准备
在搭 Loop 之前,得先把模型通道这件事解决掉。Loop 的本质是让 Agent 反复调用模型,如果每次调用都要换 Key、换 Base URL、换模型名,回路根本跑不起来。TaoToken 在这里的作用就是提供一个统一的 API 通道:一个 Key 走通多个模型,Base URL 固定,模型 ID 按需切换。这样 Loop 里的“生成 Agent”和“校验 Agent”可以挂不同模型,但走同一个入口,配置只写一份。
你需要准备三样东西,我把它叫做三件套,后面所有配置文件都围绕它展开:
第一是 Base URL。TaoToken 的 API 入口是https://taotoken.net/api,注意这个地址不带任何查询参数,配置里原样写就行。第二是 API Key,在控制台的 API Keys 页面创建,创建后只显示一次,复制下来存好。第三是 Model ID,也就是你要调用的具体模型标识,比如做生成用哪个、做校验用哪个,这个在模型列表里能查到。
创建 Key 的入口在这里:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 。进去之后点新建,起个能认出来的名字,比如eval-loop-key,方便后面在多个项目里区分。创建完把 Key 复制到本地环境变量或者直接写进配置文件,别提交到 Git。
这里有个我踩过的坑要提醒:很多人习惯把 Key 写死在代码里,Loop 跑起来之后日志里会打印请求信息,Key 就泄露了。正确做法是写进 settings.json 的 env 字段或者系统环境变量,配置文件本身不进版本库。另外 Base URL 千万别自己拼路径,比如加个/v1之类的,TaoToken 的入口就是https://taotoken.net/api,多写反而会 404。
模型分工上,我的建议是生成 Agent 用一个能力强的模型,校验 Agent 用一个更便宜、更“挑剔”的模型。为什么校验要用不同的模型?因为同模型自评会有确认偏误,换一个模型来判卷,它没有维护上一轮结论的动机,打分更独立。这正好对应前面说的“拆卷子和判卷子不能是同一个人”。TaoToken 统一 Key 的好处就在这里:两个模型走同一个 Key,你只需要在配置里改 Model ID,不用维护两套鉴权。
如果你还没决定用哪些模型,可以先到模型对话页面手动试几个,看看哪个在评测任务上输出更稳定:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 。试的时候用同一段文案、同一个评测维度,对比不同模型的打分分布,选方差小的那个做校验 Agent。这一步花十分钟,能省后面大量调参时间。
3. 可复制的 settings.json 与 config.toml 骨架
这一节是整篇的核心,直接给可复制的配置。Claude Code 的配置分两层:settings.json管环境变量和权限,config.toml管模型通道和 Loop 参数。两个文件配合,才能让评测 Loop 跑起来。
先看settings.json。这个文件一般放在项目根目录的.claude/下,或者用户级的~/.claude/下。核心是把 TaoToken 的三件套注入环境变量,让 Claude Code 启动时就能读到:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的TaoTokenKey", "ANTHROPIC_MODEL": "你的生成模型ID", "EVAL_JUDGE_MODEL": "你的校验模型ID", "EVAL_MAX_ROUNDS": "5", "EVAL_SCORE_THRESHOLD": "8.0", "EVAL_STABLE_ROUNDS": "2" }, "permissions": { "allow": [ "Read", "Write", "Bash(python:*)" ] } }这里几个参数解释一下。ANTHROPIC_BASE_URL固定写https://taotoken.net/api,这是 TaoToken 的统一入口。ANTHROPIC_API_KEY填你刚才创建的 Key。ANTHROPIC_MODEL是生成 Agent 用的模型,EVAL_JUDGE_MODEL是校验 Agent 用的模型,两者不同,实现“拆卷子和判卷子分开”。EVAL_MAX_ROUNDS是 Loop 最大轮次,防止死循环,我设 5 轮,一般 3 轮内就能收敛。EVAL_SCORE_THRESHOLD是分数阈值,低于这个分就触发修正。EVAL_STABLE_ROUNDS是连续多少轮分数波动小于阈值就停止,设 2 表示连续两轮稳定就收工。
再看config.toml。这个文件管模型通道的细节和 Loop 的行为参数:
[model] provider = "taotoken" base_url = "https://taotoken.net/api" api_key_env = "ANTHROPIC_API_KEY" [model.generate] model_id = "你的生成模型ID" temperature = 0.7 max_tokens = 2048 [model.judge] model_id = "你的校验模型ID" temperature = 0.2 max_tokens = 1024 [loop] max_rounds = 5 score_threshold = 8.0 stable_rounds = 2 dimensions = ["信息准确", "表达清晰", "受众匹配", "转化引导"] stop_on_stable = true注意[model.judge]的temperature设得比生成低,0.2 左右。为什么?校验 Agent 的任务是稳定判卷,不是发挥创意,温度低一点打分更一致。生成 Agent 温度可以高一点,让它多给几个角度的评测意见。dimensions是评测维度,你可以按自己的内容类型改,比如做电商文案就加“卖点突出”,做技术文档就加“逻辑严谨”。
两个文件的关系是:settings.json负责把 Key 和模型 ID 注入环境,config.toml负责读取这些环境变量并定义 Loop 行为。Claude Code 启动时会先读 settings,再读 config,所以 config 里用api_key_env引用环境变量名,而不是直接写 Key。这样 Key 只存在一个地方,改起来方便,也不容易泄露。
如果你用的是 Codex 系的工具,配置思路一样,只是文件名换成auth.json,把 Base URL、Key、Model ID 三件套写进去:
{ "base_url": "https://taotoken.net/api", "api_key": "sk-你的TaoTokenKey", "model": "你的生成模型ID", "judge_model": "你的校验模型ID" }三件套到齐,通道就通了。接下来是让 Loop 真正跑起来。
4. 跑一轮 ReAct 评测 Loop 并对照结果
配置写完,现在跑一轮真实的评测 Loop。我用一段产品文案做测试对象,目标是让 Agent 反复生成评测、自评、修正,直到分数稳定在 8.0 以上且连续两轮波动小于 0.3。
第一步,在 Claude Code 里发起 Loop。命令很简单,把待评测内容和评测目标写进 prompt:
claude "对 ./content/sample.md 执行评测 Loop。按 config.toml 的 dimensions 逐项打分,生成 Agent 先出评测,校验 Agent 独立复核,低于 8.0 分或波动超过 0.3 就修正重来,最多 5 轮。每轮输出分数和理由。"第二步,观察 Loop 的 ReAct 过程。正常输出会呈现“思考-行动-观察-再思考”的循环。第一轮生成 Agent 给出初评,比如信息准确 7.5、表达清晰 8.0、受众匹配 6.5、转化引导 7.0,总分 7.25。校验 Agent 独立复核后指出“受众匹配”维度打分依据不足,建议补充目标人群画像再评。这就是“观察”阶段,Loop 没有直接接受初评,而是触发了修正。
第三步,看修正轮。第二轮生成 Agent 补充了人群画像,重新打分,受众匹配升到 7.5,总分 7.75。校验 Agent 复核后认为分数仍低于阈值,但波动已经收窄。第三轮继续微调,总分到 8.1,第四轮 8.15,连续两轮波动小于 0.3,触发stop_on_stable,Loop 停止。
结果对照是这样的:如果只用一次性 Prompt,你拿到的是单点分数 7.25,不知道这个分数可不可信。跑完 Loop 之后,你拿到的是收敛曲线和每轮修正理由,最终分数 8.15 是经过独立校验、多轮修正后的稳定值。更重要的是,整个过程你只在发起时写了一次指令,后面四轮全是系统自己跑的。
这里有个细节值得说:校验 Agent 用的是不同的模型,它没有看到生成 Agent 的推理过程,只看到评测结果和维度定义。这就是“拆卷子和判卷子分开”的落地——判卷的人不知道写卷子的人怎么想的,只按标准打分,独立性有保障。实测下来,同模型自评的分数普遍比异模型校验高 0.5 到 1 分,这个偏差在 Loop 里会被校验 Agent 压下来。
如果你想看每一轮的详细 trace,可以在 config.toml 里加一个log_rounds = true,Claude Code 会把每轮的输入输出写到.claude/logs/下。跑完一轮大概消耗几千 token,具体看内容长度和轮次,用 TaoToken 统一 Key 的好处是这些调用都走一个通道,账单和用量在一个地方看,不用在多个平台之间对账。
5. 常见报错与排查对照
Loop 跑起来之后,最容易撞的几个错我列一下,都是真实遇到过的。
401 鉴权失败。报错长这样:401 Unauthorized: invalid api key。原因通常是 Key 没注入成功,或者 settings.json 里的ANTHROPIC_API_KEY拼错了。排查步骤:先在终端echo $ANTHROPIC_API_KEY看环境变量有没有值,没有的话检查 settings.json 的 env 字段是不是写对了,或者 Key 是不是过期了。还有一种情况是 Key 复制时带了空格,肉眼看不出来,重新复制一次。确认三件套里的 Key 和 Base URL 都对,401 基本就解决了。
local proxy failed。报错类似local proxy failed: connection refused。这个一般是 Base URL 写错了,比如多加了/v1或者写成了https://taotoken.net/api/带尾斜杠。正确写法就是https://taotoken.net/api,不带尾斜杠,不带额外路径。改完重启 Claude Code 让配置生效。
reading choices 报错。报错长这样:error reading choices: unexpected response format。这个通常发生在模型返回格式和预期不符时,比如校验 Agent 返回了非结构化文本,而 Loop 期望 JSON。排查方向:检查 config.toml 里 judge 模型的max_tokens是不是太小,导致输出被截断;或者 prompt 里明确要求“以 JSON 格式输出分数和理由”。如果还不行,把 judge 的 temperature 再调低到 0.1,减少格式漂移。
OAuth 相关报错。如果你看到OAuth token expired或类似提示,说明工具在尝试走 OAuth 通道而不是 API Key。检查 settings.json 里是不是同时配了 OAuth 和 API Key,两者冲突时优先走 OAuth。解决办法是清掉 OAuth 相关配置,只保留ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY,强制走 TaoToken 通道。
Loop 不停止。如果跑了 5 轮还在继续,说明max_rounds没生效,或者stop_on_stable判断逻辑有问题。检查 config.toml 里max_rounds和stable_rounds是不是都写了,stop_on_stable是不是 true。另外分数波动阈值如果设得太小,比如 0.05,可能永远达不到,建议 0.3 左右起步。
分数一直上不去。如果连续几轮分数卡在阈值以下,不是 Loop 坏了,是内容本身或评测维度有问题。这时候看校验 Agent 的修正建议,通常是某个维度定义太模糊,Agent 不知道怎么改。把维度拆细一点,比如“表达清晰”拆成“句子长度”和“术语密度”,Agent 就有明确的修正方向了。
排查的时候有个通用技巧:把EVAL_MAX_ROUNDS临时设成 1,只跑一轮看输出,确认通道和格式没问题,再放开轮次。这样能把“通道问题”和“Loop 逻辑问题”分开定位,省得在一堆报错里猜。
6. 把评测 Loop 接进日常流程
配置跑通之后,下一步是把它接进日常。我的做法是在项目里放一个eval/目录,里面存待评测内容、config.toml 和一轮跑完的输出报告。每次有新内容要评,直接claude "对 ./eval/content.md 执行评测 Loop",跑完看报告。报告里不只有最终分数,还有每轮修正理由和收敛曲线,这些比单点分数有用得多。
如果你要批量评,可以写个简单的 shell 循环,把eval/下的文件逐个喂给 Loop。注意批量跑的时候把max_rounds调小一点,比如 3 轮,控制成本。TaoToken 统一 Key 在这里的优势是批量调用不用换鉴权,一个 Key 跑到底,用量在控制台一眼能看到。
长期做内容评测的话,建议把 Loop 配置和评测维度当成代码来维护,进版本库,每次调整维度都留记录。这样评测标准是可追溯的,不会因为换了个人就换一套打法。Coding Plan 适合这种长期、高频的 Agent 调用场景,如果你打算把评测 Loop 跑成日常流水线,可以看看:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 。
最后说一个我自己的体会:Loop 不是让 AI 替你做决定,而是让 AI 替你把重复的判断跑完,你只在关键节点做决策。内容评测这件事,人最该做的是定义“测什么、测谁、什么算好”,而不是一轮一轮盯着模型改 Prompt。把这三件事定义清楚,剩下的交给 Loop,你去看报告就行。