Context Engineering实战:超越Prompt Engineering的下一个工程范式
Prompt Engineering 解决的是"怎么说"的问题,Context Engineering 解决的是"给模型看什么"的问题。随着上下文窗口越来越大,如何精心构建输入给模型的信息,成为决定 AI 应用质量的核心工程能力。
·
Prompt Engineering 解决的是"怎么说"的问题,Context Engineering 解决的是"给模型看什么"的问题。随着上下文窗口越来越大,如何精心构建输入给模型的信息,成为决定 AI 应用质量的核心工程能力。
从 Prompt 到 Context在 GPT-3 时代,Prompt Engineering 主要是在几百个 Token 的限制下,用尽可能巧妙的方式表达任务。这个时代,“怎么说"确实很重要。但 2025-2026 年的模型已经有了 128K、200K 甚至 1M 的上下文窗口。现在的问题不再是"怎么在有限空间里表达需求”,而是"如何在巨大的输入空间中,组织最有价值的信息"。这就是 Context Engineering 的核心命题:对注入模型上下文的信息进行系统性的设计、选择、组织和优化。## Context 的五个维度一个完整的 Context 由五个维度构成:┌──────────────────────────────────────────────────────┐│ Context = Instructions + Memory + State + History + Tools ││ ││ Instructions: 任务定义、角色设定、输出格式要求 ││ Memory: 长期用户信息、领域知识、过去决策 ││ State: 当前环境状态、工具调用结果 ││ History: 相关对话历史、参考案例 ││ Tools: 可调用工具的描述(影响模型决策) │└──────────────────────────────────────────────────────┘Context Engineering 的工作是决定每个维度注入什么、不注入什么、以什么顺序注入。## 信息密度优先原则最重要的 Context Engineering 原则:每一个 Token 都有成本,无效信息不仅浪费金钱,还会稀释重要信息。### 信息密度审计pythondef audit_context_quality(context: str) -> dict: """评估上下文的信息密度""" words = context.split() # 识别低价值模式 low_value_patterns = [ r"当然,我很乐意帮助", r"这是一个很好的问题", r"请注意以下几点", r"总的来说", r"综上所述", r"首先,.*?其次,.*?最后,", ] low_value_count = sum( len(re.findall(pattern, context, re.DOTALL)) for pattern in low_value_patterns ) # 计算信息密度分数(简化版) density_score = 1.0 - (low_value_count * 0.1) return { "total_tokens": len(words) * 1.3, # 粗略估计 "density_score": max(0, density_score), "improvement_hints": [ "删除套话和过渡词", "用结构化格式替代散文描述", "压缩重复信息", ] if density_score < 0.8 else [] }### 结构化 > 散文同样的信息,结构化表达比散文更节省 Token 且更清晰:python# 低效:散文描述(~120 tokens)verbose_context = """用户是一位经验丰富的Python开发者,他已经在这个项目上工作了两年。他熟悉FastAPI框架,并且在之前的对话中表示他更喜欢简洁的代码风格,不喜欢过度注释。他目前正在开发一个电商后端服务,使用PostgreSQL作为数据库。"""# 高效:结构化描述(~50 tokens)structured_context = """用户背景:- 角色:Python开发者(5年+)- 项目:电商后端(FastAPI + PostgreSQL)- 偏好:简洁代码,最小化注释"""## 动态 Context 构建好的 Context Engineering 不是静态的,而是根据当前任务动态组装最相关的信息。pythonclass DynamicContextBuilder: def __init__(self, max_tokens: int = 8000): self.max_tokens = max_tokens self.components = {} def register_component(self, name: str, priority: int, content_fn): """注册上下文组件,优先级越高越不容易被截断""" self.components[name] = { "priority": priority, "content_fn": content_fn } def build(self, query: str, user_context: dict) -> str: """根据查询动态构建最优上下文""" # 1. 计算每个组件的内容 component_contents = {} for name, comp in self.components.items(): try: content = comp["content_fn"](query, user_context) component_contents[name] = { "content": content, "tokens": estimate_tokens(content), "priority": comp["priority"] } except Exception: pass # 2. 按优先级排序,在 token 预算内装入尽可能多的组件 sorted_components = sorted( component_contents.items(), key=lambda x: x[1]["priority"], reverse=True ) selected_contents = [] remaining_tokens = self.max_tokens for name, comp in sorted_components: if comp["tokens"] <= remaining_tokens: selected_contents.append(comp["content"]) remaining_tokens -= comp["tokens"] else: # 尝试截断 truncated = truncate_to_tokens(comp["content"], remaining_tokens) if truncated: selected_contents.append(truncated) break return "\n\n".join(selected_contents)# 使用示例builder = DynamicContextBuilder(max_tokens=8000)# 注册组件(优先级 10 最高)builder.register_component( "instructions", priority=10, content_fn=lambda q, ctx: f"任务:{ctx.get('task', '回答用户问题')}")builder.register_component( "user_profile", priority=8, content_fn=lambda q, ctx: generate_user_summary(ctx.get("user_id")))builder.register_component( "relevant_history", priority=6, content_fn=lambda q, ctx: retrieve_relevant_episodes(q, ctx.get("user_id"), top_k=3))builder.register_component( "domain_knowledge", priority=4, content_fn=lambda q, ctx: search_knowledge_base(q, top_k=5))## 位置效应工程研究表明,LLM 对上下文的注意力是不均匀的——开头和结尾的信息比中间更容易被关注(“Lost in the Middle” 现象)。pythonclass ContextPositionOptimizer: """根据 Lost-in-the-Middle 效应优化信息位置""" def optimize_placement(self, context_parts: list) -> list: """ 输入:按重要性排序的上下文片段列表 输出:按位置优化后的顺序 策略: - 最重要的信息放在开头 - 次重要的信息放在结尾 - 次要信息放在中间 """ if len(context_parts) <= 2: return context_parts # 按重要性排序(假设已排好序) most_important = context_parts[0] second_important = context_parts[1] less_important = context_parts[2:] # 重新排列 optimized = [most_important] + less_important + [second_important] return optimized def add_attention_anchors(self, content: str) -> str: """添加注意力锚点,提升关键信息的显著性""" lines = content.split('\n') anchored_lines = [] for line in lines: if line.startswith('CRITICAL:') or line.startswith('重要:'): # 用特殊格式标注关键信息 anchored_lines.append(f"**[重要]** {line}") else: anchored_lines.append(line) return '\n'.join(anchored_lines)## 工具描述的 Context 工程工具描述是 Context 的重要组成部分,直接影响模型的工具调用决策。python# 低质量工具描述(模型不知道何时该用)bad_tool = { "name": "search", "description": "搜索功能"}# 高质量工具描述(明确使用场景和边界)good_tool = { "name": "knowledge_base_search", "description": """在内部知识库中搜索产品文档、FAQ和技术规格。 适合使用的场景: - 用户询问产品功能、规格或限制 - 需要查找具体的技术参数 - 回答关于公司政策的问题 不适合使用的场景: - 用户询问实时信息(如当前价格) - 一般性的编程问题 - 需要最新网络信息的查询 搜索技巧:使用产品名称或技术关键词效果最好""", "parameters": { "type": "object", "properties": { "query": { "type": "string", "description": "搜索查询词,建议使用名词性短语" } }, "required": ["query"] }}## 情景示例的 Context 注入Few-shot 示例是 Context Engineering 中最有价值的技术之一,但需要精心挑选。pythonclass FewShotSelector: def __init__(self, example_pool: list, embedding_model): self.examples = example_pool self.embedder = embedding_model # 预计算所有示例的嵌入 self.embeddings = [ self.embedder.embed(ex["input"]) for ex in example_pool ] def select_relevant_examples( self, current_input: str, n_examples: int = 3 ) -> list: """选择与当前输入最相关的示例""" query_embedding = self.embedder.embed(current_input) # 计算相似度 similarities = [ cosine_similarity(query_embedding, ex_emb) for ex_emb in self.embeddings ] # 选取最相关的 N 个示例(但要有多样性,避免全选同一类) sorted_indices = sorted( range(len(similarities)), key=lambda i: similarities[i], reverse=True ) # 取前 2N 个候选,然后按多样性筛选 candidates = [self.examples[i] for i in sorted_indices[:n_examples*2]] selected = self._diversify_selection(candidates, n_examples) return selected def format_examples(self, examples: list) -> str: """格式化示例为上下文字符串""" formatted = [] for i, ex in enumerate(examples, 1): formatted.append(f"示例{i}:\n输入:{ex['input']}\n输出:{ex['output']}") return "\n\n".join(formatted)## Context 质量的量化评估pythonclass ContextQualityMetrics: def evaluate(self, context: str, query: str, response: str) -> dict: metrics = {} # 1. Token 效率:有效信息量 / 总Token数 metrics["token_efficiency"] = self._calc_token_efficiency(context) # 2. 相关性:context 与 query 的语义相关度 metrics["relevance_score"] = self._calc_relevance(context, query) # 3. 覆盖度:response 中引用了多少 context 内容 metrics["coverage_rate"] = self._calc_coverage(context, response) # 4. 冗余度:context 中重复信息的比例 metrics["redundancy_rate"] = self._calc_redundancy(context) return metrics def _calc_token_efficiency(self, context: str) -> float: """估算 Token 效率(0-1,越高越好)""" total_tokens = estimate_tokens(context) # 去除停用词、填充词后的Token数 meaningful_tokens = estimate_tokens(remove_filler_words(context)) return meaningful_tokens / total_tokens if total_tokens > 0 else 0## 实战建议:Context Engineering 改进路径**Quick Win(一周内见效):1. 删除 System Prompt 中的所有"当然"、"请注意"等填充语2. 将散文描述改为结构化格式(JSON/Markdown列表)3. 最重要的指令放在 Prompt 开头和结尾,不要埋在中间中期优化(一个月):1. 实现动态 Context 构建,根据查询类型组装不同组件2. 建立 Few-Shot 示例库,实现相关示例的动态选取3. 优化工具描述,明确每个工具的使用场景和边界长期工程化:**1. 建立 Context 质量评估 Pipeline,持续监控信息密度和相关性2. 实现 Context 的 A/B 测试,用数据驱动优化决策3. 构建领域知识库,使特定场景的上下文更丰富准确Context Engineering 是 2026 年 AI 工程师最值得深入的技能方向。当模型能力趋于一致,Context 的质量将成为区分优秀产品和平庸产品的关键。
更多推荐



所有评论(0)