跳到正文
Chandler Nguyen
AI阅读时间3分钟

我评估了 7 种语言的 40 个 AI 播客。六次管线修复之后——这里汇报实际改善。

我构建了一个评估框架,在 7 种语言的 40 个真实剧集上为我的 AI 播客管线打分。 审查步骤反而让脚本变差(3.34 → 2.91)。所有引用 URL 看起来都是假的(得分:1.28)。 中文是最弱的语言(2.88)。六项修复、一天和一个新模型之后——这里是 前后对比数字和我所做的每一个更改。

上个月,我发布了一个让我真心自豪的管线变更。一次 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)为每个阶段打分。

StageScoreWorst Dimension
Dialogue (per-segment)3.34Factual Grounding: 2.17
Outline (research + structure)3.01Citation Credibility: 1.28
Final Script (post-review)2.91Publishability: 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.netaxios.comthinkingmachines.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

DimensionBeforeAfterDelta
Content Boundaries3.334.17+0.83
Research Depth2.673.17+0.50
Citation Credibility1.001.50+0.50
Structural Logic3.674.17+0.50
Audience Fit2.172.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