Tutorial · 教程 walkthrough

AI辅助开发工作流

从手动挡到自动驾驶 — 一份写给全栈开发者的AI编程完全指南。你不需要懂MCP、Agent、RAG,跟着小王一起看就够了。

📖 10章完全教程 🎯 30+可视化图表 💻 完整代码示例 🚀 从零到生产级
P1

AI编程工具全景 — 从手动挡到自动驾驶

先搞清楚:AI编程助手到底是什么?怎么选?

你有没有这种感觉:每次写代码,就像开手动挡的车——踩离合、挂挡、踩油门,一步不能错。写个CRUD接口要敲几百行,查个Bug要翻半天日志。2024年开始,一切变了:AI编程助手就像自动挡,你只需要说"我要去哪",它帮你换挡踩油门。

1.1 开发工具进化史

让我们先回顾一下开发工具的进化历程。每一步进化,都让开发者少做一件"机械性"的事:

🛠️ 开发工具进化时间线
📝 记事本
1990s
💡 IDE
2000s
✨ 智能补全
2010s
🤖 AI编程助手
2023+
🚀 AI Agent
2025+
📝 记事本时代:纯手工敲字,没有语法高亮,连括号配对都要自己数
💡 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干活
Cursor — 三种模式对比
⌨️ 补全模式 (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模式,看看会发生什么。
Cursor — Agent Mode
🤖 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秒

生成的项目结构如下:

user-admin 项目结构
📁 user-admin
📁 src/main/java/com/example
📁 config
📄 SwaggerConfig.java
📄 GlobalExceptionHandler.java
📁 controller
📄 UserController.java
📁 service
📄 UserService.java
📁 mapper
📄 UserMapper.java
📁 entity
📄 User.java
📁 dto
📄 RegisterDTO.java
📄 LoginDTO.java
📁 util
📄 JwtUtil.java
📁 interceptor
📄 AuthInterceptor.java
📁 src/main/resources
📄 application.yml
📄 schema.sql
📄 pom.xml
// 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);
  }
}

验证一下项目能否启动:

Terminal — 验证项目启动
$ 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作为子进程启动
SSEServer-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搜索
文档检索
💬
通讯
Slack/企微
发送消息
读取频道
2.4 实际配置:在Cursor中添加MCP Server

配置MCP Server非常简单,只需要编辑一个JSON配置文件:

~/.cursor/mcp.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能直接操作数据库。
Cursor Chat — MCP数据库查询
🤖 Cursor Chat · MCP: mysql 已连接
小王
查一下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-01823
2024-021,024
2024-031,356
2024-041,587
2024-052,103
2024-065,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自动完成整个流程。
Skill: 数据库排查 — 自动分析慢SQL
🤖 数据库排查 Skill · 正在执行
小王
帮我排查一下线上慢SQL,最近1小时的
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会自主决定先看什么、后看什么。
Agent: 502错误排查 — 自主决策
🤖 DevOps Agent · 自主排查中...
小王
线上502了,帮我排查原因
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: 角色设定模式
// ❌ 没有角色设定的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的输出对比:

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把思考过程展示出来,而不是直接给结论。这样输出的逻辑更可靠,也方便你检查。

Prompt: 思维链模式
// ✅ 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看几个你期望的输出格式,它就会照着做。比纯文字描述更直观。

Prompt: Few-shot模式
// ✅ 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: 结构化输出
// ✅ 结构化输出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: 上下文填充
// ✅ 上下文填充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帮他分析需求、拆解技术方案。
Cursor Chat — 需求分析
🤖 Cursor Chat
小王
分析一下这个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的每一步操作。
Cursor Agent — 自动创建收藏功能
🤖 Cursor Agent · 正在执行
小王
基于刚才的技术方案,帮我实现商品收藏功能的完整代码。项目用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帮你写,你只需要审查。
Cursor Chat — 自动生成测试
🤖 Cursor Chat
小王
为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"); } }
Terminal — 运行测试
$ 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
🤖 Cursor Chat
小王
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根据代码自动生成。
Cursor Chat — 自动生成API文档
🤖 Cursor Chat
小王
为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——
Cursor Chat — OOM排查
🤖 Cursor Chat · Debug模式
小王
线上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分析执行计划
Cursor Chat — 慢SQL分析
🤖 Cursor Chat · SQL优化
小王
这条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。
Cursor Chat + MCP — 数据排查
🤖 Cursor + MCP:mysql · 直连数据库
小王
用户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——
Cursor Chat — 前端白屏排查
🤖 Cursor Chat · 前端Debug
小王
前端白屏了,控制台报错: 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
🤖 AI回答
基于文档内容
生成准确回答
具体过程:
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支持混合搜索需要关键词+语义搜索开源
QdrantRust实现,高性能对性能要求高开源
7.4 实战:用RAG让AI理解你公司的代码规范

文档切分是RAG的关键一步。切太粗→检索不精准,切太细→丢失上下文。

✂️ 文档切分策略对比
按固定长度切
每500 Token切一段

❌ 可能把一句话切成两半
❌ 上下文断裂
按段落切
每个段落/标题切一段

✅ 保持语义完整
⚠️ 段落长度不均匀
按语义切(推荐)
AI理解语义后智能切分

✅ 语义完整
✅ 大小均匀
新人小李入职了,他需要快速了解项目。以前要花一周看文档、问同事,现在他通过RAG知识库,问AI就能得到准确的答案。
RAG知识库 — 新人入职问答
🤖 项目知识库助手 · RAG增强
新人小李
我们项目的用户认证是怎么实现的?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来生成:

Cursor Chat — 生成CI/CD配置
🤖 Cursor Chat
小王
帮我生成一个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帮他分析监控数据趋势,提前发现隐患。
AI监控分析面板
CPU使用率
67%
↑ 12% vs 昨日
数据库连接数
158/200
↑ 35% vs 昨日
API P99延迟
1.2s
↑ 300% vs 昨日
错误率
0.3%
→ 持平
🤖 AI分析建议
⚠️ 潜在风险:数据库连接数持续上升(158/200,79%),P99延迟同步升高(300%增幅),
预计2小时内连接池将耗尽,导致服务不可用。

建议立即:
1. 检查是否有慢SQL占用连接(SHOW PROCESSLIST
2. 考虑临时调大连接池上限(200→300)
3. 排查P99延迟最高的接口
8.3 凌晨2点告警:AI帮你初步定位
凌晨2点,手机收到告警。以前小王要爬起来开电脑,一个个查日志、查数据库。现在AI先帮他做了初步分析,他只需要确认和决策。
📱 手机 — 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,汇总今天的技术变更,发到企微群。

📊 自动技术日报Workflow
⏰ 定时触发
每天18:00
📝 扫描Git
获取今日commit
🤖 AI汇总
分类+摘要
💬 推送通知
发送到企微

AI生成的日报效果:

📱 企微群 — 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-review-bot
评论于 2 分钟前
🤖 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编造的代码
// 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编程的进化方向
2023
补全为主
Tab补全
2024
对话为主
Chat+Agent
2025
Agent为主
多步自主执行
2026+
协作为主
人机结对编程
人机协作的新模式:
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