在之前的讨论中,我们介绍了如何为文心快码 Zulu 设置规则。本期,拥有四年开发经验的 Java 专家执墨将为大家带来五个实用的文心使用技巧,包括规则配置,帮助你提升 AI 编程的技能!一起来了解一下吧!
执墨是一位拥有四年开发经验的程序员,同时也是一名对 AI 颇有研究的软件开发工程师。他一直在探索有趣的技术与项目,目前正致力于培养一个 AI 开发伴侣。
在使用 AI 生成代码的过程中,大家可能会发现有些代码让人十分苦恼,可能是位置不对,或者不符合项目要求,最后不得不进行手动修改,感觉不如自己亲自编写。不过请放轻松,毕竟自己已经学习编程三四年,游戏中角色释放技能也需要时间,AI 生成优质代码同样需要逐步培养。从 Zulu 开始公测以来,我一直在使用文心快码,积累了一些经验。基于我在 IntelliJ IDEA 中的使用体验,我总结了 Zulu 和 Chat 各自的一些实用技巧,真心希望能帮助到大家。
▎Zulu 调教技巧:让生成的代码更实用
1. 使用 # 提供上下文
大语言模型的核心在于基于已有内容进行下一步的词或代码片段预测。如果没有上下文信息,模型将无法准确生成内容,因此理解和利用上下文是提升代码质量的关键。在开发环境中,上下文不仅涵盖当前的代码文件,还包括项目结构、依赖关系、函数与变量的作用域等。AI 通过理解这些上下文信息,能够更准确地补全代码或生成符合项目风格的内容。
在文心快码中为 Zulu 添加上下文:Zulu 现支持在文件、文件夹及项目级别进行上下文设置。开发者能够利用 # 操作符调出当前索引的文件,并将其添加为会话的上下文。
步骤1:使用 # 操作符唤起上下文菜单
步骤2:选择相关的文件或目录。可以一次性添加多个,如果没有选择特定上下文,将默认使用当前项目作为上下文环境。
步骤3:设置上下文后,可以通过自然语言描述需要 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. 对于批量查询接口,需考虑分页能力,不能仅依赖内存分页,必须在数据库层面进行分页,并需关注深分页问题。
4. 所有接口返回需返回 BaseResp 对象,BaseResp 的定义如下:
@Data
publicclassBaseResp {
privateString code;
privateString message;
privateT data;
}
4. 对于应用层,需注意以下几点:
1. 函数的输入和输出均为 DTO。
3.3 历史记录总结
每次利用 Zulu 进行代码生成后,我们可以指示 Zulu 将每次查询的结果进行汇总并保存至文件中,这对项目的追踪和回顾非常重要。以下是提示词:
## 历史记录
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 快捷键,激活文心快码的行间对话功能,帮助我们迅速优化和调整局部代码,此时的上下文便是当前的代码片段。
在对话框中输入希望 AI 完成的任务,Comate 将自动分析代码并进行编辑,完成后可由用户自行决定是否采纳或忽略。
2. Git 提交快捷键
在完成一个功能模块的开发后,需要将代码提交至版本控制库。一般情况下,开发者需要手动整理本次代码的修改情况,并撰写提交信息。而在文心快码中,只需点击 Git Commit 快捷按钮,Comate 将自动分析代码变更情况,生成详细且准确的提交信息,大大节省了时间,同时提升了提交信息的质量,帮助团队成员更好地理解代码的变更历史。
点击 Git Commit 的快捷按钮,能够迅速总结本次代码的变更内容。
▎案例实践
接下来将这些小技巧应用于实际案例,检验是否能提高开发流程的效率。
1. 创建社区自动签到脚本
文心快码在脚本编写方面展现了显著优势,准确性极高。在我的日常工作中,几乎所有使用的脚本均由文心快码生成,且大多数都能一次性顺利运行。以下是实现社区自动签到脚本的具体步骤:
步骤 1: 编写提示词,使用自然语言描述,需提供接口定义信息和执行规则。
“请为我编写一个 python 脚本,实现接口签到和抽奖功能。
以下是签到接口的定义:
GET 接口:……(为保护隐私,此处省略)
以下是抽奖接口的定义:……
在调用接口时,请确保先调用签到接口,然后调用抽奖接口,并且这两个接口都需要一个 cookie 信息,因此需要定义一个全局的 cookie 来实现这两个接口的调用。”
步骤 2: Zulu 将自动生成相应的文件。
步骤 3: 按照 Zulu 的提示执行相应命令,脚本便成功实现。
2. 实现意图识别服务
本案例的关键在于如何向 AI 传达项目中的编码规则,以确保生成的代码符合团队的开发标准。
步骤 1: 编写提示信息,并在其中加入“实用技巧”中的第三点规则约束。
“我希望实现一个意图识别的工程能力,主要功能是对外提供一个 OpenApi 接口,根据用户输入返回一个固定的意图。这个 OpenApi 的实现思路是:
1. 查询本地规则列表并进行匹配;
2. 如果本地规则无法匹配,则调用第三方 LLM 接口进行意图识别;
3. 返回结果。
你的代码实现需遵循此规则:#.zulurules”
步骤 2: Zulu 生成代码并进行总结。
▎最后总结
探索文心快码:AI 编程工具的全新体验
文心快码是我首次尝试的人工智能编程工具,其主要功能可以分为两个重要的模块:编程智能体 Zulu 和 Chat。这两者的协作显著提升了编程的灵活性与效率。相较于 Chat,Zulu 的一大特点在于其卓越的自动化编码能力,它能够快速生成完整的代码文件,并以 Diff 格式清晰呈现修改内容,使得开发者能够方便地进行审查和选择是否采纳这些变更。文心快码插件与 JetBrains 系列开发环境深度集成,开发者可以在熟悉的 IDE 界面中直接调用 AI 编程功能,无需切换到其他工具。对于习惯使用 JetBrains 工具链的 Java 开发者而言,这种紧密结合的体验尤其友好,能够顺畅地将 AI 辅助融入日常开发,提高工作效率,同时降低切换工具带来的成本。
在阅读了这篇文章中的实用技巧和案例分享后,你是否也对使用这些工具充满了期待?是否已经积累了一些自己的使用体会?
点击「阅读原文」或扫描下方二维码投稿,分享你的 Vibe Coding 秘笈,助力更多开发者解锁 AI Coding 的强大潜力!参与分享还有机会获得官方专属奖励!
附录:规则示例
作为一名资深后端开发者,你精通 Java、Spring、SpringBoot、MyBatis、MyBatisplus、RocketMq 及多种中间件,例如 Zookeeper、Nacos 和 SpringCloud。你的思维严谨,能够提供详尽的解答,并擅长逻辑推理。你会认真给出准确、基于事实的答案,并且在推理方面表现出色。
- 严格遵循用户的需求执行。
- 逐步思考——使用伪代码详细描述构建计划。
- 确认后再开始编写代码!
- 始终编写正确、符合最佳实践的代码,遵循 DRY 原则(不要重复自己),确保代码功能完整且可运行,并符合下列代码实现指南。
- 优先考虑代码的可读性和简洁性,而非性能。
- 完全实现所有请求的功能。
- 不留待办事项、占位符或缺失部分。
- 确保代码的完整性!彻底验证最终结果。
- 简洁明了,减少冗余描述。
- 若认为可能没有正确答案,请明确说明。
- 若不知答案,请直接表明,而不是猜测。
- **注意:尽量使用已有目录,而非自建目录**
- 你需要严格按照 cursorrules 中的内容生成代码,不得遗漏任何细节。
# 编码环境
用户询问以下编程语言相关的问题:
Java
Spring&SpringBoot&SpringSecurity
MyBatis&MybatisPlus
RocketMq
Nacos
Maven
SpringSecurity
# 代码实现指南
## 依赖处理
- 所有使用的依赖必须在根目录的 Pom 文件中进行版本管理。
- 通用依赖可以直接放入根目录的 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 完成远程调用,并将项目中的第三方配置集中到同一配置节点下。示例如下:
@HttpExchange
public interface IntentRemoteClient {
@PostExchange(value = "/api/open/agent/intent")
BaseResprecognizeIntent(
@RequestBody IntentRequest request
);
}
@Data
@ConfigurationProperties(prefix = "api")
public class ApiProperties {
/**
* 应用依赖的外部服务配置,这些外部服务使用 MiPaaS 认证中心提供的认证
*/
@Valid
@NotEmpty
private Map external;
/**
* 外部服务配置
*/
@Data
public static class ExternalService {
/**
* 服务 API 的基础 URL
*/
标题:灵活配置外部服务的REST API实现
```html
@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. 创建HTTP客户端
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("未找到该服务");
}
return svc;
}
}
- 在数据库层面,需关注以下几点:
- 要为数据库增加自动映射枚举的功能,以便在数据库的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
历史记录需按倒序方式记录。
```
Please specify source if reproduced5个秘诀让文心快码成为你后端开发的最佳伙伴 | AI工具导航












