30秒快速回答: 上下文工程是系统化地设计和优化 AI 模型”看到的信息”的方法论。核心理念是”质量 > 数量”——给 AI 喂对的信息比喂更多的信息重要得多。它包括上下文窗口管理、信息分层、动态加载、Prompt 缓存等技术,是 2026 年 AI 应用开发中最被低估但回报最高的技能。
为什么上下文工程如此重要?
2026 年的大模型上下文窗口已经达到 200K 甚至 1M Token,但”能塞进去”不等于”能理解好”:
| 做法 | 结果 |
|---|---|
| 把所有代码/文档一股脑塞给 AI | 信息过载,关键信息被淹没,输出质量下降 |
| 精心选择相关上下文,分层组织 | AI 精准抓住关键信息,输出质量大幅提升 |
直观数据: 根据 Anthropic 的研究,经过上下文工程优化的提示词,在复杂任务上的准确率比”全量塞入”高出 30-50%。
三个核心原理
- 注意力稀释效应: 上下文越长,模型对每个 Token 的注意力越分散。无关信息会”稀释”关键信息。
- 首尾效应: 模型对上下文开头和结尾的内容关注度最高,中间部分容易被忽略。
- 语义污染: 不相关但相似的信息会干扰模型的检索和推理。
上下文工程的核心技术
一、信息分层架构
Layer 1: 系统层(System Prompt)
- 角色定义、行为约束、输出格式(最稳定,很少变化)
Layer 2: 任务层(Task Context)
- 当前任务的目标、背景、约束(每次任务变化)
Layer 3: 知识层(Knowledge Context)
- 相关文档片段、代码文件、数据(动态检索)
Layer 4: 记忆层(Memory Context)
- 对话历史摘要、长期记忆(增量更新)
实践原则: 越稳定的信息放在越上层,越动态的信息放在越下层。
二、上下文裁剪策略
并不是所有信息都值得放入上下文。裁剪规则:
放入上下文的标准:
✅ 与当前任务直接相关
✅ 用户明确引用的内容
✅ 最近的对话关键决策
不放入上下文的标准:
❌ 与当前任务无关的历史对话
❌ 已过时的信息(除非用户问历史)
❌ 重复的内容
❌ 被用户纠正过的错误信息
三、动态上下文加载
传统做法是”一次性加载所有”,现代做法是”按需动态加载”:
# 动态上下文加载示意
class DynamicContextManager:
def __init__(self, max_tokens=100000):
self.max_tokens = max_tokens
self.system_prompt = "" # Layer 1: 固定
self.task_context = "" # Layer 2: 任务相关
self.knowledge_cache = {} # Layer 3: 按需加载
self.memory = [] # Layer 4: 增量
def add_knowledge(self, doc_id, content, relevance_score):
"""根据相关性评分决定是否加入上下文"""
if relevance_score > 0.7:
self.knowledge_cache[doc_id] = {
"content": content,
"score": relevance_score
}
def build_context(self):
"""按优先级构建最终上下文"""
tokens_used = len(self.system_prompt)
context = [self.system_prompt]
# 添加任务层
context.append(self.task_context)
tokens_used += len(self.task_context)
# 按相关性降序添加知识,直到接近上限
sorted_knowledge = sorted(
self.knowledge_cache.values(),
key=lambda x: x["score"],
reverse=True
)
for k in sorted_knowledge:
if tokens_used + len(k["content"]) > self.max_tokens * 0.8:
break # 留 20% 余量给模型生成
context.append(k["content"])
tokens_used += len(k["content"])
return "\n\n".join(context)
四、Prompt 缓存
对于不经常变化的部分(系统提示词、固定指令),使用 Prompt 缓存可以:
- 大幅降低 API 调用成本(缓存部分不重复计费)
- 减少首 Token 延迟
- 提高吞吐量
# Anthropic Prompt 缓存示例
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-sonnet-4-20250514",
system=[
{
"type": "text",
"text": "你是一位资深代码审查专家...", # 长系统提示词
"cache_control": {"type": "ephemeral"} # 标记为可缓存
}
],
messages=[{"role": "user", "content": "审查以下代码..."}]
)
系统提示词只需在首次请求时处理,后续请求直接使用缓存,节省 90% 的输入 Token 成本。
实战:构建一个上下文感知的代码审查助手
# 一个完整的多层上下文管理示例
import anthropic
class CodeReviewContext:
def __init__(self):
self.client = anthropic.Anthropic()
# Layer 1: 固定的审查规范(可缓存)
self.review_rules = """
你是一位资深代码审查专家。审查标准:
1. 安全性:SQL 注入、XSS、认证缺陷
2. 性能:N+1 查询、不必要的 I/O
3. 可维护性:命名、注释、函数长度
4. 最佳实践:错误处理、类型提示
输出格式:按「问题-严重程度-修复建议」组织
"""
def review(self, code: str, related_files: list[str] = None):
# Layer 2 + 3: 动态组装上下文
task_context = f"请审查以下代码:\n```python\n{code}\n```"
if related_files:
task_context += "\n\n相关文件(供参考,不需要审查):"
for f in related_files[:3]: # 最多 3 个,避免过载
task_context += f"\n{f[:500]}" # 截断,只取关键部分
response = self.client.messages.create(
model="claude-sonnet-4-20250514",
system=[{
"type": "text",
"text": self.review_rules,
"cache_control": {"type": "ephemeral"}
}],
messages=[{"role": "user", "content": task_context}],
max_tokens=2000
)
return response.content[0].text
上下文工程的常见反模式
| 反模式 | 问题 | 正确做法 |
|---|---|---|
| 把所有文档塞给 AI | 注意力稀释 | 只给与当前问题最相关的 Top-5 片段 |
| 保留完整对话历史 | 上下文爆炸 | 定期压缩为结构化摘要 |
| 系统提示词过长 | 浪费 Token 和预算 | 提炼核心,非必须内容放在外部 |
| 每次请求重建上下文 | 延迟高、成本高 | 使用 Prompt 缓存(固定部分) |
| 不考虑信息组织顺序 | 关键信息被忽略 | 遵循”先总后分、先重要后次要” |
2026 年工具推荐
| 工具 | 功能 | 适用场景 |
|---|---|---|
| LangChain | 上下文管理 + RAG + 链式调用 | Python 开发者 |
| LlamaIndex | 文档索引 + 上下文检索 | 大量文档场景 |
| Anthropic Prompt Caching | Prompt 缓存 API | Claude 用户降成本 |
| Vercel AI SDK | 前端/全栈 AI 上下文管理 | Web 应用 |
| Dify | 可视化上下文编排 | 低代码场景 |
常见问题
Q: 上下文工程和 Prompt Engineering 有什么区别?
Prompt Engineering 关注”怎么说”,上下文工程关注”给什么信息”。两者互补——好的上下文工程让 Prompt Engineering 事半功倍。
Q: 上下文窗口这么大(200K),为什么还要裁剪?
因为模型对长上下文的”注意力”是不均匀的。实验表明,当上下文超过 50K Token 时,模型检索中间部分信息的准确率会明显下降。精准裁剪比全量塞入更有效。
Q: 多轮对话怎么管理上下文?
定期(每 5-10 轮)让模型总结对话摘要,用摘要替代完整历史。关键决策点单独标记保留。
下一步建议: 选一个你正在做的 AI 项目,尝试用本文的四层架构重组上下文,对比优化前后的输出质量差异。