AI 编程工作流优化:从 Prompt 设计到上下文管理
用 AI 写代码很简单,但用好 AI 是另一回事。很多人只是把 AI 当「更智能的搜索引擎」,忽略了它作为编程助手的真正潜力。本文分享我两年多 AI 辅助编程的经验,从 Prompt 设计到上下文管理,帮你建立一套高效的 AI 编程工作流。
为什么你的 AI 用不好?
先看几个典型问题:
- ❌ Prompt 写了一堆,AI 回答却「答非所问」
- ❌ AI 生成的代码总有小 bug,改来改去
- ❌ 对话越来越长,AI 开始「失忆」或胡言乱语
- ❌ 同样的问题问了好几次,每次答案不一样
这些问题的根源是:AI 不懂你的意图,也不了解你的上下文。AI 编程的核心不是「提问技巧」,而是信息传递效率。
高效 Prompt 的三层结构
一个好 Prompt = 背景 + 目标 + 约束。我把它总结为「三层结构」:
第一层:背景(Context)
告诉 AI 你在做什么、用的是什么技术栈、有什么限制:
帮我写一个登录功能
技术栈:Android + Kotlin + Retrofit
需求:实现手机号 + 验证码登录
限制:需要处理网络异常、验证码 60s 倒计时
第二层:目标(Goal)
明确你想要什么输出:
- 要代码?说明语言、框架、版本
- 要思路?说明你卡在哪一步
- 要优化?说明当前性能指标和目标
第三层:约束(Constraints)
这是最容易被忽略的,但往往决定了输出质量:
约束示例:
- 不要用第三方库,只用官方 API
- 代码要兼容 Android 8.0+
- 遵循项目现有的 MVVM 架构
- 变量命名用驼峰,注释用中文
上下文管理: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 的回答质量会明显下降。这时候应该:
- 总结当前状态:让 AI 总结一下「我们现在做到哪一步了」
- 开启新对话:带着总结开启一个干净的对话
- 重新提供上下文:只给当前任务需要的最小信息
迭代优化的黄金法则
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:代码审查(人工)
最终人工检查:
- 线程安全:synchronized / @Volatile 使用是否正确
- 内存泄漏:是否有 Context 泄漏风险
- 异常处理:是否覆盖所有可能的异常路径
工具推荐:不同场景的选择
不同工具有不同的适用场景:
| 场景 | 推荐工具 | 原因 |
|---|---|---|
| 快速原型 / 学习新技术 | ChatGPT / Claude | 对话式交互,方便迭代 |
| 日常编码 / 代码补全 | Cursor / Copilot | IDE 集成,上下文感知强 |
| 代码审查 / 重构建议 | Claude(长上下文) | 可以一次性分析大段代码 |
| 调试 / 问题排查 | ChatGPT + 错误日志 | 快速定位问题原因 |
| 学习新技术 / 系统学习 | Claude + 文档 | 可以结合官方文档深入讲解 |
常见误区与避坑指南
误区一:AI 生成的代码直接用
AI 生成的代码永远需要人工审查。常见问题:
- 使用了已废弃的 API
- 忽略了边界条件(空值、异常)
- 线程安全问题
- 性能问题(不必要的循环、对象创建)
误区二:Prompt 越长越好
不是的。太长的 Prompt 会稀释关键信息。原则:
- 相关性:只给与当前任务相关的信息
- 结构化:用标题、列表组织信息
- 优先级:最重要的信息放最前面
误区三:一个对话搞定所有事
这是最常见的错误。应该:
- 一个对话专注一个功能模块
- 复杂任务拆分成多个子对话
- 定期总结,开启新对话
误区四:AI 能理解「你懂的」
AI 不懂你的项目背景、团队规范、历史代码。每次都要显式说明:
// 项目背景
这是一个 MVVM 架构的 Android 项目
使用 Hilt 做依赖注入
使用 Kotlin Flow 做响应式编程
// 团队规范
变量命名用驼峰,常量全大写下划线
注释用中文,代码用英文
不要用 !! 操作符,用 ?.let 或 ?: 处理空值
总结:AI 编程的正确姿势
最后总结几个核心原则:
- Prompt 结构化:背景 + 目标 + 约束,三层缺一不可
- 上下文精简:只给相关信息,定期重置对话
- 迭代优化:先粗后细,每轮只加一个需求
- 人工审查:AI 生成只是起点,最终质量由你把关
- 工具搭配:不同场景用不同工具,没有银弹
AI 编程不是「让 AI 写代码」,而是「让 AI 帮你写代码」。用好 AI 的关键是高效的信息传递——让 AI 准确理解你的意图和约束,然后才能给出高质量的输出。