背景:手动编码的效率瓶颈
业务迭代节奏越来越快,CRUD、DTO 转换、单元测试模板却像“固定节目”一样反复出现。统计某电商后台近三个月提交记录发现:
- 62% 新增代码属于样板接口
- 平均每个需求要手写 4.2 个 VO/DTO 互转类
- 联调阶段 30% 时间花在改字段名、改类型、改校验规则
这些重复劳动不会带来业务价值,却持续挤占思考架构与性能优化的黄金时间。
技术对比:传统生成工具 vs. AI 生成
| 维度 | Swagger Codegen | ChatGPT Easy Code |
|---|---|---|
| 输入 | 严格契约(OpenAPI) | 自然语言 Prompt |
| 灵活性 | 模板固定,改结构需改模板 | 即时调整描述即可 |
| 自定义注解 | 需编码扩展 | 一句话要求即可 |
| 异常处理 | 按模板生成,可能遗漏 | 可在 Prompt 中强调 |
| 学习成本 | 熟悉 DSL、插件配置 | 会写需求句子即可 |
结论:传统工具适合“契约先行”场景;AI 生成在需求模糊、接口多变的早期迭代中更省时间。
核心实现:五个高频场景的 Prompt 构造技巧
以下示例均基于 ChatGPT Easy Code 插件(VS Code 端),模型选用 gpt-3.5-turbo-16k,温度 0.2,保证输出稳定。
1. RESTful API 骨架
Prompt 模板:
用 Spring Boot 3 写一个完整 Controller,暴露 /api/v1/books 路径,支持分页查询、新增、修改、删除。 要求: - 返回统一包装类 Result<T> - 全局异常由 @RestControllerAdvice 处理 - 所有方法写 Swagger 注解 - 包含自增主键,字段:id、title、author、price生成代码片段(关键处已加注释):
@RestController @RequestMapping("/api/v1/books") @Tag(name = "Book") public class BookController { @GetMapping public Result<Page<BookVO>> list(@RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "10") int size){ // 分页参数安全校验 if(size>100) throw new BizException("size over limit"); return Result.ok(bookService.page(page, size)); } @PostMapping public Result<Long> create(@Valid @RequestBody BookDTO dto){ // 快速失败:价格不可为负 if(dto.getPrice()!=null && dto.getPrice().compareTo(BigDecimal.ZERO)<0){ throw new BizException("price invalid"); } return Result.ok(bookService.save(dto)); } }2. 数据清洗脚本
Prompt:
写一段 Python 代码,读取 input.csv,清洗手机号列,去掉空格、横杠,校验长度 11 位,非法行写入 error.csv,合法行写入 clean.csv。要求用 pandas,带进度条。生成代码:
import pandas as pd from tqdm import tqdm def clean_phone(phone:str)->str: if pd.isna(phone): return "" phone = str(phone).strip().replace("-","") return phone if len(phone)==11 and phone.isdigit() else None df = pd.read_csv("input.csv", dtype=str) tqdm.pandas() df["phone_clean"] = df["phone"].progress_apply(clean_phone) df_valid = df[df["phone_clean"].notna()] df_invalid = df[df["phone_clean"].isna()] df_valid.to_csv("clean.csv", index=False) df_invalid.to_csv("error.csv", index=False)3. 单元测试模板
Prompt:
为上述 BookController 生成 JUnit5 单元测试,用 @WebMvcTest,Mock service,覆盖正常与异常各一条。4. 并发限流注解
Prompt:
写一个自定义注解 @RateLimit,基于 Redis 令牌桶,支持 SpEL 动态 key,默认每秒 10 次,超出返回 429。5. 多线程批处理
Prompt:
Java 17 写一段多线程批处理:从数据库分页查询订单,每页 1000 条,用虚拟线程处理,全部完成后发送邮件通知。要求捕获异常并记录行号。Prompt 技巧小结:
- 先给“身份”:
你是一位资深 <语言> 开发 - 明确“输入/输出”格式与边界条件
- 要求“异常处理、日志、测试”三件套,减少幻觉
- 复杂逻辑拆成两步:先生成骨架,再发“补充校验”指令,避免上下文超限
生产考量:安全与性能
代码安全审查要点
- SQL 注入:生成代码若用原生 JDBC,务必要求“使用 PreparedStatement”
- 敏感日志:Prompt 中追加“禁止打印密码、token”
- XXE/反序列化:对于 XML/JSON 解析,主动声明“关闭外部实体”
- 依赖版本:让 AI 显式写出坐标,方便 SCA 工具扫描漏洞
性能基准测试方法
- 生成代码后,先用 JMH 或 pytest-benchmark 打桩
- 关注热点:循环里是否重复创建对象、数据库 N+1
- 连续跑 10 次取 P90,与手写版本对比,差异 >5% 即回退优化
- 压测后结合 async-profiler 火焰图,定位 AI 可能忽略的瓶颈
避坑指南:幻觉代码识别与修正
常见幻觉:
- 调用不存在 API:
StringUtils.isBlank(str)在 Commons Lang3 实际应为StringUtils - 版本漂移:Spring Boot 2 与 3 的包名差异
- 过度封装:AI 喜欢把简单查询再包一层 CompletableFuture,反而降低可读性
修正策略:
- 让 AI 先列“依赖坐标”,再写代码,减少张冠类
- 生成后立刻跑
mvn dependency:analyze,发现未声明引用 - 把幻觉案例沉淀到团队“黑名单 prompt”,后续统一追加“禁止出现 xxx”
版本控制策略:
- 生成的代码单独放
src/ai-generated,避免与手写文件混 diff - 提交消息加标签
[AI],回滚可快速定位 - MR 阶段必须人审:安全、性能、风格三关
开放问题:当 70% 代码由 AI 生成时,工程师的核心竞争力是什么?
AI 把“打字速度”变得廉价,但需求澄清、架构权衡、稳定性治理、业务抽象仍需人类掌舵。未来差异化可能体现在:
- 精准提问能力=需求分解+上下文压缩
- 生成后“二次验证”的系统性思维
- 把不可见的用户痛点翻译成可执行的技术方案
如果机器负责“写”,工程师就要更擅长“删”——删掉不必要的需求、代码、会议,留下真正创造价值的部分。
动手延伸:把 AI 能力再往前推一步
看完上述技巧,若想系统体验“让 AI 不光写代码,还能实时开口说话”,可以尝试从0打造个人豆包实时通话AI动手实验。实验把 ASR、LLM、TTS 串成一条低延迟语音通道,30 分钟就能在网页端跑通“Hello World”级语音对话。对于想研究实时交互或打算做语音助手的开发者,是不错的练手素材。