對比測評:為什么AI編程工具需要 Rules 能力?
通義靈碼 Project Rules
在開始體驗通義靈碼 Project Rules 之前,我們先來簡單了解一下什么是通義靈碼 Project Rules?
大家都知道,在使用 AI 代碼助手的時候,有時候生成的代碼不是自己想要的,或者說生成的代碼采納后還需要人工修改一部分。這其實就是當(dāng)模型對于你的描述不能正確理解,或者說理解了你的描述,但是沒有適當(dāng)?shù)姆桨笗r,大模型會根據(jù)自己的規(guī)則來生成相似的自己認(rèn)為對的代碼,這就是我們常說的模型幻覺。
那么當(dāng)模型生成代碼不精準(zhǔn)的時候,是否有什么手段可以硬控 AI ,根據(jù)你的代碼風(fēng)格和偏好生成代碼和回復(fù)?現(xiàn)在有了,你可以感受一下通義靈碼 Project Rules 的效果。
舉個例子
這里我們來舉個小例子。比如我想要使用阿里云百煉服務(wù)平臺的模型在自己的項目中引入一個 DeepSeek 調(diào)用,那么我就可以拿到阿里云百煉服務(wù)平臺的 curl 的調(diào)用方法

復(fù)制 curl 的調(diào)用內(nèi)容放在通義靈碼的對話框中,輸入我想要的內(nèi)容
curl -X POST "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation" \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-r1",
"input":{
"messages":[
{
"role": "user",
"content": "你是誰?"
}
]
},
"parameters": {
"result_format": "message"
}
}' 生成java代碼
以下是通義靈碼為我們生成的使用 Java 調(diào)用 DeepSeek 的 API 接口的調(diào)用工具類:

這里通過截圖我們可以看到,生成的代碼基本上沒有注釋,生成的效果功能上稍作改動就可以用,采納率 95% 以上。
下面我們再來為通義靈碼定義 AI 編碼規(guī)則,定義完 AI 編碼規(guī)則之后再來看一下基于上面的 curl 調(diào)用方法生成的 Java 代碼的效果。
環(huán)境準(zhǔn)備
在配置通義靈碼 Project Rules AI 編碼規(guī)則之前,首先需要我們確認(rèn)一下我們的通義靈碼插件版本要在 v2.1.5 及以上。

規(guī)則配置
這里我們在 IDEA 開發(fā)工具的 setting 彈框中找到【Lingma】,勾選啟用并點擊【編輯】。

在編輯頁面輸入具體的編碼規(guī)則 Project Rules ,這里的規(guī)則我們直接使用官方提供的 Java 編碼規(guī)則,具體規(guī)則內(nèi)容的 markdown 語法格式如下:
你是一個資深的 java 專家,請在開發(fā)中遵循如下規(guī)則:
- 嚴(yán)格遵循 SOLID、DRY、KISS、YAGNI 原則
- 遵循 OWASP 安全最佳實踐(如輸入驗證、SQL 注入防護(hù))
- 采用 分層架構(gòu)設(shè)計,確保職責(zé)分離
- 代碼變更需通過 單元測試覆蓋(測試覆蓋率 ≥ 80%)
技術(shù)棧規(guī)范
技術(shù)棧要求:
1)框架:Spring Boot 3.x + Java 17
2)依賴:
-
核心:Spring Web, Spring Data JPA, Lombok
-
數(shù)據(jù)庫:PostgreSQL Driver 或其他關(guān)系型數(shù)據(jù)庫驅(qū)動
-
其他:Swagger (SpringDoc), Spring Security (如需權(quán)限控制)
應(yīng)用邏輯設(shè)計規(guī)范
分層架構(gòu)原則

核心代碼規(guī)范
1. 實體類(Entity)規(guī)范
@Entity
@Data // Lombok 注解
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank(message = "用戶名不能為空")
@Size(min = 3, max = 50)
private String username;
@Email
private String email;
// 關(guān)聯(lián)關(guān)系使用懶加載
@ManyToOne(fetch = FetchType.LAZY)
private Department department;
}
2. 數(shù)據(jù)訪問層(Repository)規(guī)范
public interface UserRepository extends JpaRepository<User, Long> {
// 命名查詢
Optional<User> findByUsername(String username);
// 自定義 JPQL 查詢
@Query("SELECT u FROM User u JOIN FETCH u.department WHERE u.id = :id")
@EntityGraph(attributePaths = {"department"})
Optional<User> findUserWithDepartment(@Param("id") Long id);
}
3. 服務(wù)層(Service)規(guī)范
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public ApiResponse<UserDTO> createUser(UserDTO dto) {
// 業(yè)務(wù)邏輯實現(xiàn)
User user = User.builder().username(dto.getUsername()).build();
User savedUser = userRepository.save(user);
return ApiResponse.success(UserDTO.fromEntity(savedUser));
}
}
4. 控制器(RestController)規(guī)范
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@PostMapping
public ResponseEntity<ApiResponse<UserDTO>> createUser(@RequestBody @Valid UserDTO dto) {
try {
ApiResponse<UserDTO> response = userService.createUser(dto);
return ResponseEntity.ok(response);
} catch (Exception e) {
return GlobalExceptionHandler.errorResponseEntity(e.getMessage(), HttpStatus.BAD_REQUEST);
}
}
}
數(shù)據(jù)傳輸對象(DTO)規(guī)范
// 使用 record 或 @Data 注解
public record UserDTO(
@NotBlank String username,
@Email String email
) {
public static UserDTO fromEntity(User entity) {
return new UserDTO(entity.getUsername(), entity.getEmail());
}
}
全局異常處理規(guī)范
1. 統(tǒng)一響應(yīng)類(ApiResponse)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ApiResponse<T> {
private String result; // SUCCESS/ERROR
private String message;
private T data;
// 工廠方法
public static <T> ApiResponse<T> success(T data) {
return new ApiResponse<>("SUCCESS", "操作成功", data);
}
public static <T> ApiResponse<T> error(String message) {
return new ApiResponse<>("ERROR", message, null);
}
}
2. 全局異常處理器(GlobalExceptionHandler)
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(EntityNotFoundException.class)
public ResponseEntity<ApiResponse<?>> handleEntityNotFound(EntityNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(ApiResponse.error(ex.getMessage()));
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ApiResponse<?>> handleValidationErrors(MethodArgumentNotValidException ex) {
String errorMessage = ex.getBindingResult()
.getFieldErrors()
.stream()
.map(error -> error.getField() + ": " + error.getDefaultMessage())
.collect(Collectors.joining(", "));
return ResponseEntity.badRequest().body(ApiResponse.error(errorMessage));
}
}
安全與性能規(guī)范
1. 輸入校驗:
-
使用
@Valid注解 + JSR-303 校驗注解(如@NotBlank,@Size) -
禁止直接拼接 SQL 防止注入攻擊
2. 事務(wù)管理:
@Transactional 注解僅標(biāo)注在 Service 方法上- 避免在循環(huán)中頻繁提交事務(wù)
3. 性能優(yōu)化:
- 使用
@EntityGraph預(yù)加載關(guān)聯(lián)關(guān)系 - 避免在循環(huán)中執(zhí)行數(shù)據(jù)庫查詢(批量操作優(yōu)先)
代碼風(fēng)格規(guī)范
1. 命名規(guī)范:
- 類名:
UpperCamelCase(如UserServiceImpl) - 方法/變量名:
lowerCamelCase(如saveUser) - 常量:
UPPER_SNAKE_CASE(如MAX_LOGIN_ATTEMPTS)
2. 注釋規(guī)范:
- 方法必須添加注釋且方法級注釋使用 Javadoc 格式
- 計劃待完成的任務(wù)需要添加
// TODO標(biāo)記 - 存在潛在缺陷的邏輯需要添加
// FIXME標(biāo)記
3. 代碼格式化:
- 使用 IntelliJ IDEA 默認(rèn)的 Spring Boot 風(fēng)格
- 禁止手動修改代碼縮進(jìn)(依賴 IDE 自動格式化)
部署規(guī)范
部署規(guī)范
- 生產(chǎn)環(huán)境需禁用
@EnableAutoConfiguration的默認(rèn)配置 - 敏感信息通過
application.properties外部化配置 - 使用
Spring Profiles管理環(huán)境差異(如dev,prod)
擴(kuò)展性設(shè)計規(guī)范
1. 接口優(yōu)先:
服務(wù)層接口(UserService)與實現(xiàn)(UserServiceImpl)分離
2. 擴(kuò)展點預(yù)留:
關(guān)鍵業(yè)務(wù)邏輯需提供** Strategy 或 Template 模式支持?jǐn)U展
3. 日志規(guī)范:
使用 SLF4J 記錄日志(禁止直接使用 System.out.println)核心操作需記錄 INFO 級別日志,異常記錄 ERROR 級別
在增加了 rules 規(guī)則之后,我們再來執(zhí)行一次上面基于 curl 請求生成 java 調(diào)用代碼的需求。執(zhí)行之后,我們可以看到對第一次生成的 DeepSeekClient.java 類進(jìn)行了按照 rules 規(guī)則的變更:


可以看到已經(jīng)按照我們添加的異常處理規(guī)則以及編碼規(guī)范進(jìn)行了優(yōu)化。
編輯后的靈碼規(guī)則文件的的位置在項目的具體目錄位置如圖,如果沒有看到的話刷新一下磁盤就看到了:

總的來說,通義靈碼 IDE 插件提供 AI 規(guī)則的設(shè)置功能,開發(fā)者可以通過設(shè)定個性化規(guī)則提示詞,在智能問答和 AI 程序員中,引導(dǎo)模型生成更為精準(zhǔn)、符合個人偏好或項目風(fēng)格的代碼與回答。

浙公網(wǎng)安備 33010602011771號