当前位置: 首页 > news >正文

Agent 上下文越来越长?一个 task 工具的秘密

你有没有发现:和 AI Agent 对话久了,它就越来越"笨"。

明明之前问过的问题,它会重新问一遍。明明已经分析过的文件,它又读一遍。你问它"刚才做了什么",它支支吾吾说不清楚。

为什么?

答案在messages数组里。每轮对话都在累积,中间过程全部堆在里面,有用的信息被淹没。

今天,我用一个task工具教你解决这个问题。读完这篇,你会明白:子 Agent 的核心不是"多一个模型",而是"多一个干净上下文"。


一个真实的痛点

用户问:

s03 >> 分析 src/core 目录下的所有文件,告诉我项目结构

Agent 为了回答这个问题,可能:

  • agent-loop.ts(3000 字符)
  • tools.ts(5000 字符)
  • types.ts(2000 字符)
  • 执行几次 bash 查目录结构

最终答案可能只有一句话

“项目用 TypeScript 实现,核心是 agent-loop 的循环模式。”

但整个对话里,messages数组已经塞满了 10KB+ 的中间过程。

下一个问题:

s03 >> 你刚才读了哪些文件?

模型可能回答:

“我读了 agent-loop.ts、tools.ts、types.ts…”

看起来没问题?但问题是:

  1. 这些内容全堆在父上下文里
  2. 后续对话越来越慢
  3. 有用信息被噪声淹没
  4. Token 成本直线上升

根本原因:上下文污染

用一个类比来理解:

没有子 Agent:你在一个房间里开会。每个人发言、每个讨论都留在这个房间里。房间越来越挤,噪音越来越大。

有子 Agent:你派一个人去隔壁房间开会。他回来只告诉你结论。你的房间保持安静。

父 messages = [用户问题, 工具调用, 工具结果, 工具调用, 工具结果, ...] ↑ 噪声累积,有用信息被淹没父 messages = [用户问题, task调用, 子Agent摘要, 最终回答] ↑ 干净,只有关键信息

子 Agent 的核心价值:不是"多一个模型实例",而是"多一个干净上下文"。


s04 的设计思路

核心概念:上下文隔离

Parent agent Subagent+------------------+ +------------------+| messages=[...] | | messages=[] | <-- 空白上下文| | dispatch | || tool: task | ---------->| while tool_use: || prompt="..." | | call tools || | summary | append results || result = "..." | <--------- | return last text |+------------------+ +------------------+ |Parent context stays clean.Subagent context is discarded.

关键点:

  1. 子 Agent 从空白上下文启动messages = [{ role: 'user', content: prompt }]
  2. 子 Agent 自己的工具循环:读文件、执行命令,都在自己上下文里
  3. 只返回摘要:中间过程丢弃,只带回最终文本

数据结构

// src/core/types.tsinterface SubagentContext { messages: Message[] // 子 Agent 自己的上下文(从空白开始) tools: ToolDefinition[] // 子 Agent 可用的工具(过滤后的) handlers: Record<string, ToolHandler> // 工具执行函数 maxTurns: number // 最大轮数,防止无限跑 systemPrompt: string // 子 Agent 的系统提示词}

这个结构定义了子 Agent 的"隔离边界"。


工具过滤:防止无限递归

一个关键设计:子 Agent 不能有task工具

为什么?想象一下:

父 Agent 调用 task → 子 Agent 调用 task → 孙 Agent 调用 task → ...

无限递归,系统崩溃。

// 父 Agent 工具:base + taskconst PARENT_TOOLS = [...BASE_TOOLS, TASK_TOOL]const PARENT_HANDLERS = { ...BASE_HANDLERS, task: createTaskHandler() }// 子 Agent 工具:只有 base(不含 task)const CHILD_TOOLS = BASE_TOOLS // bash, read_file, write_file, edit_fileconst CHILD_HANDLERS = BASE_HANDLERS // 没有 task

工具过滤是隔离的第一道防线。


runSubagent 函数:核心实现

// src/planning/subagent.tsexportasyncfunction runSubagent(prompt: string): Promise<string> {// 1. 创建空白上下文const subMessages: Message[] = [{ role: 'user', content: prompt }]// 2. 子 Agent 配置const context: SubagentContext = { messages: subMessages, tools: CHILD_TOOLS, // 不含 task handlers: CHILD_HANDLERS, maxTurns: 30, // 防止无限跑 systemPrompt: SUBAGENT_SYSTEM, }// 3. 循环执行,最多 30 轮for (let turn = 0; turn < context.maxTurns; turn++) { const response = await client.messages.create({ model: MODEL, system: context.systemPrompt, messages: context.messages, tools: context.tools, }) context.messages.push({ role: 'assistant', content: response.content }) if (response.stop_reason !== 'tool_use') { break// 子 Agent 做完了 } // 执行工具调用... const results = await executeTools(response.content, context.handlers) context.messages.push({ role: 'user', content: results }) }// 4. 只返回最终文本摘要(中间过程丢弃)return extractTextReply(context.messages) || '(no summary)'}

四个步骤:

步骤做什么
1空白 messages 启动
2配置隔离的工具集
3循环执行,最多 30 轮
4只返回摘要,丢弃中间过程

智能判断:什么时候用 task?

一个实际问题:模型怎么知道该走task还是直接用工具?

答案在系统提示词里

const S04_SYSTEM = `You are a coding agent at ${WORKDIR}.<task_tool_guidance>Use the task tool when the request involves:- Analyzing, exploring, or searching multiple files/directories- Finding patterns or gathering information across the codebase- Tasks where intermediate steps are noise but final summary matters- Requests starting with "analyze", "find", "search", "list", "explore"Do NOT use task tool for:- Single file operations (read/edit one file)- Simple bash commands- Tasks that need current conversation context</task_tool_guidance>The task tool spawns a subagent with fresh messages. This keeps the parent context clean.`

<task_tool_guidance>标签明确告诉模型判断条件:

用 task

  • 分析/搜索多个文件
  • 查找代码库中的模式
  • 中间过程是噪声,只要结论

不用 task

  • 单文件操作
  • 简单 bash 命令
  • 需要当前对话上下文的任务

task 工具定义

export const TASK_TOOL_DEFINITION: ToolDefinition = { name: 'task', description: 'Launch a subagent with isolated context for exploration tasks. Use this when: (1) analyzing/searching multiple files, (2) gathering information across codebase, (3) only final summary matters. Returns only the summary, keeping parent context clean.', input_schema: { type: 'object', properties: { prompt: { type: 'string', description: 'The specific task for the subagent' }, description: { type: 'string', description: 'Short label (e.g., "analyze core")' }, }, required: ['prompt'], },}

关键是description:明确列出适用场景,而不是抽象的"派生子任务"。


动手试试

运行 s04:

pnpm run s04

你会看到:

╔════════════════════════════════════╗║ s04 - Subagent ║║ "Fresh context, clean parent" ║╚════════════════════════════════════╝Tools: bash, read_file, write_file, edit_file, tasks04 >> 分析 src/core 目录下的所有文件,告诉我它们各自的作用> task (analyze src/core): 分析 src/core 目录下的所有文件... 项目使用 TypeScript 实现,核心是 agent-loop 的循环模式...s04 >> 读取 package.json 的内容> read_file ...直接读取,不走 task...

对比:

任务类型模型行为
“分析 src/core 所有文件”调用 task(多文件探索)
“读取 package.json”直接 read_file(单文件操作)

验证上下文隔离

最关键的测试:

s04 >> 分析 src/core 目录下的所有文件(等待完成后)s04 >> 你刚才读了哪些文件?

预期结果

模型回答:“我派生了一个子任务去分析 src/core,子 Agent 返回的摘要说…”

而不是:“我读了 agent-loop.ts、tools.ts、types.ts…”

如果模型能说出具体文件名,说明子 Agent 的中间过程污染了父上下文。这是错误的。


对比 s03 和 s04

组件s03s04
工具数量5(base + todo)5(base + task)
核心机制计划状态外显上下文隔离
解决问题Agent 跑偏上下文污染
返回方式渲染计划文本只返回摘要

s03 解决"忘记做什么",s04 解决"做过的事堆在上下文里"。

两者互补,不是替代。


FAQ

Q:子 Agent 和多 Agent 系统有什么区别?

A:子 Agent 是一次性的。任务完成,上下文丢弃。

多 Agent 系统(s09-s11)是长期协作的 teammate,有自己的角色、状态、通信通道。

混淆这两者会让初学者迷失方向。先做一次性子任务隔离,再做长期角色协作。

Q:为什么不把父上下文全部传给子 Agent?

A:这叫 fork 模式,但不是第一步。

空白上下文是最简单的设计。只有在子任务确实需要"继承父对话背景"时,才考虑 fork。

Q:maxTurns 设成 30 合理吗?

A:是教学值。真实系统会根据任务类型动态调整。

30 轮足够完成大部分探索任务,也足够防止无限循环。

Q:如果子 Agent 失败了怎么办?

A:返回(no summary)或错误信息。父 Agent 看到后可以决定重试或换个策略。


小结

今天我们实现了:

  • ✅ 理解了上下文污染的根本原因
  • ✅ 设计了 SubagentContext 的数据结构
  • ✅ 实现了工具过滤(防止递归派生)
  • ✅ 理解了智能判断何时用 task
  • ✅ 跑起来了一个有上下文隔离能力的 Agent

关键洞察

子 Agent 的核心,不是多一个模型,而是多一个干净上下文。 把局部任务的噪声隔离出去,主对话才能保持清晰。

学AI大模型的正确顺序,千万不要搞错了

🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!

就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇

学习路线:

✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经

以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!

我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

http://www.jsqmd.com/news/679727/

相关文章:

  • 2026年可移动垃圾房怎么选:保安岗亭/可移动垃圾房/台州岗亭/嘉兴岗亭/宁波岗亭/浙江岗亭/湖州岗亭/移动卫生间/选择指南 - 优质品牌商家
  • 大疆无人机开源项目实战:用Eclipse Paho库搞定MQTT双通道通信(TCP vs WebSocket)
  • PTP协议精讲(2.16):守护时间的金库——PTP安全机制深度解析
  • Ubuntu多硬盘加密后,如何安全地自动挂载数据盘?(附开机脚本与Trim优化)
  • 3组共11人获2026科学突破奖物理学新视野奖,其中三位华人学者
  • C语言学习笔记 - 5.C概述 - C的应用领域
  • 【硬核实战】Spring AOP 从原理到落地:3 个可运行案例带你吃透切面编程
  • 良品铺子年营收55亿:同比降23% 净亏1.5亿 拟派息1亿 控股股东3500万债务违约
  • 别再只会用定向天线了!聊聊农村、郊区基站背后的‘全向高增益’技术(附5种主流结构对比)
  • STM32F407ZGT6高级定时器驱动二自由度舵机云台:从PWM原理到安装校准全解析
  • 别再为Instant-NGP发愁!Win11下用Anaconda搞定tiny-cuda-nn环境(附VS2019编译避坑指南)
  • “太空智算互联网”专家观点分享
  • 别再手动改代码格式了!用IntelliJ IDEA的CheckStyle插件,5分钟搞定团队代码规范
  • 从CPU到硬盘:数据的一生之旅,揭秘RAM、Cache、ROM如何接力跑
  • python packer
  • 从光编到绝编:为什么你的伺服项目该考虑SSI/BISS编码器了?
  • 手把手教你用Verilog驱动JFM25F32A Flash:从状态机设计到时序参数避坑
  • LinkSwift:八大网盘直链下载助手,告别下载限速的终极解决方案
  • 别再死记硬背了!用这5个真实场景,彻底搞懂Promise.all、race、any、allSettled的区别
  • 如何在 Gin 框架中自定义 JSON 响应的 Content-Type 头部
  • 【Docker 27存储驱动性能跃迁指南】:27项内核级调优技巧,实测I/O吞吐提升3.8倍
  • 别再傻傻重装软件了!Win7/Win10报错‘丢失api-ms-win-crt-runtime-l1-1-0.dll’的终极修复指南
  • WarcraftHelper:魔兽争霸III的终极现代兼容方案
  • 华为交换机STP配置的5个实战优化技巧:从根保护到BPDU防护,让你的网络更稳
  • 别再死记硬背!用这10道经典算法题,彻底搞懂时间/空间复杂度(附408真题解析)
  • AndroidPdfViewer打印功能完整指南:3步实现PDF文档打印
  • Java项目Loom化实战:3步完成Spring WebFlux与虚拟线程深度整合(含生产级架构图)
  • 2026年打包式箱房怎么选:集装箱特色民宿、高端定制集装箱房、商铺集装箱房、定制化集装箱房、工地住人集装箱、带装修集装箱房选择指南 - 优质品牌商家
  • 2026英文降AIGC率实操:别再盲目同义词替换了!5种降AI高效方法实测(附工具测评)
  • 别再被-c pytorch坑了!手把手教你用Conda搞定PyTorch+PyG环境(附国内源配置)