上下文工程:每一个 Token 都花在刀刃上
作者:程序员马丁
Ragent AI —— 从 0 到 1 纯手工打造企业级 Agentic RAG,拒绝 Demo 玩具!AI 时代,助你拿个offer。
前面四篇咱们一步一步给 TinyAgent 搭建了完整的记忆体系——短期记忆让 Agent 在同一个会话里记住上下文(第 10、11 篇),持久化让记忆跨重启保留(第 12 篇),长期记忆让 Agent 跨会话认识用户(第 13 篇)。三层记忆各管各的,各就各位。
但如果你真的跑过 上一篇的 Demo,仔细看过控制台输出,可能会发现一个问题:随着记忆越来越丰富、工具越来越多、对话越来越长,Token 预算正在被悄悄吃光。
假设比特严选的客服 Agent 配了 8000 Token 的上下文预算,用户聊到第 8 轮时,messages 数组里塞了什么?

加起来约 5600 Token,看起来还没到 8000 的上限。但这只是第 8 轮——如果对话继续下去,或者某次工具调用返回了一大段知识库内容,Token 预算随时可能爆掉。更关键的是,这 5600 Token 里有多少是当前问题真正需要的?用户第 8 轮问的是“有没有新款扫地机推荐”,但 messages 里还挂着第 2 轮查物流时的完整轨迹 JSON、第 4 轮退款的详细结果——这些对当前问题毫无帮助,白白占着空间。
记忆、工具、历史——每个模块单独看都很合理,但塞在一起就要打架。这就是上下文工程(Context Engineering)要解决的问题。
本项目中具体代码已上传 GitHub TinyAgent,大家 Clone 项目后,将代码分支切换到 1.9.x,默认主分支是最新代码。运行前复制
.env.example为.env,把自己的 API Key 填进去,默认阿里云百炼平台;.env已加入.gitignore,切分支时不会丢。
什么是上下文工程
上下文工程这个说法,最初由 Andrej Karpathy 在 2025 年提出。他的原话大意是:与其说我们在做 Prompt Engineering(提示词工程),不如说我们在做 Context Engineering(上下文工程)——真正的挑战不是写一句好的提示词,而是在有限的上下文窗口里,把恰好需要的信息、以恰好合适的格式、放在恰好合适的位置。
用一个比喻来理解:大模型的上下文窗口就像一张办公桌。桌面大小是固定的(比如 8000 Token),你要在上面摆放所有工作材料——操作手册(系统提示词)、客户档案(长期记忆)、工具箱(工具描述)、聊天记录(对话历史)、当前任务的草稿纸(工具调用结果)。
如果你把所有东西一股脑堆上去,桌面很快就满了,你连写字的空间都没有。好的做法是:只把当前任务需要的材料放上来,其他的收进抽屉里,需要时再拿。
这就是上下文工程的核心:不是把所有信息都塞给大模型,而是精心挑选和组织信息,让每一个 Token 都花在刀刃上。
Token 是怎么被吃掉的
在动手优化之前,先把账算清楚。TinyAgent 的上下文由六个部分组成,每个部分的特征不同:
| 组成部分 | 内容 | Token 估算 | 特征 |
|---|---|---|---|
| 系统提示词 | 角色设定、行为规范 | 150-300 | 固定,每轮都一样 |
| 长期记忆 | 用户画像 + 交互记录 | 200-800 | 半固定,同用户同会话内不变 |
| 对话摘要 | HybridChatMemory 压缩的历史概要 | 200-400 | 半固定,随对话增长但增速远低于原始历史 |
| 工具描述 |