前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
AI 面试
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
AI 热点
开发者导航
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
AI 面试
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
AI 热点
开发者导航
返回 AI 情报前线
All News · 全部资讯3824
  • Copilot 代码审查支持 Lite/Balanced 力度级别
  • NVIDIA开源NOOA框架:用Python类一体化构建AI Agent
  • Meta AI在网络安全测试中自主入侵外部系统
  • 程序员用Claude追踪蓝牙信号找回丢失手机
  • My Virtual Office v0.7.0:统一SDK对接主流AI Coding工具
  • 安全沙箱执行AI生成的JavaScript实战指南
  • AI瓶颈不在模型本身,而是系统架构
  • GPT-4o vs Claude vs Mistral:按任务类型的生产基准评测
  • LLM上下文窗口的真实有效范围远小于标称值
  • 近800个恶意npm包威胁加密生态的供应链安全
  • 322个AI Agent在API市场的真实消费行为数据公开
  • 131 个测试、4 层架构、每次运行 $0.03:我的 AI Agent 评测方案
  • Simon Willison 用 GPT-5.6 Sol Ultra 单次生成完整游戏
  • Supabase 四种密钥全解析:哪些可公开、哪些必须保密
  • 从 GitHub 外推脚本到平台无关的信号贡献引擎
  • Vercel AI Gateway 接入 200+ 模型,Hermes Agent 支持云端沙箱
  • 多 Agent 系统中测试结果可信度问题
  • 多模型动态路由策略:降低供应商锁定风险
  • 多 Agent 辩论框架:角色对立 + 批评探测 + 共识置信度
  • 混合搜索:BM25 与稠密向量 Reciprocal Rank Fusion 融合
  • 用评估矩阵和回归门替代 prompt 凭感觉调优
  • 用 pass-all-k 而非准确率衡量AI系统可靠性
  • OpenAI因安全顾虑暂停Astra模型发布
  • 我停止让GPT-5管理邮箱:工作流反而更便宜更好
  • AI Agent 治理失败实录:策略门控为何沦为空文
  • LLM 应用七大攻击面与防御层
  • 大规模 AI 编程成本控制实战指南
  • Copilot 使用量 API 新增 Agent 应用活动追踪
  • Meta推出编程Agent Muse Code:成本低但数据安全存疑
  • Coinbase、Shopify、Ramp自建编程Agent为何仍付费给Anthropic
  • AMD收购Taalas将AI模型直接刻入芯片
  • 我们如何用MCP协议让AI助手直接预订餐厅
  • DGX Spark六个月实测:营销数字在骗人,真实性能这样算
  • Agentic Coding未来五年将重塑软件工程
  • EU AI Act第50条内容溯源规范落地:实际可用的双层方案
  • MCP工具返回值格式实测:72次试验对比摘要行与原始时序数据
  • Oracle禁止在OpenJDK中使用AI生成代码
  • 人机交互场景下LLM低延迟推理工程实践
  • Anthropic Agent Skills 设计反思:Skill 不是 Capability
  • x402 协议实现可靠 Agent 支付的工程实践
  • DeepSeek涨价Claude Code烧钱:Dev成本控制三招
  • 2026年多AI编程智能体运行工具横评
  • AI智能体越界真相:一次34小时的真实攻击链复盘
  • Cohere Health基于Bedrock AgentCore的临床政策数字化实践
  • 生产级MCP服务器测试与调试指南
  • claude-crew:持久化多终端Claude Code智能体架构详解
  • TReNDS用Bedrock将根因分析从30分钟压缩到60秒
  • AI Agent访问控制架构:如何防止数据库被恶意篡改
  • AWS用约束规划自动计算NHL季后赛锁定条件,经验证四个赛季
  • AI Agent自动化开发者工作流:41%发布周期压缩实战
  • Token末日:Accenture 数据显示非工程师才是 token 消耗大户
  • 已加载 51 / 3824
9.0
重磅
AI SCORE
编程提效2026-08-08 02:49

用评估矩阵和回归门替代 prompt 凭感觉调优

dev.to · AI#Prompt工程#Eval#LLM
Editor brief · 编辑速览

将 prompt 迭代从「改一下跑一个例子感觉更好就发版」改为:固定测试集→候选变体→每个变体×每个测试→确定性 grader 打分 pass/fail+分数,引入回归门防止改动破坏已有能力。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

改进 Prompt 的默认方式是:调一下,跑一下你恰好关心的那一条输入,扫一眼输出,觉得"感觉好点了",就发版。这套流程只在一种情况下有效,而且一旦你转去做别的事,就会被忘得一干二净。你永远看不到这次改动破坏了哪条输入,也无法公平地比较两个候选方案,"更好"只是一种感觉——既没法向队友解释,也没法向一周后的自己交代。

Prompt 评测(evals)用测量取代了感觉检查:固定一个测试集,写几个候选变体,让每个变体跑遍每条测试,再让确定性评分器把每个(变体 × 测试)单元格转成通过/失败和分数。这就是"promptfoo 风格"的循环,也是所有其他流程的基础。

确定性评分器不需要 LLM

大多数断言都是廉价、快速、100% 可重复的:输出是否完全匹配、是否包含某个字符串、是否匹配某个正则、是否能解析为 JSON?每个都返回 {pass, score}——二元评分器的分数就是 1 或 0。

function grade(type, output, assertion) {
  const out = String(output);
  if (type === "exact_match") { const p = out.trim() === String(assertion).trim(); return { pass:p, score:p?1:0 }; }
  if (type === "contains")    { const p = out.toLowerCase().includes(String(assertion).toLowerCase()); return { pass:p, score:p?1:0 }; }
  if (type === "regex")       { let re; try { re = new RegExp(assertion); } catch { return { pass:false, score:0 }; } const p = re.test(out); return { pass:p, score:p?1:0 }; }
  if (type === "json_valid")  { try { JSON.parse(out); return { pass:true, score:1 }; } catch { return { pass:false, score:0 }; } }
  return rubric(out, assertion);
}

rubric 评分器可以给出部分分数——按包含的必关键字数比例计算——这样平均分就能区分通过率相同但表现不同的两个变体。

跑矩阵、选赢家、然后设守卫

这个测试框架的循环很简单:对每个变体,在每条测试上运行 prompt 并评分,然后把每列缩减为通过率和平均分。

async function runEval(variants, tests, callModel) {
  return Promise.all(variants.map(async (v) => {
    const cells = await Promise.all(tests.map(async (t) => {
      const output = await callModel(v.system, t.input);   // ← 这里是真实的 LLM 调用
      return grade(t.grader, output, t.assertion);
    }));
    const passes = cells.filter(c => c.pass).length;
    return { id: v.id, passRate: passes / tests.length,
             avgScore: cells.reduce((a, c) => a + c.score, 0) / tests.length, cells };
  }));
}

选赢家是机械的:先看通过率最高,持平再比平均分。但这只是工作的一半——而且是没那么重要的一半。

真正能救你的部分

一次 Prompt 改动几乎永远不会严格支配另一个。以 demo 为例,V3 通过 few-shot 示例终于捕获了 V2 漏掉的紧急情况(通过率从 60% 升到 80%)——但同样的示例让它在一条友好的感谢消息上过度触发了紧急分类,导致一个 V2 通过的测试退化了。整体数字在涨,但某个具体行为却在变差。单一的平均分会把这个问题藏起来。

修复方法是逐单元格与基准线做 diff,任何出现通过 → 失败的情况都会阻断:

function regressions(base, cand, tests) {
  return tests.filter((t, i) => base.cells[i].pass && !cand.cells[i].pass);
}
const dropped = regressions(baseRow, candRow, tests);
if (dropped.length) throw new Error(`${dropped.length} regression(s) — blocked`);

把这套逻辑接进 CI——自己实现或通过带 assert.type 评分器的 promptfooconfig.yaml——一个净正向的改动就不可能悄无声息地发布出一个净负向的意外。保留一个你从不调优的 holdout 集,这样分数就不会说谎;同时报告通过率(作为门控)和平均分(作为微调依据),质量就只会往上走。

切换评分器,实时观察矩阵、通过率、赢家和回归 diff 如何重新计算:https://dev48v.infy.uk/prompt/day57-prompt-evals.html

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
混合搜索:BM25 与稠密向量 Reciprocal Rank Fusion 融合
下一篇
用 pass-all-k 而非准确率衡量AI系统可靠性