Tutorial · 教程 walkthrough
AI辅助开发工作流
从手动挡到自动驾驶 — 一份写给全栈开发者的AI编程完全指南。你不需要懂MCP、Agent、RAG,跟着小王一起看就够了。
📖 10章完全教程
🎯 30+可视化图表
💻 完整代码示例
🚀 从零到生产级
P1
AI编程工具全景 — 从手动挡到自动驾驶
先搞清楚:AI编程助手到底是什么?怎么选?
你有没有这种感觉:每次写代码,就像开手动挡的车——踩离合、挂挡、踩油门,一步不能错。写个CRUD接口要敲几百行,查个Bug要翻半天日志。2024年开始,一切变了:AI编程助手就像自动挡,你只需要说"我要去哪",它帮你换挡踩油门。
1.1 开发工具进化史
让我们先回顾一下开发工具的进化历程。每一步进化,都让开发者少做一件"机械性"的事:
🛠️ 开发工具进化时间线
📝 记事本时代:纯手工敲字,没有语法高亮,连括号配对都要自己数
💡 IDE时代:语法高亮、自动缩进、跳转定义——少踩几个坑
✨ 智能补全:IntelliSense根据上下文提示方法名——省了查文档的功夫
🤖 AI编程助手:你写注释,AI写代码——从"手动挡"变成"自动挡"
🚀 AI Agent:你说需求,AI自动规划步骤并执行——"自动驾驶"
类比时间:开发工具的进化就像开车——记事本是走路,IDE是骑自行车,智能补全是骑电动车,AI编程助手是开自动挡汽车,AI Agent是自动驾驶。每一代都让你更专注于"去哪"而不是"怎么去"。
1.2 主流AI编程工具对比
市面上的AI编程工具已经很多了,到底选哪个?下面这张表帮你搞清楚:
| 工具 | 类型 | 核心能力 | Agent模式 | MCP支持 | 价格 | 适合谁 |
| Cursor |
IDE | 编辑器深度集成AI,Tab补全+Chat+Agent |
✅ 强 |
✅ |
$20/月 |
全栈开发者首选 |
| GitHub Copilot |
插件 | VS Code/JetBrains插件,Tab补全+Chat |
⚠️ 有限 |
❌ |
$10/月 |
VS Code用户 |
| Windsurf |
IDE |
Codeium出品,Cascade流式Agent |
✅ 强 |
✅ |
$15/月 |
喜欢轻量IDE |
| Augment |
插件 |
深度代码库理解,长上下文 |
⚠️ 有限 |
❌ |
免费/付费 |
大型代码库 |
| Codeium |
插件 |
免费AI补全,多IDE支持 |
❌ |
❌ |
免费 |
预算有限 |
| Aider |
CLI |
命令行AI编程,Git集成好 |
✅ |
❌ |
按Token |
终端爱好者 |
| Claude Code |
CLI |
Anthropic出品,深度代码理解 |
✅ 强 |
✅ |
按Token |
高级Agent需求 |
| CodeBuddy |
IDE |
国产,中文支持好,内置Skill |
✅ |
✅ |
免费/付费 |
中文开发者 |
选型建议:如果你是全栈开发者、刚接触AI编程,直接用 Cursor。它集成了编辑器+AI+Agent+MCP,一站式解决。如果你已经在用VS Code不想换,GitHub Copilot + Copilot Chat 是最稳妥的选择。如果你喜欢命令行,试试 Claude Code 或 Aider。
1.3 三种AI辅助层级:补全→对话→代理
AI编程助手有三种"介入深度",理解这个很重要——它决定了你和AI怎么配合:
🎯 AI辅助的三种层级
⌨️
Level 1: 补全
你敲几个字母,AI猜你想写什么
Tab键确认
类似:手机输入法联想
→ 你还是主力,AI打辅助
💬
Level 2: 对话
你用自然语言描述需求
Chat窗口问答
类似:和同事讨论方案
→ 你提问,AI给建议
🤖
Level 3: 代理
你说"帮我做这个功能"
Agent自动执行多步
类似:派实习生干活
→ 你审批,AI干活
⌨️ 补全模式 (Tab)
// 你输入:
public User findBy
Id(Long id) {
return userMapper
.selectById(id);
}
↑ 灰色部分=AI猜测,Tab确认
💬 对话模式 (Chat)
帮我写一个用户注册接口
好的,我来实现用户注册接口,包含参数校验和密码加密...
@PostMapping("/register")
public Result register(...)
🤖 代理模式 (Agent)
实现完整的用户注册功能,包含前后端
📋 规划:5个步骤
✅ 创建User实体类
✅ 创建RegisterDTO
✅ 创建UserService
✅ 创建Controller
🔄 正在创建前端表单...
1.4 工作场景:小王用Cursor从零搭建Spring Boot项目
小王是一个3年经验的后端开发者,以前都是手动创建项目、拷贝配置文件、一个个写Entity/Mapper/Service/Controller。今天他第一次用Cursor的Agent模式,看看会发生什么。
王
小王
帮我创建一个Spring Boot 3.2项目,包含:用户管理(CRUD)、JWT认证、MySQL数据库、MyBatis-Plus、Swagger文档。项目名:user-admin
AI
Cursor Agent
好的!我来为你创建完整的Spring Boot项目。让我先规划一下步骤:
📋 执行计划:
1. 创建Spring Boot项目结构(pom.xml + 主启动类)
2. 配置application.yml(MySQL + Redis + JWT)
3. 创建User实体 + RegisterDTO/LoginDTO
4. 创建UserMapper + UserService + UserController
5. 实现JWT工具类 + 认证拦截器
6. 配置Swagger + 全局异常处理
7. 创建数据库初始化SQL
⏳ 开始执行...
AI
Cursor Agent
✅ 步骤1/7 — 已创建 pom.xml(含所有依赖)
✅ 步骤2/7 — 已创建 application.yml
✅ 步骤3/7 — 已创建 User.java, RegisterDTO.java, LoginDTO.java
✅ 步骤4/7 — 已创建 UserMapper, UserService, UserController
✅ 步骤5/7 — 已创建 JwtUtil, AuthInterceptor
✅ 步骤6/7 — 已创建 SwaggerConfig, GlobalExceptionHandler
✅ 步骤7/7 — 已创建 schema.sql
🎉 项目创建完成!共创建 14个文件,预计手动完成需要 2-3小时,AI Agent用时 47秒。
生成的项目结构如下:
// UserController.java — AI自动生成的完整代码
@RestController
@RequestMapping("/api/users")
@Tag(name = "用户管理")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/register")
public Result<String> register(@RequestBody RegisterDTO dto) {
userService.register(dto);
return Result.success("注册成功");
}
@PostMapping("/login")
public Result<String> login(@RequestBody LoginDTO dto) {
String token = userService.login(dto);
return Result.success(token);
}
}
验证一下项目能否启动:
$ cd user-admin && mvn spring-boot:run
[INFO] Scanning for projects...
[INFO] Building user-admin 1.0.0
[INFO] --- spring-boot-maven-plugin:3.2.0:run ---
[INFO] No tests to run.
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.2.0)
[INFO] Started UserAdminApplication in 3.2 seconds (process running for 4.1)
[INFO] Tomcat started on port(s): 8080 (http)
[INFO] Swagger UI: http://localhost:8080/swagger-ui.html
$ curl -s http://localhost:8080/api/users/register -X POST -H "Content-Type: application/json" -d '{"username":"test","password":"123456","email":"test@example.com"}'
{"code":200,"message":"success","data":"注册成功"}
$ curl -s http://localhost:8080/api/users/login -X POST -H "Content-Type: application/json" -d '{"username":"test","password":"123456"}'
{"code":200,"message":"success","data":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0IiwiaWF0IjoxNzAwMDAwMDAwLCJleHAiOjE3MDAwODY0MDB9.xxx"}
小王的内心OS:以前搭建这样一个项目,我要花2-3小时:建目录结构、拷pom.xml改依赖、写Entity、写Mapper、写Service、写Controller、配置文件、测试接口... 现在AI Agent 47秒搞定,而且代码质量还不错,只需要微调一下就能用。这就是"自动挡"的感觉!
P2
MCP — AI的USB-C接口
让AI能"动手"操作你的工具:数据库、文件系统、GitHub...
你有没有遇到过这种情况:让AI帮你查数据库,它只能告诉你SQL语句,然后你自己去执行?让AI帮你操作GitHub,它只能告诉你git命令?MCP就是解决这个问题的——让AI能直接"动手"操作你的工具。
2.1 为什么需要MCP?类比:USB-C统一了充电口
❌ 没有MCP之前
每个AI应用都要为每个工具单独写集成代码:
Cursor → 写了MySQL插件 → 只Cursor能用
Copilot → 也写MySQL插件 → 只Copilot能用
Claude → 也写MySQL插件 → 只Claude能用
同一个数据库,3个AI应用要写3遍集成代码!
就像以前:苹果Lightning、安卓Micro-USB、华为USB-C... 每个手机充电口都不一样,出门要带3根线。
✅ 有了MCP之后
只要写一次MCP Server,所有AI应用都能用:
MySQL MCP Server → 写一次
Cursor → 通过MCP协议连接 ✅
Claude → 通过MCP协议连接 ✅
Copilot → 通过MCP协议连接 ✅
一次开发,到处使用!
就像USB-C:一根线充所有设备。MCP就是一个"USB-C接口",让AI应用统一连接各种工具。
2.2 MCP架构:Host → Client → Server
🏗️ MCP三层架构
🏠 Host(宿主)
AI应用本身
如:Cursor, Claude Desktop, VS Code
类比:你的电脑
它需要"外设"来扩展能力
⟷
🔌 Client(客户端)
Host内置的MCP客户端
负责和Server通信
类比:USB控制器
管理Host和设备之间的通信
⟷
🔧 Server(服务端)
提供具体能力的程序
如:MySQL Server, GitHub Server
类比:USB设备
U盘、鼠标、键盘...
通信流程:
1. 你对AI说"查一下用户表有多少条数据"
2. Host(Cursor)识别出需要数据库能力 → 通过Client向MySQL Server发请求
3. MySQL Server执行 SELECT COUNT(*) FROM user → 返回结果
4. Host收到结果 → AI用自然语言告诉你"用户表有12,345条数据"
MCP支持两种传输方式:
| 传输方式 | 原理 | 适用场景 | 示例 |
| stdio | 标准输入输出,本地进程间通信 | 本地工具(文件系统、数据库、Git) | MCP Server作为子进程启动 |
| SSE | Server-Sent Events,HTTP长连接 | 远程服务(SaaS API、云数据库) | 通过URL连接远程MCP Server |
2.3 常见MCP Server分类
📦 MCP Server生态一览
🗄️
数据库
MySQL/PostgreSQL
MongoDB/Redis
查询+分析
🐙
GitHub
创建PR/Issue
查看代码
管理仓库
🌐
浏览器
Puppeteer控制
截图/填表
自动化测试
🔍
搜索
Brave Search
Google搜索
文档检索
2.4 实际配置:在Cursor中添加MCP Server
配置MCP Server非常简单,只需要编辑一个JSON配置文件:
{
"mcpServers": {
"mysql": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-mysql"],
"env": {
"MYSQL_HOST": "127.0.0.1",
"MYSQL_PORT": "3306",
"MYSQL_USER": "root",
"MYSQL_PASSWORD": "${DB_PASSWORD}",
"MYSQL_DATABASE": "user_admin"
}
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
}
},
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/wang/projects"]
}
}
}
安全提醒:千万不要把数据库密码、API Token直接写在配置文件里!用环境变量替代(如上面示例中的 ${DB_PASSWORD}),然后在系统环境变量中设置真实值。
配置完成后,Cursor会自动识别这些MCP Server。你可以在Cursor的设置中看到已连接的Server:
Cursor Settings → MCP Servers
已连接的MCP Servers
🗄️ mysql
localhost:3306/user_admin · 5 tools可用
已连接
🐙 github
github.com · 12 tools可用
已连接
📁 filesystem
/Users/wang/projects · 4 tools可用
已连接
2.5 工作场景:用MCP让AI直接查你本地的MySQL
产品经理跑来问小王:"我们系统里注册用户有多少了?活跃率怎么样?"以前小王要打开Navicat写SQL查,现在他直接问AI——因为MCP让AI能直接操作数据库。
王
小王
查一下user_admin数据库:1. 总用户数 2. 最近7天活跃用户数 3. 用户增长趋势(按月)
AI
Cursor (通过MCP查询)
我来通过MCP连接你的MySQL数据库查询这些数据。
📋
执行SQL 1/3: SELECT COUNT(*) AS total FROM user;
✅ 结果:
12,345 条用户
📋
执行SQL 2/3: SELECT COUNT(*) AS active FROM user WHERE last_login >= DATE_SUB(NOW(), INTERVAL 7 DAY);
✅ 结果:
3,891 条活跃用户(活跃率 31.5%)
📋
执行SQL 3/3: SELECT DATE_FORMAT(created_at, '%Y-%m') AS month, COUNT(*) AS count FROM user GROUP BY month ORDER BY month;
✅ 结果:
| 2024-01 | 823 |
| 2024-02 | 1,024 |
| 2024-03 | 1,356 |
| 2024-04 | 1,587 |
| 2024-05 | 2,103 |
| 2024-06 | 5,452 |
📊
总结:总用户12,345,7日活跃率31.5%,增长趋势良好,6月有明显增长(可能是营销活动效果)。
关键区别:没有MCP时,AI只会告诉你"你可以用这个SQL查",然后你自己去执行。有了MCP,AI直接帮你查完并分析结果——从"口述指令"变成了"直接动手"。
P3
Skills & Agents — 给AI装App、请AI实习生
MCP是接口,Skill是能力,Agent是执行者——搞清三者关系
3.1 Skill是什么?= AI的可安装能力模块(类比手机App)
你买了新手机,里面只有基础功能(打电话、发短信)。想拍照?装个相机App。想导航?装个地图App。Skill就是AI的App——给AI安装新能力。
📱 Skill ≈ 手机App
📱
新手机
只有基础功能
打电话、发短信
+ 安装App ↓
相机
地图
微信
=
🤖
AI助手
只有基础能力
对话、写代码
+ 安装Skill ↓
数据库排查
SQL优化
Code Review
🔧 Skill的特点
固定流程:Skill有预定义的执行步骤。比如"数据库排查"Skill会按固定步骤走:1.收集慢查询→2.分析执行计划→3.建议索引。
可安装/卸载:就像手机App一样,按需安装。不需要的能力不装,保持AI的精简。
即插即用:安装后AI自动获得这个能力,不需要额外的配置或学习。
3.2 Agent是什么?= 能自主完成多步骤任务的AI(类比实习生)
如果你给实习生布置一个任务:"排查线上502错误",你会怎么说?你不会一步一步告诉他怎么做——你会说目标,让他自己决定怎么完成。Agent就是这样的实习生。
🧑💻 Agent ≈ 实习生
📋 你给实习生的任务说明
"线上502了,你去排查一下"
→ 你不会说"先看日志,再查数据库,再重启服务"
→ 实习生自己决定怎么做
🤖 Agent的自主决策
Agent收到任务后自主规划:
1. 先看Nginx错误日志
2. 发现后端服务超时
3. 查应用日志定位问题
4. 发现是数据库慢查询导致
5. 给出修复方案
3.3 MCP vs Skill vs Agent的关系
🔗 三者关系图
🔌
MCP = 接口
USB-C接口
连接工具的标准
→
📱
Skill = 能力
手机App
固定流程的能力模块
→
🧑💻
Agent = 执行者
实习生
自主决策完成任务
打个比方:
🔧 MCP是电脑的USB-C接口——它提供了连接外设的能力
📱 Skill是安装的App——通过USB-C接上了打印机,App知道怎么打印
🧑💻 Agent是用App的实习生——你告诉他"打印这份报告",他自己打开App、选择文件、点击打印
3.4 工作场景1:装一个"数据库排查"Skill
小王收到告警:线上有慢SQL。以前他要手动去查information_schema、分析执行计划、建议索引。现在他安装了"数据库排查"Skill,AI自动完成整个流程。
AI
数据库排查 Skill
📋 Skill执行流程(固定步骤):
Step 1/4:查询慢日志
SELECT * FROM mysql.slow_log WHERE start_time >= NOW() - INTERVAL 1 HOUR ORDER BY query_time DESC LIMIT 5;
✅ 发现3条慢SQL,最慢的耗时 12.5秒
Step 2/4:分析执行计划
EXPLAIN SELECT o.* FROM orders o LEFT JOIN user u ON o.user_id = u.id WHERE o.status = 'PENDING' AND u.vip_level > 2;
✅ 发现问题:orders表走了全表扫描(type=ALL, rows=1,234,567)
Step 3/4:检查现有索引
SHOW INDEX FROM orders;
✅ orders表只有主键索引,没有(status)索引
Step 4/4:给出优化建议
📌 建议添加索引:
ALTER TABLE orders ADD INDEX idx_status (status);
预估优化后查询时间:< 0.05秒
3.5 工作场景2:派Agent去排查线上502错误
凌晨2点,小王收到告警:线上502。他不想爬起来一个个查日志,于是派了一个Agent去排查——Agent会自主决定先看什么、后看什么。
AI
DevOps Agent
收到,我来自主排查。先制定排查计划:
📋 自主规划的排查路径:
1. 检查Nginx错误日志 → 定位502来源
2. 检查后端服务状态 → 是否存活
3. 检查应用日志 → 具体报错
4. 检查数据库连接 → 是否超时
5. 给出修复方案
⏳ 开始执行...
Step 1:检查Nginx日志
$ tail -100 /var/log/nginx/error.log
发现:upstream timed out (110: Connection timed out)
→ 判断:不是Nginx的问题,是后端服务响应超时
Step 2:检查后端服务
$ curl -s http://localhost:8080/actuator/health
返回:{"status":"DOWN","db":{"status":"DOWN"}}
→ 判断:数据库连接出了问题
Step 3:检查数据库连接池
$ grep "connection" /app/logs/app.log | tail -20
发现:HikariPool-1 - Connection is not available, request timed out after 30000ms
→ 判断:连接池耗尽,可能是慢SQL占用
Step 4:检查MySQL活跃连接
SHOW PROCESSLIST;
发现:158个活跃连接(最大200),其中 127个 在执行同一条SQL:
SELECT * FROM orders WHERE create_time > '2024-06-01'
→ 这条SQL没有索引,导致全表扫描,锁住大量连接
🎯 根因定位:orders表缺少create_time索引,大量并发查询导致连接池耗尽
💡 建议修复方案:
1. 立即:kill掉慢查询连接,恢复服务
2. 短期:添加索引 ALTER TABLE orders ADD INDEX idx_create_time(create_time);
3. 长期:给这条查询加上分页限制
Skill vs Agent核心区别:Skill像流水线工人——按固定步骤走,每一步都是预定义的。Agent像实习生——你只给目标,他自己决定怎么做,步骤是动态规划的。Skill适合标准化任务,Agent适合开放性排查。
P4
Prompt Engineering — 给AI写好任务说明
同一件事,换个说法,AI的输出质量可能差10倍
你有没有发现:有时候AI的回答特别精准,有时候完全不着调?区别在哪?——在于你给的Prompt(提示词)。就像给实习生布置任务,说清楚和说不清楚,结果天差地别。
4.1 为什么Prompt很重要?类比:给实习生写任务说明
❌ 糟糕的任务说明
"帮我写个接口"
实习生:写什么接口?哪个模块?用什么框架?
返回什么格式?需要校验什么?错误怎么处理?
→ 只能靠猜 → 结果大概率不对
✅ 清晰的任务说明
"用Spring Boot写一个用户注册接口:接收username/password/email,密码用BCrypt加密,用户名不能重复,返回统一Result格式"
实习生:目标明确、要求具体→一步到位
→ 一次就写出你想要的代码
4.2 五种常用Prompt模式
🎭 模式1:角色设定 — "你是一个10年经验的Java后端..."
给AI设定一个专业角色,它就会按这个角色的思维模式来回答。
// ❌ 没有角色设定的Prompt
帮我优化一下这个SQL
// ✅ 有角色设定的Prompt
你是一个有10年经验的DBA,精通MySQL性能优化。
请分析以下SQL的执行计划,指出性能问题,并给出优化建议。
SQL: SELECT * FROM orders WHERE status = 'PENDING' AND create_time > '2024-01-01'
请按以下格式输出:
1. 当前执行计划分析
2. 性能瓶颈
3. 优化建议(包含具体的SQL改写)
4. 预估优化效果
AI的输出对比:
❌ 无角色设定的回复
你可以加个索引试试。
SELECT加个WHERE条件也可以减少数据量。
或者用分页查询。
✅ 有角色设定的回复
1. 执行计划分析
type=ALL (全表扫描), rows≈1.2M, Extra=Using where
2. 性能瓶颈
• SELECT * 返回所有列,增加IO
• status+create_time无复合索引
• 1.2M行全表扫描,查询时间≈8.5s
3. 优化建议
ALTER TABLE orders ADD INDEX idx_status_create(status, create_time);
改写SQL:SELECT id,order_no,amount,status,create_time FROM orders WHERE status='PENDING' AND create_time>'2024-01-01'
4. 预估效果
type: ALL→ref, rows: 1.2M→≈5000, 查询时间: 8.5s→0.03s
🧠 模式2:思维链(CoT) — "请一步步分析..."
让AI把思考过程展示出来,而不是直接给结论。这样输出的逻辑更可靠,也方便你检查。
// ✅ CoT Prompt
下面这段Java代码在线上出现了NullPointerException,
请一步步分析可能的原因,并给出修复方案。
代码:
String name = user.getProfile().getNickname();
System.out.println(name.toUpperCase());
请按以下步骤分析:
1. 列出所有可能为null的对象
2. 分析每个对象为null的条件
3. 给出每个条件的修复方案
4. 提供修复后的完整代码
📚 模式3:少样本(Few-shot) — 给2-3个示例
给AI看几个你期望的输出格式,它就会照着做。比纯文字描述更直观。
// ✅ Few-shot Prompt — 给AI看2个例子
请按以下格式将需求转换为API设计:
示例1:
需求:用户登录
输出:
POST /api/users/login
请求体:{ "username": "string", "password": "string" }
响应:{ "code": 200, "data": { "token": "string" } }
示例2:
需求:查询用户信息
输出:
GET /api/users/{id}
响应:{ "code": 200, "data": { "id": 1, "username": "string", "email": "string" } }
现在请转换:
需求:修改用户密码
AI的输出:
PUT /api/users/{id}/password
请求体:{ "old_password": "string", "new_password": "string" }
响应:{ "code": 200, "data": { "message": "密码修改成功" } }
错误响应:{ "code": 400, "message": "原密码错误" }
📋 模式4:结构化输出 — "请用JSON格式返回..."
当你需要AI的输出作为程序输入时,要求结构化格式。
// ✅ 结构化输出Prompt
分析以下代码中的潜在问题,请用JSON格式返回,包含:
- severity: "high" | "medium" | "low"
- type: 问题类型
- line: 行号
- description: 问题描述
- suggestion: 修复建议
代码:
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.getById(id);
}
@DeleteMapping("/{id}")
public String deleteUser(@PathVariable Long id) {
userService.deleteById(id);
return "deleted";
}
}
AI的输出:
[
{
"severity": "high",
"type": "安全-越权风险",
"line": 12,
"description": "删除用户接口无权限校验,任何人可删除任意用户",
"suggestion": "添加@PreAuthorize或手动校验当前用户权限"
},
{
"severity": "high",
"type": "安全-敏感信息泄露",
"line": 8,
"description": "getUser直接返回User实体,可能包含密码等敏感字段",
"suggestion": "使用UserVO/DTO替代,过滤敏感字段"
},
{
"severity": "medium",
"type": "规范-返回值不统一",
"line": 13,
"description": "deleteUser返回String而非统一Result格式",
"suggestion": "改为 return Result.success(\"删除成功\")"
}
]
📝 模式5:上下文填充 — "这是我们的项目结构...请基于此..."
给AI提供项目上下文,让它的回答贴合你的实际项目。
// ✅ 上下文填充Prompt
我们的项目使用:
- Spring Boot 3.2 + MyBatis-Plus
- MySQL 8.0 + Redis 7
- 项目结构:controller/service/mapper/entity/dto
- 统一返回格式:Result<T> { code, message, data }
- 认证方式:JWT + 拦截器
请基于以上项目结构,为"商品管理"模块编写完整的CRUD代码,
包含:GoodsController, GoodsService, GoodsMapper, Goods, GoodsDTO
4.3 开发者常用Prompt模板库
以下是6个开发者最常用的Prompt模板,直接复制改关键词就能用:
📝 模板1:写接口
你是一个{语言}后端开发专家,使用{框架}框架。
请为"{功能名}"编写完整的API接口代码。
要求:
- 遵循RESTful规范
- 包含参数校验(@Valid / @Validated)
- 使用统一返回格式 Result<T>
- 异常通过全局异常处理器捕获
- 添加Swagger注解
项目上下文:{项目结构/技术栈}
数据库表结构:{DDL}
🧪 模板2:写测试
请为以下{类名}编写单元测试,使用JUnit 5 + Mockito。
要求:
- 覆盖所有public方法
- 包含正常流程和异常流程
- Mock掉外部依赖(数据库、HTTP调用)
- 测试命名:methodName_scenario_expectedResult
- 断言要具体,不要只assertNotNull
被测试类:
{粘贴代码}
🔍 模板3:Code Review
你是一个资深Code Reviewer。请审查以下代码,重点关注:
1. 安全漏洞(SQL注入、XSS、越权等)
2. 性能问题(N+1查询、内存泄漏等)
3. 代码规范(命名、异常处理、日志等)
4. 业务逻辑错误
请按严重程度排序,格式:
【严重程度】问题类型 | 行号 | 描述 | 修复建议
代码:
{粘贴代码}
🐛 模板4:Debug
以下代码出现了{错误现象},请帮我排查。
错误信息:
{完整报错堆栈}
相关代码:
{粘贴代码}
环境信息:
- {语言/框架版本}
- {数据库/中间件版本}
请一步步分析可能的原因,给出最可能的原因和修复方案。
⚡ 模板5:SQL优化
你是一个资深DBA。请优化以下SQL:
SQL:{SQL语句}
表结构:{DDL}
数据量:{大概行数}
当前执行时间:{当前耗时}
请输出:
1. EXPLAIN分析(当前执行计划)
2. 性能瓶颈
3. 优化后的SQL
4. 建议添加的索引
5. 预估优化效果
📖 模板6:文档生成
请为以下代码生成API文档,格式为Markdown。
要求:
- 包含接口说明、请求方式、URL
- 请求参数表格(字段名、类型、必填、说明)
- 响应示例(成功+失败)
- 错误码说明
代码:
{粘贴Controller代码}
P5
AI辅助编码实战 — 一天的工作流
跟着小王,看AI如何融入他每天的5个环节
说了这么多概念,AI到底怎么用在日常开发中?我们跟着小王走完他的一天——从早到晚,5个环节,每个环节都让AI参与。
📅 小王的AI辅助工作流
09:00
📝 理解需求
粘贴PRD→AI分析→生成技术方案
10:00
💻 写代码
AI Agent模式→自动创建文件→写CRUD
13:30
🧪 写测试
AI自动生成→单元测试+Mock数据
15:00
🔍 Code Review
粘贴代码→AI审查→发现潜在问题
17:00
📖 写文档
AI自动生成→API文档+注释
5.1 早上9:00 — 用AI理解需求
产品经理发来PRD(需求文档),以前小王要自己啃半天,现在他直接丢给AI,让AI帮他分析需求、拆解技术方案。
王
小王
分析一下这个PRD,拆解成技术方案:
【商品收藏功能】
1. 用户可以收藏/取消收藏商品
2. 收藏列表支持分页查询,按收藏时间倒序
3. 商品详情页显示"已收藏"状态
4. 收藏数限制:每个用户最多收藏200个商品
5. 需要记录收藏时间
AI
Cursor AI
📋 需求拆解 & 技术方案
一、数据库设计
新建 user_favorite 表:
id, user_id, goods_id, create_time
联合唯一索引:uk_user_goods(user_id, goods_id)(防止重复收藏)
二、API设计
1. POST /api/favorites/{goodsId} — 收藏商品
2. DELETE /api/favorites/{goodsId} — 取消收藏
3. GET /api/favorites?page=1&size=20 — 收藏列表(分页)
4. GET /api/favorites/check/{goodsId} — 检查是否已收藏
5. GET /api/favorites/count — 收藏数量
三、关键逻辑
• 收藏限制:收藏前检查 count < 200
• 幂等性:用 INSERT IGNORE 或 ON DUPLICATE KEY
• 商品详情页:批量查询是否收藏(避免N+1)
• 缓存策略:用户收藏数用Redis缓存,加速计数
四、影响范围
• 新增:UserFavorite实体、FavoriteController、FavoriteService
• 修改:GoodsDetailVO(加isFavorited字段)、GoodsService
5.2 上午10:00 — 用AI写代码
有了技术方案,小王用Cursor的Agent模式让AI自动创建文件、写代码。他只需要审批AI的每一步操作。
王
小王
基于刚才的技术方案,帮我实现商品收藏功能的完整代码。项目用Spring Boot 3.2 + MyBatis-Plus + MySQL + Redis。
AI
Cursor Agent
📋 规划7个文件:
1. schema.sql — 建表语句
2. UserFavorite.java — 实体类
3. UserFavoriteMapper.java — Mapper
4. FavoriteService.java — 业务逻辑
5. FavoriteController.java — API接口
6. FavoriteDTO.java — 请求/响应DTO
7. Redis配置 — 缓存收藏数
⏳ 开始创建...
✅ 1/7 已创建 schema.sql
✅ 2/7 已创建 UserFavorite.java
✅ 3/7 已创建 UserFavoriteMapper.java
✅ 4/7 已创建 FavoriteService.java
✅ 5/7 已创建 FavoriteController.java
✅ 6/7 已创建 FavoriteDTO.java
✅ 7/7 已创建 RedisConfig更新
🎉 全部完成!
AI生成的核心代码——FavoriteService:
@Service
@RequiredArgsConstructor
public class FavoriteService {
private final UserFavoriteMapper favoriteMapper;
private final StringRedisTemplate redisTemplate;
private static final int MAX_FAVORITES = 200;
private static final String COUNT_KEY = "user:fav:count:";
/** 收藏商品 */
public Result<String> addFavorite(Long userId, Long goodsId) {
// 检查收藏数量限制
Integer count = favoriteMapper.selectCount(
new QueryWrapper<UserFavorite>().eq("user_id", userId));
if (count >= MAX_FAVORITES) {
return Result.fail("收藏数量已达上限(200个)");
}
// 幂等:用INSERT IGNORE防止重复收藏
UserFavorite fav = new UserFavorite();
fav.setUserId(userId);
fav.setGoodsId(goodsId);
fav.setCreateTime(LocalDateTime.now());
int rows = favoriteMapper.insertIgnore(fav);
if (rows > 0) {
redisTemplate.opsForValue().increment(COUNT_KEY + userId);
}
return Result.success("收藏成功");
}
/** 取消收藏 */
public Result<String> removeFavorite(Long userId, Long goodsId) {
int rows = favoriteMapper.delete(
new QueryWrapper<UserFavorite>()
.eq("user_id", userId)
.eq("goods_id", goodsId));
if (rows > 0) {
redisTemplate.opsForValue().decrement(COUNT_KEY + userId);
}
return Result.success("取消收藏成功");
}
/** 收藏列表(分页) */
public Result<Page<FavoriteVO>> listFavorites(Long userId, int page, int size) {
Page<UserFavorite> p = favoriteMapper.selectPage(
new Page<>(page, size),
new QueryWrapper<UserFavorite>()
.eq("user_id", userId)
.orderByDesc("create_time"));
// ... 转换为VO返回
return Result.success(voPage);
}
}
5.3 中午13:30 — 用AI写测试
代码写完了,测试还没写。以前写测试是最烦的事——现在AI帮你写,你只需要审查。
王
小王
为FavoriteService写单元测试,用JUnit 5 + Mockito,覆盖正常流程和异常流程
AI
Cursor AI
已生成 FavoriteServiceTest.java,包含8个测试用例:
✅ addFavorite_正常收藏_返回成功
✅ addFavorite_超过200限制_返回失败
✅ addFavorite_重复收藏_幂等处理
✅ removeFavorite_正常取消_返回成功
✅ removeFavorite_取消不存在的收藏_返回成功
✅ listFavorites_正常分页查询
✅ listFavorites_空列表
✅ checkFavorite_已收藏返回true
✅ checkFavorite_未收藏返回false
AI生成的测试代码:
@ExtendWith(MockitoExtension.class)
class FavoriteServiceTest {
@Mock
private UserFavoriteMapper favoriteMapper;
@Mock
private StringRedisTemplate redisTemplate;
@InjectMocks
private FavoriteService favoriteService;
@Test
void addFavorite_超过限制_返回失败() {
// Given: 用户已有200个收藏
when(favoriteMapper.selectCount(any())).thenReturn(200);
// When
Result<String> result = favoriteService.addFavorite(1L, 999L);
// Then
assertEquals(400, result.getCode());
assertEquals("收藏数量已达上限(200个)", result.getMessage());
verify(favoriteMapper, never()).insertIgnore(any());
}
@Test
void addFavorite_正常收藏_返回成功() {
// Given
when(favoriteMapper.selectCount(any())).thenReturn(50);
when(favoriteMapper.insertIgnore(any())).thenReturn(1);
ValueOperations ops = mock(ValueOperations.class);
when(redisTemplate.opsForValue()).thenReturn(ops);
// When
Result<String> result = favoriteService.addFavorite(1L, 100L);
// Then
assertEquals(200, result.getCode());
verify(ops).increment("user:fav:count:1");
}
}
$ mvn test -Dtest=FavoriteServiceTest
[INFO] Running com.example.service.FavoriteServiceTest
[INFO] Tests run: 9, Failures: 0, Errors: 0, Skipped: 0
[INFO] Results:
[INFO] Tests run: 9
[INFO] Failures: 0
[INFO] Errors: 0
[INFO] Skipped: 0
[INFO] BUILD SUCCESS
5.4 下午15:00 — 用AI做Code Review
代码写完了,测试也通过了。但小王不放心——让AI帮他Review一下,看看有没有遗漏的问题。
Cursor Chat — AI Code Review
王
小王
Review一下 FavoriteService 的代码,看看有没有安全问题、性能问题或逻辑错误
AI
Cursor AI — Code Review
🔍 Code Review 结果:
🔴 严重 — 并发安全问题
addFavorite中"检查数量→插入"不是原子操作,并发场景下可能突破200限制。
修复:用Redis原子计数:
Long count = redisTemplate.opsForValue().increment(COUNT_KEY + userId);
在increment之前检查count是否超过200,超过则decrement回滚。
🟡 中等 — 缓存一致性
Redis收藏数和MySQL可能不一致(如Redis宕机、删除时未同步)。
修复:启动时从MySQL加载count到Redis,或在取消收藏时同步更新。
⚪ 建议 — 批量查询优化
商品详情页需要批量查询"是否收藏",建议增加批量接口:
POST /api/favorites/batch-check body: [goodsId1, goodsId2, ...]
避免前端逐个调用check接口造成N+1问题。
5.5 傍晚17:00 — 用AI写文档
快下班了,小王需要写API文档。以前写文档最烦了,现在AI根据代码自动生成。
王
小王
为FavoriteController生成Markdown格式的API文档
AI
Cursor AI
📖 已生成API文档:
## 商品收藏 API
### 1. 收藏商品
**POST** `/api/favorites/{goodsId}`
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| goodsId | Long | 是 | 商品ID(路径参数) |
**响应示例:**
```json
{ "code": 200, "message": "success", "data": "收藏成功" }
```
**错误码:**
- 400: 收藏数量已达上限
- 401: 未登录
- 409: 已收藏过该商品
### 2. 取消收藏
**DELETE** `/api/favorites/{goodsId}`
... (共5个接口的完整文档)
一天总结:小王以前一天最多完成2个功能,现在借助AI能完成4-5个。关键是——他不需要每行代码都自己敲了,AI写初稿,他审批和调整。代码质量还有AI帮他Review,比纯手动还靠谱。
P6
AI辅助Debug & 排查 — 让AI帮你找Bug
从"线上告警"到"问题定位",AI全程陪跑
6.1 场景1:粘贴报错日志→AI定位OOM问题
线上突然OOM了,日志一大堆看不懂。小王直接把报错日志贴给AI——
王
小王
线上OOM了,帮我分析一下,这是JVM报错日志:
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3210)
at java.util.Arrays.copyOf(Arrays.java:3181)
at java.util.ArrayList.grow(ArrayList.java:265)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239)
at java.util.ArrayList.add(ArrayList.java:467)
at com.example.service.OrderService.exportOrders(OrderService.java:87)
at com.example.controller.OrderController.export(OrderController.java:42)
AI
Cursor AI — Debug分析
🔍 OOM根因分析
问题定位:OrderService.exportOrders() 第87行
ArrayList不断add导致OOM,说明一次性加载了太多数据到内存。
根因:导出订单时,直接查询全表数据到List:
List<Order> all = orderMapper.selectList(null); // 全量加载!
修复方案(3选1):
1️⃣ 分页查询 + 流式写入(推荐,改动最小)
每次查1000条,写入Excel后清空List,继续查下一批。
2️⃣ 游标查询(Cursor)
MyBatis的Cursor模式,逐条读取不占用堆内存。
3️⃣ 异步导出 + 下载链接
大数据量走异步任务,生成后发下载链接。
方案1的具体代码:
public void exportOrders(HttpServletResponse response) {
int pageSize = 1000;
int pageNum = 1;
List<Order> batch;
// 创建Excel写入器
ExcelWriter writer = EasyExcel.write(response.getOutputStream()).build();
WriteSheet sheet = new WriteSheet();
do {
// 分页查询,每次只加载1000条
Page<Order> page = orderMapper.selectPage(
new Page<>(pageNum, pageSize),
new QueryWrapper<>().orderByAsc("id"));
batch = page.getRecords();
// 写入当前批次
writer.write(batch, sheet);
pageNum++;
} while (batch.size() == pageSize);
writer.finish();
}
6.2 场景2:粘贴慢SQL→AI分析执行计划
王
小王
这条SQL跑了8秒,帮我优化:
SELECT o.id, o.order_no, o.amount, u.username, p.product_name
FROM orders o
LEFT JOIN user u ON o.user_id = u.id
LEFT JOIN order_item oi ON o.id = oi.order_id
LEFT JOIN product p ON oi.product_id = p.id
WHERE o.status = 'PAID'
AND o.create_time BETWEEN '2024-01-01' AND '2024-06-30'
ORDER BY o.create_time DESC
LIMIT 20
表数据量:orders 500万, user 50万, order_item 1500万, product 10万
AI
Cursor AI — SQL优化
🔍 慢SQL分析
问题1:4表JOIN + ORDER BY + LIMIT = 大量临时表排序
问题2:orders表缺少(status, create_time)复合索引
问题3:LEFT JOIN可能产生笛卡尔积(1个order对应多个item)
优化步骤:
Step 1:添加复合索引
ALTER TABLE orders ADD INDEX idx_status_create(status, create_time);
→ WHERE条件和ORDER BY都能命中索引
Step 2:改写SQL — 延迟JOIN
先通过索引查到20条order的id,再JOIN其他表:
SELECT o.id, o.order_no, o.amount, u.username, p.product_name
FROM (
SELECT id, order_no, amount, user_id, create_time
FROM orders
WHERE status = 'PAID'
AND create_time BETWEEN '2024-01-01' AND '2024-06-30'
ORDER BY create_time DESC
LIMIT 20
) o
LEFT JOIN user u ON o.user_id = u.id
LEFT JOIN order_item oi ON o.id = oi.order_id
LEFT JOIN product p ON oi.product_id = p.id
预估效果:8秒 → 0.05秒(约160倍提升)
6.3 场景3:用MCP连接数据库→AI直接查数据排查
用户反馈"下单失败",小王通过MCP让AI直接查数据库,而不是自己写SQL。
王
小王
用户ID=12345反馈下单失败,帮我排查:1. 用户状态是否正常 2. 购物车里有没有商品 3. 最近的订单有没有异常
AI
Cursor (MCP查询)
通过MCP直连数据库,执行3条查询:
📋 查询1:用户状态
SELECT id,username,status,vip_level,created_at FROM user WHERE id=12345;
✅ 结果:用户状态正常,VIP用户
📋 查询2:购物车
SELECT * FROM cart WHERE user_id=12345;
❌ 结果:购物车为空!用户购物车里没有商品。
📋 查询3:最近订单
SELECT id,status,amount,created_at FROM orders WHERE user_id=12345 ORDER BY created_at DESC LIMIT 5;
✅ 结果:最近5笔订单都是"COMPLETED"状态,无异常
🎯 结论:用户状态正常,但购物车为空。可能是:
1. 前端没有成功加入购物车(接口bug)
2. 用户直接点"立即购买"而不是"加入购物车"
3. 购物车数据被清理了
建议:查看用户最近的行为日志,确认是前端问题还是数据问题。
6.4 场景4:前端白屏→AI分析错误栈
前端同事说页面白屏了,发来一段浏览器控制台的报错。小王把报错丢给AI——
王
小王
前端白屏了,控制台报错:
TypeError: Cannot read properties of undefined (reading 'map')
at GoodsList (GoodsList.vue:28)
at renderComponentRoot (runtime-core.esm-bundler.js:907)
at ReactiveEffect.run (reactivity.esm-bundler.js:177)
AI
Cursor AI
🔍 前端白屏分析
根因:GoodsList.vue第28行,对undefined调用了.map()
→ 说明接口返回的数据结构不是你期望的数组。
最可能的原因:
接口返回了 {code:200, data:{list:[]}} 而不是直接的数组,
你写了 goodsList.map(...) 但实际应该是 goodsList.data.list.map(...)
修复方案:
1️⃣ 修复数据解构(最常见):
// 修改前
const goodsList = ref([]) // 初始值为空数组
// 接口返回后赋值
goodsList.value = res.data // ❌ res.data 是 {list:[]},不是数组
// 修改后
goodsList.value = res.data.list || [] // ✅ 取内层数组,加默认值
2️⃣ 加防御性检查(更安全):
<div v-for="item in (goodsList || [])" :key="item.id">
完整排查流程总结:线上告警/用户反馈 → 把错误信息贴给AI → AI分析根因 → 给出修复方案 → 你确认后执行。关键是:你不需要自己分析堆栈、查文档,AI已经帮你做了最耗时的那步。
P7
RAG & 知识库 — 让AI开卷考试
纯靠训练数据=闭卷考试,加上RAG=开卷考试
7.1 闭卷考试 vs 开卷考试
❌ 闭卷考试(纯靠训练数据)
你问AI:"我们公司的代码规范是什么?"
AI:不知道,我的训练数据里没有你们公司的内部文档。
你问AI:"这个接口的业务逻辑是什么?"
AI:不知道,我只能猜。
就像闭卷考试——只能凭记忆答题,没看过的内容就不会
✅ 开卷考试(RAG)
你问AI:"我们公司的代码规范是什么?"
AI:先查知识库→找到规范文档→基于文档回答。
你问AI:"这个接口的业务逻辑是什么?"
AI:查知识库→找到设计文档→准确回答。
就像开卷考试——先翻书找到相关内容,再组织答案
7.2 RAG完整流程
📚 RAG流程:用户提问→文档检索→拼接上下文→AI回答
→
→
📋 拼接上下文
把找到的文档
作为上下文拼入Prompt
→
具体过程:
1. 用户提问:"我们公司的Java代码规范是什么?"
2. 系统把问题转成向量(一组数字),在向量数据库中搜索最相似的文档
3. 找到3段相关文档(如:代码规范.md的3个片段)
4. 把这3段文档拼进Prompt:"以下是参考资料:[文档1][文档2][文档3],请基于以上资料回答:我们公司的Java代码规范是什么?"
5. AI基于这些真实文档回答,而不是凭记忆瞎编
7.3 向量数据库基础:什么是Embedding?
你可能会问:"什么叫把文字变成向量?为什么需要向量搜索?"
🔢 Embedding:把文字变成数字
问题:怎么让电脑理解"代码规范"和"编码标准"是一个意思?
答案:把它们都变成数字(向量),让数学来衡量相似度。
Embedding过程:
"代码规范" → [0.82, 0.15, 0.91, 0.33, ...] // 768个浮点数
"编码标准" → [0.79, 0.18, 0.88, 0.35, ...] // 很接近!
"红烧肉做法" → [0.12, 0.95, 0.08, 0.77, ...] // 完全不同
向量搜索:计算向量之间的"距离"(余弦相似度),距离越近=越相关。
所以当你问"代码规范"时,系统能找到"编码标准"相关的文档——即使关键词不完全匹配。
| 向量数据库 | 特点 | 适用场景 | 开源/商业 |
| Chroma | 轻量,Python友好 | 个人项目、原型验证 | 开源 |
| Milvus | 高性能,分布式 | 企业级大规模检索 | 开源 |
| Pinecone | 全托管,免运维 | 不想自己部署 | 商业 |
| Weaviate | 支持混合搜索 | 需要关键词+语义搜索 | 开源 |
| Qdrant | Rust实现,高性能 | 对性能要求高 | 开源 |
7.4 实战:用RAG让AI理解你公司的代码规范
文档切分是RAG的关键一步。切太粗→检索不精准,切太细→丢失上下文。
✂️ 文档切分策略对比
按固定长度切
每500 Token切一段
❌ 可能把一句话切成两半
❌ 上下文断裂
按段落切
每个段落/标题切一段
✅ 保持语义完整
⚠️ 段落长度不均匀
按语义切(推荐)
AI理解语义后智能切分
✅ 语义完整
✅ 大小均匀
新人小李入职了,他需要快速了解项目。以前要花一周看文档、问同事,现在他通过RAG知识库,问AI就能得到准确的答案。
李
新人小李
我们项目的用户认证是怎么实现的?JWT的密钥配置在哪里?
AI
知识库助手 (RAG)
📖 根据项目文档检索到以下相关内容:
用户认证方案(来源:docs/auth-design.md):
本项目采用JWT + Redis的认证方案:
1. 用户登录→后端验证密码→生成JWT Token
2. Token存入Redis(key: token:{userId}, TTL: 2h)
3. 请求拦截器校验Token→从Redis检查是否有效
JWT密钥配置(来源:docs/deploy-guide.md):
密钥配置在 application-prod.yml 中:
jwt.secret: ${JWT_SECRET}
实际值通过环境变量注入,不在代码仓库中明文存储。
相关代码(来源:src/util/JwtUtil.java):
密钥在JwtUtil.java的第23行通过@Value注入。
RAG的威力:没有RAG时,AI只能告诉你"JWT一般怎么做"(通用知识)。有了RAG,AI能告诉你"我们项目的JWT具体怎么做"(公司专属知识)。这就是"开卷考试"的力量。
P8
AI + DevOps — 智能运维
AI不只是写代码,还能帮你运维
8.1 AI辅助CI/CD:自动生成Pipeline配置
写Jenkinsfile或GitHub Actions配置文件很繁琐,让AI来生成:
王
小王
帮我生成一个GitHub Actions配置,要求:1. Java 17 + Maven 2. 跑测试+打包 3. 构建Docker镜像 4. 推到阿里云ACR 5. SSH部署到服务器
AI
Cursor AI
已生成 .github/workflows/deploy.yml ✅
包含5个步骤:checkout → JDK setup → Maven test&build → Docker build&push → SSH deploy
🔑 注意:请将敏感信息(ACR密码、SSH密钥)配置到GitHub Secrets中:
- ACR_USERNAME / ACR_PASSWORD
- DEPLOY_HOST / DEPLOY_USER / DEPLOY_KEY
AI生成的GitHub Actions配置:
name: Deploy to Production
on:
push:
branches: [main]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Maven Test & Package
run: mvn clean package -DskipTests=false
- name: Build & Push Docker Image
run: |
docker build -t registry.cn-hangzhou.aliyuncs.com/myapp/user-admin:${{ github.sha }} .
docker login registry.cn-hangzhou.aliyuncs.com -u ${{ secrets.ACR_USERNAME }} -p ${{ secrets.ACR_PASSWORD }}
docker push registry.cn-hangzhou.aliyuncs.com/myapp/user-admin:${{ github.sha }}
- name: Deploy via SSH
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.DEPLOY_HOST }}
username: ${{ secrets.DEPLOY_USER }}
key: ${{ secrets.DEPLOY_KEY }}
script: |
docker pull registry.cn-hangzhou.aliyuncs.com/myapp/user-admin:${{ github.sha }}
docker stop user-admin && docker rm user-admin
docker run -d --name user-admin -p 8080:8080 registry.cn-hangzhou.aliyuncs.com/myapp/user-admin:${{ github.sha }}
8.2 AI辅助监控:分析指标趋势→预测问题
小王在Grafana上配置了监控面板,现在他想让AI帮他分析监控数据趋势,提前发现隐患。
数据库连接数
158/200
↑ 35% vs 昨日
API P99延迟
1.2s
↑ 300% vs 昨日
🤖 AI分析建议
⚠️ 潜在风险:数据库连接数持续上升(158/200,79%),P99延迟同步升高(300%增幅),
预计2小时内连接池将耗尽,导致服务不可用。
建议立即:
1. 检查是否有慢SQL占用连接(SHOW PROCESSLIST)
2. 考虑临时调大连接池上限(200→300)
3. 排查P99延迟最高的接口
8.3 凌晨2点告警:AI帮你初步定位
凌晨2点,手机收到告警。以前小王要爬起来开电脑,一个个查日志、查数据库。现在AI先帮他做了初步分析,他只需要确认和决策。
🚨 告警:API错误率超过阈值
服务:user-admin-prod
指标:5xx错误率 12.3%(阈值 5%)
时间:02:13:47
影响:约3200个请求失败
🤖 AI初步分析
1. 错误集中在 POST /api/orders 接口
2. 错误信息:Connection refused: connect
3. 时间关联:02:10开始,数据库主从切换
4. 根因推测:数据库主从切换期间,连接池未刷新导致连接断开
5. 建议操作:重启应用以重建连接池(预计恢复时间:30秒)
AI辅助DevOps的价值:不是替代运维人员,而是把"从告警到定位"的时间从30分钟缩短到30秒。人做决策,AI做分析。凌晨2点你只需要看一眼手机,确认"重启"就行。
P9
AI工作流 & 自动化 — 让AI替你干活
定义好步骤,AI按流程自动执行——你只需要看结果
9.1 Workflow模式:定义步骤→AI按步骤执行
Workflow和Agent的区别:Workflow的步骤是你预定义的,Agent的步骤是AI自己规划的。
🔄 Workflow vs Agent
📋 Workflow(流程化)
步骤是固定的,每次执行都一样:
1. 扫描Git日志
2. 汇总变更内容
3. 生成日报
4. 发送到企微
类比:流水线——每一步都固定
🤖 Agent(自主化)
步骤是动态的,AI自己决定:
1. 收到"排查502"任务
2. AI自己决定先看Nginx日志
3. 发现问题在数据库
4. AI决定查MySQL
类比:实习生——根据情况灵活调整
9.2 三大自动化场景
📊 场景1:每日自动生成技术日报
每天下班后自动扫描Git commit,汇总今天的技术变更,发到企微群。
AI生成的日报效果:
📋 今日技术日报 — 2024-06-12
🆕 新功能(3项)
• 商品收藏功能(小王) — 7个文件,+420行
• 导出优化-分页写入(小王) — 2个文件,+35行
• 用户注册增加邮箱验证(小李) — 4个文件,+180行
🐛 Bug修复(2项)
• 修复订单列表N+1查询(小王) — 3个文件
• 修复登录Token过期未跳转(小李) — 1个文件
⚡ 性能优化(1项)
• orders表添加复合索引(小王) — 查询时间从8s→0.03s
🔍 场景2:PR自动Review Bot
每次提PR,AI自动Review,在评论区给出建议。
GitHub — AI Review Bot 自动评论
🤖 AI Code Review
🔴 严重 — FavoriteService.java:23
addFavorite中"检查数量→插入"非原子操作,并发下可能突破200限制。
建议用Redis原子操作替代。
🟡 中等 — FavoriteController.java:18
GET /favorites/check/{goodsId} 缺少用户身份参数,可能被遍历。
建议从JWT Token中获取userId,不要从参数传入。
⚪ 建议 — FavoriteService.java:45
listFavorites方法建议加缓存,减少数据库查询。
总体评价:代码逻辑清晰,命名规范。主要问题是并发安全,建议修复后再合并。
🔍 场景3:定时巡检 — 数据库慢查询自动分析
每天凌晨自动扫描慢查询日志,AI分析后发通知。
🔍 每日慢查询巡检报告
🚨 新增慢SQL(2条)
1. SELECT * FROM orders WHERE status='PENDING' — 耗时 5.2s
💡 建议:添加 idx_status 索引
2. SELECT * FROM user WHERE email LIKE '%@gmail.com' — 耗时 3.8s
💡 建议:前导%无法用索引,考虑全文索引或ES
✅ 已优化的慢SQL(1条)
SELECT * FROM goods WHERE name LIKE '手机%' — 从 2.1s 降至 0.02s ✅
9.3 Cron/Schedule:让AI定时执行任务
自动化任务需要一个触发器——Cron表达式就是定时器的"闹钟设置":
| Cron表达式 | 含义 | 场景 |
0 18 * * * | 每天18:00 | 技术日报 |
0 2 * * * | 每天凌晨2点 | 慢查询巡检 |
0 9 * * 1 | 每周一9:00 | 技术债务周报 |
*/30 * * * * | 每30分钟 | 服务健康检查 |
0 0 1 * * | 每月1号0:00 | 月度报告 |
小王设置了一个自动化:每周一早上9点,AI自动汇总上周的技术债务,发送到团队群。
{
"name": "每周技术债务汇总",
"schedule": "0 9 * * 1",
"steps": [
{
"action": "git_log",
"params": { "since": "7 days ago", "repo": "user-admin" }
},
{
"action": "scan_todos",
"params": { "patterns": ["TODO", "FIXME", "HACK"] }
},
{
"action": "ai_analyze",
"params": { "prompt": "汇总技术债务,按优先级排序" }
},
{
"action": "notify",
"params": { "channel": "wechat_work", "group": "tech-team" }
}
]
}
P10
注意事项 & 最佳实践
AI不是万能的——知道它的局限,才能用好它
10.1 AI幻觉:AI会编造不存在的东西
⚠️ 最重要的注意事项:AI有时候会一本正经地胡说八道——编造不存在的API、库、方法,而且说得跟真的一样。这就是"AI幻觉"(Hallucination)。
❌ AI编造的代码
// AI说:"用Redis的getAndIncrement方法"
Long count = redisTemplate
.opsForValue()
.getAndIncrement(key);
❌ 这个方法不存在!
StringRedisTemplate没有getAndIncrement
✅ 正确的代码
// 正确用法:increment返回增长后的值
Long count = redisTemplate
.opsForValue()
.increment(key);
✅ increment是真实存在的方法
如何避免AI幻觉的坑?
🛡️ 防幻觉清单
1. 验证API/方法是否存在:AI给的API,去官方文档查一下是否真实存在。特别是不熟悉的库。
2. 验证版本兼容性:AI可能给的是旧版本API。比如Spring Boot 3.x和2.x的API差异很大。
3. 运行测试:代码能编译通过≠逻辑正确。跑一下测试用例。
4. 看官方文档:AI给的配置建议,对照官方文档确认。
5. 不要100%信任:把AI当成一个"很厉害但不完全靠谱的同事"——它的输出一定要你审核。
10.2 安全性:不要把密钥传给AI
🚨 绝对不要做的事:不要把API Key、数据库密码、JWT密钥等敏感信息直接写在Prompt里。你的对话可能被存储、用于训练,或通过日志泄露。
❌ 危险做法
帮我看看这个配置文件有没有问题:
spring:
datasource:
password: MyP@ssw0rd123
redis:
password: redis_pass_456
jwt:
secret: my-super-secret-key
✅ 安全做法
帮我看看这个配置文件有没有问题:
spring:
datasource:
password: ${DB_PASSWORD}
redis:
password: ${REDIS_PASSWORD}
jwt:
secret: ${JWT_SECRET}
10.3 何时用AI / 何时不该用
⚖️ AI擅长 vs 不擅长
✅ AI擅长
• 写CRUD代码(重复性工作)
• 生成测试用例
• Code Review找常见问题
• 分析报错日志/堆栈
• SQL优化建议
• 写文档/注释
• 生成配置文件
• 翻译/重构代码
• 解释复杂代码逻辑
❌ AI不擅长
• 复杂业务逻辑设计(需要领域知识)
• 性能关键路径的优化(需要profiling)
• 安全敏感的代码(加密/认证)
• 跨系统架构设计
• 创新性算法设计
• 处理边缘case
• 理解公司特定业务规则
• 数据库迁移方案
• 需要深度调试的问题
🪟 Context Window:你的"办公桌"大小有限
类比:Context Window就像你的办公桌——桌面上能放的材料是有限的。如果桌面上堆了太多不相关的东西,你就找不到需要的那份文件了。
实际影响:如果对话太长,AI会"忘记"之前说的内容。所以:
• 不要在一个对话里做太多事——新任务开新对话
• 关键信息放在Prompt前面,别让AI翻半天
• 用@file引用具体文件,不要把整个项目贴给AI
• 大文件只贴相关部分,不要全贴
💰 成本控制:Token消耗估算
AI不是免费的——每条消息都消耗Token。了解Token消耗,才能控制成本。
| 操作 | 预估Token消耗 | 费用估算(GPT-4o) | 省钱建议 |
| 简单问答 | ~500 Token | ~$0.004 | — |
| 代码补全(Tab) | ~200 Token | ~$0.002 | — |
| 代码生成(Chat) | ~2000 Token | ~$0.015 | 描述精确,减少来回 |
| Agent模式(完整功能) | ~10000 Token | ~$0.08 | 任务拆小,分步执行 |
| 全项目分析 | ~50000+ Token | ~$0.4+ | 只分析变更部分 |
省钱策略:1. 简单任务用便宜模型(GPT-4o-mini/Claude Haiku),复杂任务才用强模型。2. Agent模式最贵,但效率最高——别为了省钱用Tab模式做Agent该做的事。3. 代码补全用Cursor的Tab就够了,不用每次都开Chat。
10.4 未来趋势:从辅助到自主
🚀 AI编程的进化方向
人机协作的新模式:
• AI不会替代程序员——它会替代"机械性"的编码工作
• 未来的开发者更像"架构师+审查者":你定方向、审方案,AI负责执行
• 核心竞争力变化:从"会写代码"变成"会描述需求"+"会审查质量"
• 就像从"手动挡"到"自动驾驶"——你还是要坐在驾驶位上,但不用一直握方向盘了
📝 本教程核心要点总结
1. AI编程助手 = 自动挡,不是替代你,是让你更专注于"做什么"而不是"怎么做"
2. MCP = USB-C接口,统一了AI应用连接工具的方式,一次配置到处使用
3. Skill = 手机App,给AI安装新能力,按需即插即用
4. Agent = 实习生,你给目标,它自己规划步骤并执行
5. Prompt = 任务说明,说清楚需求,AI才能给出好结果
6. RAG = 开卷考试,让AI基于你的真实文档回答,不再瞎编
7. Context Window = 办公桌,空间有限,别堆太多不相关的东西
8. AI幻觉是最大的坑——永远验证AI给出的代码和API
9. 安全第一——绝对不要把密钥传给AI
10. 未来是"人机协作"——你做决策,AI执行
AI辅助开发工作流 — 从手动挡到自动驾驶
全栈开发教程系列 · 2024