Context Engineering 2026:超越Prompt工程的下一个AI能力边界
如果说Prompt工程是"写好一段话让模型更好地回答你",那么Context Engineering就是"系统性地设计并管理模型看到的所有信息,让AI系统在复杂任务中持续表现优异"。
2026年,随着模型上下文窗口扩展到100万token(Gemini 2.5 Pro支持200万),随着Agent系统处理的任务越来越复杂,Context Engineering已经成为AI工程师最重要的核心技能之一。## 为什么需要Context Engineering传统Prompt工程关注单次对话的输入设计。但现代AI应用面临的挑战更复杂:- Agent需要在多轮任务执行中保持连贯性- RAG系统需要决定把哪些文档放入上下文- 多Agent系统需要在Agent间高效传递信息- 长文档处理需要管理超出窗口限制的内容- 成本控制要求精简上下文而不损失关键信息这些都不是"写好一段Prompt"能解决的问题,需要系统化的Context Engineering方法论。## Context的五个维度Context不只是"你发给模型的文字",它包含五个维度:### 1. Instructions(指令)告诉模型它是谁、要做什么、有什么约束。pythonSYSTEM_INSTRUCTION = """你是一个专业的代码审查助手,专注于Python后端代码。职责:- 发现安全漏洞(OWASP Top 10)- 识别性能问题- 检查代码规范(PEP 8)- 建议最佳实践限制:- 只评审Python代码,其他语言说明无法处理- 不修改代码,只提建议- 每个问题必须给出具体的修改建议,不只是指出问题输出格式:1. 问题描述(一句话)2. 严重程度(高/中/低)3. 修改建议(具体代码示例)"""原则:指令要精确,不要模糊。“尽量简洁"不如"回答不超过200字”。“注意安全"不如"重点检查SQL注入和XSS漏洞”。### 2. Memory(记忆)模型没有持久记忆,但你可以把重要信息注入上下文:pythonclass ContextMemory: """管理注入到上下文的记忆信息""" def __init__(self): self.short_term = [] # 当前对话历史 self.working = {} # 当前任务的工作状态 self.long_term = {} # 跨会话的持久信息 def get_memory_context(self, token_budget: int = 2000) -> str: """生成注入上下文的记忆摘要,控制在token预算内""" parts = [] # 长期记忆(用户偏好、历史决策) if self.long_term: parts.append(f"用户偏好:{json.dumps(self.long_term, ensure_ascii=False)}") # 工作状态(当前任务进度) if self.working: parts.append(f"当前任务状态:{json.dumps(self.working, ensure_ascii=False)}") # 控制长度 full_memory = "\n".join(parts) if len(full_memory) > token_budget * 3: # 粗略token估算 full_memory = full_memory[:token_budget * 3] # 截断 return full_memory### 3. History(历史)对话历史是最消耗Token的部分,需要精细管理:pythonclass HistoryManager: def __init__(self, max_tokens: int = 6000): self.messages = [] self.max_tokens = max_tokens def estimate_tokens(self, text: str) -> int: return len(text) // 3 # 中文粗略估算 def add_message(self, role: str, content: str): self.messages.append({ "role": role, "content": content, "tokens": self.estimate_tokens(content) }) def get_trimmed_history(self) -> list: """从最新消息倒推,保留在token预算内的历史""" result = [] total_tokens = 0 for msg in reversed(self.messages): if total_tokens + msg["tokens"] > self.max_tokens: break result.insert(0, {"role": msg["role"], "content": msg["content"]}) total_tokens += msg["tokens"] return result async def compress_old_history(self, llm) -> str: """将早期历史压缩为摘要""" cutoff = len(self.messages) // 2 old_messages = self.messages[:cutoff] summary_prompt = f""" 将以下对话摘要为100字以内的关键信息点,保留重要的决策和事实: {json.dumps(old_messages, ensure_ascii=False)} """ return await llm.agenerate(summary_prompt)### 4. Tools(工具)工具定义本身也是Context,会消耗Token:python# 工具定义优化:精简描述,减少Token消耗tools = [ { "name": "search_codebase", "description": "在代码库中搜索相关代码", # 简洁描述 "parameters": { "type": "object", "properties": { "query": { "type": "string", "description": "搜索关键词" } }, "required": ["query"] } }]# 动态工具选择:根据任务类型只注入相关工具def get_relevant_tools(task_type: str) -> list: """根据任务类型返回相关工具子集,减少无关工具的Token消耗""" tool_sets = { "coding": ["search_codebase", "run_tests", "read_file"], "research": ["web_search", "read_url", "take_notes"], "data_analysis": ["query_database", "create_chart", "export_data"], } return [t for t in all_tools if t["name"] in tool_sets.get(task_type, [])]### 5. Retrieved Content(检索内容)RAG系统中,如何选择注入哪些文档是Context Engineering的核心:pythonclass SmartRetriever: def __init__(self, vectorstore, reranker, token_budget: int = 4000): self.vectorstore = vectorstore self.reranker = reranker self.token_budget = token_budget async def retrieve_for_context(self, query: str) -> list: # 1. 初始检索(多查多) candidates = await self.vectorstore.asimilarity_search(query, k=20) # 2. 重排序(精准筛选) reranked = await self.reranker.rerank(query, candidates, top_n=10) # 3. Token预算控制 selected = [] total_tokens = 0 for doc in reranked: doc_tokens = len(doc.page_content) // 3 if total_tokens + doc_tokens > self.token_budget: break selected.append(doc) total_tokens += doc_tokens return selected def format_for_context(self, docs: list, query: str) -> str: """将文档格式化为上下文字符串""" parts = [f"以下是与「{query}」相关的参考资料:\n"] for i, doc in enumerate(docs, 1): source = doc.metadata.get("source", "未知来源") parts.append(f"[{i}] 来源:{source}\n{doc.page_content}\n") return "\n".join(parts)## Context窗口的位置效应研究和实践都发现:LLM对上下文中不同位置的内容注意程度不同。Lost in the Middle现象:模型对上下文头部(开始)和尾部(结束)的内容记忆最好,中间部分容易被"遗忘"。pythondef optimize_context_layout(system: str, history: list, retrieved_docs: list, user_query: str) -> list: """优化上下文布局,把重要内容放在头部和尾部""" messages = [] # 头部:系统指令(模型最先看到,印象深) messages.append({"role": "system", "content": system}) # 中间:对话历史(内容最多,但注意力稀释) messages.extend(history) # 尾部User消息:关键检索内容 + 用户问题(最后看到,印象深) user_content = "" if retrieved_docs: user_content += format_docs(retrieved_docs) + "\n\n" user_content += f"问题:{user_query}\n\n请基于以上资料回答。" messages.append({"role": "user", "content": user_content}) return messages## Context Engineering实践:Agent工作流在Agent系统中,Context Engineering最复杂,也最重要:pythonclass AgentContextBuilder: """为Agent构建高质量的执行上下文""" def __init__(self, agent_config: dict): self.config = agent_config self.execution_history = [] # 已执行步骤记录 def build_context(self, current_task: str, available_tools: list, recent_observations: list, token_budget: int = 8000) -> list: """构建完整的Agent执行上下文""" sections = [] used_tokens = 0 # 1. Agent身份和能力(固定消耗,约200 tokens) agent_identity = self._get_agent_identity() sections.append(("system", agent_identity)) used_tokens += 200 # 2. 当前任务(高优先级,约100 tokens) task_section = f"当前任务:{current_task}" sections.append(("task", task_section)) used_tokens += 100 # 3. 可用工具(动态,根据任务选择) tools_desc = self._format_tools(available_tools) tools_tokens = len(tools_desc) // 3 if used_tokens + tools_tokens < token_budget * 0.3: sections.append(("tools", tools_desc)) used_tokens += tools_tokens # 4. 执行历史摘要(压缩历史) remaining = token_budget - used_tokens history_summary = self._summarize_history(remaining * 0.4) sections.append(("history", history_summary)) # 5. 最近观察结果(最重要,放最后) for obs in recent_observations[-3:]: # 最近3条 sections.append(("observation", obs)) return self._assemble_messages(sections) def _summarize_history(self, token_budget: float) -> str: """将执行历史压缩到token预算内""" if not self.execution_history: return "" # 只保留关键决策和结果 key_steps = [ step for step in self.execution_history if step.get("is_key_decision", False) ] if not key_steps: return f"已完成 {len(self.execution_history)} 个步骤。" return "关键步骤:\n" + "\n".join([ f"- {step['action']}:{step['result'][:100]}" for step in key_steps[-5:] ])## 衡量Context Engineering效果pythonclass ContextQualityMetrics: """衡量Context Engineering的质量指标""" def measure_efficiency(self, context: list, output_quality: float) -> dict: """信息效率 = 输出质量 / 上下文Token数""" total_tokens = sum( len(msg["content"]) // 3 for msg in context ) return { "total_tokens": total_tokens, "output_quality": output_quality, "efficiency": output_quality / (total_tokens / 1000), "context_compression_ratio": self._estimate_compression(context) }Context Engineering是一门关于"信息管理"的工程学——把对的信息,在对的时机,以对的方式,放进模型的上下文里。随着AI系统复杂度不断提升,这项能力将越来越决定AI应用的天花板。
