先别把 AI 当自动写码机

AI 写代码这件事,现在最大的问题不是能不能生成代码,而是很多人只会“问一句,贴一段”,最后要么答非所问,要么产出一堆不能落地的模板。

如果你平时是 Java 后端、全栈或者日常维护业务系统,真正有价值的不是“让 AI 替你开发一切”,而是把它变成一个能查上下文、能执行工具、能按规则做事的开发助手。

现在常见的几个关键词,基本绕不开这些:

1、Prompt

2、Agent

2、Skills

3、MCP

5、工作区上下文

这篇不讲大模型原理,只讲平时开发里最容易碰到的三个东西:Agent、Skills、MCP,它们分别是什么,为什么要有,平时该怎么用。

先把三个词分开

这三个词经常被混着说,但它们其实不是一层东西。

先说最短的版本:

1、Agent 更像一个会自己拆任务、会决定下一步做什么的执行者

2、Skills 更像给这个执行者准备好的固定套路和工作规范

3、MCP 更像把它接到外部工具和数据源上的接口层

如果非要类比成一个工程团队,可以这么理解:

1、Agent 是干活的人

2、Skills 是团队里的 SOP 和最佳实践

3、MCP 是这个人能用到的工具箱和外部系统权限

把这三层分开后,再看很多 AI 开发工具就不容易混乱了。

Agent 是什么

Agent 不是单纯回答一句话的聊天模型,而是一个会围绕目标连续做动作的执行单元。

比如你说:

1
帮我把订单查询慢的问题排一下

如果只是普通聊天,它大概率只会给你一串建议:看索引、看 SQL、看慢日志。

但如果是 Agent,它更像会自己按步骤推进:

1、先找订单查询相关代码

2、再看 SQL 和表结构

3、再看 explain 或日志

4、最后再给修改建议

它和普通问答最大的区别,不是“更聪明”,而是它会围绕目标连续决策,而不是只生成一段答案。

Skills 是什么

Skills 可以理解成给 Agent 或 AI 助手准备好的固定技能包。

它不是模型能力本身,而是你提前沉淀好的做事方式。

例如下面这些都很适合做成 Skills:

1、Spring Boot 项目里新增 controller、service、mapper 的固定写法

2、排查事务失效时先看代理、异常、调用边界的固定检查顺序

3、写 SQL 优化建议时优先看 where、join、索引、limit 的固定套路

4、写前端组件时遵守现有设计系统和目录结构的固定规则

Skills 的价值不在于“更高级”,而在于重复任务不用每次重新讲一遍。

MCP 是什么

MCP 可以把它理解成 AI 调用外部能力的一层通用协议。

只会聊天的 AI,只能基于你贴出来的信息回答。

一旦接上 MCP,它就不只是“看你发来的内容”,而是可以按允许的边界去拿工具结果。

最常见的能力通常有:

1、读文件

2、搜代码

3、执行有限命令

4、查接口文档

5、看 Git 变更

6、接数据库、知识库、浏览器自动化

它的核心价值不是名字新,而是让 AI 从“只能说”变成“能看、能查、能调工具”。

这三者是什么关系

如果你把它们放到一条链路里看,关系会更清楚:

1、Agent 负责决定这件事怎么推进

2、Skills 负责告诉它这类事通常该按什么套路做

3、MCP 负责让它真的能用上文件、命令、文档这些外部能力

用一句更直白的话说:

没有 Skills,Agent 容易每次风格都不一样;
没有 MCP,Agent 再会规划也碰不到真实代码和工具;
没有 Agent,Skills 和 MCP 也只是零散能力,缺少收口的人。

简单原理怎么理解

不用从模型原理讲太深,平时开发里记住下面这套就够了:

1、你先给目标

2、Agent 按目标拆步骤

3、过程中它会参考 Skills 里的规则

4、需要外部信息时,通过 MCP 去拿文件、命令或文档结果

5、再把这些结果继续喂回当前任务,往下推进

所以它不是“模型突然会写代码了”,而是:

目标、规则、工具、上下文,这几层终于串起来了。

平时开发里怎么用

如果你平时主要是写业务代码,我更建议把这三层这样用:

1、Agent 负责处理多步任务

例如:排查超时、定位事务失效、补一个新接口、梳理调用链。

2、Skills 负责固化团队规则

例如:统一异常写法、统一返回体、统一目录结构、统一 review 规则。

3、MCP 负责接环境能力

例如:读项目文件、跑编译命令、查日志、查 README、看数据库脚本。

如果你把这三层都丢掉,只剩一个聊天框,那大多数时候它还是只能当“高级搜索”。

上下文先给够

很多人和 AI 对话时,只有一句:

1
帮我写一个订单接口

这类问题最大的问题,不是 AI 不够聪明,而是上下文太少。

更接近可用产出的提问方式应该是:

1
2
3
4
5
6
7
8
项目是 Spring Boot + MyBatis。
现有表 order_main、order_item。
我需要一个创建订单接口:
1、校验商品库存
2、插入主表和明细表
3、失败时回滚
4、返回订单号
请给我 controller、service 和 mapper 层示例。

如果你在 VS Code 这类带工作区上下文的环境里,用法会更直接:

1、先打开相关文件

2、明确告诉 AI 参考哪个类、哪个方法

3、说清楚是修改已有代码,还是新建文件

上下文越具体,AI 越接近一个真正的协作开发者,而不是随机代码生成器。

Skills 最适合沉淀什么

如果你经常需要 AI 遵守同一套规则,比如:

5、代码风格偏实战,不要生成教程式注释

这类规则不要每次手打,最好固化成 Skills 或项目指令文件。

一个简单的指令文件可以长这样:

1
2
3
4
5
6
7
8
---
applyTo: "**/*.java"
---

- 使用 Java 17。
- Service 层抛 BizException,不直接返回 null。
- 数据访问统一通过 Mapper,不直接拼接 SQL。
- 优先给出可落地的业务代码,不要只给概念说明。

这样做的价值很直接:

1、AI 输出更稳定

2、多人协作时口径更统一

3、减少一遍遍补充约束的时间

如果你的项目经常做固定类型任务,例如:

1、写 Controller + Service + Mapper 骨架

2、补单元测试

3、排查 NPE 或事务失效

4、写 SQL 优化建议

这些都很适合做成 Skills。

如果要再往前走一步,我更建议 Skills 里沉淀这几类东西:

1、固定代码风格

2、固定目录结构

3、固定排查路径

4、固定测试补法

5、固定 review 清单

MCP 更像工具总线

只会聊天的 AI,最多算“会写建议”。

能接工具的 AI,才开始像“能干活”。

MCP 可以理解成一种让 AI 安全调用外部能力的协议。常见接法包括:

1、文件系统

2、数据库查询

3、接口文档

4、Git 仓库

5、浏览器自动化

例如你要让 AI 帮你排查一个订单查询慢的问题,如果它只能聊天,最多告诉你去看索引、看执行计划。

如果它能接到工具,流程就会更实用:

1、先读项目里的 Mapper 和 SQL

2、再看建表语句和索引

3、必要时跑 explain

4、最后给修改建议

从开发视角看,MCP 最值得用的不是花哨能力,而是这几个方向:

1、查文件

2、读代码

3、执行有限命令

4、连知识库或文档

5、查 PR、Issue、接口定义

如果只保留一句话,我会这么理解 MCP:

它不是一个具体工具,而是一种让 AI 统一接工具的方式。

Agent 什么时候最有用

Agent 最有价值的,不是替你写一个 Hello World,而是处理那种一步答不完的任务。

例如下面这些就很适合让 Agent 来做:

1、排查一个线上超时问题

2、沿着调用链找一个字段是在哪改掉的

3、基于现有代码补一个完整的小功能

4、找出一个模块里哪些 SQL 可能有 N+1 或索引问题

这类事的共同点是:

1、要读不止一个文件

2、要做不止一次判断

3、往往还要跑命令或查结果

这种时候,Agent 比单轮问答更像真正的协作方式。

任务拆小再交给 AI

最容易翻车的用法是:

1
帮我写一个完整商城系统

这种任务对人都不够清楚,对 AI 当然更容易失真。

更高效的方式,是把任务切成很小的执行单元。

比如把“开发订单模块”拆成:

1、先生成 OrderDO、OrderMapper、建表 SQL

2、再补创建订单的 Service 方法

3、再补事务和库存校验

4、最后再补单元测试和异常分支

例如你可以这样提:

1
2
3
4
5
6
参考现有 UserService 的写法,新增 OrderService#createOrder。
要求:
1、使用 @Transactional
2、插入 order_main 和 order_item
3、库存不足抛 BizException
4、不要改现有公共类

这种拆法的好处是:

1、输出更稳定

2、方便逐步校验

3、出了问题更容易定位是哪一步偏了

审查和重构往往更稳

在真实项目里,AI 一个更稳的用法不是从零生成,而是基于现有代码做局部改造。

例如:

1、补空值保护

2、把重复 if-else 收成策略模式

3、定位事务失效点

4、补日志上下文

5、找出可能的 N+1 查询

这类任务可以直接给它现有代码:

1
2
3
4
5
6
7
8
9
public List<OrderDTO> query(List<Long> orderIds) {
List<OrderDTO> result = new ArrayList<>();
for (Long orderId : orderIds) {
Order order = orderMapper.selectById(orderId);
User user = userMapper.selectById(order.getUserId());
result.add(buildDTO(order, user));
}
return result;
}

然后让 AI 做有边界的优化:

1
2
这段代码可能有 N+1 查询问题。
请保持现有返回结构不变,改成批量查询写法,并说明修改点。

比起让 AI 从零写一套查询逻辑,这种方式通常更稳,也更符合真实开发流程。

调试时把报错和文件给全

“为什么启动失败”这种提问,如果没有日志,没有文件,没有报错堆栈,AI 只能猜。

更有效的输入一般至少包含三部分:

1、报错信息

2、相关配置或代码

3、你已经试过什么

例如:

1
2
3
4
Spring Boot 启动失败,报错是 BeanCurrentlyInCreationException。
相关类有 OrderService、StockService、OrderFacade。
我已经确认没有显式 @Lazy。
请帮我定位循环依赖位置,并给两个可落地改法。

如果环境支持读取工作区文件、跑命令、看错误列表,AI 排查问题的效率会高很多。

固定一套用法

日常开发里,一个很实用的 AI 使用流程通常就是下面这样:

1、先给上下文:项目技术栈、参考文件、目标方法

2、再给约束:不要改公共接口、保持返回结构、按现有风格写

3、让它先做小改动,不要一口气改十几个文件

4、每改一步就跑编译、测试或最小验证

5、让它总结变更点和潜在风险

你甚至可以把常用请求模板固定下来:

1
2
3
4
5
6
7
参考当前项目已有代码风格,帮我修改这个方法。
目标:
1、修复空指针
2、保持原有返回结构
3、不要改接口定义
4、给出修改后的完整方法
5、补 3 个边界场景说明

这比研究一堆“万能提示词”更有用。

一套最容易落地的组合

如果你想把 Agent、Skills、MCP 真正用起来,我更建议按下面这个顺序:

1、先接 MCP,把文件、命令、文档能力接进来

2、再补 Skills,把团队的固定规则沉淀下来

3、最后再让 Agent 去处理多步任务

因为很多团队一上来就想要“全自动 Agent”,但连规则和工具都没接好,最后只能得到一个会聊天但不太落地的助手。

常见坑

1、只给一句需求,不给上下文

AI 不是你脑子里的读心器,项目背景不说清,结果自然会飘。

2、让 AI 一次生成过大范围改动

改动面太大,校验成本会迅速变高,最后反而更慢。

3、把 AI 输出直接复制进生产代码

AI 适合提速,不适合替你省掉 review、编译和测试。

4、没有固定项目规则,导致每次输出风格不一致

这类问题最适合用 Skills 或项目指令文件收口。

5、只会聊天,不会接工具

不接文件、命令、文档、仓库的 AI,能给建议,但很难真正参与开发流程。

6、把 Agent、Skills、MCP 当成一个东西

三层职责不分清,最后最常见的结果就是:不知道问题该补规则、补工具,还是补执行链路。

收一下

快速利用 AI 开发代码,真正有价值的不是把它当“自动写码机”,而是把它变成一个有上下文、有规则、有工具可用的协作助手。

如果用一句话收口:

Agent 负责推进任务,Skills 负责固定套路,MCP 负责接上工具。

真正能落地的 AI 开发方式,通常不是三选一,而是三层一起配合。

最值得保留的核心是:

1、先给清晰上下文,不要只丢一句模糊需求

2、把稳定规则固化成 Skills 或项目指令

3、尽量让 AI 接到文件、命令、文档等真实工具

4、把任务拆小,先做局部改动再验证

5、优先让 Agent 处理多步任务,而不是只让 AI 停留在聊天层