与 AI 结对编程时,最常见的挫败感是"AI 听不懂人话"。这通常不是因为 AI 太笨,而是你给的上下文太多或太少。以下是实战中验证有效的上下文控制方法:
1. 精准裁剪:只给"相关"代码
不要把整个 500 行的文件扔给 AI。提供当前函数加上它的直接依赖(入参类型、调用的子函数签名)即可。
糟糕示例:
"帮我优化这段代码" [粘贴整个 controller.js 文件]
正确做法:
"这是
calculatePrice函数(第 45-60 行),它依赖的DiscountRule类型定义如下。当前性能瓶颈在双重循环,如何优化?"
2. 用注释作为"锚点"
在代码关键位置插入临时注释,告诉 AI 你的意图,这比在对话框里描述更有效。
def process_data(raw_data):
# TODO: AI 请在这里添加空值检查,要求:不修改原数据结构,返回错误码 4001
parsed = json.loads(raw_data)
return transform(parsed)
AI 会优先处理带明确指令的注释区域,且理解这是增量修改而非重写。
3. 提供"骨架"而非"血肉"
对于复杂业务逻辑,给 AI 看接口定义和类型声明,比给实现代码更有用。
高效上下文:
// 当前接口定义
interface Order {
items: LineItem[];
coupon?: string;
userTier: 'gold' | 'silver';
}
// 需要实现:calculateFinalPrice(order: Order): number
// 业务规则:gold 用户额外 95 折,coupon 和 userTier 折扣叠加
这比粘贴 200 行现有计算逻辑更能让 AI 理解你的架构意图。
4. 分阶段传递上下文
如果任务复杂,采用"背景 → 约束 → 具体任务"的三段式:
- 背景:"这是一个基于 DDD 架构的电商项目,这是聚合根的定义..."
- 约束:"数据库不能用事务,因为用了分库分表..."
- 任务:"请实现库存扣减的幂等性方案"
5. 利用文件元信息
主动说明文件路径和技术栈,弥补 AI 看不到项目结构的缺陷:
"这是
src/domain/order/OrderService.ts,NestJS 项目,使用 TypeORM。需要在createOrder方法中..."
常见陷阱
- 给太多历史记录:不要说"昨天改了这个,然后影响了那个...",直接给当前代码状态
- 假设 AI 知道业务术语:首次出现的缩写(如"需要兼容老系统的 OMS 接口")必须解释
- 忽视错误上下文:报 Bug 时,提供具体错误行和堆栈信息,而非只说"报错了"
核心原则:把 AI 当作一个刚入职的高级工程师——给他刚好能理解问题、又不被无关信息淹没的代码片段。