如果你使用过 Cursor、Claude Code 或其他 AI Coding 工具,应该遇到过这样的情况:
同样一个模型,同样一句需求,在一个项目里表现很好,换到另一个项目却经常答非所问。
你让它修改一个接口,它改错了文件;让它增加一个功能,它没有遵守项目现有的架构;明明项目里已经有一个工具类,它却重新写了一套;甚至你已经告诉它某个规则不能违反,它还是会继续这么做。
很多时候,问题并不是模型不会写代码。
而是它不知道足够多的东西。
这也是 Context Engineering 开始受到关注的原因。
如果说 Prompt Engineering 关注的是「我应该怎么告诉模型」,那么 Context Engineering 更关注:为了让模型完成任务,我到底应该让它知道什么?
这两个问题看起来很接近,但面对复杂 Agent 时,区别会越来越明显。
1. Prompt Engineering 解决什么问题
Prompt Engineering 并没有过时。
在简单任务中,一个好的 Prompt 仍然非常重要。
例如:
请把下面的 方法重构一下:
要求:
1. 保持接口兼容;
2. 降低数据库查询次数;
3. 增加异常处理;
4. 给出修改后的代码。
这里已经包含了任务、约束和输出要求。
对于一次性的文本生成、代码生成、总结、分类等任务,这样的 Prompt 通常已经足够。
但软件开发中的很多任务并不是一次性的。
例如:
给这个项目增加用户注册功能。
这句话真正包含的信息其实非常少。
Agent 要完成它,至少还需要知道:
项目是什么框架?
目录结构是什么?
Controller 怎么写?
Service 怎么写?
数据库表在哪里?
Model 怎么定义?
验证规则是什么?
异常怎么处理?
返回格式是什么?
认证体系是什么?
测试怎么写?
哪些代码不能修改?
如果这些信息没有进入 Agent 的上下文,那么你即使把 Prompt 写得再漂亮,也很难得到稳定的结果。
所以,复杂任务真正的问题开始从:
「怎么写 Prompt?」
变成:
「怎么给 Agent 准备一个足够好的工作环境?」
这就是 Context Engineering 的核心。
Anthropic 将 Context 描述为 Agent 的关键但有限资源,并强调上下文需要被持续地策划、管理和压缩,而不是简单地把更多信息塞进 Context Window。
2. Context 到底是什么
Context 很容易被理解成「Prompt」。
实际上,Prompt 只是 Context 的一部分。
对于一个 Agent 来说,可以把 Context 粗略理解为:
Context
│
├── System Instructions
├── User Request
├── Project Rules
├── Conversation History
├── Repository Context
├── Retrieved Knowledge
├── Tool Definitions
├── Tool Results
├── Memory
├── Task State
└── Previous Actions
例如一个 Coding Agent 正在修改 PHP 项目。
它当前真正需要的 Context 可能是:
任务:
增加用户注册接口。
项目规则:
使用 Hyperf 3.1。
Controller 不直接访问数据库。
业务逻辑放在 Service。
统一使用项目异常体系。
相关代码:
app/Controller/UserController.php
app/Service/UserService.php
app/Model/User.php
数据库:
users 表结构。
测试:
tests/Controller/UserControllerTest.php
当前状态:
代码已经修改,但测试失败。
这些内容共同构成了 Agent 当前所处的「工作环境」。
因此,Context 并不等于:
Prompt + 更多文字
更准确地说:
Context 是 Agent 在当前任务中能够看到、依赖和使用的信息集合。
这也是为什么 Context Engineering 比单纯 Prompt Engineering 更接近一个系统工程问题。
3. 为什么“更多 Context”并不一定更好
这里有一个很容易犯的错误:
既然 Context 很重要,那是不是把所有东西都塞进去就行?
当然不是。
假设一个项目有:
1000 个 PHP 文件
200 张数据库表
5000 条历史 Commit
100 篇技术文档
几十万行日志
你全部交给 Agent,并不意味着它会因此变得更聪明。
相反,大量无关信息可能让 Agent 更难找到真正重要的内容。
例如你要求:
修复 UserController 的参数验证问题。
结果给它:
整个 Repository
+
全部 Git 历史
+
所有数据库表
+
所有日志
+
所有 API 文档
真正有价值的信息可能只有:
UserController
UserRequest
ValidationService
相关测试
项目验证规范
所以 Context Engineering 的关键不是:
让 Agent 获得更多信息。
而是:
让 Agent 在正确的时间获得正确的信息。
Anthropic 的实践文章也特别强调了这一点:Context 是有限资源,Agent 的上下文管理需要考虑信息选择、压缩、隔离和任务阶段,而不是无限增加输入内容。
4. Context Engineering 到底在做什么
如果把 Context Engineering 简单化,可以把它理解成四件事情:
获取
↓
筛选
↓
组织
↓
维护
首先是获取。
Agent 需要知道哪些信息?
例如:
Repository
Documentation
Database
Knowledge Base
Memory
Tools
然后是筛选。
并不是所有信息都与当前任务相关。
例如:
当前任务:修改支付回调
高相关:
PaymentService
PaymentController
PaymentCallback
支付接口文档
相关测试
低相关:
用户头像
文章系统
后台菜单
日志系统
接下来是组织。
即使信息本身正确,如果组织方式混乱,Agent 仍然可能理解错误。
例如与其给它几十个散乱规则,不如明确组织:
项目规范
架构约束
编码规范
当前任务
相关文件
测试要求
完成标准
最后是维护。
Agent 完成一个复杂任务往往不是一次调用。
它可能:
读取代码
↓
修改代码
↓
运行测试
↓
发现错误
↓
读取错误信息
↓
修改代码
↓
重新测试
每一步都会产生新的状态。
因此 Context 也会不断变化。
这也是 Agent 与普通 Chatbot 的一个重要区别。
5. RAG、Memory 和 Tools 都属于 Context 的一部分
理解这一点之后,很多 AI 技术之间的关系会变得清楚。
例如 RAG。
传统 RAG 通常是:
用户问题
↓
检索知识
↓
相关文档
↓
LLM
↓
回答
从 Context Engineering 的角度看,本质上是:
在模型回答问题之前,为它动态准备相关 Context。
Memory 也是类似的。
例如 Agent 之前已经知道:
用户喜欢 PHP / Hyperf。
项目使用 MySQL。
项目采用 Redis。
这些历史信息如果在当前任务中有价值,就可以进入当前 Context。
Tools 同样如此。
当 Agent 调用:
search_code()
工具返回:
UserService.php
UserController.php
UserRepository.php
这些结果也会成为 Agent 下一步决策所依赖的 Context。
所以可以把它们放在一起理解:
Context
│
┌────────────┼────────────┐
↓ ↓ ↓
RAG Memory Tools
│ │ │
知识检索 历史状态 外部能力
│ │ │
└────────────┼────────────┘
↓
Agent
这也是为什么 Context Engineering 与 RAG、Memory、Tool Calling、MCP 最终会产生非常紧密的联系。
6. Context Engineering 在 AI Coding 中尤其重要
AI Coding 是理解 Context Engineering 最好的场景之一。
假设你对 AI 说:
给这个项目增加 Refresh Token。
如果 AI 只看到这一句话,它只能依靠自己的经验猜。
但如果它能够获得:
项目结构
+
现有登录代码
+
Token 服务
+
数据库结构
+
项目编码规范
+
异常规范
+
测试代码
+
当前 Git 状态
它对项目的理解就完全不同了。
例如项目已经存在:
app/
├── Controller/
├── Service/
├── Model/
├── Middleware/
└── Exception/
并且项目规定:
Controller
↓
Service
↓
Repository
↓
Model
如果 Agent 不知道这个规则,它可能直接在 Controller 中写数据库逻辑。
代码本身可能完全可以运行。
但它已经破坏了项目架构。
所以 AI Coding 中一个非常重要的问题是:
如何让 Agent 理解“这个项目应该怎么写”,而不仅仅是“这段代码应该怎么写”。
这也是 Cursor Rules、AGENTS.md、项目文档、代码库索引等机制存在价值的原因。
它们本质上都是在向 Agent 提供项目 Context。
7. Context 的质量比 Context 的数量更重要
对于 Agent 来说,可以简单建立一个判断:
Context Quality
≈
相关性
+
完整性
+
一致性
+
时效性
+
可验证性
例如:
“项目使用 Redis”
这是一条信息。
但如果进一步告诉 Agent:
项目使用 Redis 7。
缓存统一通过 CacheService 操作。
禁止 Controller 直接访问 Redis。
分布式锁使用 Redis LockService。
缓存 Key 必须使用项目统一前缀。
这就变成了更有价值的 Context。
因为它不仅告诉 Agent「是什么」,还告诉它:
怎么用
在哪里用
什么时候不能用
应该遵守什么规则
2026 年的一些研究已经开始尝试把 Context Engineering 作为独立的工程方法进行研究。例如相关研究将 Context 的质量进一步拆分为相关性、充分性、隔离性、经济性和来源可追溯性等维度。不过这些仍属于快速发展的研究领域,不应该把某一种学术框架当成行业统一标准。
这一点需要特别说明:
Context Engineering 目前并不是一个已经标准化的协议或统一规范。
它更像是 AI Agent 工程实践中逐渐形成的一种方法论。
8. 从 Prompt Engineering 到 Context Engineering
两者并不是替代关系。
更准确的关系应该是:
Prompt Engineering
↓
告诉模型“应该怎么做”
│
▼
Context Engineering
↓
提供模型“完成任务需要知道什么”
│
▼
Agent Engineering
↓
让 Agent 能够持续地理解、行动和验证
例如:
Prompt:
请实现用户注册功能。
这是任务。
再加入:
Rules:
Controller 不处理业务逻辑。
所有数据库操作必须通过 Repository。
异常统一使用 BusinessException。
这是约束。
再加入:
Repository:
UserController.php
UserService.php
UserRepository.php
User.php
这是代码 Context。
再加入:
Tool:
运行 PHPUnit。
这是执行能力。
再加入:
Test:
UserRegisterTest.php
这是验证 Context。
最终 Agent 才真正拥有完成任务所需要的工作环境。
所以可以把一个复杂 Agent 的输入理解成:
任务
+
规则
+
相关知识
+
当前状态
+
工具
+
历史
+
验证标准
而 Prompt 只是其中一个部分。
9. Context Engineering 的难点:动态 Context
真正复杂的 Agent 并不会一直使用一份固定 Context。
假设 Agent 正在处理一个 Bug:
用户:
修复订单退款接口。
第一阶段,它可能需要:
订单模块
退款模块
相关数据库结构
第二阶段发现:
第三方支付接口超时。
那么新的 Context 就应该加入:
支付 SDK
支付配置
超时处理
相关日志
第三阶段运行测试:
RefundServiceTest
失败
新的 Context 又变成:
测试代码
测试错误
调用栈
当前修改
因此:
Context
不是固定 Prompt
而是:
随着任务执行不断变化的状态。
这也是长时间运行 Agent 面临的一个核心问题。
如果一个 Agent 执行几分钟甚至几个小时,所有历史消息、工具结果和中间状态都不断累积,Context 很快就会变得庞大。
所以实际 Agent 系统需要进行:
Context Selection
Context Compression
Context Summarization
Context Isolation
Context Retrieval
Anthropic 关于长时间运行 Agent 的工程实践中,也专门讨论了 Context Management 和 Compaction,用于避免 Agent 因为上下文持续增长而耗尽 Context Window。
这说明一个重要事实:
Context Engineering 不是“把资料塞给模型”,而是管理 Agent 在整个任务生命周期中所需要的信息。
10. Context Engineering 会成为 AI 开发的基础能力
如果只是使用 ChatGPT 生成一段代码,Prompt Engineering 仍然非常有价值。
但当你开始构建:
AI Coding Agent
RAG
Knowledge Base
MCP
Multi-Agent
AI Workflow
Autonomous Agent
问题就会逐渐发生变化。
你会开始问:
Agent 应该知道什么?
这些信息从哪里来?
哪些信息应该进入 Context?
什么时候进入?
什么时候应该删除?
工具结果应该怎么处理?
历史信息应该保存多久?
哪些信息可信?
哪些信息不能被 Agent 使用?
Context 太长怎么办?
多个 Agent 应该共享哪些 Context?
这些问题已经不是简单的 Prompt 技巧,而是系统设计问题。
所以我认为 Context Engineering 最值得理解的地方,不是又出现了一个新的 AI 术语,而是它提醒我们:
当 AI 从“回答问题”进入“完成任务”,决定 Agent 表现的就不再只是模型本身,而是它在执行任务时所处的整个信息环境。
模型决定了 Agent 能够做到什么。
Context 决定了 Agent 知道什么、理解什么以及基于什么做决定。
Tools 决定了 Agent 能够做什么。
而验证机制决定了 Agent 做得是否正确。
这几者结合起来,才构成真正可靠的 Agent 系统。