[Hello-Agents] Day 12: 第九章 上下文工程
[Hello-Agents] Day 12: 第九章 上下文工程阅读日期:2026年4月6日 "上下文工程的'艺与术',在于从持续扩张的'候选信息宇宙'中,甄别哪些内容应当进入有限的上下文窗口。" 一、章节摘要第九章「上下文工程」是 Hello-Agents 教程中承上启下的关键章节。在前八章介绍了智能体的基础概念、发展历史、大语言模型基础、经典范式构建、低代码平台搭建、框架开发实践、Agent框架构建以及记忆与检索系统之后,本章聚焦于一个看似简单却极具深度的核心问题:如何在每一次模型调用前,以可复用、可度量、可演进的方式,拼装并优化输入上下文? 本章首先厘清了「上下文工程」与「提示工程」的本质区别:提示工程关注如何编写和组织 LLM 的指令以获得更优结果,而上下文工程则是在推理阶段策划和维护「最优的信息集合(tokens)」,不仅包含提示本身,还包含系统指令、工具定义、外部数据、消息历史等所有进入上下文窗口的信息。 接着,本章深入探讨了「上下文腐蚀」现象——随着上下文窗口中 tokens 增加,模型从上下文中准确回忆信息的能力反而下降。这一观察引出了「上下文必须被视作有限资源」的核心认知,进而提出了 GSSC(Gather-Select-Structure-Compress)流水线作为系统性解决方案。 最后,本章提供了三个生产级工具的实现:ContextBuilder(上下文构建器)、NoteTool(结构化笔记工具)、TerminalTool(终端工具),展示了从理论到实践的完整路径。 二、核心概念解析2.1 上下文工程 vs 提示工程这是本章最重要的概念区分。在 LLM 工程的早期阶段,提示工程往往是主要工作,因为大多数用例需要针对单轮分类或文本生成做精调式的提示优化。然而,随着智能体工程化的深入,它们需要在更长的时间范围内、跨多次推理轮次地工作,仅仅优化提示已远远不够。
2.2 上下文腐蚀(Context Rot)「针堆找针」(needle-in-a-haystack)基准测试揭示了一个关键现象:随着上下文窗口中 tokens 增加,模型从上下文中准确回忆信息的能力反而下降。这不是某个模型的缺陷,而是几乎所有 LLM 共同的特征。 这种「上下文腐蚀」的根源在于 Transformer 架构本身的约束:每个 token 需要与上下文中的所有 token 建立关联,理论上形成 n² 级别的两两注意力关系。随着上下文长度增长,模型对这些两两关系的建模能力会被「拉薄」,产生「上下文规模」与「注意力集中度」的张力。 实践启示:上下文必须被视作一种有限资源,具有边际收益递减特性。每新增一个 token,都会消耗模型的「注意力预算」。 2.3 GSSC 流水线:上下文管理的四阶段框架ContextBuilder 的核心是 GSSC(Gather-Select-Structure-Compress)流水线,这是一个清晰的四阶段上下文构建框架:
2.4 长时程任务的三种策略针对超出上下文窗口的长序列行动,本章提出了三种互补的工程手段: 1. 压缩整合(Compaction) 当对话接近上下文上限时,对历史进行高保真总结,用摘要重启新窗口。适合需要长对话连续性的任务,强调上下文的「接力」。 2. 结构化笔记(Structured Note-taking) 智能体以固定频率将关键信息写入上下文外的持久化存储,在后续阶段按需拉回。适合有里程碑/阶段性成果的迭代式开发与研究。 3. 子代理架构(Sub-agent architectures) 主代理负责高层规划与综合,多个专长子代理在干净上下文中深挖,仅回传凝练摘要。适合复杂研究与分析,能从并行探索中获益。 三、代码示例与实现解析3.1 ContextPacket 与 ContextConfig 数据结构ContextBuilder 使用两个核心数据结构来管理上下文:
3.2 Select 阶段的核心算法选择阶段是 GSSC 流水线的核心,采用相关性和新近性的加权组合进行评分:
3.3 NoteTool 的存储格式NoteTool 采用 Markdown + YAML 混合格式,兼顾结构化和可读性:
3.4 TerminalTool 的安全机制TerminalTool 通过四层安全机制确保系统安全: 第一层:命令白名单 — 只允许安全的只读命令(ls, cat, head, tail, grep, find, wc 等) 第二层:工作目录沙箱 — 只能访问指定工作目录及其子目录,禁止路径逃逸 第三层:超时控制 — 每个命令有执行时间限制,防止无限循环 第四层:输出大小限制 — 限制命令输出大小,防止内存溢出 四、个人思考与反思4.1 从「写提示」到「管理上下文」的思维转变读完本章,我意识到一个根本性的思维转变:传统提示工程教我们「如何写出有效提示」,而上下文工程要求我们思考「什么样的上下文配置最有可能让模型产出期望的行为」。这不是措辞的优化,而是系统性的信息管理。 这种转变有几个深刻的含义:
4.2 GSSC 流水线的工程智慧GSSC 流水线的设计体现了几个重要的工程原则: 分离关注点: Gather 负责数据收集、Select 负责价值判断、Structure 负责格式组织、Compress 负责兜底处理。每个阶段职责单一,便于独立测试和优化。 可配置性: 通过 ContextConfig 暴露关键参数(max_tokens、reserve_ratio、min_relevance、权重配置),使得不同场景可以调整策略。 贪心选择的实用主义: 按分数从高到低填充的贪心算法虽然不一定找到全局最优解,但在工程实践中足够高效且可解释。 4.3 NoteTool 与 MemoryTool 的互补关系本章明确区分了两种「记忆」工具的定位:
这种设计体现了「不同问题需要不同工具」的工程智慧。MemoryTool 擅长模糊检索和语义匹配,而 NoteTool 擅长精确状态追踪和结构化记录。在实际应用中,两者应该配合使用:
4.4 TerminalTool 与 JIT 上下文的范式意义TerminalTool 实现了本章 9.2.2 节提出的「即时上下文」(Just-in-time, JIT)理念: 传统方式:预先索引所有文件 → 建立向量数据库 → 查询时检索 JIT 方式:维护轻量化引用(文件路径、查询)→ 运行时通过工具动态加载所需数据 这种范式的优势在于:
4.5 关于「工具集臃肿」的警示本章提出了一个重要的设计原则:「如果人类工程师都说不准用哪个工具,别指望智能体做得更好。」这指向了工具设计的核心挑战: 最小可行工具集(MVTS)原则:精心甄别一个职责单一、相互低重叠的工具集,往往比提供大量「全能型」工具更有效。 这让我反思在实际项目中是否过度追求「功能全面」,而忽视了「职责清晰」。一个接口语义明确、对错误鲁棒、入参描述无歧义的工具,远比一个功能复杂但边界模糊的工具更有价值。 五、实践建议5.1 动态调整 Token 预算根据任务复杂度动态调整 max_tokens。简单分类任务用较小预算(如 2000 tokens),复杂推理任务增加预算(如 4000+ tokens)。可以通过监控 token 使用率来优化配置。 5.2 相关性计算优化本章示例使用简单的 Jaccard 相似度计算相关性。生产环境中应替换为向量相似度计算:
5.3 笔记分类的最佳实践使用 NoteTool 时,合理分类笔记类型: blocker:阻塞问题,优先级最高,应优先检索 action:下一步行动计划,次优先级 task_state:阶段性进展和状态 conclusion:重要结论和发现 reference:重要参考资料 5.4 定期清理和归档笔记系统需要定期维护:
5.5 A/B 测试与持续优化上下文工程不是一次性配置,而是需要持续优化的系统:
六、章节总结第九章「上下文工程」是 Hello-Agents 教程中承上启下的关键章节。它系统地回答了一个核心问题:在智能体工程中,如何让模型「看见」最该看见的信息? 本章的核心贡献包括: 理论层面:厘清了上下文工程与提示工程的区别,提出了「上下文腐蚀」概念,建立了 GSSC 流水线框架 工具层面:提供了 ContextBuilder、NoteTool、TerminalTool 三个生产级工具的完整实现 实践层面:给出了长时程任务的三种策略(压缩整合、结构化笔记、子代理架构)及其实践建议 在 AI 应用从「单轮问答」走向「多轮智能体」的时代,上下文工程正在成为新的核心能力。它要求我们不仅关注「如何写提示」,更要关注「如何管理信息流」——在有限资源约束下,最大化信号、最小化噪声。 正如本章所言:「即便模型能力持续提升,'在长交互中维持连贯性与聚焦'仍是构建强健智能体的核心挑战。谨慎而系统的上下文工程将长期保持其关键价值。」 下一章预告:第十章「智能体通信协议」将探讨智能体之间如何进行标准化通信,包括 MCP(Model Context Protocol)等新兴协议的设计理念与实践。 |
评论
发表评论