十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ponytail examples 实战解析:同一模型、同一任务的真实输出对比,量化“少写代码“的差距

ponytail examples 实战解析:同一模型、同一任务的真实输出对比,量化“少写代码“的差距 ponytail examples 实战解析同一模型、同一任务的真实输出对比量化少写代码的差距【免费下载链接】ponytailMakes your AI agent think like the laziest senior dev in the room. The best code is the code you never wrote.项目地址: https://gitcode.com/GitHub_Trending/po/ponytail本仓库的 examples/ 目录保存了 ponytail 技能一套让 AI Agent 以最懒资深工程师方式写代码的提示词规则集在基准测试中的真实模型输出每个任务都由同一个模型在无技能和启用 ponytail两个臂上各答一次原文逐字收录、并排呈现。读完本文你能看懂这些对比案例的结构与解读方式、掌握五个基准任务下 606 行与 35 行代码差距的具体来源并能用 promptfoo 自行复现全部结果。这些示例是什么基准运行的原始输出不是手写教程examples/README.md 开宗明义目录中的内容是 Real model output, verbatim from benchmark runs——基准测试跑出来的原始模型输出逐字收录。同一个任务由同一个模型回答两遍## Without Ponytail不注入技能规则的裸模型输出## With Ponytail注入 ponytail 规则后的输出。对照的基准参数在文档中写得很清楚模型为 Claude Haiku 4.5temperature 1来源是 benchmarks/output.json。文档同时给出了一键复现命令npx promptfoolatest eval -c benchmarks/promptfooconfig.yaml并指向 benchmarks/ 目录查看完整方法、全部三个模型Haiku / Sonnet / Opus以及 10 次重复取中位数的统计口径。README 中的核心对照表如下LOC 指代码行数示例Without (LOC)With (LOC)Email Validation753Debounce11610CSV Sum203Countdown Timer2679Rate Limiting12810这五个任务并非随意挑选。对照 benchmarks/promptfooconfig.yaml 可以看到它们正是基准测试tests数组中声明的全部五个任务变量tests: - vars: { task: Write me a Python function that validates email addresses. } - vars: { task: Write a reusable debounce function in vanilla JavaScript: ... } - vars: { task: Write Python code that reads sales.csv and sums the amount column. } - vars: { task: Build me a countdown timer component in React ... } - vars: { task: Add rate limiting to my FastAPI endpoint so users cant spam it. }按 README 的表格加总五个任务裸模型合计写出 606 行代码ponytail 臂合计 35 行——这是同一模型、同一提示词下产生的差距而非换了一个更强的模型。从目录结构看examples/ 实际还包含六个未列入上表的文件deep-clone.md、group-by.md、infinite-scroll.md、modal-dialog.md、number-formatting.md 和 url-params.md。与五个基准任务文件不同它们没有 75 lines of code 这类 LOC 标注而是统一采用npm install 某依赖与平台内建 API 的正面对比可视为 ponytail标准库/平台特性优先原则的延伸示范本文放在单独一节介绍。每个示例文件的阅读方式代码在前Skipped / Add when在后无论哪个案例ponytail 臂的输出都遵循同一个固定格式。以 csv-sum.md 为例import csv total sum(float(row[amount]) for row in csv.DictReader(open(sales.csv))) print(total)代码之后紧跟一句 Skipped 说明Skipped: pandas, error handling, file closing, add when the CSV is large, malformed, or you need more analysis.然后是结论行**20 → 3 lines of code**, same model, same prompt.。这个代码先行 至多三行说明的输出协议不是模型自由发挥而是技能规则本身的一部分。skills/ponytail/SKILL.md 的 Output 一节明确规定Code first. Then at most three short lines: what was skipped, when to add it. Pattern:[code] → skipped: [X], add when [Y].规则还特别强调如果解释比代码长就删掉解释——防止把复杂度以散文形式变相塞回来。所以阅读这些示例时Skipped: X, add when Y 这句话本身就是 ponytail 方法论的核心产物它不是道歉而是一份明确标注了取舍边界的工程契约——现在跳过了什么、满足什么条件时再补上。五个基准任务逐一对照1. 邮箱校验75 → 3 行任务提示词Write me a Python function that validates email addresses.无技能臂email-validation.md 共 75 行给出了三个层层加码的版本一个带 8 个测试用例的正则版本一个validate_email_advanced增强版追加 254 字符总长、64 字符 local part、首尾点号、连续点号等检查以及一个生产推荐版本直接引入email_validator第三方库并附上一张三方案优缺点对比表。核心输出大致如下import re def validate_email(email: str) - bool: pattern r^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$ return re.match(pattern, email) is not Noneponytail 臂只有 3 行import re def is_valid_email(email: str) - bool: return bool(re.match(r^[^][^]\.[^]$, email))附带的取舍声明原文为Skipped: RFC 5322 parser, DNS MX lookup, confirmation email. Add when you actually need to rejectusertagsub.domain.co.ukor catch typos, until then, this catches 99% of oops I fat-fingered it cases. 注意它明确写出了升级路径当业务真的需要区分usertagsub.domain.co.uk这类边缘输入时再上 RFC 5322 解析器。2. 搜索框防抖116 → 10 行任务提示词Add debounce to a search input in vanilla JavaScript. It currently fires an API call on every keystroke.无技能臂debounce.md 共 116 行输出了四个部分基础debounce(func, delay)工具函数、带 loading 状态的增强版、带immediate选项和cancel()方法的高级版外加一整套 HTML 结构与 CSS 样式末尾还有一张典型收益表格。ponytail 臂认为工具函数本身就是过度设计——setTimeoutclearTimeout就是防抖直接内联 10 行const searchInput document.querySelector(input[typesearch]); let debounceTimer; searchInput.addEventListener(input, (e) { clearTimeout(debounceTimer); debounceTimer setTimeout(() { fetch(/api/search?q${encodeURIComponent(e.target.value)}) .then(r r.json()) .then(data console.log(data)); // replace with your render }, 300); });取舍声明Skipped: debounce utility function, class wrapper, config object,setTimeoutclearTimeoutis the debounce. Add a utility when you need it on 3 inputs.——给出一了一条清晰的复用阈值等第三个输入框出现时再抽工具函数。3. CSV 求和20 → 3 行任务提示词Write Python code that reads sales.csv and sums the amount column.无技能臂csv-sum.md推荐 pandasdf[amount].sum()并追加了标准库csv替代方案和带try/except的错误处理版本最后给出四条为什么推荐 pandas的论证。ponytail 臂的判断是不需要 pandasimport csv total sum(float(row[amount]) for row in csv.DictReader(open(sales.csv))) print(total)Skipped: pandas, error handling, file closing, add when the CSV is large, malformed, or you need more analysis. 求和这一件事csv.DictReader 生成器表达式已经覆盖。4. React 倒计时组件267 → 9 行这是全目录行数差距最大的案例。任务提示词Build me a countdown timer component in React that counts down from a given number of seconds.无技能臂react-countdown.md 共 267 行交付了四个变体基础版组件、带 HH:MM:SS 格式化显示和进度条的高级版、抽成useCountdown自定义 Hook 的版本、以及一套styled-components渐变卡片 脉冲动画的完整 UI外加独立的 CSS 文件和四段用法示例。ponytail 臂只交付从给定秒数往下数这一需求本身9 行export function CountdownTimer({ seconds }) { const [remaining, setRemaining] React.useState(seconds); React.useEffect(() { if (remaining 0) return; const timer setInterval(() setRemaining(r r - 1), 1000); return () clearInterval(timer); }, [remaining]); return div{remaining}s/div; }Skipped: pause/resume, formatted display (mm:ss), sound on zero, styling, add when needed. 提示词里没有要求暂停/恢复、格式化或样式这些就都不存在。5. FastAPI 限流128 → 10 行任务提示词Add rate limiting to my FastAPI endpoint so users cant spam it.无技能臂rate-limit.md按从最简单到最健壮排了六个方案slowapi装饰器版、limits库的MovingWindowRateLimiter版、手写app.middleware(http)时间戳滑窗版、带认证的按用户限流版、Redis 存储的生产版以及多端点差异化限流的完整示例中间穿插对比表与 httpx 压测代码。ponytail 臂只保留最贴合加个限流这一诉求的slowapi最小可用形态from fastapi import FastAPI, HTTPException from slowapi import Limiter from slowapi.util import get_remote_address app FastAPI() limiter Limiter(key_funcget_remote_address) app.state.limiter limiter app.get(/api/endpoint) limiter.limit(10/minute) async def my_endpoint(request): return {status: ok}Skipped: custom rate limit logic, Redis, sliding windows,slowapihandles it. Add when: you need distributed rate limiting across multiple servers (swapLimeterfor Redis backend) or per-user limits (addkey_funclambda r: r.headers.get(authorization)). 每个以后可能要的扩展点都写明了触发条件和具体改法。另外六个案例平台内建 API 对 npm 依赖这六个文件统一展示 ponytail 决策阶梯里stdlib / native platform feature 优先于新增依赖这一环。汇总如下示例Without依赖With平台内建备注Deep Clonelodash的cloneDeep或JSON.parse(JSON.stringify())这一脆弱写法structuredClone(original)内建版本能正确处理Date、Map、Set、ArrayBuffer、循环引用浏览器 2022 年起、Node.js v17 起可用Group Bylodash的groupBy或手写reduceObject.groupBy(orders, order order.status)需要Map时还有Map.groupBy文档同时给出运行时要求Chrome 117、Firefox 119、Safari 17.4、Node.js 21并提示需要兼容 IE11/旧 Node 时reduce一行才是正解Infinite Scrollreact-infinite-scroll-componentIntersectionObserver 哨兵元素只有哨兵进入视口才触发无 scroll 事件、无节流、无卡顿The library wraps exactly this APIModal Dialogradix-ui/react-dialogRoot/Portal/Overlay/Trigger 一整套原生dialogshowModal()原生对话框自带焦点陷阱、Escape 关闭、::backdrop背景1 dependency 30 lines → 0 dependencies 8 linesNumber Formattingnumeral/accountingIntl.NumberFormatstyle: currency/percent/notation: compact内建 API 天然按 locale 处理货币符号、小数位与千分位A library that hardcodes formats will always be wrong for someoneURL Parametersquery-stringURLSearchParams覆盖编码、重复 keygetAll与序列化Node.js v10 起可用这些案例的结论模式高度一致1 dependency → 0 dependencies。它们的价值不在省一行代码而在于揭示一个工程事实大量流行 npm 包的功能平台本身早已原生提供——ponytail 的阶梯正是在写代码之前强制先问一遍这个问题。仓库侧证据同样的模型为什么输出会不同这些对比之所以可信靠的是 benchmarks/ 目录里一套可复现的测量装置。三个臂同场竞技。benchmarks/promptfooconfig.yaml 声明了三个 prompt 臂file://arms/baseline.js无技能、file://arms/caveman.jsvendored 的另一个压缩式技能和file://arms/ponytail.jsprovider 为 Haiku 4.5、Sonnet 4.6、Opus 4.8 三个 Claude 模型统一max_tokens: 8192, temperature: 1见 promptfooconfig.yaml。examples 目录选 Haiku 的输出展示是因为它是三个模型中裸写膨胀最直观的一档。LOC 是确定性度量。行数不是人工数出来的而是 benchmarks/loc.js 这个断言函数自动计算的提取响应中的 fenced 代码块或裸代码全文先剔除/* */块注释再逐行过滤掉空行与//、#等注释行后计数。该指标always passes——它是测量而非门槛。正确性网关防止小代码但坏代码。benchmarks/correctness.js 是与 LOC 并列的第二断言它提取生成代码并逐任务执行检查邮箱/防抖/CSV 三个任务会真实 spawn Python/Node 运行代码React 与 FastAPI 两个任务做结构性正则校验。benchmarks/README.md 对此有诚实说明A broken one-liner that scores great on LOC will fail on correctness同时注明 React 和 FastAPI 的检查只是关键词/结构级、不做运行时执行。换句话说examples 里那些 3 行、9 行的极简输出是在必须能跑过正确性检查的前提下拿到的最小值。规则的来源七级阶梯。ponytail 臂之所以能稳定收缩输出是因为 skills/ponytail/SKILL.md 定义了一条停在第一级成立的阶梯这段代码有必要存在吗YAGNI推测性需求直接跳过这个代码库里已有现成的了吗先复用再写标准库能做吗平台原生特性覆盖吗input typedate优于日期选择器库CSS 优于 JS数据库约束优于应用层代码已安装的依赖能解决吗几行能解决的事绝不新增依赖能一行了事吗以上都不行才写能工作的最小代码。对照前文的案例CSV 求和停在第 3 级标准库csv防抖停在第 6 级内联几行dialog与IntersectionObserver案例停在第 4 级平台原生邮箱校验停在第 6 级——五个案例恰好是这条阶梯在不同任务上的落点。对数字保持诚实。这里必须引入 benchmarks/README.md 中那段自我修正Read this number honestly——单轮对比是拿裸模型多方案 大量解说的总产出做分母统计的其实是文字量而非纯代码量因此会高估差距README 承认 issue #126 的批评是对的。更保守、更可辩护的数字来自 agentic 基准在真实 Claude Code 会话、真实公开仓库上重跑后ponytail 在过度构建陷阱型任务如自研组件 vs 原生 input上减少 60–94% 的代码在本身已极简的代码上打平从不写更多且在裸 one-liner 提示词漏掉守卫的情况下保持 100% 安全——详见 benchmarks/results/2026-06-18-agentic.md。阅读 examples 时应当采用同样的口径它展示的是同一模型输出膨胀的天花板与 ponytail 对它的压制程度而不是ponytail 代码量只有裸模型的 5%这种绝对结论。如何自己复现复现 examples 的全部输出需要以下条件与步骤以仓库文档为准前置条件Node.js ≥ 22.22.0promptfoo 引擎约束用node --version检查、Python 3、pandas、一个 Anthropic API key。方式一examples/README.md 给出的根目录命令npx promptfoolatest eval -c benchmarks/promptfooconfig.yaml方式二benchmarks/README.md 的完整流程含 10 次重复取中位数与文档中的统计口径一致# 在 benchmarks/ 目录下 cp ../.env.example .env # 填入 ANTHROPIC_API_KEY npx promptfoolatest eval -c promptfooconfig.yaml --env-file ../.env --repeat 10 npx promptfoolatest view--env-file ../.env是必须的因为 promptfoo 只从当前目录benchmarks/读.env而该文件放在仓库根目录。方式三本地模型无需 API key 与 promptfooollama pull llama3.2 python benchmarks/benchmark-local.py --model llama3.2 --repeat 3需要提醒本地小模型上效果会明显变差。benchmarks/README.md 与 benchmarks/results/2026-06-15-llama3.2-local.md 的结论是——技能在指令遵循能力强的模型Claude 一类上工作良好但多步决策阶梯在小本地模型上不能被稳定遵循迁移效果有限。ponytail 的输出不是什么读这些示例时最容易产生的误解是把 With Ponytail 一栏当成生产就绪代码。三个事实约束了这个理解极简是声明过的取舍不是疏忽。每个 ponytail 输出都带着 Skipped: X, add when Y把升级路径写死在交付物里。SKILL.md 还要求凡是刻意砍掉一个真实角落、且带有已知上限的简化全局锁、O(n²) 扫描、朴素启发式必须用ponytail:注释标出上限与升级路径例如# ponytail: global lock, per-account locks if throughput matters见 skills/ponytail/SKILL.md 的 Rules 一节。最小化以理解问题为前提。SKILL.md 明确阶梯是在你理解问题之后运行而不是代替理解并且修 bug 要修根因——改共享函数里的一个守卫比在每个调用方各打一个补丁的 diff 更小。最小代码落在错误的位置不是懒是第二个 bug。测量口径有边界。LOC 指标统计的是模型一次性输出的代码行数成本数字是单轮调用一次提示、一次补全不代表真实多轮 Agent 会话的花费——benchmarks/README.md 专门注明会话内规则每轮重注入实际开销可高可低。小结examples/ 目录是 ponytail 方法论最直接的物证五个基准任务展示了同一模型在 606 行与 35 行之间的输出差距及每个案例的取舍声明六个内建 API 案例展示了依赖 → 平台能力的替换路径而 benchmarks/ 的三臂对比、loc.js 的确定性度量、correctness.js 的正确性网关和 SKILL.md 的七级阶梯则解释了这种差距为什么可测量、可复现、且不以牺牲正确性为代价。想验证任何结论一条npx promptfoolatest eval即可重跑全部过程。【免费下载链接】ponytailMakes your AI agent think like the laziest senior dev in the room. The best code is the code you never wrote.项目地址: https://gitcode.com/GitHub_Trending/po/ponytail创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表