文章指出用免费 AI 编程模型时团队常陷入五个错误假设——免费计算不等于行为契约、编译通过不等于逻辑正确、对话流畅不等于结果可靠,并提供了可直接运行的验证实践。
模型免费,规格就多余了吗?我在 pull request 里一直看到这个假设。
一个免费的编程模型出现在工作流中,一个免费的远程服务器出现在它旁边。然后人们毫无抵抗地丢掉了检查清单。
为一个廉价循环写一个失败的测试有什么意义?一直重跑 agent 直到编译通过就行了,对吧?这种心智模型对团队来说暗地里很烧钱。
免费算力不能买到一份行为契约。它只是买到了另一个犯错的地方。这篇 FAQ 列出了我仍然经常听到的五个说法。
每个条目都有原说法、证据和修正后的模型。然后我附上一个小工件供你运行。都不需要我编造的付费配额。
你已经在用编程 agent 交付产品补丁了。你也不信任 agent 发来的流畅聊天记录。你想要的是一个在免费机器消失后仍能存活的工作流。
如果你需要硬 SLA,跳过这条路径。如果你需要在盒子里存放生产密钥,跳过这条路径。如果"在 agent 主机上能跑"就是发布门槛,跳过这条路径。
我实际想说的这套方案
我指的是一个狭窄、无聊的技术栈。你可以调用编程模型而无需付费。你可以免费使用远程服务器。
我用 MonkeyCode 来实现这种配对,一站式搞定。披露:本文是 MonkeyCode 产品推广的一部分。
我不会指名模型、硬件或时长。这些细节一直在变,误区却不变。这个方法在你已有的笔记本上同样有效。
免费机器在以下每一步都是可选的。规格在每一步都不是可选的。
Myth 1:免费重试可以替代失败的测试
免费的,所以我可以循环直到树编译通过。
编译不是行为,从来都不是。编译器变绿仍然可能发布错误的函数。重试 prompt 不会为以后冻结一个 oracle。
那次额外的重试真的对你来说更便宜了吗?样本是更便宜了,但没有出现断言。
失败的测试是你保留的规格。agent 是你不信任的补丁生成器。免费重试始终是廉价的样本,不是证明。
提议的工件:先固定失败
在任何模型标签页之前做这件事。
# test_spec.py — proposal, not a measured run
def test_parse_window_rejects_empty_frame():
from parser import parse_window
try:
parse_window(b"")
except ValueError as exc:
assert "empty frame" in str(exc)
return
raise AssertionError("empty frame must raise ValueError")
运行它,故意看它失败。然后在 agent 开始之前提交那个失败。
python -m pytest test_spec.py -q
git add test_spec.py
git commit -m "test: empty frame must raise"
agent 在某个聊天气泡里跑完了?问 pytest,别信任那个聊天气泡。免费循环可以整晚跑下去。规格不会因为循环廉价就移动。
Myth 2:免费服务器的磁盘就是实验记录本
把文件留在盒子里,因为我会记住。
免费服务器消失的时候不会办追悼会。临时磁盘在那些安静会话之间被回收。你的记忆不是 /tmp 的一个副本。
如果唯一一份副本存在远程,你就丢了补丁。你只有一个带着主机名的传言。
Git 仍然是你能真正回放的笔记本。盒子是一个你可能失去的临时文件系统。把每个有用的字节先当作不可信的。它在受你控制的远程上才变成可信的。
git status --short
git diff --stat
git rev-parse --short HEAD
在关闭任何东西之前,把分支从盒子里拷出来。
git bundle create /tmp/work.bundle HEAD main
# scp /tmp/work.bundle to a machine you control
什么能在免费主机的重启后存活?你的 /tmp 树不会在那个重启后存活。模型的滚动上下文窗口也一样会死。你笔记本上的一个 bundle 可能仍然存活。
Myth 3:免费机器不需要密钥卫生
盒子是一次性的,所以本地 .env 没问题。
对你来说是一次性的,对某个人来说还是一块磁盘。Agent 仍然会读到你忘记存在的文件。Shell 日志会捕获你匆忙粘贴进去的 export 行。
免费真的是私密的同义词吗?免费不是私密的同义词。回收的磁盘不是带证书的碎纸机。
爆炸半径和任何其他开发主机一样大。免费主机仍然是一个有文件系统的主机。如果 token 不能留在 CI 日志里,它也不能留在这里。
# proposal: refuse to start if secrets are tracked
if git ls-files | grep -E '(^|/)\.env$|\.pem$|id_rsa'; then
echo "refusing to start agent; secret files are tracked"
exit 1
fi
还要扫描你即将发送的 prompt。你是不是刚刚粘贴了一个 token?那么这个对话记录现在就是一个密钥存储。
轮换那个 token,别去争辩那个 transcript。模型不会帮你把它从记忆里抹掉。
Myth 4:不固定工具版本在一次性盒子上没问题
盒子是随用随扔的,所以为什么要固定 Python 版本?
你的 CI runner 的处置方式不是这样的。你的笔记本也不是这样。一个未固定的 python3 在免费服务器上明早就是另一个解释器了。
agent 修复了一个在合并时将不复存在的世界。那个纪念品不是合并时的一个修复。
固定测试实际会遇到的世界。盒子之后可以免费丢弃。语言版本不是你之后协商的氛围。
每回都把指纹文件和分支放在一起保存。
#!/usr/bin/env bash
# proposal: env_fingerprint.sh
set -euo pipefail
{
printf 'utc=%s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)"
printf 'kernel=%s\n' "$(uname -srm)"
command -v python3 >/dev/null && python3 - <<'PY'
import sys, platform
print(f"python={sys.version.split()[0]}")
print(f"impl={platform.python_implementation()}")
PY
command -v node >/dev/null && printf 'node=%s\n' "$(node -v)"
command -v go >/dev/null && printf 'go=%s\n' "$(go env GOVERSION 2>/dev/null || true)"
git rev-parse HEAD >/dev/null 2>&1 && printf 'head=%s\n' "$(git rev-parse HEAD)"
} | tee env.fingerprint
在任何合并之前跨运行比对指纹。如果 Python 变了,补丁就是不同的补丁。别凭一个死盒子的氛围合并。
Myth 5:明天免费的模型会回放今天的补丁
我之后可以从保存的 prompt 重建。
免费模型的路由会在不给你发日历邀请的情况下改变。隐藏的系统 prompt 会在没有警告的情况下改变。你 cached 的上下文在标签页关闭时就消失了。
保存的 prompt 真的是构建输入吗?prompt 是一个有语法的心愿。这样的心愿之后不会重放。
回放是一个测试加一个在 git 里的补丁。不是 Downloads 里一个 prompt 文件。如果你不能 git checkout 出结果,你就不能回放那个结果。
提议的回放检查
git checkout -B replay/check
python -m pytest test_spec.py -q
git revert --no-edit HEAD
python -m pytest test_spec.py -q
# expect green, then red; that is replay
你仍然想归档聊天记录吗?只把它作为笔记保存到工单里。永远不要把它当作发版的产物。
我实际用的一张决策表
每次运行从上到下读一遍。免费技术栈是一种可能,不是默认。这张表是不关心价格的关卡。
一个具体的调试工作流
这才是我想用的确切循环。把它当作一个提议,不是基准。
写一个失败的测试并提交它。
给盒子打指纹,现在就保存 env.fingerprint。
运行密钥守卫,失败即停。
问模型要一个补丁,不是故事。
在命名分支上应用补丁。
用没有额外文件的方式运行同样的测试。
把分支从免费盒子里 bundle 出来。
在你真正控制的机器上回放。
八步,不需要付费模型。八步,不需要付费服务器。全部八步仍然需要一个你先写的规格。
免费技术栈在实践中哪里有帮助?第四步和第五步的采样变便宜了。你现在可以丢掉更多补丁了。那些补丁大多数你应该丢掉。
这篇 FAQ 不是厂商性能研究。我没有给模型相互计时。我没有给免费服务器排硬件等级。
免费访问可能在两个安静的早晨之间消失。免费服务器可能重置而没有有用的 diff。指纹可能匹配但行为仍然在你下面漂移。
测试可以用自信的语气说错话。Agent 也可以欺骗你写得太窄的测试。pytest 跑绿仍然在这里是必要的。对生产流量来说它不是充分的。
不要在以下情况使用这个方案:
承载生产凭证的工作负载
任何需要合同级正常运行时间目标的东西
没有原始聊天就不能回放的补丁
把 git status 当作可选仪式对待的团队
如果你的组织禁止远程开发盒子,待在笔记本上。五个误区在那里仍然适用。价格从来都不是真正的 bug。
我想让你偷的是什么
偷顺序,不是另一个厂商口号。保持这个顺序:测试、打指纹、守卫、补丁、回放。别从 prompt、希望再来一次和另一个免费重试开始。
模型免费,规格就多余了吗?这项工作的规格从来都不是可选的。模型的价格从来都没有买来 oracle。
这周在免费盒子上跑这张表。然后告诉我哪一行先失败了。我最关心那个失败的行。我不关心盒子上坐的是哪个 logo。