返回博客

AI 编程工作流优化:从 Prompt 设计到上下文管理

用 AI 写代码很简单,但用好 AI 是另一回事。很多人只是把 AI 当「更智能的搜索引擎」,忽略了它作为编程助手的真正潜力。本文分享我两年多 AI 辅助编程的经验,从 Prompt 设计到上下文管理,帮你建立一套高效的 AI 编程工作流。

📌 适用场景:本文适用于 Claude、ChatGPT、Cursor、Copilot 等主流 AI 编程工具,核心方法论通用。

为什么你的 AI 用不好?

先看几个典型问题:

这些问题的根源是:AI 不懂你的意图,也不了解你的上下文。AI 编程的核心不是「提问技巧」,而是信息传递效率

高效 Prompt 的三层结构

一个好 Prompt = 背景 + 目标 + 约束。我把它总结为「三层结构」:

第一层:背景(Context)

告诉 AI 你在做什么、用的是什么技术栈、有什么限制:

❌ 差 Prompt
帮我写一个登录功能
✅ 好 Prompt
技术栈:Android + Kotlin + Retrofit
需求:实现手机号 + 验证码登录
限制:需要处理网络异常、验证码 60s 倒计时

第二层:目标(Goal)

明确你想要什么输出:

第三层:约束(Constraints)

这是最容易被忽略的,但往往决定了输出质量:

约束示例:
- 不要用第三方库,只用官方 API
- 代码要兼容 Android 8.0+
- 遵循项目现有的 MVVM 架构
- 变量命名用驼峰,注释用中文
💡 经验法则:约束越具体,AI 输出越接近你的预期。宁可多写 3 行约束,也不要来回修改 10 次。

上下文管理:AI 编程的分水岭

很多人用不好 AI 的核心原因是上下文管理不当。AI 的上下文窗口有限,对话越长,「记忆」越模糊。这里有几个关键策略:

策略一:精简输入

不要把整个文件扔给 AI,只给相关部分

❌ 差做法

粘贴 500 行代码,问「哪里有问题」

✅ 好做法

只粘贴报错相关的 20 行 + 错误信息 + 说明「这个函数在做什么」

策略二:结构化信息

用格式化的方式提供信息,AI 更容易理解:

// 项目结构
├── api/          # 网络请求层
├── repository/   # 数据仓库层
├── viewmodel/    # ViewModel 层
└── ui/           # UI 层

// 问题代码(LoginViewModel.kt:45)
fun login(phone: String, code: String) {
    // 这里报 NPE,不知道为什么
}

// 错误日志
java.lang.NullPointerException: user is null
    at LoginViewModel.login(LoginViewModel.kt:47)

策略三:及时重置

当对话超过 20 轮,AI 的回答质量会明显下降。这时候应该:

  1. 总结当前状态:让 AI 总结一下「我们现在做到哪一步了」
  2. 开启新对话:带着总结开启一个干净的对话
  3. 重新提供上下文:只给当前任务需要的最小信息
⚠️ 注意:不要在长对话中频繁切换话题。每个对话专注一个任务,可以并行开多个对话处理不同任务。

迭代优化的黄金法则

AI 很难一次给出完美答案,但迭代优化可以让它越来越接近。核心原则:

法则一:先粗后细

第一轮:给我一个 Retrofit + Kotlin 协程的网络请求示例
第二轮:加上错误处理和 Loading 状态
第三轮:把错误处理改成统一的 ExceptionHandler
第四轮:添加日志拦截器,方便调试

每一轮只加一个需求,让 AI 有明确的优化方向。

法则二:给出反馈

AI 不知道它生成的代码好还是不好,你需要告诉它:

❌ 差反馈

「不对,改一下」

✅ 好反馈

「这个方案有问题:1. Retrofit 的 enqueue 回调在主线程,会阻塞 UI;2. 没有处理网络超时。请改用协程 + withTimeout 重写」

法则三:明确「为什么」

当你拒绝 AI 的方案时,解释原因。这样它会学习你的偏好:

❌ 不要用 GlobalScope,它会导致内存泄漏
✅ 改用 viewModelScope,它会自动取消

几次之后,AI 就会记住你的代码规范。

实战案例:从零到一的完整流程

下面是一个完整的 AI 辅助开发流程,以「实现一个图片缓存组件」为例:

Step 1:需求分析(人工)

需求:图片缓存组件
- 支持内存缓存 + 磁盘缓存
- LRU 淘汰策略
- 支持设置缓存大小上限
- 线程安全

Step 2:初步实现(AI 生成)

Prompt:
技术栈:Kotlin + Android
需求:实现一个双缓存图片加载器
要求:
1. 内存缓存用 LruCache,磁盘缓存用 DiskLruCache
2. 提供 get(url) 和 put(url, bitmap) 接口
3. 自动处理线程切换

Step 3:问题反馈(人工 + AI)

反馈:
1. DiskLruCache 的初始化要在子线程,否则会 ANR
2. 内存缓存大小建议用可用内存的 1/8
3. 需要处理图片加载失败的情况

请针对这三点优化代码

Step 4:边界处理(AI 补全)

追问:
- 如果同一张图片被多次请求,怎么避免重复加载?
- 如果缓存满了,新图片进来怎么处理?

请补充这些边界情况的处理逻辑

Step 5:代码审查(人工)

最终人工检查:

💡 核心原则:AI 负责生成和优化,人负责审查和决策。不要把最终的代码质量交给 AI。

工具推荐:不同场景的选择

不同工具有不同的适用场景:

场景 推荐工具 原因
快速原型 / 学习新技术 ChatGPT / Claude 对话式交互,方便迭代
日常编码 / 代码补全 Cursor / Copilot IDE 集成,上下文感知强
代码审查 / 重构建议 Claude(长上下文) 可以一次性分析大段代码
调试 / 问题排查 ChatGPT + 错误日志 快速定位问题原因
学习新技术 / 系统学习 Claude + 文档 可以结合官方文档深入讲解

常见误区与避坑指南

误区一:AI 生成的代码直接用

AI 生成的代码永远需要人工审查。常见问题:

误区二:Prompt 越长越好

不是的。太长的 Prompt 会稀释关键信息。原则:

误区三:一个对话搞定所有事

这是最常见的错误。应该:

误区四:AI 能理解「你懂的」

AI 不懂你的项目背景、团队规范、历史代码。每次都要显式说明:

// 项目背景
这是一个 MVVM 架构的 Android 项目
使用 Hilt 做依赖注入
使用 Kotlin Flow 做响应式编程

// 团队规范
变量命名用驼峰,常量全大写下划线
注释用中文,代码用英文
不要用 !! 操作符,用 ?.let 或 ?: 处理空值

总结:AI 编程的正确姿势

最后总结几个核心原则:

  1. Prompt 结构化:背景 + 目标 + 约束,三层缺一不可
  2. 上下文精简:只给相关信息,定期重置对话
  3. 迭代优化:先粗后细,每轮只加一个需求
  4. 人工审查:AI 生成只是起点,最终质量由你把关
  5. 工具搭配:不同场景用不同工具,没有银弹

AI 编程不是「让 AI 写代码」,而是「让 AI 帮你写代码」。用好 AI 的关键是高效的信息传递——让 AI 准确理解你的意图和约束,然后才能给出高质量的输出。

📌 进阶阅读:如果你想深入学习 Prompt Engineering,推荐阅读 OpenAI 的 Prompt Engineering Guide 和 Anthropic 的 Claude Prompt Engineering