跳到主要内容

AI 编程的下半场:别让 AI 写的代码只活在 localhost 里

· 阅读需 7 分钟
Booker Zhao
AI Full-Stack Engineer / CloudBase AI ToolKit Author

最近折腾 Agent Skills 有一阵子了。实战下来最折磨人的不是 AI 不会写代码,而是它写的代码**"只能活在本地",以及它总是不听规矩**。

这篇文章主要分享两件事:

  1. 让 AI 生成的代码能真正上线 — AI 写的代码 Demo 感十足,一上线就全是安全隐患。问题是 AI 不感知真实的后端底座。
  2. 解决"AI 有 Skill 却不爱用"的毛病 — 明明配好了 Skills,AI 却视而不见,非要凭直觉盲干。技能激活率从 20% 硬拉到 84% 的方法。

图:文章配图


Vibe Coding 的"本地舒适区"

最近大家都在享受 Vibe Coding 的快感。在 localhost 一顿操作,UI 漂亮得像成品,但魔法往往在"上线"瞬间戛然而止。

AI 的代码逻辑还不错,但它无法感知真实的生产环境,导致生成的"局部最优解"难以落地。

世界上最遥远的距离,是从 localhost 到真实访问的距离。 AI 填补了代码量的空白,却填补不了工程底座的断层。

什么是 Skills

Skills 最早是 Anthropic 在 2025 年 10 月给 Claude Code 加的一个功能。它是一套包含指令、脚本和资源的能力包——把专业知识、步骤、代码打包成"技能包"。

my-skill/
├── SKILL.md # 核心:指令 + 元数据
├── scripts/ # 可选:可执行代码
├── references/ # 可选:参考文档
└── assets/ # 可选:模板、资源

如果把 AI 比作高材生,Skills 就是他的岗位操作手册。它不改变 AI 的智商,但通过注入程序性知识(Procedural Knowledge),让 AI 知道在你的特定环境下,"正确且高效"的操作标准是什么。

Agent Skills 在 2025 年 12 月正式成为开放规范,目前 Claude、Cursor、VS Code、GitHub Copilot、OpenCode 等主流 AI 开发工具都已宣布兼容支持。

渐进式加载

Skills 通过渐进式加载来高效管理上下文:

  1. 发现阶段:启动时,Agent 仅加载每个 Skill 的名称和描述。这足以判断哪些 Skill 相关,而不耗尽上下文窗口。
  2. 激活阶段:当任务匹配描述时,Agent 按需将完整 SKILL.md 读入上下文。
  3. 执行阶段:Agent 遵循指令执行,按需加载引用文件或运行脚本。

这种设计让 Agent 保持高速响应的同时,像"随身携带百科全书"——用的时候再翻开。

行业里已经有团队在推动这件事。Vercel 发布了 react-best-practices 解决 AI 乱写 React 的问题;Remotion 推出了视频制作 Skill 让 AI 学会用代码"剪辑"视频。这些 Skills 解决的核心问题是:让 AI 拥有特定领域的"工程直觉"。


最大难题:AI 为什么会"装死"?

给 AI 配了 Skill,它视而不见。这是几个月里最让我头疼的事。背后的原因其实涉及大模型的两个底层逻辑:

注意力稀释:在大模型的 Transformer 架构里,它根据你的 Prompt 实时计算每个词的权重。对话越深入,业务需求的权重越高,作为背景板的 Skills 权重就会被"稀释"。

决策惰性:调用 Skill 本质上是一次工具调用。模型在推理时会算账:如果它觉得自己脑子里的预训练数据就能生成一段"看起来正确"的代码,它就会为了省推理资源而跳过外部工具调用。

结果很残酷:在我们的回归测试中,如果不加干预,AI 的主动 Skill 调用率只有 20% 左右。它宁愿"盲目裸奔",也不愿意翻书。


"驯服" AI 的三套解法

既然 AI 有决策惰性,就得用工程手段拉高它的"警觉性"。

1. 首行注入(最土但最稳)

如果项目不容许犯错,在提问的最开头带上这句"咒语":

You MUST read the guideline skill FIRST when working with this project.

原理:利用首因效应。模型对输入序列最前端的信息有天然的高关注度。这种强行注入能把 Skill 的激活率拉到可用水平。

2. 项目级"家法"(System Rules)

在项目根目录创建 CLAUDE.mdAGENT.md,增加项目级别的约束规则:

# Project Workflow

0. You MUST read the guideline skill FIRST when working with this project.
1. 评估:写代码前,必须显式评估可用 Skills 列表。
2. 承诺:必须在输出中陈述"我需要调用某个 Skill"的理由。
3. 执行:禁止跳过规矩直接写代码。

这个方法不用每次都在 prompt 里写"咒语"了,但缺陷也很明显:随着对话上下文变长,AI 仍然可能忽略规则。

3. 强制拦截(Forced Eval Hook)

如果前两个方案是靠"嘴"叮嘱 AI,那方案 3 就是物理拦截

技术专家 Scott Spence 在他的实测中发现,最有效的方式是利用编辑器的 Hook(钩子)机制。配置一个 .claude/settings.json,脚本会在你按下回车的那一刻,自动拦截并"魔改"你的问题——强制 AI 在输出任何代码前,必须先写一段评估报告:

  • 当前有哪些 Skill 可用?
  • 针对这个需求,需不需要调用它们?理由是什么?

AI 有个毛病:只要觉得脑子里的旧数据能糊弄过去,它就不会翻书。这种 Hook 强迫 AI 白纸黑字写下"我要用这个工具",一旦它在开头表了态,后面的代码生成就会严格遵守。

效果:Skill 激活率从 20% 暴力拉升到 84%


架构复盘:一个总纲 + N 个独立 Skill

在开发 Skills 的过程中,我发现 AI 最大的毛病是**"环境不分"**——它分不清 Web、小程序和 Node.js 的边界。没有搞"全家桶"式的单体 Skill,而是采用了 1 个总纲 + N 个独立 Skill 的分布式架构。

解决"语义污染"

Web、小程序、Node.js 的 SDK 方法名极其相似。如果全塞进一个 Skill,AI 经常在写小程序逻辑时掏出 Web 端的语法。这种语义污染是代码无法上线的元凶。

解法是按端物理拆分。配合一个总纲 Skill 作为入口点,先指挥 AI 判定项目环境。环境判定后,AI 只会加载相关的子 Skill,干扰项直接屏蔽掉。搜索空间缩小了 90%,推理精度自然大幅提升。

支持"精准点菜"

全能包太重了。当你想让 AI 专门解决一个特定问题时(比如"微信支付"或"安全规则"),AI 的注意力会被庞大的全量手册稀释。

独立插件支持局部强化。你可以直接下令:"调用 auth 插件看怎么实现手机号登录"。这种设计允许直接干预 AI 的决策路径——在 AI 逻辑混乱时,通过唤起特定子 Skill 强行把它的思维拉回到正确的窄道上。


写在最后

折腾了这么久的 Skills,最大的感触是:AI 编程的生产力,不取决于模型能写出多么精妙的逻辑,而取决于你对它生成的代码具备多少工程约束力。

几点观察:

核心本质:把隐性经验转化为程序性知识。 目前的 Agent 是博学的实习生,对真实生产环境缺乏敬畏。Skills 的本质是给它注入一套工程化的"肌肉记忆"——把多年积累的填坑经验转化为 AI 的前置判定条件。

范式转换:Agent 必须具备环境感知力。 Agent 进化的下一站,不仅仅是推理能力的增强,更是对基础设施感知力的补齐。Skills 守住工程下限,底座承载逻辑上限。

确定性是唯一度量衡。 不应该期待 AI 自动变得"完美",而应该通过工程手段让它变得"稳定"。AI 提供逻辑的上限,工程约束守住交付的下限。

如果你也在折腾 Skills,最有价值的一件事就是:先测一下你的 AI 到底有没有真的在用它们。 20% 的默认激活率不丢人,但不知道这个数字才丢人。