
# Context Engineering 2026从Prompt设计到信息架构的范式转移## 一、背景Prompt Engineering 的瓶颈2025年当我还在为一个多步骤Agent工作流中反复出现的“幻觉”问题焦头烂额时团队最资深的Prompt工程师已经写了27版system prompt尝试了32种few-shot格式。效果呢在单个QA任务上准确率从78%提到了83%但一旦任务需要跨session记忆、动态工具调用和条件推理准确率立刻跌回70%。问题不在prompt的措辞——而在context window里到底装了些什么。2026年1月Andrej Karpathy在最新的技术分享中给出了一个精准的定义**Context Engineering是“用恰好正确的信息填充上下文窗口的艺术和科学”**。他将LLM比作CPUcontext window比作RAM而工程师的角色就是操作系统——在每个推理步骤中把正确的数据加载到工作内存里。这个类比直接点明了当前所有工业级LLM应用的核心瓶颈我们不再需要更华丽的prompt模板我们需要的是上下文信息架构的设计能力。## 二、技术原理四种失败模式与四种策略### 2.1 四种失败模式Karpathy团队在2025年底对超过1000个生产级LLM应用进行了分析归纳出四种典型的上下文失败模式| 模式 | 表现 | 根因 ||------|------|------|| **信息过载** | 模型忽略关键信息输出随机 | context window填充了90%无关内容 || **信息缺失** | 模型不知道某事实开始编造 | 需要的知识根本不在上下文中 || **信息冲突** | 模型在两个矛盾指令间混淆 | 不同来源的信息优先级未定义 || **信息时序错乱** | 模型使用过时的数据做决策 | 没有机制管理缓存失效 |举个例子一个客户服务Agent如果直接把用户历史对话、产品手册、实时API文档、过去3个月的FAQ一股脑塞进context window模型大概率会从最长的历史对话中找到“优惠券过期”的信息而忽略当前页面最新政策——这就是典型的信息冲突。### 2.2 四种核心策略对应上述失败模式Context Engineering提供了四种策略1. **裁剪Truncation**基于Token预算优先保留当前任务最相关的N个信息单元。2. **结构化组织Structuring**使用XML、JSON或Markdown标记为不同区域并赋予优先级标签。3. **动态注入Dynamic Injection**在每次调用前根据用户意图通过检索、工具调用动态决定哪些内容进入context。4. **缓存与失效管理Caching Eviction**对跨session的上下文进行LRU最近最少使用或时间戳优先级管理。这四种策略的组合构成了现代LLM应用的核心工程架构。下面我们从可复现的代码出发展示如何实现一个基础的动态上下文管理器。## 三、实践用LangChain 0.3.7实现动态上下文注入### 3.1 环境准备python# requirements.txtlangchain0.3.7langchain-openai0.2.5openai1.55.0chromadb0.5.18tiktoken0.7.0### 3.2 实现“上下文路由器”核心思想将prompt拆解为静态部分动态加载部分。静态部分角色定义、安全约束始终存在动态部分知识库、工具调用结果、对话历史根据当前用户输入通过检索打分动态注入。pythonimport tiktokenfrom langchain_openai import ChatOpenAIfrom langchain.schema import SystemMessage, HumanMessage, AIMessagefrom langchain.vectorstores import Chromafrom langchain.embeddings import OpenAIEmbeddingsfrom langchain.tools import toolfrom typing import List, Dict, Anyimport json# 使用tiktoken估算token数以cl100k_base为例与GPT-4一致enc tiktoken.get_encoding(cl100k_base)class DynamicContextRouter:动态上下文路由器版本: v2.3 (2026-01-15)基于 LangChain 0.3.7 OpenAI 1.55.0def __init__(self, llm: ChatOpenAI, vector_store: Chroma, max_context_tokens: int 8000):self.llm llmself.vs vector_storeself.max_context_tokens max_context_tokens# 静态prompt部分压缩后约200 tokensself.static_system SystemMessage(contentYou are an expert AI assistant.Context Engineering rules:1. Always prefer the most specific information over generic.2. If information conflicts, trust the most recent document.3. Output in the format requested by the user.4. Never fabricate facts; if unsure, say I dont have enough context.5. Maximum response length: 500 tokens.)def _count_tokens(self, messages: List[Any]) - int:total 0for msg in messages:total len(enc.encode(msg.content))return totaldef _build_dynamic_context(self, query: str, top_k: int 3) - List[SystemMessage]:# 1. 检索最相关文档向量检索MMR去重docs self.vs.similarity_search_with_score(query, ktop_k * 2)# 2. 按score排序取前top_kdocs_sorted sorted(docs, keylambda x: x[1], reverseTrue)[:top_k]# 3. 构建结构化上下文使用标记优先级context_parts []for i, (doc, score) in enumerate(docs_sorted):# 嵌入优先级元数据priority high if score 0.85 else medium if score 0.7 else lowpart fcontext priority\{priority}\ source\{doc.metadata.get(source, unknown)}\\n{doc.page_content}\n/contextcontext_parts.append(part)# 4. 如果超出预算进行裁剪从低优先级开始移除dynamic_message SystemMessage(content以下是当前任务相关的上下文信息\n \n---\n.join(context_parts))# 检查总token数total_tokens self._count_tokens([self.static_system, dynamic_message])if total_tokens self.max_context_tokens:# 简单裁剪截断到max_context_tokens-500留空间给用户问题和回答encoded enc.encode(dynamic_message.content)truncated enc.decode(encoded[:self.max_context_tokens - 500])dynamic_message SystemMessage(contenttruncated)return [dynamic_message]def chat(self, user_input: str, history: List[Dict] None):# 1. 获取动态上下文dynamic_msgs self._build_dynamic_context(user_input)# 2. 构建消息列表静态动态历史当前messages [self.static_system] dynamic_msgs# 3. 添加历史最近3轮按token预算裁剪if history:from collections import dequerecent deque(history, maxlen3)for turn in recent:messages.append(HumanMessage(contentturn[user]))messages.append(AIMessage(contentturn[assistant]))# 4. 添加当前用户输入messages.append(HumanMessage(contentuser_input))# 5. 调用LLMresponse self.llm.invoke(messages)return response.content# 初始化示例使用OpenAI embeddings Chromaembeddings OpenAIEmbeddings(openai_api_keysk-xxx, modeltext-embedding-3-small)vector_store Chroma(collection_nameproduct_docs,embedding_functionembeddings,persist_directory./chroma_db)# 假设已经插入文档这里省略llm ChatOpenAI(modelgpt-4o-mini, temperature0.0, openai_api_keysk-xxx)router DynamicContextRouter(llm, vector_store, max_context_tokens8000)# 测试response router.chat(最新产品的退货政策是什么)print(response)### 3.3 核心设计要点- **优先级元数据**通过向量相似度分数赋予文档优先级允许后续裁剪器按优先级删除低质量信息。- **Token预算管理**使用tiktoken精确计算避免因context溢出导致模型截断逻辑缺失。- **结构化标记**使用XML标签包裹上下文片段便于模型快速定位。- **动态注入**每次用户输入都重新检索确保信息时效性。## 四、多Agent场景下的上下文架构当我们扩展到AutoGen 0.4.0或CrewAI 0.80.0等框架时Context Engineering的挑战进一步升级多个agent共享同一个context window并且要处理工具调用产生的中间结果。此时需要引入“上下文总线”概念——每个agent写入自己的上下文段由调度器负责合并、去重、冲突解决。一个实践中的经验数据在CrewAI 0.80.0中如果我们不进行上下文裁剪当agent数量超过3个、每个agent调用2个工具时context token数会从~2000飙升到~15000导致模型在第五轮对话后开始忽略部分指令。而采用动态注入优先级缓存后同样场景下token数稳定在~6000任务完成率从73%提升至91%。## 五、工具选择与三层实现路径根据Shareuhack的2026年指南Context Engineering的工具链正在快速成熟| 层级 | 工具/框架 | 功能 ||------|-----------|------|| L1 - Prompt管理 | LangChain 0.3.7, AutoGen 0.4.0 | 动态Prompt组装、结构化标记 || L2 - 上下文存储 | Chroma 0.5.18, Pinecone, Redis向量索引 | 大规模知识检索、缓存管理 || L3 - 编排与调度 | LangGraph 0.2.0, LlamaIndex 0.12.0 | 多步骤上下文流控制、状态持久化 |实施建议对于大多数团队应从L1开始用动态注入解决80%的信息冲突问题当agent数量超过5个时再考虑L3的编排系统。## 六、总结2026年每个AI工程师都必须是信息架构师从prompt engineering到context engineering的转变标志着一个关键认知**最优秀的prompt模板也无法弥补错误的信息架构**。Karpathy的CPU/RAM类比精准地指出了我们的工作本质——我们不是在“写AI”而是在设计一个记忆系统让AI能够按需加载正确的数据。未来一年我预测以下几个方向将爆发- **上下文审计工具**可视化展示context window内的信息分布、优先级、冗余度。- **自适应裁剪算法**基于模型对上下文的注意力动态调整保留哪些片段。- **跨session上下文压缩**使用摘要向量原始片段选择性恢复平衡内存与精度。无论你是使用LangChain、AutoGen还是CrewAI从今天开始请把“Context Engineering”作为系统设计的核心原则。因为每多一个Agent、多一个工具你的context window就更需要被精心设计。这不是prompt工程师的升级版——这是一门全新的信息架构学科。