AI编程工具正在重塑软件开发的工作方式。从简单的代码补全到自主完成复杂任务的编程Agent,这个领域在短短两三年内经历了巨大的变化。本文梳理AI编程工具的核心概念、工作原理和实践方法。

一、AI编程工具的演进

1.1 三代AI编程工具

graph LR
    G1["第一代
代码补全
Copilot (2021)"] --> G2["第二代
对话式编程
ChatGPT (2022)"] G2 --> G3["第三代
编程Agent
Cursor/Devin (2024+)"]
代际交互方式能力范围代表产品
第一代行内补全,按Tab接受单行/单函数级别GitHub Copilot
第二代对话框问答代码片段级别ChatGPT、Claude
第三代Agent模式,自主执行跨文件/跨系统级别Cursor、Windsurf、Devin

1.2 当前主流工具对比

工具类型核心特点
GitHub CopilotIDE插件最早的AI编程助手,集成在VS Code/JetBrains等主流IDE中
Cursor独立IDE基于VS Code深度定制,Agent模式、多文件编辑
Windsurf独立IDECodeium推出,强调"Flow"模式的流畅体验
Claude CodeCLI工具终端中运行的编程Agent,适合命令行工作流
Devin云端Agent全自主编程Agent,自带开发环境
Amazon Q DeveloperIDE插件AWS深度集成,擅长云原生开发

二、AI编程工具的工作原理

2.1 代码补全的原理

代码补全是最基础的能力。以Copilot为例:

graph LR
    CTX["上下文收集
当前文件内容
打开的相关文件
光标位置"] --> PROMPT["构造Prompt"] PROMPT --> LLM["LLM
(Codex/GPT-4)"] LLM --> SUGGEST["补全建议"] SUGGEST --> USER["用户
Tab接受 / Esc拒绝"]

上下文收集是关键——模型看到的上下文越好,补全质量越高:

上下文来源作用
当前文件光标前后的代码最直接的上下文
同项目中打开的相关文件理解项目的代码风格和模式
导入的类型定义理解可用的API
注释和文档字符串理解开发者的意图

2.2 对话式编程的原理

Cursor的Chat/Composer模式在代码补全之上增加了:

graph TD
    USER["用户指令
'把这个类重构为MVVM'"] --> GATHER["上下文收集"] GATHER --> ANALYZE["分析需要修改的文件"] ANALYZE --> PLAN["制定修改计划"] PLAN --> EDIT["生成代码修改
(diff格式)"] EDIT --> APPLY["应用修改到文件"] APPLY --> REVIEW["用户审查
接受/拒绝"]

它能理解你的意图,跨多个文件进行修改,并以diff的形式展示变化供你审查。

2.3 Agent模式的原理

Agent模式是当前最强大的交互方式。以Cursor的Agent模式为例:

graph TD
    TASK["用户任务
'给项目添加单元测试'"] --> THINK["思考:需要了解项目结构"] THINK --> EXPLORE["行动:搜索代码库
读取关键文件"] EXPLORE --> PLAN["规划:确定要测试的模块
选择测试框架"] PLAN --> CODE["行动:创建测试文件
编写测试代码"] CODE --> RUN["行动:运行测试"] RUN --> CHECK{测试通过?} CHECK -->|否| FIX["分析失败原因
修复代码"] FIX --> RUN CHECK -->|是| DONE["完成任务"]

Agent模式的关键能力:

  • 代码库探索:搜索、阅读文件,理解项目结构
  • 多文件编辑:同时修改多个文件
  • 命令执行:运行终端命令(编译、测试、Git操作等)
  • 自我修正:运行出错时分析原因并修复
  • MCP工具调用:使用MCP Server连接外部服务

三、Rules:定制AI的行为准则

3.1 什么是Rule

**Rule(规则)**是给AI编程助手设定的持久化指令,让它在项目中始终遵循特定的编码规范、架构约定或工作流程。

不用Rule的问题:每次对话都要重复说"用Swift不要用OC"、“遵循MVVM架构”、“用中文回答”。

用Rule后:这些约束被写入配置文件,自动注入到每次交互中。

3.2 Rule的类型

以Cursor为例,Rule分为多个层级:

类型作用域存储位置用途
全局Rule所有项目用户设置通用偏好(语言、风格)
项目Rule当前项目.cursor/rules/项目特定的规范

项目Rule可以通过 .cursor/rules/ 目录下的 .mdc 文件定义,支持按文件类型自动激活:

---
description: Swift代码规范
globs: ["**/*.swift"]
---

# Swift开发规范

- 使用MVVM架构模式
- 网络请求使用async/await
- UI布局使用SnapKit
- 命名遵循Swift API Design Guidelines
- 每个public方法都要写文档注释

当AI在编辑匹配 **/*.swift 的文件时,这些规则会自动生效。

3.3 Rule的最佳实践

好的Rule

# API设计规范
- 所有网络请求返回 Result<T, NetworkError> 类型
- 错误类型统一使用 NetworkError 枚举
- 请求超时设置为30秒
- 必须支持请求取消

差的Rule

# 规范
- 写好代码(太模糊)
- 不要写bug(废话)
- 用最新的技术(不够具体)

编写Rule的原则:

  • 具体可执行:AI能直接按照Rule行动
  • 有约束边界:明确什么该做、什么不该做
  • 包含示例:给出好/坏代码的对比
  • 适度精简:Rule太长会稀释重点

四、Skill:可复用的能力模块

4.1 什么是Skill

**Skill(技能)**是一种可复用的知识模块,封装了在特定场景下AI应该如何行动的详细指南。

如果说Rule是"你应该遵守的规范",那Skill是"你应该按这个流程做事"。

4.2 Skill vs Rule

维度RuleSkill
定位约束和规范操作流程和知识
触发方式自动生效(全局/按文件类型)按需触发(AI判断或手动指定)
内容长度通常较短(几十行)通常较长(几百行详细指南)
典型内容“用Swift写"“遵循MVVM”“如何创建一个新的网络请求模块"的完整步骤
复用粒度项目级别可跨项目复用

4.3 Skill的结构

一个典型的Skill文件(SKILL.md):

# iOS组件创建向导

## 触发场景
当用户要求创建新的UI组件、页面模块或功能模块时使用。

## 执行步骤

### 1. 确认需求
- 确认组件的功能定位
- 确认使用的架构模式(MVVM)
- 确认是否需要网络请求

### 2. 创建文件结构

ModuleName/ ├── View/ │ └── ModuleNameViewController.swift ├── ViewModel/ │ └── ModuleNameViewModel.swift ├── Model/ │ └── ModuleNameModel.swift └── Service/ └── ModuleNameService.swift


### 3. 文件模板
每个文件的头部使用以下格式:
(提供具体的代码模板...)

### 4. 注册路由
创建完成后,在Router中注册新页面的路由...

### 5. 检查清单
- [ ] 文件命名符合规范
- [ ] ViewModel与View正确绑定
- [ ] 内存管理无循环引用
- [ ] 路由已注册

4.4 Skill的价值

Skill将团队的"隐性知识"转化为AI可理解、可执行的"显性流程”:

graph LR
    subgraph 没有Skill ["没有Skill"]
        NEW["新人/AI"] --> ASK["反复问同事
'这个怎么做?'"] ASK --> LEARN["学习碎片化知识"] LEARN --> MISTAKE["容易遗漏步骤"] end subgraph 有Skill ["有Skill"] NEW2["新人/AI"] --> READ["阅读Skill"] READ --> FOLLOW["按流程执行"] FOLLOW --> QUALITY["质量一致"] end

五、Rule、Skill、MCP的关系

这三个概念在不同层面增强AI编程助手的能力:

graph TD
    subgraph 知识层 ["知识层 — 告诉AI'知道什么'"]
        RULE["Rule
编码规范、项目约定"] SKILL["Skill
操作流程、领域知识"] end subgraph 能力层 ["能力层 — 告诉AI'能做什么'"] MCP_T["MCP Tools
可调用的工具"] FC["Function Calling
工具调用能力"] end subgraph 执行层 ["执行层 — AI'做了什么'"] EDIT["代码编辑"] CMD["命令执行"] API["API调用"] end RULE --> LLM["LLM(大脑)"] SKILL --> LLM MCP_T --> LLM FC --> LLM LLM --> EDIT LLM --> CMD LLM --> API

一个具体的例子:

你让Cursor:"帮我创建一个新的用户信息页面"

1. Rule 告诉AI:
   - 用Swift语言
   - 遵循MVVM架构
   - 用SnapKit做布局

2. Skill 告诉AI:
   - 创建页面的完整流程(哪些文件、什么目录结构)
   - ViewModel与View的绑定方式
   - 创建完成后需要注册路由

3. MCP 让AI能够:
   - 通过GitLab MCP查看相关的设计文档
   - 通过数据库MCP查询已有的字段定义
   
4. AI执行:
   - 按照Skill流程创建文件
   - 文件内容遵循Rule规范
   - 通过MCP获取需要的外部信息

六、Prompt Engineering在编程工具中的应用

6.1 如何高效使用AI编程工具

不同的交互方式适合不同的场景:

场景推荐方式原因
补全当前行/函数Tab补全最快,不打断心流
修改已有代码Inline Edit (Cmd+K)直接在代码上修改
实现新功能Chat/Agent模式需要理解上下文和多文件编辑
跨文件重构Agent模式需要探索代码库和多文件协调
调试错误选中报错 + Chat需要分析上下文

6.2 给AI编程工具的好指令

差的指令

帮我写个网络请求

好的指令

在NetworkService中添加一个获取用户信息的方法:
- 使用 GET /api/v1/users/{id} 接口
- 返回类型 Result<UserInfo, NetworkError>
- 使用async/await
- 参考项目中已有的 fetchOrders 方法的风格

关键原则:

  • 提供参考:指向项目中已有的类似代码
  • 明确约束:API路径、返回类型、错误处理方式
  • 说明上下文:在哪个文件、哪个类中操作
  • 分步骤:复杂任务拆成多个步骤执行

6.3 使用@引用提供精确上下文

大多数AI编程工具支持 @ 符号引用文件、文件夹或符号:

参考 @NetworkService.swift 的请求风格,
在 @UserModule/ 目录下创建用户信息获取功能。
数据模型参考 @UserInfo 结构体的定义。

直接引用比描述更精确,减少AI理解偏差。

七、AI编程工具的局限与应对

7.1 当前的局限

局限表现应对策略
上下文有限大型项目无法完整理解手动提供关键上下文,使用@引用
幻觉编造不存在的API审查生成的代码,运行测试验证
过时知识使用已废弃的APIRule中注明当前使用的SDK版本
架构理解不足打破项目的架构约定通过Rule/Skill固化架构规范
复杂逻辑错误在边界情况上出错人工审查关键逻辑,补充单元测试

7.2 有效的人机协作模式

AI编程工具最大的价值不在于"替代程序员”,而在于改变工作的分配方式:

传统方式:
  人类:思考设计 → 编写代码 → 调试测试 → 审查优化
  
AI辅助方式:
  人类:思考设计 → [AI:编写代码] → [AI:初步调试] → 人类:审查+优化
       ↑                                              |
       └──────────── 人类始终把控方向 ──────────────────┘

人类负责:架构决策、需求理解、代码审查、质量把关 AI负责:代码生成、重复劳动、搜索探索、初步调试

八、总结

AI编程工具的核心概念关系:

graph TB
    subgraph 工具 ["AI编程工具 (Cursor/Copilot/...)"]
        direction TB
        LLM["LLM引擎"]
        
        subgraph 定制化 ["定制化"]
            RULE["Rule
规范约束"] SKILL["Skill
操作流程"] end subgraph 能力扩展 ["能力扩展"] MCP_CONN["MCP
外部工具连接"] FC_CONN["Function Calling
工具调用"] end subgraph 交互模式 ["交互模式"] TAB["Tab补全"] CHAT["对话式"] AGENT["Agent模式"] end end LLM --- 定制化 LLM --- 能力扩展 LLM --- 交互模式
概念一句话总结
Rule给AI设定项目级别的持久规范
Skill给AI提供可复用的操作流程和领域知识
MCP让AI通过标准协议连接外部工具
Function Calling让LLM能够决策和调用工具
Agent模式AI自主规划+执行+反思的完整工作流

这些概念共同构成了当代AI编程工具的技术栈。理解它们的原理和关系,能帮助你更高效地利用AI工具,同时也能更清醒地认识到它的边界——AI是强大的助手,但架构设计的判断力和代码质量的最终把关,仍然依赖于工程师自己。