掘金人工智能本月最热 3小时前
上下文工程:从提示到智能代理的关键演进
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

文章探讨了从提示工程(prompt engineering)到上下文工程(context engineering)的转变,强调后者在构建更强大、多轮自主行动的大语言模型(LLM)代理中的核心作用。上下文工程关注如何构建和维护“最可能让模型产生期望行为”的最优信息集,包括提示、工具、外部数据等。文章深入分析了上下文工程的重要性,阐述了“上下文腐化”现象及其成因,并详细介绍了构建有效上下文的关键原则,包括精炼系统提示、优化工具设计、精心选择示例以及运行时上下文检索策略。此外,还提出了应对长时任务的压缩、结构化笔记和多代理架构等高级策略,为构建高效LLM代理提供了全面的指导。

💡 **上下文工程是LLM代理发展的必然趋势**:随着大模型能力增强,将精力从精雕细琢单句提示转移到构建和维护最优信息集合(上下文)变得更为关键。上下文工程旨在确保模型在复杂任务中稳定产生预期行为,是构建高级智能代理的基础。

📉 **警惕“上下文腐化”现象**:模型在处理长上下文时,信息检索和长程推理能力会随之下降,这并非特定模型问题,而是普遍现象。其原因包括有限的注意力资源分配、Transformer架构的计算复杂度以及模型对长序列依赖的经验不足。

✨ **构建高效上下文需多维度优化**:有效上下文应遵循“信息密度高、指导性强、冗余小”的原则。这体现在:系统提示需清晰直接,避免过度复杂或空泛;工具设计应遵循单一职责、鲁棒性强、用途清晰;少样本示例应精心挑选,多样且典型,以直观展示期望行为。

🚀 **运行时检索与长时任务管理是关键**:采用“即时”(just-in-time)上下文策略,代理动态加载数据而非一次性塞入大量信息,能更高效地利用有限上下文。对于长时任务,可通过压缩、结构化笔记或多代理架构来维持连贯性、目标导向和状态记忆,避免上下文污染。

🛠️ **持续迭代与精炼是工程核心**:上下文工程是一个持续优化的过程。需要明确目标与评估标准,从最小上下文开始迭代,精炼提示、工具和示例,设计合理的检索策略,并建立记忆机制,最终实现更稳健、高效的LLM代理。

大模型发展这两年,应用型 AI 的焦点一直在 “提示工程”(prompt engineering),但随着更强大的大语言模型(LLM)走向多轮、长时间的自主行动,一个更关键的概念开始走到台前:上下文工程(context engineering)。
与其把精力放在如何雕琢每一句提示,不如把问题聚焦到:怎样构造和维持 “最可能让模型产生期望行为” 的上下文?
本文是参考 Claude 官网博客的总结,文章原文:www.anthropic.com/engineering…

1. 什么是上下文工程

上下文,是在一次 LLM 推断过程中被纳入采样的全部 token 集合,上下文工程的核心任务,是在模型固有约束下,优化这些 token 的效用,以更稳定地获得预期结果。
要驾驭 LLM,往往需要 “在上下文中思考”:把模型任意时刻能读取到的一切状态视为整体,并评估这些状态可能产生的行为。

2. 上下文工程 vs 提示工程

随着我们构建的代理(agent)变得更有能力、能在更长时间维持自治并反复调用工具,我们的工作不再是一次性写好一个提示,而是在每一轮决定 “往模型里放什么,不应该放什么”。
代理循环运行会不断产生新数据,这些信息必须被周期性筛选、提炼。
“上下文工程” 的艺术就在于:在有限的上下文窗口中,选取最有价值的子集。

3. 为什么 “上下文工程“ 对强代理至关重要?

模型上下文越长,性能不一定越好,大量基准研究揭示了 “上下文腐化” (context rot):当上下文 token 增加,模型从中准确检索信息的能力会下降,这不是某个模型的特例,而是普遍现象,只是不同模型的退化曲线更缓或更陡。

这些问题需要用更好的处理方法:把上下文视为稀缺资源,并以工程化方式加以管理,是构建强大代理的基础。

4. 什么是有效上下文?

目标是用尽可能少的高信号 token 最大化产出概率,落实到实践层面,各类上下文组件都要贯彻 “信息密度高、指导性强、冗余小” 的原则,主要这几方面:

系统提示(system prompt)

工具(tools)

示例(few-shot)

总体原则:在系统提示、工具、示例、消息历史等各组件上保持 “信息紧凑而有用”。

4.1 低效的样例

样例1:低效的系统提示

你是一个非常聪明的全能 AI,尽可能全面地回答所有问题。   无论问题是什么,都要先给出10步解决方案和详细解释。   如果问题涉及价格,则必须先搜索“pricing”关键字;如果是技术问题则必须按下列条件分支:- 如果包含“error”,先假设用户使用的是Linux,再给出Linux专属排错步骤;- 如果包含“timeout”,请把所有相关文档全文粘贴进来,以免遗漏;- 如果问题很复杂,请写一篇至少1000字的长文来解释背景、历史和可能的未来演进。   请务必列出所有可能的边界情况(不少于20条),并逐条覆盖。   尽量引用你记得的一切信息,避免遗漏。   # 输出不限制格式,尽量详细,越长越好。   

样例2:低效的工具提示

- search: 任意搜索(字符串或正则或自然语言),返回所有匹配文档的全文内容与元数据(可能很大)。   - semantic_search: 与search类似,但“更智能”,返回更长的上下文片段。   - list_docs: 列出所有文档并返回每个文档的首5页内容,防止错过重要信息。   - fetch_document: 输入doc_id,返回完整文档(不做截断)。   - open_url: 打开任意URL并把网页完整HTML塞回上下文。   (说明模糊,职责重叠,返回内容过大且无长度限制)

样例3:低效的少样本

示例1(定价问题):- 输入:我们的专业版多少钱?- 输出:逐条列出30条可能的价格方案、所有历史版本定价、每个地区的税率、以及可能的促销活动;同时粘贴相关文档全文以备参考。   示例2(技术问题):- 输入:API 请求出现 timeout 怎么办?- 输出:先贴出所有网络相关文档全文,再给出一个长达2000字的网络排错手册,覆盖DNS、TLS、路由、BGP等所有可能性,最后再总结。   

4.2 高效的样例

样例1:高效的系统提示

## 角色你是“企业知识库问答与行动项生成”代理,目标是在有限上下文内准确回答,并附上文档引用;必要时提出精炼的后续行动。   ## 目标- 高信号:以尽可能少的token交付准确答案与清晰引用。   - 稳健:不确定时按需检索;避免加载全文。   - 可执行:当信息不足,提出具体的下一步。   ## 指令1) 先用工具检索,再回答;避免凭空臆测。   2) 优先返回摘要与引用,不要粘贴大段原文。   3) 若检索结果不足或冲突,说明不确定点并提出下一步(如缩小查询、定位章节)。   4) 遵守输出格式,控制总长度(答案≤200字,引用≤3条)。   ## 工具指南- 先 search_docs(query) 获取候选与片段摘要;- 用 get_doc(doc_id, section_hint, max_chars=1000) 读取必要部分;- 用 write_note(key, summary) 记录关键结论与未决项,供后续轮次引用。   ## 输出格式以Markdown返回:- 答案(简洁结论)- 引用(最多3条,格式:文档名 · 章节/段落 · 摘要)- 下一步(当信息不足时)

样例2:高效的工具

search_docs(query: string) -> [{doc_id, title, score, snippet}]  说明:语义检索,返回最多5条候选,含简短片段snippet;不返回全文。   - get_doc(doc_id: string, section_hint?: string, max_chars?: number=1000) -> {title, section, excerpt}  说明:按提示抓取指定章节或邻近段落,长度受max_chars限制,返回精炼摘录excerpt。   - write_note(key: string, summary: string) -> {ok: boolean}  说明:将关键结论与未决项持久化,便于后续调用;不回填长文本到上下文。   (职责单一,参数明确;返回内容受限以节省token)

样例3:高效的少样本

示例1:定价问答(有答案)- 输入:专业版的月费是多少?- 工具:search_docs("专业版 定价"); get_doc(top.doc_id, "价格/订阅", 800)- 输出:  答案:专业版月费为¥199(按月订阅)。     引用:专业版定价 · 订阅与计费 · “专业版:¥199/月”  下一步:如需年度方案,请检索“年度定价”。   示例2:技术故障(需要更多信息)- 输入:API 请求出现 timeout,如何排查?- 工具:search_docs("API timeout 排查"); get_doc(top.doc_id, "网络与重试", 800)- 输出:  答案:建议先检查网络连接与重试策略(超时阈值、重试间隔)。     引用:服务可用性指南 · 超时与重试 · “建议超时≥3s,指数退避重试”  下一步:请检索“区域网络状态”或提供具体报错信息。   示例3:无答案场景(信息不足)- 输入:有没有针对巴西市场的专属折扣?- 工具:search_docs("巴西 市场 折扣")- 输出:  答案:当前未检索到巴西市场专属折扣的正式说明。     引用:营销政策总览 · 地区优惠 · “未包含巴西的专属折扣条目”  下一步:请查询“区域促销公告”或联系市场团队获取最新政策。   

5. 运行时上下文检索与 “代理式搜索”

我们将 “代理” 简化定义为:LLM 在循环中自主使用工具,随着模型提升,代理自治能力增强,能更好地独立探索与纠错。

这一策略像人类的认知:我们不背整库的内容,而是借助文件系统、收件箱、书签等外部索引按需调用。
它还有额外好处:引用的元数据(命名、层级、时间戳、大小)本身就是指导信号,帮助代理更合理地评估用途与相关性。
通过探索,代理逐步揭示重要上下文,并只维护必要的 “工作记忆”,其余用 “笔记” 持久化,这能避免在冗余信息里迷失。

当然以上的方案不一定适合你当前的工程,基于实际场景也可以权衡混合策略:

5.1 低效的样例

# 场景目标:找出过去1小时 API 超时率上升的根因,并给出可执行行动项。   # 预处理(推断前)- 用嵌入检索关键字 "timeout", "latency", "error"- 将所有匹配文档(Wiki 页、运行手册、SRE 备忘、过去事故报告)的大段内容粘贴入上下文- 将最近24小时的日志文件(/logs/api/*.log)全文截断到前3MB后仍塞入- 将监控平台的几张图表(以Markdown导出)和完整查询DSL放入# 传入模型的初始上下文(≈20k tokens)- Wiki: 《API超时全指南》(3,000+字)- 运行手册:网络栈排查(2,500+字)- 事故报告:2023‑09‑17 高延迟事件(摘要+长引用)- 日志:api‑gateway.log(最近24h前半段)- 日志:auth‑service.log(最近24h前半段)- 监控:Latency 95th/99th、Error Rate 图表说明与查询DSL全文- 若干无关的边缘案例(误检)…(大量冗余、上下文污染)# 第1轮推断行为- 模型在冗余信息中“捡针”,关注分散,回溯变慢- 将不相关的旧事故细节混入当前分析- 给出冗长结论(>1,500字),包含多条假设与过度覆盖# 输出问题- 结论不聚焦,包含过期配置与不适用策略- 后续行动不具体:建议“全面检查网络与依赖”,成本高- Token 浪费,且后续轮次难以保持上下文清晰

5.2 高效的样例

# 场景目标不变:定位过去1小时超时率上升的根因,输出精炼行动项与引用。   # 初始上下文(≈300 tokens)- 任务说明:排查过去1小时的 API timeout spike- 轻量引用(不加载内容):   - 日志根路径:/logs/api/  - 监控面板URL(id=latency_p95, error_rate)  - Wiki 索引:SRE/Runbooks/Timeout.md, Incidents/- 工具可用:list_files, grep, head/tail, read_partial, query_metrics, open_wiki, write_note# 第1轮(探索起点:用元数据缩小范围)- list_files("/logs/api/", last_modified>=now-90m)  - 返回(文件名·大小·修改时间):    - api-gateway.log(420MB, 09:15)    - auth-service.log(180MB, 09:12)    - payments-service.log(95MB, 09:17)- 决策信号:  - 修改时间接近事件窗口,大小提示数据量与复杂度  - 优先检查 gateway(流量汇聚点)- grep("/logs/api/api-gateway.log""timeout", window=last_60m)  - 返回匹配统计与最近片段的偏移量- tail("/logs/api/api-gateway.log", n=200, from=offset)  - 观测模式:timeout集中在某条上游路由- query_metrics(panel="error_rate", range=last_60m, filter="service=gateway route=/v1/orders")  - 结果:09:05‑09:20 错误率升高,与日志吻合- write_note("hypothesis""超时集中在 /v1/orders 路由,时间对齐监控峰值;可能与下游 auth-service 连接池耗尽相关")# 第2轮(渐进披露:加载必要片段)- grep("/logs/api/auth-service.log""connection pool|timeout", window=last_60m)- head("/logs/api/auth-service.log", n=100, from=matched_offset-500)  - 结果:09:05 开始出现 "pool exhausted" 警告- open_wiki("SRE/Runbooks/Timeout.md#connection-pool")  - 只取节选(max_chars=600):推荐将 pool.size 从 200 提升至 400,并启用指数退避- query_metrics(panel="latency_p95", range=last_60m, filter="service=auth")  - 结果:p95 在 09:05 附近突升,与连接池告警时间一致- 更新工作记忆(上下文仅保留三条核心摘录)  - 摘录1:gateway 路由 /v1/orders timeout 片段(~200行尾部)  - 摘录2:auth‑service pool exhausted 告警片段(~80行)  - 摘录3:Wiki Runbook 连接池节选(~400字)- 其他细节写入持久笔记(write_note),不留在上下文# 第3轮(收敛与行动)- 结论(≤200字):超时由 auth‑service 连接池耗尽引发,集中影响 /v1/orders;与监控峰值时间吻合- 引用(≤3条):日志片段偏移、监控查询ID、Wiki小节锚点- 行动项:  - 临时:提升 auth 连接池至 400 并启用指数退避;观察 15 分钟  - 根因复盘:评估本周订单高峰的流量建模与容量规划  - 跟进:记录变更与影响范围到 Incidents/2025‑10‑18.md# 上下文管理- 工作记忆:仅保留当前决策所需的3个摘录- 持久化:详细日志偏移、图表链接、附加线索写入笔记(不占用上下文)- Token 用量:每轮≈1‑2k tokens,随检索渐进增加但保持可控

6. 长时任务的上下文工程

当任务跨越数十分钟到数小时,超过上下文窗口容量时,代理需要专门技术维持连贯性、目标导向与状态记忆,使用更大窗口的模型并不能解决问题:再大的窗口也会遭遇上下文污染与相关性衰减。
我们实践出三类应对手段:压缩、结构化笔记、多代理架构。

压缩(Compaction)

结构化笔记(Agentic Memory)

多代理架构(Sub-agent)

如何选择策略(按任务特征)

7. 总结上下文功能原则

如果以上内容你觉得太多,最有效的一条建议就是:上下文尽量足够小,一次只做少量的任务。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

上下文工程 Context Engineering 大语言模型 LLM 提示工程 Prompt Engineering AI代理 AI Agents 上下文腐化 Context Rot 工具使用 Tool Usage 长时任务 Long-duration Tasks
相关文章