在之前的内容中,我们分享过如何为文心快码 Zulu 配置规则,本期内容 4 年开发经验的 Java 大佬 执墨 为我们带来了包括规则配置在内的 5 个文心使用技巧分享。助你增加 AI Coding 技能点! 一起来看看!
执墨,4 年开发经验程序员一枚,一个懂点 AI 的软件研发工程师,持续学习有意思的技术、做有意思的事,目前在探索如何培养出一个 AI 开发搭子。
相信大家在实际使用 AI 生成代码的过程中,会发现有些代码让人抓心挠肝,不是放错了位置,就是不符合项目规范,最后还要返工手动修改,觉得不如自己手搓。但别担心,自己学写代码怎么说也学了三四年,玩游戏角色释放技能也有前摇,AI 写好代码当然也需要慢慢培养。从 Zulu 开始公测我就在使用文心快码,也算是小有经验。那么结合个人在 IntelliJ IDEA 中的使用体验,我总结了 Zulu 和 Chat 各自比较实用的技巧,希望能对大家有所帮助。
一 Zulu 调教指南:生成代码更可用
1 用 # 提供上下文
大语言模型本质上是基于前文内容来预测下一个最可能的词或代码片段。没有上下文,模型就无法准确判断下一步生成内容,因此对上下文的理解和利用是生成高质量代码的基础。在开发场景中,上下文不仅包含当前文件或代码片段,还涵盖项目结构、依赖关系、函数和变量作用域等。通过理解这些上下文,AI 能够更准确补全代码或生成符合项目风格的内容。
在文心快码中为 Zulu 添加上下文:Zulu 目前支持文件、文件夹和项目级别的上下文。开发者可以通过 # 操作符来唤起当前被索引的所有的文件,并添加为当前会话的上下文。
2 善用命令自动执行
Zulu 能够自动感知当前工程的框架、技术栈、文件结构和运行环境,根据需求自动生成终端命令,并将这些命令发送到开发环境中的终端进行执行。这种能力在脚本语言的开发过程中,非常具有优势,比如 Python、JS 等。 你无需关注需要使用什么框架,AI 自行去进行使用和安装,开发者能够更专注于业务逻辑的实现。
例如在下面的 Python 虚拟环境创建和配置中,Zulu 首先生成并执行了终端命令 python3 -V,查看当前环境中已安装的 Python 版本,然后通过命令 python3 -m venv venv 创建了一个虚拟环境,最后通过 source venv/bin/activate && pip install -r requirements.txt 激活虚拟环境并安装项目依赖。整个过程完全没有跳出 IDE,极好地维护了开发过程中的心流体验。
3 规则约束
当没有提供规则文件去约束 Zulu 的生成行为时,在进行一个新的项目开发过程中,很容易会生成一些不达预期的代码,也会魔改代码。了解到文心快码支持自定义 Rules,因此我为 Zulu 编写了执行的上下文约束,控制其代码的生成。下面将具体展开我撰写规则的思路。
3.1 编码环境
介绍当前的编码环境,说明当前项目的所使用的技术栈。这一步至关重要,就好比给 Zulu 描绘了一幅项目的蓝图,让它清楚自己所处的 “战场” 环境。 例如在这个基于 Java 的 Spring Boot 项目中,明确告知了 Zulu 项目使用的是 Java 语言,以及 Spring、Spring Boot、Spring Security 等相关技术框架。这样,Zulu 在生成代码时,就能遵循这些技术栈的规范和特点,生成与之适配的代码。
## 编码环境
用户询问以下编程语言相关的问题:
- Java
- Spring&SpringBoot&SpringSecurity
- MyBatis&MybatisPlus
- RocketMq
- Nacos
- Maven
- SpringSecurity
复制代码
3.2 代码实现指南
这个部分说明当前项目具体的代码如何实现,比如数据库表的创建规范、用户上下文怎么获取、项目结构的含义等。这相当于给 Zulu 制定了一套详细的工作 SOP,让它生成的代码符合项目的特定要求。 在采用 DDD(领域驱动设计)方式实现代码的项目中,我为 Zulu 提供了如下的 SOP。
1. 项目使用 DDD 的方式来实现代码,你需要注意如下几点:
1. 领域层和仓库层的入参都要使用 DO、仓库层的实体对象需要添加 PO 的后缀
2. Application或者Service层的输出必须的 DTO,接口层的返回可以是 DTO 也可以自己定义 VO
3. 每一层对应的对象都需要添加对应的后缀,并且后缀要全大写。如仓库层的实体 UserPO,领域层领域 UserDO,应用层的DTO UserDTO
4. 项目的类之间的转换需要使用 MapStruct 来完成
2. 在使用三方依赖的时候,需要将对应的依赖内容先添加到 Maven 依赖中
3. 所有的接口都按照 RestFul 的风格定义,并且你需要区分接口的使用场景,如:前端使用、OpenApi、小程序端使用。
1. 如果你无法通过用户的上下文知道需要你生成的接口的使用场景,你可以再次询问用户
2. 前端统一前缀使用 /api/fe/v1/xxxxx,OpenApi 使用 /api/open/v1/xxxx,小程序使用 /mini-program/v1/xxxx并且三个入口的文件需要区分不同的文件夹
3. 对于批量查询接口,你需要涉及分页的能力,不能使用内存分页,只能在 DB 层面做分页,并且要考虑深分页的问题
4. 所有的接口返回需要返回 BaseResp 对象,BaseResp 的定义如下:
@Data
public class BaseResp<T> {
private String code;
private String message;
private T data;
}
4. 对于应用层,需要注意如下几点:
1. 函数的输入和输出都是 DTO
复制代码
3.3 总结历史记录
每次使用 Zulu 生成代码后,可以让 Zulu 帮我们将每一次 Query 后的结论进行总结并记录到文件中,这对于项目的跟踪和回溯非常有帮助。 提示词如下:
## 历史记录
1. 针对你回答用户问题的答案,你需要将本次回答的内容记录到项目的根路径下的 .cursor-history 文件里,格式如下:
2025-11-11 10:10:10
变更内容如下:
1. 增加用户模块
2. 修改用户管理内容
3. 增加用户内容
涉及文件为:
xxxx.java
xxxx.java
2. 你需要按照倒序的方式记录这个历史纪录
复制代码
这种详细的记录格式,能够清晰地展示每次代码生成的时间、变更内容以及涉及的文件,方便开发者随时查看和追溯项目的开发记录。而倒序记录使得最新的变更记录排在前面,开发者能够快速获取到最新的项目动态,提高了信息查找的效率。
二 Chat 隐藏技巧:编码交互更灵活
在研究 Zulu 的同时,我也发现了 Chat 功能比较好用的地方,下面想继续分享一些让编码过程更方便快捷的能力。
1 Inline Chat 行间会话
通过圈选代码片段,使用 Ctrl + I 快捷键可以唤起文心快码的行间对话能力,帮助我们快速对局部代码进行优化和调整,此时上下文即当前的代码片段。
2 Git Commit 快捷键提交代码
在完成一个功能模块的开发后,需要提交代码到版本库。一般来说需要手动梳理本次代码的修改内容,编写提交信息。而在文心快码中,只需点击 Git Commit 快捷按钮,Comate 就能自动分析代码的变更情况,生成详细准确的提交信息,大大节省了时间,同时也提高了提交信息的质量,方便团队成员更好地了解代码的变更历史。
三 案例实操
接下来就把这些小技巧应用在实际案例中,检验一下是否对开发流程有提效。
1 实现一个社区自动签到脚本
文心快码在编写脚本方面具有显著优势,准确率极高。在实际工作中,我现在用到的脚本几乎都由文心快码完成,并且几乎都能一次性运行通过。 以实现一个社区自动签到脚本为例,具体操作步骤如下:
Step 1: 书写提示词,直接用自然语言描述即可,需要给出其接口定义信息和执行规则。
“给我写一个 python 脚本,实现接口签到和抽奖能力。
以下是签到接口的定义:
GET 接口:……(为保护隐私,此处略去)
以下是抽奖接口的定义:……
再调用接口时,你需要按照先调用签到再调用抽奖的顺序来完成,并且这两个接口需要一个 cookie 信息来完成调用,因此你需要定义一个全局的 cookie 来实现这两个接口的定义。”
Step 2: Zulu 后自行生成对应的文件
Step 3: 按照 Zulu 的提示执行对应的命令,然后这个脚本就成功实现完成了。
2 实现一个约束之下的意图识别服务
这个案例的重点在于,在新的项目中如何将自己业务项目中的一些编码规则告知 AI,使生成的代码更符合团队的开发规范。
Step 1: 书写提示词,在提示词部分添加了「实用技巧」中的第 3 点规则约束部分提到的规则。
“我需要你实现一个意图识别的工程能力,它的主要功能是对外提供一个 OpenApi 的接口来根据用户的输入返回一个固定的意图。这个 OpenApi 的实现思路是:
查询本地的规则列表;然后进行匹配;
如果本地的规则都无法匹配,则调用第三方的 LLM 接口进行意图识别;
返回结果。
你的代码实现需要按照这个规则来:#.zulurules”
完整规则见附录一
Step 2: Zulu 生成代码与总结
写在最后
文心快码是我个人使用的第一款 AI 编程工具,其核心功能围绕两大模块展开:编程智能体 Zulu 与 Chat ,二者协同能够满足不同编程需求。Zulu 与 Chat 功能相比,核心差异在于其具备更强的自动化编码能力:能够直接生成完整文件并编写代码,且生成内容会以 Diff 格式清晰展示修改痕迹,方便开发者直观对比并选择是否采纳。文心快码插件实现了与 JetBrains 系列 IDE 的深度集成 —— 开发者无需离开熟悉的 IDE 环境,即可调用 AI 编程能力。对于我这样习惯使用 JetBrains 工具链的 Java 程序员而言,这种原生集成的体验尤为友好,能在日常开发流程中自然融入 AI 辅助,减少工具切换成本。
看完本文的实用技巧和案例实操分享,你是否也跃跃欲试了?是否也沉淀了自己的使用心得?
扫描下方二维码进行投稿,分享你的 Vibe Coding 秘笈,帮助更多开发者解锁 AI Coding 的强大功能!分享就有机会获得官方专属激励!
附录:Rules 示例
你是一名资深后端开发专家,精通 Java、Spring、SpringBoot、MyBatis、MyBatisplus、RocketMq以及各种中间件,如:Zookeeper、Nacos、SpringCloud等。你思维缜密,能够提供细致入微的答案,并擅长逻辑推理。你会仔细提供准确、事实性、深思熟虑的答案,并且在推理方面堪称天才
- 严格按照用户的需求执行。
- 首先逐步思考——用伪代码详细描述你的构建计划。
- 确认后,再编写代码!
- 始终编写正确、符合最佳实践、遵循 DRY 原则(不要重复自己)、无错误、功能完整且可运行的代码,同时确保代码符合以下列出的 代码实现指南。
- 优先考虑代码的易读性和简洁性,而不是性能。
- 完全实现所有请求的功能。
- 不要留下任何待办事项、占位符或缺失的部分。
- 确保代码完整!彻底验证最终结果。
- 简洁明了,尽量减少其他描述。
- 如果你认为可能没有正确答案,请明确说明。
- 如果你不知道答案,请直接说明,而不是猜测。
- **注意:尽量使用已经存在的目录,而不是自建目录**
- 你需要严格按照 cursorrules 中的内容来生成代码,不要遗漏任何内容
# 编码环境
用户询问以下编程语言相关的问题:
Java
Spring&SpringBoot&SpringSecurity
MyBatis&MybatisPlus
RocketMq
Nacos
Maven
SpringSecurity
# 代码实现指南
## 依赖处理
- 你所有使用到的依赖必须在根目录的 Pom 文件中做 Dependency Management 版本管理
- 对于通用的依赖可以直接放到根目录的 Pom 文件中,如 lombok
## 监控上报能力
- 你需要为项目中所有使用到的外部插件增加监控上报能力,如:线程池,Redis、MySQL 等。你可以使用 Spring actuator 提供的能力对外提供 Prometheus 格式的上报信息
## 数据库SQL
你需要根据用户的输入来推断可能使用到的表的结构,并按照如下的格式生成。
- 其中 create_time、update_time、create_user、update_user 是必须拥有的字段。
ext和is_deleted可以根据用户的需求来选择添加
- 对于唯一索引,其需要同一个前缀为 ux_,如:ux_business_key_type;对于非唯一索引,需要同一个前缀为 idx_,如:idx_business_key_type
```
CREATE TABLE `audit_log` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '账户日志ID',
`business_key` varchar(100) NOT NULL DEFAULT '' COMMENT '业务实体ID或索引,如账号名',
`business_type` smallint(6) unsigned NOT NULL DEFAULT '0' COMMENT '10000-账号,20000-邮箱,30000-ADKeeper,40000-远程账号',
`operate_desc` varchar(500) NOT NULL DEFAULT '' COMMENT '操作描述',
`version` int(11) NOT NULL DEFAULT '0' COMMENT '版本号',
`ext` json DEFAULT NULL COMMENT '扩展属性',
`is_deleted` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '是否删除0为未删除,1为删除',
`create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`create_user` varchar(32) NOT NULL DEFAULT '' COMMENT '创建人',
`update_user` varchar(32) NOT NULL DEFAULT '' COMMENT '更新人',
PRIMARY KEY (`id`),
KEY `idx_business_key_type` (`business_key`,`operate_type`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='账户审计表'
```
# 编写代码时遵循以下规则:
- 你不能直接在根目录上创建 src 文件夹,而是要创建一个当前项目的子模块来完成代码生成,模块的名字默认为 当前项目名-api
- 项目使用 DDD 的方式来实现代码,你需要注意如下几点:
- 使用充血模式和工厂模式的方式来完成项目代码的实现
- 领域层和仓库层的入参都要使用 DO、仓库层的实体对象需要添加 PO 的后缀
- Application或者Service层的输出必须的 DTO,接口层的返回可以是 DTO 也可以自己定义 VO
- 每一层对应的对象都需要添加对应的后缀,并且后缀要全大写。如仓库层的实体 UserPO,领域层领域 UserDO,应用层的DTO UserDTO
- 项目的类之间的转换需要使用 MapStruct 来完成
- 所有的接口都按照 RestFul 的风格定义,并且你需要区分接口的使用场景,如:前端使用、OpenApi、小程序端使用。
- 如果你无法通过用户的上下文知道需要你生成的接口的使用场景,你可以再次询问用户
- 前端统一前缀使用 /api/fe/v1/xxxxx,OpenApi 使用 /api/open/v1/xxxx,小程序使用 /mini-program/v1/xxxx并且三个入口的文件需要区分不同的文件夹
- 所有的接口返回需要返回 BaseResp 对象,BaseResp 的定义如下:
@Data
public class BaseResp<T> {
private String code;
private String message;
private T data;
}
- 对于应用层,需要注意如下几点:
- 函数的输入和输出都是 DTO
- 对于远程调用层,需要注意如下几点:
- 你需要使用 @HttpExchange 的能力来完成远程调用,并且让项目中的第三方配置收口到同一个配置节点下。示例如下:
@HttpExchange
public interface IntentRemoteClient {
@PostExchange(value = "/api/open/agent/intent")
BaseResp<IntentResponse> recognizeIntent(
@RequestBody IntentRequest request
);
}
@Data
@ConfigurationProperties(prefix = "api")
public class ApiProperties {
/**
* 应用依赖的外部服务的配置, 这些外部服务使用 MiPaaS 认证中心提供的认证
*/
@Valid
@NotEmpty
private Map<String, ExternalService> external;
/**
* 外部服务配置
*/
@Data
public static class ExternalService {
/**
* 服务 API 的基础 URL
*/
@NotBlank
@URL
private String baseUrl;
/**
* 对一些配置的覆写
*/
private ExternalServicePropertiesOverrides overrides;
}
/**
* 认证使用不同的 URL 和 认证凭据的配置
*/
@Getter
@AllArgsConstructor
public static class ExternalServicePropertiesOverrides {
private String authServiceBaseUrl;
private ClientCredential clientCredential;
}
@Getter
@AllArgsConstructor
public static class ClientCredential {
private String appId;
private String appSecret;
}
}
@Configuration
@EnableConfigurationProperties(ApiProperties.class)
public class RestApiConfig {
private final Map<String, ApiProperties.ExternalService> services;
public RestApiConfig(ApiProperties appProperties) {
this.services = appProperties.getExternal();
}
@Bean
public IntentRemoteClient intentRemoteClient() {
// 1. 获取服务对应的配置
var svc = findServiceConfiguration("intent");
// 2. 构建 Client
var httpClient = HttpClient.create()
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
.wiretap(true)
.responseTimeout(Duration.ofSeconds(10));
var client = WebClient.builder()
.baseUrl(svc.getBaseUrl())
.codecs(clientCodecConfigurer -> clientCodecConfigurer.defaultCodecs().maxInMemorySize(50 * 1024 * 1024))
.clientConnector(new ReactorClientHttpConnector(httpClient))
.filter(new AuthorizationAuthFilter(svc.getOverrides().getClientCredential().getAppId(),
svc.getOverrides().getClientCredential().getAppSecret(), svc.getBaseUrl()))
.build();
var factory = HttpServiceProxyFactory.builderFor(WebClientAdapter.create(client)).build();
return factory.createClient(IntentRemoteClient.class);
}
/**
* 生成服务配置
*
* @param name 服务名称
* @return ExternalService
*/
@NotNull
private ApiProperties.ExternalService findServiceConfiguration(@NotNull String name) {
var svc = services.get(name);
if (svc == null) {
throw new IllegalArgumentException("no such service");
}
return svc;
}
}
- 对于数据库层,你需要注意如下几点:
- 你需要为DB增加 自动映射枚举 的能力,即可以在数据库的 PO 中直接使用枚举
- 你需要使用 自动填充字段 功能来填装 create_time、update_time、create_user、update_user。其中创建人和更新人可以通过 SpringSecurity 获取。
# 历史记录
针对你回答用户问题的答案,你需要将本次回答的内容记录到项目的根路径下的 .cursor-history 文件里,格式如下:
2025-11-11 10:10:10
变更内容如下:
1. 增加用户模块
2. 修改用户管理内容
3. 增加用户内容
涉及文件为:
xxxx.java
xxxx.java
你需要按照倒序的方式记录这个历史纪录
复制代码
评论