引言:从Prompt Engineering到Context Engineering的范式转变

如果你在2024年还在专注于"如何写一个好的Prompt",那么到了2026年,游戏规则已经彻底改变。当LLM的上下文窗口从4K扩展到200K,甚至更大;当模型本身的指令跟随能力已经足够强大;真正的工程挑战变成了:如何精确地向模型提供它需要知道的信息,同时过滤掉它不需要知道的噪音。这就是Context Engineering的核心命题。—## 一、Context Engineering是什么?Context Engineering(上下文工程)是指系统性地设计、构建、管理和优化输入给LLM的上下文信息,以最大化模型在特定任务上的表现。它不是一个Prompt模板,而是一套工程体系,包括:- 信息选择:从海量数据中选出最相关的片段- 信息压缩:在有限的token预算内传递最多有效信息- 信息结构化:以最利于模型理解的格式组织信息- 动态更新:随对话和任务进展动态调整上下文内容- 记忆管理:决定哪些信息应该进入短期/长期记忆—## 二、上下文的五个组成维度理解Context Engineering,先要搞清楚"上下文"到底包含什么。### 2.1 系统提示(System Prompt)定义模型的角色、能力边界、输出格式要求和行为约束。这是最稳定的上下文层,一般在会话生命周期内不变。pythonSYSTEM_PROMPT = """你是一个专业的代码审查助手,专注于Python和TypeScript。你的职责:1. 识别代码中的安全漏洞、性能问题、可维护性问题2. 提供具体可行的改进建议3. 解释每个问题的严重程度(Critical/High/Medium/Low)输出格式:- 使用Markdown格式- 每个问题以###标题开始- 包含问题描述、代码示例、修复建议三个部分约束:- 只针对用户提供的代码,不要引申讨论无关内容- 如果代码没有问题,明确说明"未发现明显问题""""### 2.2 对话历史(Conversation History)多轮对话的核心挑战是如何管理对话历史——完整保留会撑爆上下文窗口,随意截断会导致模型"失忆"。pythonclass ConversationManager: def __init__(self, max_tokens: int = 8000, reserve_for_response: int = 2000): self.max_context_tokens = max_tokens - reserve_for_response self.messages = [] def add_message(self, role: str, content: str): self.messages.append({"role": role, "content": content}) self._compress_if_needed() def _compress_if_needed(self): """当上下文超限时,压缩早期对话""" total_tokens = sum(estimate_tokens(m["content"]) for m in self.messages) if total_tokens <= self.max_context_tokens: return # 策略1:保留系统消息 + 最近N轮 # 策略2:对早期对话进行摘要压缩 # 策略3:保留关键决策节点的消息 # 实践中推荐:先尝试保留最近N轮, # 如果仍超限,对早期N轮生成摘要 self._summarize_early_messages() def _summarize_early_messages(self): """将早期消息压缩为摘要""" if len(self.messages) < 6: return early_messages = self.messages[:4] summary_prompt = f"""请将以下对话压缩为200字以内的摘要,保留关键决策和重要信息: {format_messages(early_messages)}""" summary = call_llm(summary_prompt, max_tokens=300) # 用摘要替换早期消息 self.messages = [ {"role": "system", "content": f"[对话摘要] {summary}"} ] + self.messages[4:]### 2.3 检索增强内容(RAG Context)这是Context Engineering中变化最快的领域。2026年的RAG已经从简单的"向量检索+拼接"演进为精细化的上下文注入。pythonclass AdvancedRAGContext: def __init__(self, vector_db, reranker): self.vector_db = vector_db self.reranker = reranker def build_context(self, query: str, max_tokens: int = 3000) -> str: # 第一步:多路召回 semantic_results = self.vector_db.search(query, k=20) keyword_results = self.bm25_search(query, k=10) # 合并去重 all_results = self._merge_results(semantic_results, keyword_results) # 第二步:精排 reranked = self.reranker.rerank(query, all_results, top_k=5) # 第三步:结构化注入 context_parts = [] token_used = 0 for doc in reranked: doc_tokens = estimate_tokens(doc.content) if token_used + doc_tokens > max_tokens: # 截断到预算 remaining = max_tokens - token_used truncated = truncate_to_tokens(doc.content, remaining) context_parts.append(self._format_doc(doc, truncated)) break context_parts.append(self._format_doc(doc, doc.content)) token_used += doc_tokens return "\n\n---\n\n".join(context_parts) def _format_doc(self, doc, content: str) -> str: """结构化文档格式,帮助模型定位引用来源""" return f"""[来源: {doc.source} | 相关度: {doc.score:.2f}]{content}"""### 2.4 工具调用结果(Tool Results)当Agent调用工具后,如何将结果重新注入上下文是关键工程问题。pythondef format_tool_result(tool_name: str, result: Any, max_tokens: int = 1000) -> str: """将工具结果格式化为上下文友好的格式""" # 对不同类型的工具结果做不同处理 if tool_name == "web_search": # 搜索结果:只保留标题、摘要、URL,不保留全文 return format_search_results(result, max_items=5) elif tool_name == "code_execution": # 代码执行:保留stdout/stderr,截断超长输出 output = result.get("stdout", "") + result.get("stderr", "") if estimate_tokens(output) > max_tokens: # 保留开头和结尾,用省略号连接 return truncate_middle(output, max_tokens) return output elif tool_name == "database_query": # 数据库结果:转换为结构化表格,限制行数 return format_table(result, max_rows=20) return str(result)[:max_tokens * 4] # 粗略截断### 2.5 用户信息与偏好(User Context)个性化上下文是提升用户体验的关键,但也是数据合规的敏感区域。pythonclass UserContextBuilder: def build(self, user_id: str, session_context: dict) -> str: user = self.user_service.get(user_id) context = [] # 技能水平:帮助模型调整输出复杂度 if user.expertise_level == "expert": context.append("用户是该领域专家,可以使用专业术语,省略基础解释") elif user.expertise_level == "beginner": context.append("用户是初学者,请使用通俗语言,提供更多背景解释") # 工作上下文 if session_context.get("current_project"): context.append(f"当前项目: {session_context['current_project']}") # 历史偏好 if user.preferred_language: context.append(f"代码示例使用: {user.preferred_language}") return "\n".join(context)—## 三、Token预算管理:Context Engineering的量化核心Context Engineering最终要落到可量化的指标上:Token预算管理。### 3.1 建立Token预算分配表pythonclass TokenBudgetManager: def __init__(self, model_max_tokens: int = 128000): # 典型预算分配(基于实践经验) self.budget = { "system_prompt": 0.05, # 5% "user_context": 0.03, # 3% "conversation_history": 0.20, # 20% "rag_context": 0.35, # 35% "tool_results": 0.15, # 15% "current_query": 0.05, # 5% "response_reserve": 0.17, # 17% 留给模型输出 } self.total = model_max_tokens def get_budget(self, component: str) -> int: ratio = self.budget.get(component, 0) return int(self.total * ratio) def report(self, actual_usage: dict) -> dict: """报告各组件的实际token使用情况""" report = {} for component, tokens_used in actual_usage.items(): budget = self.get_budget(component) report[component] = { "budget": budget, "used": tokens_used, "utilization": f"{tokens_used/budget*100:.1f}%", "status": "OK" if tokens_used <= budget else "OVERFLOW" } return report### 3.2 上下文质量评估不只要管理token数量,更要管理token质量:pythondef evaluate_context_quality(context: str, query: str) -> float: """评估上下文与查询的相关性分数""" # 使用轻量级embedding模型计算相关度 context_embedding = embed(context) query_embedding = embed(query) similarity = cosine_similarity(context_embedding, query_embedding) # 相关度过低说明RAG检索质量差 if similarity < 0.5: logger.warning(f"Context quality low: similarity={similarity:.2f}") return similarity—## 四、2026年Context Engineering的三大前沿趋势### 4.1 动态上下文压缩不再依赖固定规则截断,而是使用小型LLM对上下文进行智能压缩:- LLMLingua系列方法:通过小模型识别并删除冗余token,压缩率可达80%,同时保持95%以上的语义完整性- 选择性上下文(Selective Context):识别并移除低自信息量的内容片段### 4.2 结构化上下文格式研究表明,上下文的结构化程度显著影响模型表现。2026年的最佳实践是使用XML-like标签明确标注上下文的语义角色:xml<context> <background>用户当前正在开发一个电商系统的订单模块</background> <current_code> <file name="order.py"> <!-- 代码内容 --> </file> </current_code> <relevant_docs> <doc source="架构设计文档" relevance="0.92"> <!-- 相关片段 --> </doc> </relevant_docs> <user_query>为什么并发下单时会出现库存超卖?</user_query></context>### 4.3 长期记忆与上下文的协同LLM应用的长期记忆不再简单存储对话历史,而是提炼出可重用的知识结构,在需要时精准注入:pythonclass LongTermMemory: def store(self, session_id: str, insights: list): """将session中的关键信息提炼并存储""" for insight in insights: self.memory_db.upsert({ "content": insight.content, "category": insight.category, # user_preference/project_fact/decision "embedding": embed(insight.content), "confidence": insight.confidence, "last_accessed": datetime.now() }) def retrieve(self, current_query: str, max_memories: int = 5) -> list: """按相关性检索历史记忆""" query_embedding = embed(current_query) return self.memory_db.search( query_embedding, top_k=max_memories, filter={"confidence": {"$gt": 0.7}} )—## 五、实践建议:从今天开始的Context Engineering1. 审计你的系统提示:很多系统提示臃肿冗余,建议定期用token profiler分析哪些内容真正影响输出质量2. 为RAG上下文建立质量基线:跟踪相关度分数,低于0.6的检索结果值得怀疑3. 实施Token预算监控:在生产环境监控各组件的token消耗,异常增长往往预示着上下文管理问题4. 建立A/B测试机制:上下文格式的改变可以像代码部署一样,通过A/B测试量化效果5. 不要追求"多",追求"准":更多的上下文不等于更好的输出,精准相关的信息才是关键Context Engineering是2026年LLM工程师最核心的能力之一。它的边界不是一个固定的技术栈,而是一种不断优化"给模型看什么"的系统性思维。掌握了这种思维,你才能在上下文窗口越来越大的时代,真正发挥出模型的全部潜力。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐