如何让Copilot成为你的外置大脑(一)

乐云一
  • 笔记
  • note
About 3279 wordsAbout 11 min

如何让Copilot成为你的外置大脑(一)

用Copilot也有一段时间了。

从一开始的"哇好厉害"到后来的"这玩意是不是傻",再到现在的"嗯,还行吧",经历了一个完整的情感周期。

踩了无数坑之后,总结下来一个道理:别把Copilot当"代码生成器"用,而要把它打造成贴合自己工作习惯的"外置大脑"。

这篇文章分享三个解决Copilot使用过程中最头疼问题的核心解法。

Copilot的三个头疼问题

先说问题,再说解法。

1. 格式混乱

你让它写个接口,返回格式一会儿驼峰一会儿下划线,工具类用的跟你项目里已有的不一样。代码生成完了,还得花时间检查调整,有时候调整的时间比自己写还长。

2. 答非所问

让它写Java代码,结果接口返回格式跟团队统一封装不匹配,技术栈也对不上。又因为思考过程不透明,你都不知道它到底是怎么想的,白忙一场。

3. 逻辑断层

这个最崩溃。前一天让它帮你写了个列表组件,隔两天想让它加个搜索功能,结果因为窗口断层、上下文长度限制,它完全记不得之前写了什么,直接从零开始。你只好把之前的代码再贴一遍给它...

针对这三个问题,分别来说解法。

解法一:与Copilot做约定

现在不管接手哪个项目,我的第一步都是做这件事:在项目根目录新建 .github/copilot-instructions.md 文件。

这个文件的好处有三点:

  1. Copilot的所有窗口都会默认加载该文件,自动纳入上下文
  2. 你可以把希望Copilot做的、不希望它做的条例一一列出来,Copilot会优先遵循
  3. 从源头杜绝"垃圾"和"危险"代码

分享下我常用的约定:

# GitHub Copilot 工作约定

## 基本原则
1. 总是用中文回复我
2. 直接给我脚本而不是在聊天中开一个CMD窗口
3. 记录思考链路和审计文件到根目录{窗口标题-日期}-ai-thing.md
4. 注意文件、变量命名,请全部使用驼峰
5. 不要过度设计,先总是以最小改动进行任务计划设计
6. 修复bug原则:先提供解决方案,优先改核心逻辑,不要过多变更重构
7. 新功能/需求原则:先提供实现方案,没有提到优化,不要修改现有代码
8. 所有问题不要直接修改我的代码,请强制按照工作流程思考
9. 所有注释使用中文,按执行步骤说明。新建文件头部注释使用以下格式:
/**
 * 文件含义
 *
 * @author LeYunone
 * @version V1.0.0
 * Company XXX
 * @date 日期
 */

## 工作流程
1. 先理解需求,分析问题,禁止过度设计
2. 检查相关文件,收集上下文
3. 提出解决方案(最小改动原则)
4. 直接修改文件并验证
5. 如果遇到数据库表操作,请直接使用配置里的MCP配置,不用询问
6. 检查错误并修复

## 代码规避
1. 别用过时API和过时的第三方依赖/组件
2. 优先专注功能实现
3. 所有并发功能,请注意线程安全
4. 请不要出现没有使用到的常量/方法/文件

## 代码规范
- 使用驼峰命名法(camelCase)
- 常量使用大写+下划线(UPPER_SNAKE_CASE)
- 遵循阿里巴巴Java开发规范
- 注释要清晰完整
- 请参考项目中MpBaseDao基类搭建持久层

这个约定文件不是写一次就完了。随着项目的迭代和团队规范的调整,随时修改变更。Copilot每次响应时都会优先遵循这些约定。

除了个人约定,各部门/组内也可以根据项目情况,把Copilot工作规范维护在对应项目中,使之成为该项目使用Copilot的标准手册。

解法二:让提示词成为高效沟通的桥梁

Copilot的输出质量完全取决于你的指令精度。

摸爬滚打下来,总结了一个程序员专属的提示词公式:

[场景定位] + [技术栈约束] + [功能需求] + [输出规范] + [示例参考]

以"监控预警模块"为例,对比一下模糊提示词和精准提示词的差距。

模糊提示词

写一个监控预警模块,能接收指标上报,做可视化和预警通知

结果:AI生成的方案用了3张表存储不同指标,技术栈选了HTTP接口(项目实际用Netty),也没走预定的流转链路。完全不符合需求,等于白做。

精准提示词

[场景定位] 后端监控预警模块开发
[技术栈约束] Java8 + SpringBoot + MyBatis-Plus + Netty + 单表设计
[功能需求] 核心目标:接收客户端服务器指标上报,实现可视化图表、可配置预警规则、多渠道通知;
[关键约束] 高并发数据接收抗压、规则引擎判定预警执行效率、少表设计;

具体任务:
[收集客户端上报的指标数据]
1. 指标数据入库:接收Netty上报的CPU(type=3)、带宽(type=4)、内存(type=5)、磁盘(type=6)、应用运行状态指标,设计单表存储所有指标,字段兼容各指标上报的message结构;
2. 采用策略模式,参考GetClientMessageStrategy实现类
[服务端监控预警]
1. 表结构设计:
- 完善tbl_monitor_config(客户端监控配置):包含客户端id、描述、监控名称、条件判定类型(0=全部符合/1=其一符合)、预警接收方(邮箱/企微机器人);
- 完善tbl_monitor_alarm_condition(预警条件):包含配置id、指标类型(CPU/内存/带宽/磁盘)、比较符(>/>=/</<=/=)、阈值、预警信息模板;
2. 规则引擎完善,见已部分实现入口MonitorEnterService:补充AlarmExpressionHandler实现类...
[可视化图表]
1. 前端图表接口:为每个指标提供X-Y轴数据接口(X=时间戳,Y=指标值),支持前端ECharts渲染
[客户端监控配置]
1. 监控配置CRUD:实现客户端监控配置的新增/查询/修改/删除接口...

[输出规范]
1. 先提供表结构SQL(含索引设计);
2. 按"实体类→Mapper→Service→Controller"分层输出代码;
3. 所有命名用驼峰,遵循阿里巴巴Java开发规范;
4. 附思考链路和关键逻辑注释;
5. Service层需包含高并发处理策略

[示例参考]
1. 实体类参考项目中BaseEntity结构,Mapper继承MpBaseDao
2. 针对前端接口返回统一用Result封装(code/message/data)
3. 消息接收请采用NettyServer->GetClientMessageStrategy的链路

生成效果对比

精准提示词的生成结果:

  • 表结构:自动生成单表设计,并且优化了已有表的字段
  • 代码分层:严格按"实体类→Mapper→Service→Controller"输出,接口返回统一用Result封装
  • 规则引擎:按指标类型分别实现,还补充了阈值合法性校验(比如CPU使用率不能超过100)
  • 接口设计:支持按clientId、metricType、时间范围查询,直接满足ECharts渲染需求

三个核心技巧

  • 约束前置:把技术栈、性能要求等"不可协商"的条件放最前面,避免AI走偏
  • 任务拆解:将复杂需求拆分为编号明确的子任务,AI会逐一落地
  • 示例锚定:用项目中已有的代码结构(如BaseEntity、Result)作为参考,确保生成代码无缝融入现有项目

解法三:实时记录上下文锚点

续接开发时的逻辑断层,是使用Copilot最头疼的问题之一。

我的解决方案是**"实时记录上下文锚点"**,让Copilot无论隔多久都能"记起"之前的开发逻辑。

建立会话锚点文件

在项目根目录新建 copilot-context.md 文件。每次开发完成后,花几分钟记录关键信息:

# 监控预警模块 - Copilot上下文锚点
## 开发进度(2025-XX-XX)
1. 已完成:tbl_monitor_data/tbl_monitor_config/tbl_monitor_alarm_condition三张表设计及实体类、Mapper、Service基础代码;
2. 已实现:Netty指标接收服务(MetricReceiveHandler)、指标数据批量入库逻辑(MonitorDataServiceImpl);
3. 待实现:规则引擎预警判定、多渠道通知(邮箱/企微)、前端图表接口优化;
## 关键逻辑说明
1. 指标类型映射:CPU=3、带宽=4、内存=5、磁盘=6,存储在MetricType枚举类中;
2. 规则引擎:入口为MonitorEnterService,核心判定逻辑写在AlarmExpressionHandler实现类中
3. 预警规则执行时机:指标入库后通过异步线程(@Async)触发判定,避免阻塞入库流程;
4. 前端图表使用ECharts工具
## 代码关联
- 指标接收:demo.streams.NettyServer
- 数据存储:demo.streams.impl.MonitorDataServiceImpl
- 规则引擎:demo.streams.engine.enter.MonitorEnterService
- 指标数据表实体: demo.streams.model.entity.MonitorDataEntity

续接开发时的提示词模板

隔段时间续接开发时,先在提示词开头引用锚点文件:

[上下文引用] 参考项目根目录copilot-context.md文件,当前开发监控预警模块,已完成指标入库和表结构设计,待实现规则引擎预警判定;
[具体需求]
1. 完善AlarmExpressionHandler的各指标判定逻辑:
- CPU使用率:当metricValue>阈值时触发预警;
- 内存使用率:metricValue>=阈值且持续5分钟触发预警;
- 带宽/磁盘使用率:同CPU逻辑;
2. 实现多渠道通知:
- 邮箱通知:调用项目已有的MailUtil.sendMail()方法;
- 企微通知:调用QywxRobotUtil.sendMsg()方法;
3. 输出要求:按最小改动原则,在现有代码基础上补充,附思考链路,注释用中文。

效果

之前没做记录时,续接开发让AI补全规则引擎,它会重新设计指标判定逻辑,甚至把已有的批量入库代码也改了。

用了锚点文件后,AI能精准定位到AlarmExpressionHandler类的未完成方法,直接补充判定逻辑,还能正确调用已有的枚举类、工具类,完全不会出现"从零开始"的情况。

打样模仿:让AI成为重复劳动终结者

日常开发中,很多任务都是重复的——CRUD接口、相似模块开发、运维脚本编写。这时候让AI"模仿已有样板"重复执行,能极大减少工作量。

核心思路:给AI一个"正确的样板",让它照着葫芦画瓢。

样板选择原则

  • 结构完整:选项目中已落地、经过验证的完整链路代码
  • 规范统一:样板代码要符合团队编码规范
  • 场景典型:选重复度高的场景,比如管理后台CRUD、数据统计接口

案例:模仿CRUD接口

比如已经有一个完整的ClientController作为样板,现在要生成MonitorConfigController

[样板引用] 参考com.example.client.controller.ClientController的CRUD接口结构,模仿其分层设计、接口命名、参数接收、返回格式;
[开发需求] 实现监控配置模块(tbl_monitor_config)的CRUD接口:
[要求] 请通过MYSQL_MCP查询数据streams3中的tbl_monitor_config表字段
1. 请求DTO:
- 新增:MonitorConfigAddReq(含clientId、description、monitorName...);
- 查询:MonitorConfigQueryReq(含clientId、monitorName、conditionType);
- 修改:MonitorConfigUpdateReq(在新增DTO基础上增加id);
2. 响应DTO:MonitorConfigResp(包含表中所有字段+预警条件列表);
3. 接口路径:/api/v1/monitor/config;
4. 输出要求:按"请求DTO→响应DTO→Controller→Service→Mapper"顺序输出,遵循阿里巴巴Java开发规范

AI会完全模仿样板的结构来生成——接口路径风格一致、参数校验注解完整、返回格式统一用Result封装。甚至事务处理的逻辑也模仿了样板。

团队复用

可以在团队Git仓库新建/docs/copilot-templates目录,按开发方向分类存储样板代码:

/docs/copilot-templates
├── backend/
│   ├── crud-controller-template.java
│   ├── service-template.java
│   └── mybatis-mapper-template.xml
├── android/
│   ├── recyclerview-adapter-template.kt
│   ├── viewmodel-template.kt
│   └── retrofit-api-template.kt

后续新人接手项目,参考样板库就能快速让Copilot生成符合团队规范的代码。

总结

用好Copilot的三件事:

  1. 做约定copilot-instructions.md 让AI知道你的规矩
  2. 写精准提示词:场景+约束+需求+规范+示例,五要素缺一不可
  3. 记录上下文锚点copilot-context.md 解决续接开发的断层问题

Copilot不是代码生成器,是你的外置大脑。你得告诉它怎么思考,它才能按你的方式帮你干活。

Last update:
Contributors: LeYunone
Comments
  • Latest
  • Oldest
  • Hottest
Powered by Waline v2.14.7