上个月,我发布了一个让我真心自豪的管线变更。一次 prompt 重写。一个全上下文审查步骤。一个详细的评分标准,用于捕捉重复并确保各片段之间的结构多样性。
我部署了它。观察了六周。告诉自己它在正常工作。
然后我构建了一个评估框架。在 7 种语言的 40 个真实生产剧集上运行。结果发现,审查步骤——我精心设计的那一步——正在可测量地让脚本变差。
不是中性。是变差。
每个片段的对话得分 3.34(满分 5 分)。大纲得分 3.01。而最终脚本,在审查通过之后呢?2.91。
那个旨在改进脚本的步骤,正在降低超过 12% 的质量。
这个转变——从"我以为它在工作"到"我知道它没有"——始于几周前。我当时在观看 Andrew Ng 在 DeepLearning.AI 上的 Agentic AI 课程,他强调了一个听起来显而易见但其实不然的观点:评估和追踪是任何 agentic 系统的基础。 没有它们,你就是在黑暗中调试。有了它们,你就能确切知道链条的哪个环节断裂了。
我已经进行了数月的临时脚本质量检查——像话轮长度比例和说话人平衡这样的结构性指标,再加上一个比较 A/B prompt 变体的 LLM 裁判。它们能捕捉到明显的回归。但它们不够全面。它们只覆盖一个阶段(对话),一次一种语言,并且是为 prompt A/B 测试设计的,而不是为全管线质量审计设计的。
Andrew 关于追踪的观点深深触动了我。我的管线每个剧集有五次主要的 LLM 调用——研究、大纲、每段对话、开场/收尾和审查——再加上一次 ElevenLabs TTS 处理。我对其中的一次有质量指标。其余四次完全依赖直觉信任。
所以我构建了一个真正的评估系统。完整。多维。可重复运行。这是它发现的结果,我在一天内发布的六项修复,以及实际改善了什么。
基线:三个改变一切的数字
我从我的生产数据库中评估了 40 个已完成的剧集——覆盖全部 7 种语言(en, vi, ja, ko, es, zh, fr)和 10 种播客风格——使用三套评分标准,每套五个维度。一个 LLM 裁判(GPT-5.6-terra)为每个阶段打分。
| Stage | Score | Worst Dimension |
|---|---|---|
| Dialogue (per-segment) | 3.34 | Factual Grounding: 2.17 |
| Outline (research + structure) | 3.01 | Citation Credibility: 1.28 |
| Final Script (post-review) | 2.91 | Publishability: 1.95 |
三件事立即跳了出来:
1. 审查通过正在使脚本退化 0.43 分。 对话得分 3.34。审查之后呢?2.91。旨在改进质量的步骤正在移除质量。
2. 所有引用 URL 都是不透明的重定向。 每个大纲中的每个"源 URL"都指向 vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQ...。这些对点击的人类有效,但在自动审查者看来完全是捏造的。344 个事实有源 URL。零个有 resolved_url——一个尚不存在的字段。
3. 可发布性(Publishability)是整个管线中最低的维度(1.95)。 根据评估裁判的判断,真正的播客主不会以自己的名义发布这些脚本。可检测的 AI 模式:相同的片段开头语、通用的过渡语、缺少主持人个性。
评估给了我一个精确排名的待修复列表。我把当天剩下的时间都花在了修复上。
六项修复(及其测量的影响)
修复 1:引用 URL——0% 到 100% 解析
之前: 344 个研究事实中有 0 个有 resolved_url。每个 URL 都看起来是捏造的。
修复: 一个 60 行的 URL 解析器,在大纲生成期间运行,追踪 Vertex AI 重定向到实际来源,并存储两个 URL(原始 URL 用于 Google 服务条款合规,已解析 URL 用于其他一切用途)。
def resolve_grounding_url(url: str) -> str:
if "grounding-api-redirect" not in url:
return url
response = requests.head(url, allow_redirects=True, timeout=5)
return response.url if response.url != url else url
之后: 今天新剧集里 23 个研究事实中的 23 个都有 resolved_url 已填充——真实的 URL,如 simonwillison.net、axios.com、thinkingmachines.ai。100% 解析。
修复 2:更换审查模型(Gemini → DeepSeek)
之前: Gemini 3.5 Flash 运行审查通过。它做出轻量、保守的编辑:把"Exactly!"改成"No question about it!",但大多保留原始文本。它添加的填充语使对话变得平淡。音频标签密度下降。类型-词符比下降。话轮数膨胀。
修复: 将审查通过更换为 DeepSeek v4-pro(384K 最大输出,设定 96K 上限)。使提供商可配置:
provider = get_provider("review") # reads REVIEW_PROVIDER env var
response = provider.generate(
prompt=prompt, temperature=0.0,
max_output_tokens=96000,
)
验证: 已部署到生产环境。一个越南语科技新闻剧集在 DeepSeek 审查下通过完整管线——10.3K → 11.6K tokens,在 121 秒内完成,需要 0 次收紧处理。第二个剧集(英语)处理 7.9K → 17K tokens,耗时 203 秒。DeepSeek API 密钥保存在 Google Cloud Secret Manager 中,部署时通过 service.yaml 自动注入。
修复 3:大纲自我批评(+0.50 改善)
之前: 大纲从 Gemini 直接到用户,没有任何内部质量检查。平均得分:3.01。
修复: 添加了一个自动化批评步骤。DeepSeek v4-pro 用 6 维度评分标准(5 个大纲维度加上片段数量)评估大纲,返回分数 + 具体反馈,并将批评存储在播客元数据中。
然后我进行了一个对照实验:取 6 个大纲得分低于 3.0 的剧集,运行 DeepSeek 批评,将反馈作为重新生成指令回传给 Gemini,然后重新打分。
之后: 在 6 个剧集上总体改善 +0.50。
| Dimension | Before | After | Delta |
|---|---|---|---|
| Content Boundaries | 3.33 | 4.17 | +0.83 |
| Research Depth | 2.67 | 3.17 | +0.50 |
| Citation Credibility | 1.00 | 1.50 | +0.50 |
| Structural Logic | 3.67 | 4.17 | +0.50 |
| Audience Fit | 2.17 | 2.33 | +0.17 |
最差的剧集从 1.80 升至 3.20(+1.40)。6 个中只有 1 个变差了。批评现在在生产环境中默认启用——每个新大纲在用户看到之前都经过此质量检查。
修复 4:单片段大纲现在强制失败
之前: 评估显示,只有一个片段和零研究事实的剧集得分低至 2.07。这些是管线未当作失败处理的失败案例。
修复: 如果大纲生成器在恢复尝试后产生少于 3 个有效片段,则播客被标记为 FAILED。不再有单片段大纲到达用户手中。在下一次创建尝试时,用户的额度被释放以重试。
修复 5:中文本地化规则
之前: 中文剧集得分 2.88——7 种语言中最低。翻译痕迹(英文习语直译)、相同的片段开头语、默认的英文主持人名(Alex/Maya)而非中文名字(明辉/晓雯)。
修复: 编写了中文特定对话规则:原生会话模式(不是...而是...结构)、适当的句末助词(吧/啊/呢)、反翻译指南(绝不要直译"medical miracle")、世界杯剧集的中国足球隐喻,以及具有鲜明个性的地区特定主持人档案。
中文对话模板从重用英文默认值,发展到拥有自己 80 行的指南,涵盖会话模式、表达不同意见的措辞,以及每种播客风格的受众特定框架。
修复 6:非英语语言的默认主持人名称
之前: 多个非英语剧集的主持人叫 Alex 和 Maya。地区特定的主持人档案存在,但大纲生成器中的回退路径被硬编码为英文默认值。
修复: 通过语言感知的档案解析管线追踪修复。近期生产剧集现在使用 翔太/健一(ja)、Mạnh/Nga(vi)、Hugo/Camille(fr)、明辉/晓雯(zh)。七月提交的代码已经修复了边缘函数和创建流程——剩余的回退在大纲生成器本身中。
评估框架(可复用)
发现这一切的框架大约 500 行 Python、三个评分标准文件(每个 5 个维度)、一个共享的 GPT-5.6-terra 裁判和一个编排器:
docs/pipeline/evals/
├── run.py # Orchestrator: extract → judge → report
├── judge.py # Shared LLM judge (rate with rubric)
├── rubric_outline.py # Stage 1: 5 dimensions, 1-5 scale
├── rubric_dialogue.py # Stage 2: 5 dimensions, 1-5 scale
├── rubric_final_script.py # Stage 3: 5 dimensions, 1-5 scale
├── dataset_40.json # Extracted production data
├── scores.json # Machine-readable scores
└── report.md # Auto-generated report
我还构建了一个实验层用于 A/B 比较:
docs/pipeline/evals/experiments/
├── review_ab.py # Compare two review models
├── outline_critique_ab.py # Critique → regenerate → compare
├── shared.py # Score comparator, report generator
└── results/ # Archived by date
在任何管线变更后运行 python docs/pipeline/evals/run.py --full,约 8 分钟内获得报告。运行 experiments/review_ab.py --episodes 10 来比较模型。结果按日期归档以追踪趋势——想知道本月相比上月质量是否改善了?对比分数即可。
完整的 40 个剧集评估 API 调用成本约 $1-2。实验成本更低。作为回报,你获得的信号——一个精确列出管线中哪些阶段和维度需要关注的排名列表——这是我构建过的最便宜的调试工具。
仍然存在的问题
DeepSeek 审查 A/B 实验需要完整的生产 prompt。 实验脚本使用了一个简化的 15 行 prompt。生产审查使用 80 行 prompt,包含反重复规则、口头禅配额、编辑防护栏和时长策略。使用简化 prompt 时,DeepSeek 表现出基本中性的结果(-0.04)。使用完整 prompt 在生产环境中,管线在英语和越南语中成功完成。我需要更新实验以反映生产环境并重新运行。
中文本地化需要验证。 规则在纸面上看起来正确,主持人档案已编写,对话指南已到位。但我还没有在新中文剧集上运行评估以确认得分从 2.88 上升了。这是本周的优先事项。
我需要在新剧集上重新运行完整的 40 个剧集评估。 所有六项修复都已部署。下一步是提取在这些变更之后生成的 40 个剧集,通过相同的评估运行它们,并与历史基线进行比较。如果最终脚本得分从 2.91 上升到 3.0 以上,并且引用可信度从 1.28 提升到合理水平,我就知道这些变更端到端地奏效了。
三问管线审计
经过这次经历,我现在用三个问题审计每个管线变更:
1. 每个步骤之间是否有质量关卡? 我的大纲从 Gemini 直接到用户。添加批评步骤在任何人看到之前就抓住了最差的大纲。每个管线步骤都需要质量检查——根据明确标准进行自动化 LLM 评估。
2. 每个步骤在被测量时是否真的改善了质量? 运行它并假设它有帮助是不够的。你需要同一内容上的字面前后分数。我的审查步骤在被我测量之前,降低了脚本质量六周。先测量,不做任何假设。
3. 我能否判断是哪个维度出了问题? "质量不好"是不可操作的。"引用可信度是 1.28,因为 100% 的 URL 是不透明的重定向"是可操作的。每个阶段的多维评分标准告诉你该往哪里看。在评估之前,我花了数小时调查我的审查步骤。有了评估,我只花了数秒——数字直接指向了可发布性和审查模型。
常见问题
运行 LLM 评估不会变贵吗?
完整的 40 个剧集评估 API 调用成本约 $1-2(GPT-5.6-terra,总计约 420K tokens)。A/B 实验成本更低。作为回报,你获得的信号——一个精确列出管线中哪些阶段需要关注的排名列表——这是我构建过的最便宜的调试工具,比用户在坏掉的剧集上浪费的额度更便宜。
为什么每个阶段 5 个维度?为什么不只用"整体质量"?
"整体质量"告诉你有什么地方不对。它不告诉你是什么。当我看到引用可信度为 1.28 时,我立刻知道 URL 坏了。当我看到可发布性为 1.95 时,我知道 AI 痕迹是可检测的。五个维度给你一个鉴别诊断。一个维度只给你一个发烧体温计。
如何保持 LLM 裁判的一致性?
相同的模型(GPT-5.6-terra),相同的温度(0.0),相同的推理力度(medium),每次都使用相同的评分标准 prompt。分数带时间戳存档,以便你跨日期比较。更换裁判会改变基线——选定一个并坚持下去。
当裁判本身出错时怎么办?
评分标准包含每个分数的必需理据——裁判必须引用内容中的具体证据。我还对所有 7 种语言的 10 个剧集进行了手动定性审查来校准裁判。LLM 分数与我的主观判断紧密匹配。对于 LLM 可能不可靠的关键维度(如需要文化判断的"可发布性"),人工抽检至关重要。
我在晚上和周末独自开发 DIALOGUE,一个 AI 播客平台。我写下沿途学到的东西。
如果你为自己的 LLM 管线构建了评估系统,我很好奇:你如何衡量质量,你发现了什么让你惊讶的事情?
就这些了。
祝好,Chandler