2026/10/17 10:35:58

《AI Agent原理与实战》2026版 第13课 上下文工程

《AI Agent原理与实战》2026版 第13课 上下文工程 本文收录于专栏《AI Agent原理与实战》2026版—— 专栏系统覆盖 AI Agent 的记忆、工具、插件与实战点击订阅可跟踪后续更新。本课定位跑得越久上下文越挤。本课讲上下文工程构成与权衡、四大操作写入/选择/压缩/隔离、四种失败模式、token 账本实战。第 7 课的工具描述烧 token在这里算总账第 26 课的成本控制以此为地基。阶段 2单 Agent 核心机制 来源【微·12】微软 AI Agents for Beginners 第 12 课关键字上下文工程、Context Engineering、上下文压缩、token管理、信息选择、上下文隔离、失败模式、长对话管理本节目录13.1 上下文的构成与权衡13.2 与 Prompt Engineering 的分界13.3 四大操作写入、选择、压缩、隔离13.4 四种上下文失败模式13.5 检查上下文别只管进还要看进了什么13.6 核心代码13.7 实测账本13.8 动手练习概念讲解13.1 上下文的构成与权衡微软原课把 Agent 需要管理的上下文分成五类来源内容增长行为指令Instructions系统提示、few-shot 示例、工具描述固定每轮都在知识KnowledgeRAG 检索结果、数据库查询结果每次检索跳涨工具Tools工具定义 schema 调用结果定义固定结果累积对话历史History用户/助手往来消息随轮次线性增长用户偏好Preferences长期学到的用户习惯缓慢增长权衡的两端都不好受太少——模型缺信息瞎猜、编造、反复问太多——不只是贵注意力被稀释后判断质量下降“上下文腐烂”context rot——Anthropic 的提法窗口内每个 token 都在消耗注意力预算窗口越满精度越低200K 窗口的任务可能在半满时就开始劣化。原课给的直觉错误常在窗口装满之前就发生。13.2 与 Prompt Engineering 的分界一句话分界原课口径prompt engineering 优化一段静态指令context engineering 管理一个动态信息系统。前者是写好一份说明书后者是设计什么信息、什么时候、怎么进窗口的流水线——包括把信息挪出窗口文件、记忆库、子 Agent再按需取回。原课还给了配套的三步规划法在写任何策略之前先走①定义明确的结果——任务完成时世界是什么样用户拿到什么变化/信息/回应②绘制上下文图谱——完成任务需要哪些信息这些信息分别在哪里③创建上下文流水线——Agent 怎么获取这些信息RAG、MCP 服务器、工具调用都是管道选项。这三步与第 10 课规划是同一件事的两面第 10 课拆做什么这里拆每一步窗口里该有什么。13.3 四大操作写入、选择、压缩、隔离原课的策略清单可以归纳为四个动词——写入write、选择select、压缩compress、隔离isolate。这个四动词框架由 LangChain 于 2025 年 7 月在《Context Engineering for Agents》一文中系统化提出微软原课的六条实践策略便签、记忆、压缩、多 Agent、沙箱、运行时状态对象以及 Anthropic 在《Effective context engineering for AI agents》2025-09中的论述都能映射进这四个动词——三家口径在操作层面高度一致写入WriteAgent 用 scratchpad便签把任务关键状态记到窗口外的文件或运行时对象需要时再读回。窗口里只留指针不留全文。Claude Code 的 TODO 文件、进度文件都是这个模式。选择Select进窗口前先筛选——RAG 的 top-k 截断、工具描述的按需加载第 8 课的 response_format 是选择手段之一、记忆检索的相关性排序。原则宁可漏掉可再取的不可塞进用不上的。压缩Compress窗口逼近上限时摘要 裁剪。做法旧轮次压成摘要消息、超长工具输出只留结论、保留最近 N 轮原文 更早的摘要。工程上各家阈值不同Claude Code 在窗口约 95% 时自动压缩有的框架默认 85%——关键是触发条件要确定性按 token 计数不靠模型自觉。隔离Isolate把大任务拆给子 Agent各自开干净窗口只回传 1-2K token 的摘要给父 Agent。第 22 课的 orchestrator-workers 本质上就是隔离策略的组织化。13.4 四种上下文失败模式原课总结了四个典型翻车场景诊断时按图索骥失败模式症状解法毒化Poisoning一条幻觉/错误信息进窗口被反复引用Agent 追不可能的目标入窗前校验 隔离坏信息第 12 课外部验证分心Distraction窗口塞满旧细节Agent 纠缠历史而忽略当前请求定期摘要压缩混淆Confusion工具太多描述重叠选错工具工具分组按需加载第 8 课命名空间 RAG over tools冲突Clash窗口内新旧信息矛盾推理摇摆剪枝过时信息 显式标注信息新旧13.5 检查上下文别只管进还要看进了什么原课特别强调一步常被跳过的工程动作审查每次模型调用实际收到了什么。调试三问装太多了装错了还是漏了该装的生产环境不需要记录原始 prompt隐私体积记账本就够候选多少条、选中多少条、压缩前后 token 数、哪个子任务的输出被隔离在窗口外。这就是下一节案例的主角——token 账本。案例实战长任务的 token 账本目标一个逐篇读论文做笔记的研究助理 Agent10 篇、每篇约 700 字对比两种上下文策略的逐轮 token 账本策略 A 累积式全部历史塞着走基线策略 B 滚动摘要式每 3 篇把旧笔记压缩成摘要消息窗口只保留 [系统提示 总任务 摘要 最近 2 组消息]环境Windows推荐Windows 10/11 Python 3.9pip install openai3.6.0setx DEEPSEEK_API_KEY sk-...后新开终端运行python 13_context_ledger.py——脚本无操作系统相关依赖Linux本课实测环境Ubuntu 22.04Python 3.10.12openai 3.6.0deepseek-chat2026-10-01 实测两种策略各约 5-8 次 API 调用全程约 3-4 分钟。注意模型行为有随机性绝对 token 数每次运行会有浮动但累积式单调递增 vs 滚动摘要锯齿形的形状稳定可复现换国内模型GLM/MiniMax/MiMo接入参数与实测行为见第 7 课国内模型适配节代码改base_url与model两行token 账本的具体数值随模型分词器不同而不同对比结论形状不受影响13.6 核心代码# 13_context_ledger.py节选B 的滚动窗口配对完整性是关键defstrategy_rolling(n_papers10,keep_recent2,compress_every3):summary,ledger,raw_tailNone,[],[]# raw_tail 每元素 一组配对完整的消息foriinrange(1,n_papers1):view[系统提示,总任务]# 骨架永远保留ifsummary:view.append({role:system,content:f[已读论文要点摘要]\n{summary}})view[mforgroupinraw_tailformingroup]rclient.chat.completions.create(modelMODEL,messagesview,tools...,...)# ...执行工具调用组 决策消息 所有 tool 响应 一句话笔记ifi%compress_every0:# 确定性触发按篇数不按模型自觉notes[...旧组里的 assistant 笔记...]summarycompress(notes)# 一次额外 LLM 调用换窗口瘦身raw_tailraw_tail[-keep_recent:]# 只留最近 2 组returnledger,messages【已实测】2026-10-01deepseek-chat。13.7 实测账本策略 A累积式第 1篇: prompt 320 completion332 ← 起步很便宜 第 3篇: prompt 5062 completion50 ← 模型批量预读历史暴涨 第 5篇: prompt 5559 completion50 第 7篇: prompt 6056 completion50 ← 单调递增看不到头 第 9篇: prompt 6553 completion50 A 总消耗: 24,082 tokens策略 B滚动摘要式第 1篇: prompt 320 completion329 第 3篇: prompt 5075 completion88 ← 压缩前最后一次全量 第 5篇: prompt 947 completion105 ← 压缩生效窗口瘦回 1/5 第 6篇: prompt 1975 completion66 第 8篇: prompt 2434 completion68 ← 在低位缓慢爬升2 组原文 摘要 第10篇: prompt 1427 completion78 ← 又一次压缩后回落 B 总消耗: 17,908 tokens为 A 的 74.4%三条解读账本形状即策略指纹。A 的 prompt 单调爬升每轮都为全部历史付费且越往后越贵B 呈锯齿形——压缩点回落、组间缓升。10 篇只省 26%但差距随任务长度放大A 是 O(n²) 累计n 轮每轮带 n 轮历史B 是 O(n)——100 篇的任务里 B 会便宜一个数量级。压缩不是免费的。每次压缩多一次 LLM 调用把旧笔记变成摘要的这次调用本身也花钱且压缩会丢细节——若最终问题恰好问第 2 篇的实验数字是多少B 只能从摘要里答关于稀疏化的改进方法答不出具体数字。压缩比和保留策略是业务决策摘要保结论、原文保最近、关键数据写文件写入策略三件套配合。窗口裁剪的第一坑消息配对完整性。本案例实测踩到裁剪窗口时把 assistant 的 tool_calls 决策消息切在了边界外、对应的 tool 消息留在窗口内API 直接 400“insufficient tool messages following tool_calls message”。裁剪必须按组为单位——决策消息和它的所有 tool 响应同生共死。这也解释了为什么生产系统都用框架管理这段逻辑第 15-17 课。13.8 动手练习把keep_recent改成 1、compress_every改成 2观察 B 的总消耗先降后升——压缩太频繁时压缩调用本身的开销反噬。找出这组参数下的最优点。在最终汇总前问 Agent第 2 篇论文的具体实验数字——亲测压缩的信息损失边界体会什么信息必须走写入文件而不是摘要。小结上下文窗口是统一预算指令/知识/工具/历史/偏好五类信息在此竞争太少缺信息太多稀释注意力context rot 在装满前就发生。四大操作写入挪出窗口、选择进前筛选、压缩摘要裁剪、隔离子 Agent 干净窗口触发条件要确定性。四种失败模式毒化、分心、混淆、冲突——按症状对号入座。实测账本累积式单调膨胀 O(n²)滚动摘要锯齿形 O(n)压缩有信息损失关键数据走文件不走摘要窗口裁剪以消息组为单位保配对。上下文管的是这一次会话内的信息流。跨会话要记住用户偏好、历史经验就需要外部存储与检索——第 14 课《记忆管理》收束单 Agent 机制的最后一块。扩展阅读 网络提示github.com 需代理clone 可走 ghproxy 加速、push 优先 SSHanthropic.com 需代理核心结论已摘进本课正文pip 安装建议加清华镜像-i https://pypi.tuna.tsinghua.edu.cn/simple。详见总纲附录《国内网络访问与国产适配指南》。微软原课第 12 课Context Engineeringhttps://github.com/microsoft/ai-agents-for-beginners/tree/main/12-context-engineeringAnthropic《Effective context engineering for AI agents》2025-09https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agentsLangChain《Context Engineering for Agents》2025-07write/select/compress/isolate 四动词框架的出处原文页已随博客域名迁移若链接失效可搜标题https://blog.langchain.dev/context-engineering-for-ai-agents/原课配套 notebookchat 摘要压缩实操课程仓库 12-context-engineering/code_samples/我的专栏蛋白 / 抗体 / 多肽 / 核酸分子模拟 / 动力学 / 对接药物 / 设计 / 案例AI / Agent / 大模型开源蛋白结构预测分子模拟基础小分子药物设计案例AI Agent系列开源蛋白生成方法实践分子动力学模拟-Amber蛋白药物设计案例化学大模型开源多肽设计模型分子动力学模拟-Gromacs多肽药物设计案例《AI Agent原理与实战》开源多肽性质预测分子动力学模拟-OpenMM开源小分子生成设计CADD中的机器学习模型DNA/RNA药物设计結合自由能高效计算配置《MCP 入门实战》siRNA药物设计模型UCSF DOCK系列我胡师兄说药《AI入门实战2026》ASO药物设计模型rDock系列 LeDock系列 gnina系列《经典机器学习实战》