在以往的文章中,我们曾探讨过如何配置文心快码Zulu的规则。本期邀请了拥有4年开发经验的Java专家执墨,他将分享包括规则配置在内的五个实用技巧。让你提升AI编程技能!快来看看吧!
执墨是一位拥有四年开发经验的程序员,具备一定的AI知识,始终在探索新技术与有趣项目,目前正在研究如何培养AI开发伙伴。
大家在实际使用AI生成代码时,是否会遇到一些难以忍受的问题?有些代码不仅位置错误,还不符合项目规范,最后不得不手动返工,令人感到不如自己写的来得顺手。不过,别担心,经过三四年的学习,我们都已掌握了一些编程技巧。AI在编写代码时,也需要时间来适应。自Zulu公测以来,我便开始使用文心快码,积累了一定的经验。结合我在IntelliJ IDEA上的使用体会,我总结了Zulu和Chat的一些实用技巧,希望能够帮助大家。
一、Zulu调试指南:生成更可用的代码
1. 使用 # 提供上下文
大型语言模型的核心在于基于之前内容预测下一个最可能的词或代码段。缺乏上下文,模型难以准确生成内容,因此理解和利用上下文是生成高质量代码的关键。在开发环境中,上下文不仅涉及当前文件或代码片段,还包括项目结构、依赖关系以及函数和变量的作用域。通过这些上下文信息,AI能够更精准地补全代码或生成符合项目风格的内容。
在文心快码中为Zulu添加上下文:目前Zulu支持文件、文件夹和项目级别的上下文。开发者可以通过 # 操作符调出当前索引的所有文件,并将其添加为当前会话的上下文。
-
使用 # 操作符打开上下文菜单进行编辑
-
选择想要的文件或目录,可以添加多个,如果未选择上下文,系统会默认使用当前项目作为上下文环境。。
-
上下文配置后,可以用自然语言描述你希望AI完成的任务。在这个示例中,我选择了Cache.java文件,并询问Zulu“实现一个查询缓存并根据类型进行反序列化的函数,目标为Redis序列化”。此时,Zulu便开始分析上下文,迅速理解我的需求,在Cache接口中作出修改,添加了所需功能。
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的生成行为,生成的代码往往难以符合预期,甚至会出现魔改现象。得知文心快码支持自定义规则后,我为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 { private String code; private String message; private T data; } 4. 对于应用层,需要注意如下几点: 1. 函数的输入和输出都是 DTO
3.3 总结历史记录
每次使用Zulu生成代码后,可以让Zulu帮助我们总结每次查询的结果并记录到文件中,这对项目跟踪和回溯非常有益。提示词如下:
## 历史记录1. 针对你回答用户问题的答案,你需要将本次回答的内容记录到项目的根路径下的 .cursor-history 文件里,格式如下:2025-11-11 10:10:10变更内容如下:1. 增加用户模块2. 修改用户管理内容3. 增加用户内容涉及文件为:xxxx.javaxxxx.java2. 你需要按照倒序的方式记录这个历史纪录
这种详细的记录格式,能够清晰展示每次代码生成的时间、变更内容及涉及的文件,方便开发者随时查看和追溯项目开发记录。同时,倒序记录使得最新的变更排在前面,开发者可以迅速获取到最新的项目动态,提高信息查找效率。
二、Chat隐藏技巧:编码交互更灵活
在深入研究Zulu时,我也发现了Chat功能的一些优点,接下来我将分享一些使编码过程更加便捷高效的功能。
1. Inline Chat 行间会话
提升开发效率的实用技巧与案例分析
通过选择特定的代码片段,利用 Ctrl + I 快捷键可以激活文心快码的行间对话特性,助力我们对局部代码进行快速优化与调整,此时上下文即为当前选中的代码。
-
在对话框中输入希望AI完成的任务
-
Comate 会自动分析代码并进行编辑,编辑完成后可以选择接受或忽略。
2 Git Commit 快捷键快速提交代码
在一个功能模块开发完成后,必须将代码提交到版本库。通常,我们需要手动整理本次代码的修改内容,并撰写提交信息。但借助文心快码,只需简单点击 Git Commit 快捷按钮,Comate 就能够自动分析代码的变更情况,生成准确详尽的提交信息,这不仅节省了时间,同时提升了提交信息的质量,帮助团队成员更好地了解代码的历史变更。
-
在进行 Git Commit 时,点击快捷按钮便可迅速总结本次代码的变更内容。
三 案例应用实践
接下来将这些技巧应用于实际案例中,检验其对开发流程的提升效果。
1 创建一个社区自动签到脚本
文心快码在脚本编写方面展现出显著优势,准确率极高。在实际工作中,我使用的脚本几乎都由文心快码生成,并且大多数能够一次性运行成功。以创建一个社区自动签到脚本为例,具体步骤如下:
步骤 1: 撰写提示词,直接用自然语言进行描述,需包含接口定义信息和执行规则。
“请帮我写一个Python脚本,实现接口签到和抽奖的功能。
以下是签到接口的定义:
GET接口:……(为保护隐私,此处略去)
以下是抽奖接口的定义:……
在调用接口时,需先调用签到接口再调用抽奖接口,并且这两个接口都需要一个cookie信息,因此你需要定义一个全局cookie来完成这两个接口的调用。”
步骤 2: Zulu 会自动生成相应的文件。
步骤 3: 按照 Zulu 的提示执行相应命令,脚本便成功完成。
2 实现一个在约束条件下的意图识别服务
此案例的重点在于如何在新项目中向AI传达自己业务项目中的编码规则,以确保生成的代码符合团队的开发标准。
步骤 1: 撰写提示词,并在提示词中加入「实用技巧」中的第三点规则约束部分提到的规则。
“我需要你实现一个意图识别的项目,其主要功能是提供一个OpenApi接口,能够根据用户输入返回固定的意图。这个OpenApi的实现思路如下:
-
查询本地规则列表并进行匹配;
-
若本地规则无法匹配,则调用第三方的LLM接口进行意图识别;
-
返回结果。
请确保你的代码实现遵循以下规则:#.zulurules”
完整规则见附录一
步骤 2: Zulu 生成相关代码及总结。
最后的感悟
文心快码是我使用的首款AI编程工具,其核心功能围绕两个主要模块展开:编程智能体 Zulu 和 Chat。这两者相辅相成,能够满足多样的编程需求。相较于 Chat,Zulu 的最大特点在于其更强的自动编码能力:能够直接生成完整的文件并编写代码,并且生成的内容会以 Diff 格式清晰展示修改痕迹,便于开发者直观比较并决定是否采纳。文心快码插件实现了与 JetBrains 系列IDE的深度集成 —— 开发者无须离开熟悉的IDE环境,即可调用AI编程能力。对于我这个习惯使用JetBrains工具链的Java程序员而言,这种原生集成的体验尤为友好,能够将AI辅助自然融入日常开发流程,降低工具切换的成本。
阅读完这篇文章中分享的实用技巧与案例,你是否也心动不已?是否也积累了自己的使用体会呢?
扫描下方二维码投稿,分享你的Vibe Coding秘笈,助力更多开发者解锁AI Coding的强大功能!分享还有机会获得官方专属激励!
附录:规则示例
你是一名资深后端开发专家,精通 Java、Spring、SpringBoot、MyBatis、MyBatisplus、RocketMq以及各种中间件,如:Zookeeper、Nacos、SpringCloud等。你思维缜密,能够提供细致入微的答案,并擅长逻辑推理。你会仔细提供准确、事实性、深思熟虑的答案,并且在推理方面堪称天才- 严格按照用户的需求执行。- 首先逐步思考——用伪代码详细描述你的构建计划。- 确认后,再编写代码!- 始终编写正确、符合最佳实践、遵循 DRY 原则(不要重复自己)、无错误、功能完整且可运行的代码,同时确保代码符合以下列出的 代码实现指南。- 优先考虑代码的易读性和简洁性,而不是性能。- 完全实现所有请求的功能。- 不要留下任何待办事项、占位符或缺失的部分。- 确保代码完整!彻底验证最终结果。- 简洁明了,尽量减少其他描述。- 如果你认为可能没有正确答案,请明确说明。- 如果你不知道答案,请直接说明,而不是猜测。- **注意:尽量使用已经存在的目录,而不是自建目录**- 你需要严格按照 cursorrules 中的内容来生成代码,不要遗漏任何内容# 编码环境用户询问以下编程语言相关的问题:JavaSpring&SpringBoot&SpringSecurityMyBatis&MybatisPlusRocketMqNacosMavenSpringSecurity# 代码实现指南## 依赖处理- 你所有使用到的依赖必须在根目录的 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 { private String code; private String message; private T data; } - 对于应用层,需要注意如下几点: - 函数的输入和输出都是 DTO - 对于远程调用层,需要注意如下几点: - 你需要使用 @HttpExchange 的能力来完成远程调用,并且让项目中的第三方配置收口到同一个配置节点下。示例如下:@HttpExchangepublic interface IntentRemoteClient { @PostExchange(value = "/api/open/agent/intent") BaseResp recognizeIntent( @RequestBody IntentRequest request );}@Data@ConfigurationProperties(prefix = "api")public class ApiProperties { /** * 应用依赖的外部服务的配置, 这些外部服务使用 MiPaaS 认证中心提供的认证 */ @Valid @NotEmpty private Map 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 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.javaxxxx.java你需要按照倒序的方式记录这个历史纪录
Please specify source if reproduced掌握这5个技巧,轻松让文心快码成为你的后端开发最佳伙伴! | AI工具导航












