如果你还在为 Agent “聊着聊着就忘了自己是谁”而抓狂,或者被塞满几万 Token 的 Prompt 搞得晕头转向,那么这篇实战复盘就是为你准备的。

之前我们聊过了 ReAct、记忆系统和 RAG,但这些都是“零件”。真正的工程化难题在于:如何把这些零件组装成一个能长期稳定工作的系统? 这就是第九章的核心——上下文工程(Context Engineering)


为什么你的 Agent 总是“脑子不够用”?

很多人有一个误区:觉得模型支持的 Context Window 越大越好,100K、200K 随便塞。
但现实很骨感:LLM 也有“注意力预算”

在第九章里,我看到了一个扎心的概念:上下文腐蚀(Context Rot)
就像人脑一样,当信息量超过某个临界点,模型的检索精度和逻辑推理能力会断崖式下跌。你塞进去的越多,它“走神”的概率就越大。

所以,上下文工程的核心不是“怎么塞更多”,而是“怎么塞得更精”
我们要做的,是在有限的 Token 预算内,实现信号密度的最大化


第一部分:从“提示工程”到“上下文工程”的思维跃迁

以前我们搞 Prompt Engineering,像是在写“说明书”,琢磨怎么把指令写清楚。
现在搞 Context Engineering,更像是在做“导演剪辑”

1. 什么是 GSSC 流水线?

HelloAgents 框架里实现了一个 ContextBuilder,它把上下文构建拆解成了四个步骤,这个设计非常工业级:

  • Gather(汇集):从记忆、RAG、历史对话、文件系统里把所有可能相关的信息捞出来。
  • Select(选择):这是最核心的!不是所有信息都有用。它通过“相关性 + 新近性”的双重评分,把垃圾信息过滤掉。
  • Structure(结构化):把选中的信息按 [Role][Task][Evidence][Context] 分区摆放。这不仅是给模型看,更是为了调试方便。
  • Compress(压缩):如果还是超限,那就得“断舍离”。保留核心骨架,砍掉冗余细节。

2. 我的思考:为什么“结构化”这么重要?

在实战中我发现,如果把一堆乱七八糟的文本扔给 LLM,它很容易“迷路”。
但如果你告诉它:

[Evidence]
这里是检索到的事实...
[Context]
这里是之前的对话...

模型的处理效率会显著提升。清晰的边界,就是高效的推理。


第二部分:NoteTool —— 给 Agent 一本“随身笔记本”

第八章的记忆系统更像是“潜意识”,而第九章的 NoteTool 则是 Agent 的“显意识笔记”

1. 为什么要用 Markdown + YAML?

很多框架喜欢把状态存在数据库里,但 HelloAgents 选择了文件化
每个笔记都是一个 .md 文件,头部带 YAML 元数据:

---
id: note_001
type: blocker
tags: [refactoring, urgent]
---

这种设计太妙了:

  • 人类可读:我可以直接打开文件看 Agent 在想什么。
  • Git 友好:笔记的变化可以版本控制,方便回溯。
  • 低耦合:不需要复杂的数据库连接,纯文本操作,稳得一匹。

2. 实战场景:长程任务的“救命稻草”

想象一个重构代码库的任务,可能要跑好几天。
如果没有 NoteTool,Agent 每次重启都失忆。
有了 NoteTool,它可以记录:

  • task_state:当前进度到哪了?
  • blocker:遇到了什么坑?
  • action:下一步该干嘛?

这种“持久化状态”的能力,才是 Agent 从“玩具”走向“工具”的关键。


第三部分:TerminalTool —— 拒绝“预加载”,拥抱“即时探索”

这是本章最让我兴奋的部分。
传统的 RAG 是把所有文档预先切分、向量化。但在代码库维护这种场景下,预加载成本高且容易过时

TerminalTool 让 Agent 拥有了“即时探索”的能力。
它就像一个熟练的开发者,不会先把整个项目背下来,而是:

  1. ls 看看目录结构。
  2. grep 搜一下关键函数。
  3. head 瞥一眼文件头。
  4. cat 仔细看具体实现。

1. 安全是底线

允许 Agent 执行命令是很危险的。HelloAgents 做了四层防护:

  • 白名单:只允许 lscatgrep 等只读命令,rmsudo 想都别想。
  • 沙箱:限制在工作目录下,防止 cd ../../etc 这种逃逸。
  • 超时:防止死循环卡死系统。
  • 截断:输出太大直接砍掉,保护内存。

2. JIT 上下文的威力

这种 Just-in-time (JIT) 的模式,完美解决了“上下文腐蚀”问题。
Agent 只在需要的时候加载需要的信息,永远保持轻装上阵


第四部分:实战复盘——构建一个“代码库维护助手”

我把这三个组件串起来,做了一个 CodebaseMaintainer
它的工作流是这样的:

  1. 探索阶段:用 TerminalTool 扫描项目结构,生成初步印象。
  2. 分析阶段:用 grep 找 TODO 和复杂函数,把发现的问题记入 NoteTool(标记为 blocker)。
  3. 规划阶段:读取笔记,结合 ContextBuilder 整理的历史,制定下一步计划。
  4. 执行阶段:每走一步,更新笔记状态。

最爽的时刻:
当我第二天再运行它时,它居然说:“昨天我们发现 order_service.py 嵌套太深,今天我们来重构它。”
那一刻,我感觉它真的“活”了。


第五部分:深度思考与避坑指南

1. 别迷信“大窗口”

我在测试中发现,即使模型支持 128K,一旦上下文超过 20K,它的指令遵循能力就开始下降。
结论:能用 ContextBuilder 压缩到 5K 解决的,绝不要用到 10K。少即是多。

2. 笔记不是越多越好

一开始我让 Agent 疯狂记笔记,结果检索时全是噪音。
优化:给笔记加权重。blocker > action > conclusion。在构建上下文时,优先加载高权重的笔记。

3. 人机协作的边界

NoteTool 的文件化设计,让人类介入变得异常简单。
我可以手动修改笔记,纠正 Agent 的错误判断。
这才是 AI 辅助开发的正确姿势:AI 跑腿,人类把关。


结语:上下文工程,是 Agent 的“内功心法”

如果说 LLM 是引擎,RAG 是燃油,那么上下文工程就是传动系统
它决定了动力能否高效、精准地传递到车轮上。

HelloAgents 第九章展示的这套组合拳(ContextBuilder + NoteTool + TerminalTool),不仅是一套代码,更是一种工程哲学

  • 分层管理:即时、短期、长期记忆各司其职。
  • 按需加载:拒绝暴力堆砌,追求精准打击。
  • 透明可控:让人类看得懂、改得了、信得过。

下一步,我打算在这个基础上,尝试加入“子代理架构”,让主代理负责指挥,子代理负责深挖。毕竟,一个人的精力有限,一个团队的力量才是无穷的。


👋 互动时间:
你在开发 Agent 时,遇到过最头疼的“上下文溢出”或“失忆”问题是什么?你是怎么解决的?欢迎在评论区留言,我们一起聊聊“调教”Agent 的那些坑!

如果觉得这篇文章帮你打开了新思路,欢迎点赞、收藏、转发!你的支持是我继续死磕底层原理的最大动力。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐