从 Prompt 到 Context Engineering:GPT 和 Codex 的真正门槛,是上下文系统设计
使用 GPT 和 Codex
2026年7月
start/aixufei/c/o/m
仍然把重点放在“提示词”上。
怎么问更准?
怎么让它写得更好?
怎么让它少废话?
怎么让它生成代码更稳定?
怎么让它理解我的需求?
这些问题当然有价值,但如果只停留在 Prompt 层面,会很容易遇到瓶颈。
因为 GPT 和 Codex 真正处理的,并不是一句提示词,而是一个上下文系统。
模型的输出质量,不只取决于你最后一句话写得好不好,而取决于它能看到什么、理解什么、记住什么、忽略什么、验证什么。
这就是为什么同样一个模型,在不同人手里效果差距很大。
有人只会输入一句:
帮我优化这个项目。
结果模型生成一堆泛泛而谈的建议。
有人会给它项目结构、核心文件、当前问题、约束条件、历史决策、测试要求和输出格式,模型就能给出更接近真实工程的结果。
差别不在于谁用了更神秘的提示词,而在于谁构建了更好的上下文。
所以,GPT 和 Codex 的高阶使用,不应该叫 Prompt Engineering,而应该叫 Context Engineering。
提示词只是入口。
上下文才是系统。
一、Prompt 是一句话,Context 是一个工作环境
Prompt 更像是用户发出的指令。
例如:
帮我给订单模块增加一个导出功能。
这句话本身并不复杂,但对模型来说信息远远不够。
它不知道:
- 订单模块在哪里;
- 项目是什么技术栈;
- 当前是否已有导出功能;
- 前端筛选条件如何组织;
- 后端接口是否存在;
- 权限系统如何设计;
- 导出数据量是否有限制;
- 文件格式是什么;
- 是否需要异步任务;
- 是否要补测试;
- 哪些文件不能修改;
- 什么结果算完成。
如果没有这些信息,模型只能基于通用经验猜。
而真实项目最怕的就是“猜”。
Context 不一样。
Context 是围绕任务构建的一整套信息环境。
它包括:
用户目标
项目结构
相关代码
历史约束
业务规则
数据格式
错误日志
测试标准
输出要求
安全边界
人工决策
当这些信息被合理组织起来,模型才不再是在空中生成答案,而是在一个具体环境里推理。
所以,Prompt 是一句话。
Context 是一张地图。
没有地图,模型只能凭经验走。
有了地图,模型才能在真实空间里行动。
二、Codex 的稳定性,本质上取决于上下文质量
很多人说 Codex 写代码不稳定。
这句话只说对了一半。
Codex 的确会犯错,会误解需求,会生成不合适的实现。
但很多“不稳定”,其实来自上下文不足。
比如你让它:
帮我修复登录 bug。
它可能会给出很多猜测:
- token 过期;
- cookie 丢失;
- 请求头没带;
- 后端返回异常;
- 前端状态没更新;
- 路由守卫有问题。
这些都可能对,也可能完全不相关。
但如果你提供更完整的上下文:
问题:用户登录成功后,刷新页面会回到登录页。
已知信息:
1. 登录接口返回 token;
2. token 存在 localStorage;
3. 刷新后 localStorage 里仍然有 token;
4. 前端使用 React Router;
5. 权限判断在 authGuard.ts;
6. 用户信息接口 /api/me 偶尔返回 401;
7. 最近改动过 axios 拦截器。
请先不要修改代码,先分析可能原因,并按优先级给排查路径。
这时候 Codex 的判断会明显更接近真实问题。
为什么?
因为它不是凭空猜 bug,而是在上下文里寻找因果关系。
对代码任务来说,上下文质量直接影响输出质量。
一个高质量上下文至少包含:
任务目标:要解决什么问题
当前现象:实际发生了什么
期望结果:应该发生什么
相关文件:需要关注哪些代码
已知事实:哪些已经确认
约束条件:不能改什么
历史改动:最近动过什么
验证方式:如何确认修复成功
这比单纯写一个“神级提示词”更重要。
三、上下文不是越多越好,而是越结构化越好
很多人误以为,给模型的信息越多越好。
于是把一整个项目、一大段聊天记录、一堆日志全部丢进去,让模型自己理解。
结果模型反而容易混乱。
因为上下文不是仓库,不是把所有材料塞进去就完事。
上下文更像操作台。
你要把当前任务真正需要的东西摆出来,不需要的东西收起来;重要信息放在前面,辅助信息放在后面;确定事实和猜测分开;目标和限制分开;输入和输出分开。
一个混乱上下文可能是这样:
这里是我的项目代码,还有一些报错,还有之前的需求,还有别人说的几个问题。
你帮我看看怎么改。
一个结构化上下文应该是这样:
# 任务目标
修复用户刷新页面后被错误重定向到登录页的问题。
# 当前现象
用户登录成功后可以进入首页,但刷新页面后会回到登录页。
# 期望结果
只要 token 有效,刷新后应继续保持登录状态。
# 已确认事实
- 登录接口正常返回 token;
- token 已写入 localStorage;
- 刷新后 token 仍然存在;
- /api/me 偶尔返回 401;
- 最近修改过 axios 拦截器。
# 相关文件
- src/router/authGuard.ts
- src/store/userStore.ts
- src/services/http.ts
- src/services/authApi.ts
# 限制条件
- 不要修改登录接口返回结构;
- 不要改变路由配置方式;
- 不要引入新状态管理库;
- 先分析,不要直接改代码。
# 输出要求
请按可能性排序,给出 3 个排查方向,并说明每个方向需要检查的代码位置。
这就是上下文工程的核心。
不是堆信息,而是组织信息。
模型不是神。
它需要好的输入环境。
四、上下文工程的第一原则:区分事实、推测和目标
在复杂任务里,最容易出问题的是把事实、推测和目标混在一起。
比如用户说:
应该是接口有问题,帮我改一下前端。
这句话里至少有三个层次:
目标:修复某个问题
推测:可能是接口有问题
动作建议:改前端
如果模型不区分这些层次,它可能直接开始改前端。
但正确做法应该是先拆开:
事实是什么?
用户看到什么错误?
接口真的有问题吗?
前端有没有处理异常?
后端返回是否稳定?
用户的判断是不是只是猜测?
所以,一个成熟的上下文系统,应该显式标记信息类型。
可以这样设计:
type ContextItemType =
| "fact"
| "assumption"
| "goal"
| "constraint"
| "evidence"
| "risk"
| "decision";
interface ContextItem {
type: ContextItemType;
content: string;
source?: string;
confidence?: number;
}
例如:
const context: ContextItem[] = [
{
type: "goal",
content: "修复刷新页面后被重定向到登录页的问题"
},
{
type: "fact",
content: "token 刷新后仍然存在于 localStorage",
confidence: 0.95
},
{
type: "fact",
content: "/api/me 偶尔返回 401",
confidence: 0.8
},
{
type: "assumption",
content: "问题可能与 axios 拦截器有关",
confidence: 0.6
},
{
type: "constraint",
content: "不要修改后端接口返回结构"
}
];
这种结构很重要。
因为模型需要知道哪些是事实,哪些只是猜测。
否则它会把用户的猜测当成确定结论。
GPT 和 Codex 的高阶使用,本质上就是不断降低模型误解上下文的概率。
五、上下文工程的第二原则:让模型知道“不要做什么”
很多人只告诉模型要做什么,却不告诉它不要做什么。
这在 Codex 场景里尤其危险。
比如:
帮我优化订单模块。
模型可能会:
- 重构大量文件;
- 改变函数签名;
- 引入新依赖;
- 修改接口结构;
- 调整数据库字段;
- 删除它认为重复的逻辑;
- 改变项目风格。
这些都可能不是你想要的。
所以,上下文里必须包含边界。
比如:
# 不允许做的事
- 不要修改数据库结构;
- 不要改变接口返回格式;
- 不要引入新依赖;
- 不要重构无关模块;
- 不要删除历史兼容逻辑;
- 不要一次性修改超过 3 个文件;
- 如果需要大范围改动,先说明原因,等待确认。
这类限制不是多余的。
它们是安全边界。
如果写成程序结构,可以这样表示:
interface ExecutionBoundary {
allowedFiles?: string[];
forbiddenFiles?: string[];
maxFilesChanged?: number;
allowNewDependencies: boolean;
allowDatabaseMigration: boolean;
requireApprovalForHighRisk: boolean;
}
例如:
const boundary: ExecutionBoundary = {
allowedFiles: [
"src/pages/orders/**",
"src/services/orderApi.ts"
],
forbiddenFiles: [
"src/database/**",
"src/auth/**"
],
maxFilesChanged: 3,
allowNewDependencies: false,
allowDatabaseMigration: false,
requireApprovalForHighRisk: true
};
一个没有边界的 Agent,很容易过度执行。
而软件工程里,很多事故不是因为没做功能,而是因为动了不该动的地方。
六、上下文工程的第三原则:把“验收标准”写进上下文
很多 AI 输出看起来不错,但无法判断是否完成。
原因是任务没有验收标准。
比如:
帮我提高代码可维护性。
什么叫提高了?
函数变短算不算?
重复代码减少算不算?
命名更清楚算不算?
测试更多算不算?
复杂度下降算不算?
如果没有验收标准,模型会按自己的理解处理。
而工程任务必须可验收。
例如:
# 验收标准
1. 不改变订单列表原有查询结果;
2. 新增筛选项可以正确传递给接口;
3. 接口失败时页面显示错误提示;
4. loading 状态正常;
5. 不新增第三方依赖;
6. 相关测试通过;
7. 输出修改文件列表和改动说明。
对应程序结构:
interface AcceptanceCriteria {
id: string;
description: string;
verificationMethod: "test" | "manual" | "static-check" | "review";
required: boolean;
}
例如:
const criteria: AcceptanceCriteria[] = [
{
id: "AC-001",
description: "订单列表原有查询结果不受影响",
verificationMethod: "test",
required: true
},
{
id: "AC-002",
description: "新增筛选项能正确传递给接口",
verificationMethod: "manual",
required: true
},
{
id: "AC-003",
description: "不新增第三方依赖",
verificationMethod: "static-check",
required: true
}
];
验收标准的作用,是把“感觉完成了”变成“可以判断是否完成”。
GPT 和 Codex 越进入真实工作流,验收标准越重要。
因为模型可以生成,但结果是否合格,必须有明确标准。
七、上下文窗口不是记忆,真正的记忆需要管理
很多人把上下文窗口理解成模型记忆。
其实不准确。
上下文窗口只是模型当前能看到的信息。
记忆则是跨任务、跨时间、跨会话沉淀下来的信息。
在复杂项目中,真正有价值的不是把所有东西一次塞进上下文,而是建立可检索、可更新、可过滤的记忆系统。
比如一个项目里可能有这些长期信息:
技术栈:React + Node.js
状态管理:Zustand
UI 库:Ant Design
接口规范:统一返回 { code, data, message }
权限系统:基于 role + permission
数据库:PostgreSQL
代码规范:不允许引入未审批依赖
历史决策:订单导出暂不支持异步任务
风险记录:支付模块不可由 AI 自动修改
这些信息不应该每次都重新告诉模型。
它们应该成为项目记忆。
可以设计成:
interface ProjectMemory {
projectId: string;
techStack: string[];
conventions: string[];
apiContracts: string[];
forbiddenActions: string[];
historicalDecisions: Decision[];
riskAreas: RiskArea[];
}
例如:
const memory: ProjectMemory = {
projectId: "order-admin",
techStack: ["React", "Node.js", "PostgreSQL"],
conventions: [
"API response must use { code, data, message }",
"Frontend services are placed in src/services",
"Do not introduce new dependencies without approval"
],
apiContracts: [
"Order list API supports pagination",
"Export API must respect current filters"
],
forbiddenActions: [
"Do not modify payment settlement logic automatically",
"Do not change database schema without review"
],
historicalDecisions: [
{
date: "2026-01-10",
decision: "Order export uses synchronous CSV for MVP",
reason: "Data volume is currently acceptable"
}
],
riskAreas: [
{
module: "payment",
level: "critical",
rule: "human approval required for any change"
}
]
};
这才是真正的上下文工程。
不是每次写更长的 Prompt,而是构建一个可持续的上下文资产。
八、RAG 不是简单搜索,而是上下文装配
很多人把 RAG 理解成“从知识库里搜索资料,再让模型回答”。
这个理解太浅。
在 GPT 和 Codex 的高阶使用里,RAG 更像是上下文装配系统。
用户提出任务后,系统需要判断:
这个任务需要哪些信息?
哪些文件最相关?
哪些历史决策需要加载?
哪些风险规则需要加载?
哪些测试标准需要加载?
哪些信息不应该加载?
也就是说,RAG 的关键不是“搜到更多”,而是“装配正确”。
一个上下文装配流程可能是:
用户目标
↓
识别任务类型
↓
检索相关代码
↓
检索项目规范
↓
检索历史决策
↓
检索风险规则
↓
压缩无关信息
↓
生成任务上下文
↓
交给模型推理
如果写成代码结构:
interface ContextAssemblyInput {
userGoal: string;
taskType: "bugfix" | "feature" | "refactor" | "analysis" | "document";
projectId: string;
}
interface AssembledContext {
goal: string;
relevantFiles: FileContext[];
conventions: string[];
constraints: string[];
risks: RiskArea[];
acceptanceCriteria: AcceptanceCriteria[];
historicalDecisions: Decision[];
}
async function assembleContext(
input: ContextAssemblyInput
): Promise<AssembledContext> {
const taskType = classifyTask(input.userGoal);
const relevantFiles = await retrieveRelevantFiles(input.projectId, input.userGoal);
const conventions = await retrieveConventions(input.projectId, taskType);
const risks = await retrieveRiskRules(input.projectId, relevantFiles);
const historicalDecisions = await retrieveDecisions(input.projectId, input.userGoal);
const acceptanceCriteria = generateAcceptanceCriteria(taskType, input.userGoal);
return {
goal: input.userGoal,
relevantFiles,
conventions,
constraints: buildConstraints(taskType, risks),
risks,
acceptanceCriteria,
historicalDecisions
};
}
这就是高阶 RAG。
它不是知识搜索,而是任务上下文构建。
对于 Codex 来说,这尤其重要。
因为代码任务不是看一个文件就能完成。
它需要加载正确文件、正确规范、正确历史、正确风险。
上下文装错了,模型再强也会做错。
九、上下文压缩:高阶使用中最容易被忽略的能力
模型上下文窗口再大,也不可能无限承载信息。
所以必须进行上下文压缩。
但压缩不是简单摘要。
好的压缩要保留:
任务相关事实
关键约束
因果关系
风险点
历史决策
代码结构
未解决问题
同时丢弃:
重复信息
无关讨论
过期方案
低价值日志
和当前任务无关的文件
已经被否定的猜测
例如一个项目会议记录很长,直接丢给模型可能很混乱。
更好的方式是压缩成:
# 当前任务相关摘要
目标:
- 给订单列表增加异常订单筛选能力。
已确认:
- 后端已有 orderStatus 字段;
- 前端当前筛选组件支持动态配置;
- 异常状态包括 timeout、refund_failed、manual_review。
约束:
- 不修改订单主表结构;
- 不影响现有订单状态枚举;
- 先只做前端筛选和接口参数传递。
风险:
- orderStatus 与 afterSaleStatus 容易混淆;
- 旧导出接口不支持异常状态筛选。
待确认:
- 导出功能是否也需要同步支持该筛选条件。
这种上下文比一万字聊天记录更有用。
可以用结构表示:
interface CompressedContext {
summary: string;
confirmedFacts: string[];
constraints: string[];
risks: string[];
openQuestions: string[];
outdatedInformation: string[];
}
上下文压缩能力决定了 AI 能否参与长期任务。
没有压缩,信息会越来越乱。
压缩不好,重要信息会丢失。
压缩准确,模型才能在长周期任务中保持方向。
十、上下文污染:AI 系统中最隐蔽的风险
上下文工程里有一个非常重要的问题:上下文污染。
所谓上下文污染,就是错误、过期、不确定或无关的信息进入模型上下文,并影响后续判断。
比如:
用户曾经猜测 bug 是接口问题,但后来证明不是。
如果这个猜测仍然留在上下文里,模型可能继续围绕接口排查。
或者:
项目曾经计划使用异步导出,但后来决定暂不做。
如果旧计划仍然被检索出来,模型可能错误设计异步任务。
或者:
某段代码已经废弃,但仍然被 RAG 当成相关文件召回。
模型可能基于废弃代码生成方案。
这就是上下文污染。
它比普通错误更危险,因为它会让模型在错误前提下做出看起来合理的推理。
所以,成熟的上下文系统必须有状态管理。
例如:
type ContextStatus =
| "active"
| "deprecated"
| "rejected"
| "uncertain"
| "confirmed";
interface ManagedContextItem {
content: string;
status: ContextStatus;
updatedAt: string;
source: string;
confidence: number;
}
上下文不应该只是文本堆积。
它应该有生命周期。
新信息进入
↓
被确认
↓
被使用
↓
被更新
↓
可能过期
↓
被废弃或归档
未来 AI 系统的可靠性,很大程度取决于它能不能管理上下文污染。
十一、Codex 的真正难点:不是生成代码,而是维护工程上下文一致性
单独生成一个函数并不难。
难的是在一个真实项目里做修改,同时保持上下文一致性。
例如你修改一个订单状态字段,可能要同步考虑:
前端类型定义
接口请求参数
后端 DTO
数据库枚举
状态展示文案
筛选条件
导出逻辑
权限判断
测试用例
文档说明
如果只改一个地方,系统就会不一致。
Codex 的高级能力,应该不是“写出这段代码”,而是理解这种一致性网络。
可以把工程上下文看成一张图:
OrderStatus
├── frontend/types/order.ts
├── frontend/pages/OrderList.tsx
├── frontend/services/orderApi.ts
├── backend/dto/orderQuery.dto.ts
├── backend/services/orderService.ts
├── backend/repositories/orderRepository.ts
├── tests/orderQuery.test.ts
└── docs/order-status.md
修改一个节点,可能影响多个节点。
这就是工程上下文图。
如果写成结构:
interface ContextGraphNode {
id: string;
type: "file" | "function" | "type" | "api" | "test" | "doc";
name: string;
}
interface ContextGraphEdge {
from: string;
to: string;
relation: "imports" | "calls" | "defines" | "tests" | "documents" | "depends-on";
}
interface EngineeringContextGraph {
nodes: ContextGraphNode[];
edges: ContextGraphEdge[];
}
未来 Codex 类工具如果要真正可靠,就不能只看文件文本,而要理解工程上下文图。
因为软件不是文件集合,而是依赖网络。
十二、上下文工程会成为 AI 时代的新基础设施
如果 GPT 和 Codex 越来越多地进入工作流,那么上下文工程就会变成基础设施。
未来很多团队可能不只是维护代码库,还会维护上下文库。
包括:
项目规范库
业务规则库
历史决策库
接口契约库
风险边界库
测试标准库
常见问题库
用户偏好库
任务模板库
这些内容过去也存在,只是散落在文档、聊天记录、会议纪要、代码注释和人的脑子里。
AI 时代,它们需要被结构化。
因为模型要用它们。
一个团队如果没有上下文资产,AI 就只能靠临时输入工作。
一个团队如果拥有高质量上下文资产,AI 就能更稳定地参与任务。
这就像过去企业重视数据资产。
未来可能还要重视上下文资产。
数据回答“发生了什么”。
上下文回答“为什么这样做、现在应该怎样做、不能做什么、历史上发生过什么”。
对 GPT 来说,上下文资产决定内容和决策质量。
对 Codex 来说,上下文资产决定代码修改是否可靠。
十三、未来程序员的新角色:上下文架构师
如果上下文工程变得重要,程序员的角色也会发生变化。
过去程序员主要写代码。
后来程序员还要设计架构、维护 CI/CD、管理云服务、关注安全和可观测性。
未来程序员可能还要设计 AI 可用的上下文系统。
也就是说,程序员不仅要写:
业务代码
接口代码
数据库代码
测试代码
还要维护:
工具描述
接口语义
任务边界
风险规则
上下文检索逻辑
Agent 可调用能力
验收标准模板
这是一种新的工程能力。
可以称为:
Context Architect
上下文架构师要思考:
哪些信息应该进入模型上下文?
哪些信息不能进入?
信息如何分类?
上下文如何压缩?
历史决策如何检索?
过期信息如何淘汰?
风险规则如何注入?
模型输出如何验证?
这不是传统 Prompt 技巧能解决的。
这是系统设计问题。
十四、真正高级的 AI 系统,是可控上下文系统
很多人判断 AI 系统好不好,只看模型强不强。
但未来真正高级的 AI 系统,可能不只是模型强,而是上下文系统强。
一个强上下文系统应该做到:
知道当前任务需要什么信息;
知道哪些信息已经过期;
知道哪些规则不能违反;
知道哪些文件最相关;
知道哪些历史决策必须参考;
知道什么时候需要人工确认;
知道如何压缩长上下文;
知道如何避免污染;
知道如何验证输出。
这比单纯调用模型复杂得多。
可以用一条管线表示:
User Goal
↓
Intent Classification
↓
Context Retrieval
↓
Context Filtering
↓
Context Compression
↓
Risk Injection
↓
Task Planning
↓
Model Execution
↓
Verification
↓
Context Update
最后一步很重要:Context Update。
AI 完成任务后,上下文系统也要更新。
例如:
本次做了什么决策?
哪些方案被否定?
哪些文件被修改?
哪些风险被发现?
哪些测试被新增?
哪些规则需要沉淀?
否则系统不会成长。
真正的 AI 工作流,不是一次性对话,而是上下文资产持续演化。
十五、结语:GPT 和 Codex 的高阶竞争,不在模型,而在上下文
GPT 和 Codex 让很多人第一次感受到 AI 的生产力。
但越往深处走,就越会发现:模型能力只是第一层。
真正决定效果的,是上下文。
没有上下文,GPT 只能生成通用内容。
没有上下文,Codex 只能写孤立代码。
没有上下文,Agent 只能凭空规划。
没有上下文,自动化执行就会失控。
上下文让模型从“回答问题”变成“参与任务”。
上下文让 Codex 从“生成代码”变成“理解项目”。
上下文让 AI 从“聪明聊天”变成“可靠协作”。
所以,未来真正重要的能力,不只是写提示词,而是构建上下文。
谁能更好地组织事实、目标、约束、记忆、风险和验收标准,谁就能更稳定地使用 GPT 和 Codex。
这也是为什么 AI 时代不会简单淘汰工程能力。
相反,它会让更深层的工程能力变得更重要。
因为模型可以生成结果,但上下文决定结果是否可靠。
GPT 和 Codex 的真正高阶使用,不是问得更花,而是让模型站在一个正确、干净、结构化、可验证的上下文里工作。
这才是从 Prompt Engineering 走向 Context Engineering 的核心变化。
未来的 AI 竞争,表面上看是模型竞争。
深入看,是工具竞争。
再往深看,是上下文工程竞争。
谁拥有更好的上下文系统,谁就能更好地调度智能。
而这,可能才是 GPT 和 Codex 背后最值得长期关注的技术命题。
更多推荐


所有评论(0)