把基础模型升级从数月压缩到数小时:评测器、智能体循环与提示词爬山

2026-07-17 41 预计阅读时间: 1 分钟
来源: cloud.google.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:11 分钟

基础模型升级很少是一次简单的模型名称替换。即使只是在同一模型家族内切换检查点,工程团队也要重新验证质量、延迟、成本和边界案例。模型演进速度越来越快,如果每次升级都依赖人工逐条检查,迁移周期很容易从几周拖到几个月。

Google Cloud Applied ML 团队给出的核心思路,是把模型迁移重新定义为一个可评测、可搜索、可追踪的智能体工作流。其内部实践将部分升级任务从数月缩短到数小时。真正值得复用的并不是某个固定提示词,而是三条工程经验:先从真实迁移中发现约束,警惕传统自动化的刚性,再用可适配的智能体循环持续寻找更优方案。

为什么固定流水线很快会失效

传统迁移脚本通常隐含了一组稳定假设:输入字段固定、任务只有一种、评测指标统一、失败样本可以用同一种方式修复。现实项目往往同时打破这些假设。

例如,视频翻译与配音不只要求译文语义正确,还要求朗读时长贴近原视频节奏。一个在通用翻译指标上表现更好的提示词,可能生成更长的句子,反而让配音无法对齐。类似的复合约束还包括:

  • JSON、字幕片段、对话历史等不同输入格式;
  • 准确率、格式合规率、时长偏差和安全性等多目标指标;
  • 某些样本允许改写,另一些样本必须保留术语或数字;
  • 新模型平均分更高,但在关键业务切片上出现回归。

因此,迁移系统不应只执行“运行新模型,然后计算总分”。它还需要读取项目数据,识别失败模式,调整提示词或参数,再对候选方案进行分层评测。这正是智能体架构比固定 DAG 更有价值的地方:步骤可以保持受控,分析与搜索策略则根据项目反馈动态变化。

三条经验如何落到工程系统里

1. 先处理真实案例,再抽象规则

迁移初期应让工程师和产品团队共同检查真实失败样本。目标不是立即搭建通用平台,而是明确什么叫“升级成功”。需要记录的内容至少包括:

  • 当前模型、基线提示词和生产参数;
  • 代表性输入以及经过确认的参考结果;
  • 必须保持的硬约束;
  • 可接受的质量、延迟和成本阈值;
  • 业务风险最高的数据切片。

这些信息最终应成为版本化的评测集和评分规则,而不是停留在会议记录中。没有稳定评测集的提示词优化,本质上只是反复观察少量示例。

2. 把自动评测器当作扩容工具,而不是绝对真相

模型型自动评测器可以快速覆盖大量候选结果,减少人工逐条审阅。但评测器也可能存在位置偏差、长度偏好、风格偏好,以及对专业事实判断不准的问题。

更稳妥的做法是先用人工标注集校准评测器,检查它与专家判断的一致率;对高风险样本、低置信度样本和新出现的失败类型继续保留人工复核。自动评测器负责扩大覆盖面,人类负责定义标准并处理不确定区域。

3. 让智能体搜索方案,但把发布权留给门禁

智能体可以分析低分样本、提出新提示词、运行目标模型、调用评测器并生成损失报告。它适合做提示词“爬山”:从当前基线出发,每轮提出有限数量的候选,只保留在验证集上取得稳定提升的版本。

但智能体不应凭单一总分直接修改生产配置。发布门禁仍需检查关键切片、延迟、成本、输出格式和安全指标,并保存模型版本、提示词、参数、评测集版本与完整结果,确保结论可以复现。

可以这样实践:一个最小迁移循环

下面是一个可改造的供应商无关示例。它假设目标模型和自动评测器都提供 JSON HTTP 接口;这只是演示用接口约定,并非 Gemini Enterprise Agent Platform 的真实 API 定义。运行前需要把 MODEL_URLRATER_URL 和鉴权令牌替换为自己的服务。

先准备评测数据:

cat > samples.jsonl <<'EOF'
{"input":"Translate for dubbing: The train leaves in five minutes.","reference":"火车五分钟后开出。","max_chars":12}
{"input":"Translate for dubbing: Please keep the door open.","reference":"请让门开着。","max_chars":8}
EOF

export MODEL_URL="https://model.example.com/generate"
export RATER_URL="https://rater.example.com/score"
export API_TOKEN="replace-me"

然后运行这个最小评测器:

# migrate.py
import json
import os
import statistics
import urllib.request

MODEL_URL = os.environ["MODEL_URL"]
RATER_URL = os.environ["RATER_URL"]
TOKEN = os.environ["API_TOKEN"]

CANDIDATE_PROMPTS = [
    "Translate into concise Chinese suitable for video dubbing. Preserve meaning.",
    "Translate into natural, concise Chinese for dubbing. Preserve all facts and prefer shorter phrasing.",
]


def post_json(url, payload):
    request = urllib.request.Request(
        url,
        data=json.dumps(payload).encode("utf-8"),
        headers={
            "Authorization": f"Bearer {TOKEN}",
            "Content-Type": "application/json",
        },
        method="POST",
    )
    with urllib.request.urlopen(request, timeout=60) as response:
        return json.load(response)


def load_samples(path="samples.jsonl"):
    with open(path, encoding="utf-8") as file:
        return [json.loads(line) for line in file if line.strip()]


def evaluate_prompt(prompt, samples):
    rows = []
    for sample in samples:
        generated = post_json(MODEL_URL, {
            "system": prompt,
            "input": sample["input"],
            "temperature": 0,
        })["text"]

        rating = post_json(RATER_URL, {
            "rubric": {
                "meaning": "Preserve the meaning and factual details.",
                "fluency": "Use natural Chinese suitable for speech.",
            },
            "input": sample["input"],
            "reference": sample["reference"],
            "candidate": generated,
        })

        length_ok = len(generated) <= sample["max_chars"]
        semantic_score = float(rating["score"])
        final_score = semantic_score if length_ok else semantic_score - 0.25
        rows.append({
            "input": sample["input"],
            "output": generated,
            "semantic_score": semantic_score,
            "length_ok": length_ok,
            "score": final_score,
        })

    return statistics.mean(row["score"] for row in rows), rows


def main():
    samples = load_samples()
    reports = []

    for prompt in CANDIDATE_PROMPTS:
        score, rows = evaluate_prompt(prompt, samples)
        reports.append({"prompt": prompt, "score": score, "rows": rows})

    reports.sort(key=lambda item: item["score"], reverse=True)
    print(json.dumps({"winner": reports[0], "all_candidates": reports}, ensure_ascii=False, indent=2))


if __name__ == "__main__":
    main()
python migrate.py > migration-report.json

真实的智能体版本可以在每轮读取 migration-report.json,归类语义丢失、超长、术语错误等失败模式,再生成下一批候选提示词。需要给循环设置明确边界,例如最多运行 10 轮、每轮不超过 4 个候选、预算达到上限立即停止,并使用独立保留集决定最终胜者,避免提示词过拟合开发集。

上线前看总分,也要看“提升空间”

迁移报告至少应同时展示基线、新模型和目标阈值。除了平均质量分,还应提供关键切片的回归数量、硬约束通过率、P95 延迟、单请求成本,以及距离理论或业务目标还有多少提升空间。只报告“新方案提高了 3%”并不足以支持发布决策。

可以用下面的清单决定是否进入灰度:

  • 自动评测器已经用人工标注样本校准;
  • 评测数据与提示词、模型版本一起被版本化;
  • 候选搜索使用开发集,发布判断使用独立保留集;
  • 关键业务切片没有超过约定的回归阈值;
  • 格式、安全、延迟和成本均设置硬门禁;
  • 失败报告能够定位到具体样本和评分理由;
  • 生产环境保留旧模型配置和快速回滚路径。

智能体工作流能显著压缩实验和评测时间,但它不会自动消除错误指标、数据污染或评测器偏差。最可靠的采用方式,是让智能体负责高频搜索与分析,让版本化数据、确定性门禁和人工抽检负责约束发布风险。这样,模型升级才会从一次次临时项目,变成可以持续运行的工程能力。


相关推荐