前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
返回 AI 情报前线
All News · 全部资讯8593
  • Cloudflare 发布 Agent 访问控制模型:身份代理+持续鉴权架构
  • Cloudflare公开企业级AI工作平台实践
  • Cloudflare WriteGuard:MCP Server 写入细粒度管控方案
  • Cloudflare推出身份感知AI行为分析:实时捕获异常Agent
  • 语音转写深度横评:AssemblyAI 对阵 NVIDIA Parakeet/Canary
  • 自托管还是 API:语音转写 TCO 全面对比
  • Qwen3-ASR vs AssemblyAI:语音转写生产级对比
  • Whisper Large-v3 vs AssemblyAI:生产环境语音转写怎么选
  • 自托管开源语音转写真实成本揭秘
  • Mistral开源Shieldstral:3B参数端侧内容安全模型
  • 图像生成 API 选型:用 JSON Prompt Contract 做安全边界
  • 构建 AI Agent 实战总结:分布式系统思维落地
  • MacPaw用Liquid AI做端侧推理
  • VS Code / Cursor / Google Antigravity 紧急 RCE 漏洞
  • MCP Server 生产部署指南(2026-07-28 新版 spec)
  • AI攻克埃尔德什猜想:数学难题的AI证明突破
  • 法院裁决:AI代理可代表用户访问电商平台
  • 无状态MCP正在成为AI Agent连接标准
  • Bullet编码Agent: SWE-bench 95.8%通过率
  • 英国 AI 安全研究所实测:AI 代理失控,自主创建虚假身份发起社工攻击
  • 60行代码建立AI编程模型评估框架
  • AI生成代码回归测试的黄金输入集实践
  • AI编码Agent网络出口安全审计指南
  • PostgreSQL + Serverless 架构下防止机器人注册的数据库膨胀应对指南
  • 长上下文 Agent 化:Karpathy 百万 Token 委托实验启示
  • VS Code / Cursor / Google Antigravity 存在一键 RCE 漏洞,请立即修复
  • 95% AI 试点失败的根本原因是架构问题而非模型
  • Mac本地跑AI生成100+游戏3D资产:Hunyuan3D + SDXL实战
  • Claude Code 子代理实战:何时用、怎么配、避坑指南
  • 研究实证:AI 编程助手无法让你成为 10x 开发者
  • AI Agent 出问题?先检查你的数据模型设计
  • Claude Sonnet 4.6 vs Opus 4.6 编程选择指南
  • 从零实现纯 C# AI 编程助手:Litos 架构解析
  • 五个让调试效率提升数倍的AI提示词模板
  • API测试核心转变:从确认到质问
  • 防火墙后无端口部署AI Agent实战
  • 如何真正评估你的AI输出质量
  • NVIDIA 开源 34B 自动驾驶模型 Alpamayo 2 Super
  • 阿里云推 One Key MCP 服务,兼容 Codex/Cursor/Claude Code
  • 快手35B编程模型KAT-Coder V2.5:单卡可跑的开源王者
  • 100x工程师神话的真相:AI提效不只是找出明星工程师
  • 构建安全的多模态推理系统实战指南
  • 多模态推理安全最佳实践:攻击面与防御策略
  • 多模态推理四种典型失效模式及排查方法
  • 让AI Agent安全部署到服务器而不暴露SSH密钥
  • 流式输出中逐块解析LLM返回的JSON
  • 200行代码构建私有知识库:RAG + LLM 实战指南
  • Sand.ai开源千亿MoE视频生成模型:10秒1080P仅需5毛钱
  • 免费层可跑的 Prompt 回归测试框架
  • 像数据库迁移一样管理 Prompt 变更
  • 编译器对抗 Demo:可复现的 C++ 编程模型评分器
  • 已加载 51 / 8593
8.0
热点
AI SCORE
编程提效2026-08-05 18:12

60行代码建立AI编程模型评估框架

dev.to · AI#AI评测#提示词工程#自动化测试
Editor brief · 编辑速览

用固定任务集+确定性断言+重复运行构建prompt回归测试,输出pass/fail表替代主观感受。可对接任意OpenAI兼容API,免费层也能跑。

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

完整中文译文

本周 DEV 社区所有人都在讨论 Agent、编排和多 Agent 流水线。但所有这些之前有一个无聊的问题:你选的这个模型真的能完成你的任务吗?我们大多数人的答案是把提示词粘贴到聊天界面,眯着眼睛看输出,然后说"看起来没问题"。这不是评估——如果你在对着付费 API 迭代,那在犹豫的过程中也在慢慢烧钱。

我常用的一个更便宜的方案是:一个小型固定任务集,配合确定性检查,指向任意 OpenAI 兼容端点运行。半天就能搭建好,如果指向免费层则分文不花,而且给你的是一张通过/失败表,而不是一种感觉。

提示词回归测试框架有三部分:

固定任务 —— 一组小型编码提示词,代表你实际让模型做的事情。

确定性验证 —— 每个生成的答案都会被提取出来,用真实的断言语句执行。没有人工眯眼判断。

可重复性 —— 在 temperature: 0 下将每个任务运行 N 次,并报告通过率。一次幸运的生成不应该算数。

因为这个框架使用 OpenAI chat-completions 格式,你可以指向几乎任何端点:付费 API、本地服务器(如 llama.cpp 或 vLLM),或托管的免费层。

纯标准库 Python。保存为 model_harness.py:

#!/usr/bin/env python3
"""Score a coding model against a small fixed task set.

Point it at any OpenAI-compatible endpoint:

    export LLM_BASE_URL="https://your-endpoint/v1"
    export LLM_API_KEY="..."          # or a placeholder for local servers
    export LLM_MODEL="model-name"
    python model_harness.py
"""
import json, os, re, subprocess, sys, tempfile, time, urllib.request

BASE_URL = os.environ.get("LLM_BASE_URL", "http://localhost:8000/v1").rstrip("/")
API_KEY  = os.environ.get("LLM_API_KEY", "none")
MODEL    = os.environ.get("LLM_MODEL", "change-me")
RUNS     = int(os.environ.get("RUNS", "3"))

TASKS = [
    {
        "name": "dedupe_keep_order",
        "prompt": (
            "Write a Python function `dedupe(items)` that returns the list "
            "with duplicates removed, preserving first-occurrence order. "
            "Reply with only a single python code block."
        ),
        "test": "from solution import dedupe\n"
                "assert dedupe([1, 2, 1, 3, 2]) == [1, 2, 3]\n"
                "assert dedupe([]) == []\n"
                "assert dedupe(['a', 'a', 'b']) == ['a', 'b']\nprint('ok')\n",
    },
    {
        "name": "fizzbuzz",
        "prompt": (
            "Write a Python function `fizzbuzz(n)` returning the classic "
            "FizzBuzz list from 1 to n. Reply with only a python code block."
        ),
        "test": "from solution import fizzbuzz\n"
                "assert fizzbuzz(5) == [1, 2, 'Fizz', 4, 'Buzz']\n"
                "assert fizzbuzz(15)[14] == 'FizzBuzz'\nprint('ok')\n",
    },
    {
        "name": "parse_keyvals",
        "prompt": (
            "Write a Python function `parse(s)` that parses a string like "
            "'a=1, b = 2 ,c=3' into {'a': '1', 'b': '2', 'c': '3'}. "
            "Reply with only a python code block."
        ),
        "test": "from solution import parse\n"
                "assert parse('a=1, b = 2 ,c=3') == {'a': '1', 'b': '2', 'c': '3'}\n"
                "assert parse('x=y') == {'x': 'y'}\nprint('ok')\n",
    },
]

def chat(prompt):
    body = json.dumps({
        "model": MODEL,
        "messages": [{"role": "user", "content": prompt}],
        "temperature": 0,
    }).encode()
    req = urllib.request.Request(
        f"{BASE_URL}/chat/completions",
        data=body,
        headers={"Content-Type": "application/json",
                 "Authorization": f"Bearer {API_KEY}"},
    )
    with urllib.request.urlopen(req, timeout=120) as r:
        return json.load(r)["choices"][0]["message"]["content"]

def extract_code(text):
    blocks = re.findall(r"```(?:python)?\s*\n(.*?)\n```", text, re.S)
    return blocks[0] if blocks else text

def run_once(task):
    code = extract_code(chat(task["prompt"]))
    with tempfile.TemporaryDirectory() as d:
        with open(os.path.join(d, "solution.py"), "w") as f:
            f.write(code)
        p = subprocess.run([sys.executable, "-c", task["test"]],
                           cwd=d, capture_output=True, text=True, timeout=30)
        return p.returncode == 0

if __name__ == "__main__":
    total_pass = total_runs = 0
    for task in TASKS:
        passed = 0
        start = time.time()
        for _ in range(RUNS):
            try:
                passed += run_once(task)
            except Exception as e:
                print(f"  error on {task['name']}: {e}", file=sys.stderr)
        total_pass += passed
        total_runs += RUNS
        print(f"{task['name']:20s} {passed}/{RUNS} passed "
              f"({time.time() - start:.1f}s)")
    print(f"\nOverall: {total_pass}/{total_runs} "
          f"({100 * total_pass / max(total_runs, 1):.0f}%)")

用本地服务器跑一遍,再指向托管端点跑一遍,然后对比两张表。任务故意选得很简单——这是起点,不是基准。把它们换成你过去一个月实际使用中抽取的提示词,分数就开始有意义了。

安全提醒:这会执行模型生成的代码。对于玩具任务以外的内容,要把子进程跑在容器或一次性 VM 里,且不能有网络和凭证。

免费层适合在哪里用

披露:本文是 MonkeyCode 产品推广的一部分。

对于上述工作流,一个实用的端点选择是 MonkeyCode,它目前提供免费模型访问和免费服务器选项。这个组合对于上面描述的阶段确实有用:你正在迭代提示词和任务定义,会烧掉大量调用,而且你还不知道哪个模型值得你花钱。将框架指向零成本的端点意味着你的实验预算只是时间,而不是金钱。按照其文档设置 LLM_BASE_URL、LLM_API_KEY 和 LLM_MODEL,上述脚本即可无缝运行。

两个真诚的注意事项:免费层可能变更配额、模型阵容或可用性,因此请将当前条款作为事实来源,而不是本文中的任何内容——并且不要在未经检查数据政策的情况下,通过任何第三方端点(免费或付费)传输专有代码或密钥。

决策表:哪个阶段用哪个端点

小样本会说谎。三个任务乘以三次运行,从统计学上讲几乎说明不了什么问题。把早期分数当作方向性参考,从你观察到的实际失败中扩展任务集。

通过测试 ≠ 代码好。模型可以通过断言但输出难以阅读、无法维护的内容。对于任何要发布的内容,加上人工审查。

污染是真实存在的。FizzBuzz 这样的经典任务几乎肯定在训练数据里,这会虚增分数相对于你的新颖、私有任务的分数。

Temperature 0 不是确定性。提供商确实会在不同运行和版本间返回不同输出。定期重新运行,并用模型名和日期记录结果。

免费层可用性可能变化。不要把免费端点硬编码到你明天它消失就会想念的东西里。

如果你已经有评估框架(如正经的基准测试套件或 LLM 评判流水线),这只是降级。如果你的决策纯粹关于生产延迟或合规性,玩具通过率回答不了这些问题。而且如果你永远只问模型一个问题——直接用聊天界面就好了。

对于"哪个模型值得花钱"这个阶段的其他所有人:偷走这个脚本,换上你自己的任务,让表格来做决定,而不是靠直觉。如果你没有闲置的 GPU 容量或 API 预算,MonkeyCode 的免费模型访问和免费服务器选项是获得实验端点的一种零成本方式。

Original source

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

阅读英文原文
上一篇
英国 AI 安全研究所实测:AI 代理失控,自主创建虚假身份发起社工攻击
下一篇
AI生成代码回归测试的黄金输入集实践