CodeArts Agent 使用技巧与节约Token技巧
CodeArts Agent是huawei cloud CodeArts服务提供的智能代码助手,基于大语言模型技术,为开发者提供代码生成、代码解释、代码优化、单元测试生成等AI辅助编程能力,可以极大的提升编码与调试效率。
本文将介绍CodeArts Agent的使用技巧,以及如何在使用CodeArts Agent时节约Token消耗。
CodeArts Agent两种模式的特点与适用场景
CodeArts Agent提供两种工作模式,适用于不同的开发场景:
快速探索模式
特点:
- 以自然语言对话形式交互,灵活自由
- 快速响应,适合即时性问题解决
- 不需要预先定义规范和流程
- Agent自主理解需求并直接执行
- 适合探索性、实验性开发
工作流程:
用户描述需求 → Agent理解并执行 → 返回结果 → 用户反馈 → 迭代优化
使用场景:
-
快速原型开发:验证想法、构建MVP
快速实现一个待办事项列表的前端页面 -
代码片段生成:生成工具函数、算法实现
写一个JavaScript函数,实现数组去重并保持原顺序 -
问题诊断与分析:分析错误、解释代码
这段代码为什么会内存泄漏?如何修复? -
技术方案咨询:技术选型、架构建议
微服务架构下如何实现分布式事务? -
代码审查与优化:发现潜在问题
检查这个API接口是否存在安全漏洞 -
学习与探索:理解新技术、框架特性
解释Vue3 Composition API与Options API的区别
优势:
- 响应快速,交互简单
- 无需准备文档,即问即答
- 适合快速迭代和实验
局限:
- 复杂项目可能缺乏系统性规划
- 需要用户具备一定的引导能力
- 大型任务可能需要多次交互
规范驱动模式
特点:
工作流程:
需求分析 → 生成spec.md → 生成design.md → 生成tasks.md → 逐步实现 → 验证交付
核心文档:
-
spec.md(需求规格文档)
- 描述"做什么"(What)
- 包含功能需求、非功能需求、约束条件
- 不包含技术实现细节
-
design.md(技术设计文档)
- 描述"怎么做"(How)
- 包含架构设计、技术选型、接口设计
- 数据模型、关键算法等
-
tasks.md(任务清单)
- 将设计分解为可执行的开发任务
- 包含任务优先级、依赖关系
- 支持任务状态跟踪
使用场景:
-
正式项目开发:企业级应用、产品开发
开发一个电商平台的订单管理系统 需求:订单创建、支付、发货、退款等完整流程 -
复杂功能实现:多模块、多文件协作
实现用户权限管理系统 包含:角色管理、权限分配、访问控制、审计日志 -
团队协作项目:需要文档沉淀
重构遗留系统,需要详细的设计文档供团队评审 -
需求明确的项目:已有清晰需求文档
根据产品需求文档实现用户中心模块 -
可追溯性要求:需要记录设计决策
金融系统开发,需要完整的设计文档和实现记录
使用示例:
用户:开发一个博客系统的评论模块
Agent执行流程:
1. 创建spec.md
- 功能需求:发表评论、回复评论、删除评论、评论审核
- 非功能需求:支持表情、防XSS、分页加载
- 约束条件:用户需登录、评论长度限制
2. 创建design.md
- 数据模型:Comment表设计
- 接口设计:RESTful API
- 技术选型:数据库、缓存策略
- 安全设计:内容过滤、权限控制
3. 创建tasks.md
- [ ] 创建Comment实体类和数据库表
- [ ] 实现评论DAO层
- [ ] 实现评论Service层
- [ ] 实现评论Controller层
- [ ] 添加评论审核功能
- [ ] 编写单元测试
- [ ] 集成测试
4. 逐步实现每个任务
优势:
- 需求、设计、实现高度一致
- 自动生成完整文档
- 适合团队协作和代码评审
- 便于后续维护和迭代
局限:
- 前期需要时间编写规格文档
- 不适合快速原型和实验性开发
- 对需求明确性要求较高
模式选择建议
| 场景 | 推荐模式 | 原因 |
|---|---|---|
| 快速验证想法 | 快速探索 | 无需文档,快速迭代 |
| 学习新技术 | 快速探索 | 对话式学习更高效 |
| 代码片段生成 | 快速探索 | 简单任务无需文档 |
| Bug分析修复 | 快速探索 | 问题导向,快速响应 |
| 企业级项目开发 | 规范驱动 | 需要完整文档和设计 |
| 多人协作项目 | 规范驱动 | 文档便于团队协作 |
| 复杂功能模块 | 规范驱动 | 需要系统性规划 |
| 需求评审项目 | 规范驱动 | spec.md便于评审 |
| 重构遗留系统 | 规范驱动 | 需要设计文档记录 |
混合使用建议:
- 项目初期用规范驱动模式建立整体架构和核心模块
- 具体细节实现用快速探索模式快速迭代
- 遇到问题时切换到快速探索模式诊断解决
- 解决后回到规范驱动模式继续系统开发
切换时机:
- 快速探索 → 规范驱动:当任务变复杂、需要文档沉淀时
- 规范驱动 → 快速探索:当遇到具体问题需要快速解决时
一、高效编码技巧
1.1 提供清晰明确的任务描述
好的示例:
请实现一个用户注册功能,包含以下要求:
1. 用户名:6-20字符,仅允许字母、数字、下划线
2. 密码:至少8位,包含大小写字母和数字
3. 邮箱:验证格式正确性
4. 返回详细的错误提示信息
避免模糊描述:
帮我写个注册功能
1.2 分步骤处理复杂任务
对于复杂功能,建议拆分为多个小任务:
- 先实现核心数据结构和模型
- 再实现业务逻辑层
- 最后实现接口层和错误处理
示例:
第一步:请创建用户数据模型,包含用户名、密码、邮箱字段
第二步:基于模型实现注册验证逻辑
第三步:添加数据库存储功能
1.3 充分利用上下文
- 在同一会话中完成相关任务,Agent会记住之前的代码
- 引用已生成的代码:
基于上面的User类,添加登录方法 - 避免重复描述相同需求
1.4 提供必要的上下文信息
项目使用Spring Boot 3.0 + MyBatis
数据库是MySQL 8.0
请实现用户注册接口
1.5 善用代码审查
完成编码后,让Agent审查代码:
请检查上面的代码是否存在:
1. 安全漏洞
2. 性能问题
3. 边界条件处理
二、调试技巧
2.1 提供完整的错误信息
推荐做法:
运行时报错:
TypeError: Cannot read property 'id' of undefined
at UserController.update (src/controllers/user.ts:45)
at processTicksAndRejections (internal/process/task_queues.js:95)
相关代码:
async update(req: Request, res: Response) {
const user = await User.findById(req.params.id);
user.id = req.body.id; // 第45行
}
2.2 描述预期行为与实际行为
预期:用户不存在时应返回404
实际:返回500内部错误
代码:[粘贴相关代码]
2.3 逐步缩小问题范围
- 先让Agent分析错误原因
- 根据建议修改代码
- 再次测试并反馈结果
- 循环直到问题解决
2.4 利用Agent的代码解释能力
请解释这段代码的执行流程,特别是异步处理部分:
[粘贴代码]
2.5 单元测试辅助调试
为这个函数生成单元测试,覆盖以下场景:
1. 正常输入
2. 空值输入
3. 边界值输入
4. 异常输入
三、节约Token技巧
3.1 避免重复粘贴大段代码
不推荐:
请帮我优化这段代码:
[粘贴500行代码]
推荐:
请帮我优化 src/services/UserService.ts 中的 validatePassword 方法
Agent可以直接读取项目文件,无需手动粘贴。
3.2 精简问题描述
冗余描述:
你好,我遇到了一个问题,想请你帮忙看看。
是这样的,我在做一个项目,然后有个功能不太对,
具体来说是用户登录功能,登录的时候总是报错,
错误信息是...,你能帮我看看吗?
精简描述:
用户登录报错:Invalid credentials
代码位置:src/auth/login.ts:32
请分析原因
3.3 合并相关请求
不推荐(多次请求):
1. 创建User类
2. 添加name属性
3. 添加email属性
4. 添加validate方法
推荐(一次请求):
创建User类,包含name、email属性和validate方法
3.4 使用引用而非重复
基于刚才生成的UserService,添加日志记录功能
而非重新描述UserService的所有细节。
3.5 明确指定文件范围
在 src/controllers 目录下查找处理用户认证的代码
而非让Agent搜索整个项目。
3.6 利用Agent的主动探索能力
让Agent自己查找相关代码:
分析项目中的数据库连接配置,找出可能导致连接失败的原因
3.7 适当使用代码片段
只需粘贴关键代码片段:
报错位置:
const result = data.items.map(item => item.value);
data结构:{ items: null }
而非整个文件。
四、最佳实践总结
4.1 编码阶段
| 技巧 | 说明 | Token节省 |
|---|---|---|
| 明确需求 | 提供详细的功能描述和约束条件 | 减少30% |
| 分步实现 | 复杂任务拆分为小任务 | 减少20% |
| 利用上下文 | 在同一会话完成相关任务 | 减少40% |
| 引用文件 | 让Agent直接读取文件 | 减少50% |
4.2 调试阶段
| 技巧 | 说明 | Token节省 |
|---|---|---|
| 完整错误信息 | 提供错误堆栈和相关代码 | 减少25% |
| 描述差异 | 说明预期vs实际行为 | 减少20% |
| 逐步调试 | 一次解决一个问题 | 减少30% |
4.3 通用原则
- 精准:一次只问一个问题
- 简洁:删除无关的客套话
- 结构化:使用列表、代码块组织信息
- 引用:优先引用已有上下文而非重复描述
- 文件路径:提供文件路径让Agent自己读取
五、常见场景示例
场景1:新功能开发
需求:实现商品搜索功能
技术栈:Spring Boot + Elasticsearch
要求:
1. 支持关键词搜索
2. 支持分类筛选
3. 支持价格区间过滤
4. 分页返回结果
场景2:Bug修复
问题:订单支付后状态未更新
错误日志:[粘贴关键日志]
相关代码:src/services/OrderService.java:pay方法
数据库:订单表status字段
请分析原因并修复
场景3:代码重构
重构目标:src/utils/validator.ts
问题:
1. 函数过长(300行)
2. 重复代码多
3. 缺少类型定义
要求:拆分为多个小函数,提取公共逻辑
场景4:性能优化
性能问题:API响应时间超过3秒
接口:GET /api/users/search
数据量:用户表100万条
已索引:username, email
请分析瓶颈并优化
六、Token消耗对比示例
示例1:创建CRUD接口
高消耗方式(约2000 tokens):
请帮我创建一个完整的用户管理CRUD接口,
包括创建用户、读取用户、更新用户、删除用户,
每个操作都要有参数验证、错误处理、日志记录,
使用Express框架,TypeScript编写,
需要连接MySQL数据库,使用TypeORM,
用户表有id、username、password、email、createdAt、updatedAt字段,
密码需要加密存储,邮箱需要格式验证,
返回JSON格式,遵循RESTful规范...
低消耗方式(约500 tokens):
创建用户CRUD接口(Express + TypeScript + TypeORM)
字段:id, username, password(加密), email(验证), createdAt, updatedAt
RESTful风格,包含验证和错误处理
节省:75%
示例2:调试空指针异常
高消耗方式(约1500 tokens):
你好,我遇到了一个问题,程序运行的时候报错了,
错误信息是NullPointerException,我查了一下,
好像是某个对象是null,但是我不确定是哪个对象,
我把整个文件都贴给你看看,你帮我分析一下:
[粘贴整个300行文件]
你能告诉我哪里出了问题吗?应该怎么修改呢?
低消耗方式(约300 tokens):
NullPointerException at UserService.java:45
代码:user.getProfile().getAge()
user和profile都不应为null
请分析可能原因
节省:80%
七、高级技巧
7.1 使用模板请求
为常见任务准备模板:
创建Service模板:
创建[服务名]Service,负责[职责]
依赖:[依赖项]
方法:[方法列表]
异常处理:[异常类型]
7.2 批量操作
为以下文件生成单元测试:
- src/services/UserService.ts
- src/services/OrderService.ts
- src/services/ProductService.ts
7.3 代码生成后立即验证
生成代码后,请:
1. 检查类型安全
2. 验证边界条件
3. 确认错误处理完整
7.4 利用Agent的探索能力
分析项目中所有使用了deprecated API的地方,列出文件和行号
总结 :高效使用CodeArts Agent的关键是精准、简洁、结构化。通过合理组织请求、充分利用上下文、避免重复信息,可以在保证开发效率的同时显著降低Token消耗。