别跟我提“涌现能力”,我只关心标准差和可复现率。
在工程师眼里,任何黑盒都要被抽象成接口。大模型的本质是什么?是一个输入Prompt,输出Token串,且输出分布带有随机性的函数。
这意味着三点:
所以,我们写代码的第一原则不是“让AI写代码”,而是“为AI写一个稳定的调用封装”。
绝大多数人失败在一次性生成。工程师的解法是Pipeline化。
层级 | 职责 | 输入 | 输出 |
|---|---|---|---|
L1 规划层 | 生成步骤清单,不写代码 | 自然语言需求 | 结构化步骤列表(JSON) |
L2 编码层 | 按步骤逐个生成函数 | 单一步骤+上下文 | 纯函数代码块 |
L3 校验层 | 静态检查+Mock运行 | 完整代码 | 通过/失败+错误日志 |
为什么要拆?因为单次生成100行代码的错误率,远高于分5次每次生成20行。错误率不是线性叠加,而是指数上升。
下面这段代码(仅12行有效逻辑)展示了一个工程师如何封装大模型调用,把随机性关进笼子里:
def generate_with_validation(prompt, schema, retries=2):
for attempt in range(retries):
raw = llm.chat(prompt, temperature=0.2) # 低温降方差
code = extract_code_block(raw) # 正则剥离Markdown
if validate_syntax(code) and match_schema(code, schema):
return code
# 失败时,将错误信息追加到Prompt,下次重试
prompt += f"\n[上一版错误]: {get_compile_error(code)}"
raise RuntimeError("超过重试次数,生成失败")工程要点拆解:
工程师最值钱的能力不是告诉AI“要做什么”,而是明确“绝对不许做什么”。
在Prompt的末尾,固定追加这一段(仅5行):
【硬性约束】
- 禁止使用 eval() 或 exec()
- 禁止访问 os.system() 和 subprocess 直接调用
- 所有文件操作必须包裹在 try-finally 中
- 禁止生成任何交互式输入(input())
- 若无法满足上述任一条件,直接回复"REJECTED"这比给100个“正面示例”都有效。因为大模型的注意力机制对结尾的否定词敏感度极高。这就像给代码生成器加了一个安全围栏,而不是指望它自觉。
我们团队内部跑过一组对照实验(基于DeepSeek-V3):
指标 | 对照组 | 实验组 |
|---|---|---|
首次编译通过率 | 37% | 82% |
逻辑正确率(含边界) | 21% | 71% |
平均生成耗时 | 8秒 | 26秒(含重试) |
耗时增加了,但无效返工时间减少了3倍。工程上这叫用确定性开销置换不确定性风险,这笔账算得过来。
不要把大模型当作“决策者”,把它当作“高并发的实习生”。
你需要做的不是让它自由创作,而是:
当你把这三件事写成代码(总共不超过30行封装),大模型就不再是一个需要“哄”的玩具,而是一个可度量、可监控、可降级的普通中间件。
—— 这才是一个工程师该有的姿势。
后记:如果你想要这份代码的完整封装类(含日志、超时、Token计数),那就是另一个话题了。不过按工程师的习惯,你应该已经能自己手搓出来了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。