04 LLM 侧工具运行时的输出边界控制 本节摘要:工具执行完,输出要回流给模型。但工具输出可能极大(读了个 10 万行文件、跑了个超长命令),全塞进上下文会撑爆。第 01 节讲了「截断」这道第一防线,本节讲 LLM 侧工具运行时的更精细控制——模型工具输出限制、托管工具输出文件(大输出落盘只回传引用)。这是工具系统的「第三层抽象」,守在模型上下文的最前线。 一、为什么需要第三层抽象 回顾工具系统的三层: 第 01 节(定义层):工具定义 + 参数校验 + 基础截断 第 02、03 节(注册表 + 上下文):汇总、过滤、权限联动 本节(运行时层):输出边界精细控制 为什么还要第三层?因为前两层的「基础截断」不够精细: 基础截断是「统一长度截」,不管输出内容重要性,粗暴。
本节摘要:工具执行完,输出要回流给模型。但工具输出可能极大(读了个 10 万行文件、跑了个超长命令),全塞进上下文会撑爆。第 01 节讲了「截断」这道第一防线,本节讲 LLM 侧工具运行时的更精细控制——模型工具输出限制、托管工具输出文件(大输出落盘只回传引用)。这是工具系统的「第三层抽象」,守在模型上下文的最前线。
回顾工具系统的三层:
为什么还要第三层?因为前两层的「基础截断」不够精细:
运行时层就是来解决这些的——它守在「工具输出 → 模型上下文」这个关口,做更聪明的边界控制。
第一个机制是模型工具输出限制。不同模型对「一次工具输出能多大」有不同限制(有的模型工具结果上限是 8000 token,有的是 16000)。运行时层会根据当前模型的限制,决定工具输出要截到多大:
工具输出(原始,可能很大) │ ▼ 查当前模型的工具输出限制 │ ▼ 按限制截断(超则截,标注「已截断」) │ ▼ 喂给模型
这比第 01 节的「统一截」更精准——它按模型特性来,不会在小限制模型上塞太多,也不会在大限制模型上截太狠。
第二个机制更聪明——托管工具输出文件(Managed Tool Output File)。当工具输出实在太大(超过合理范围),运行时层不把它塞进上下文,而是:
工具输出(10 万行日志) │ ▼ 太大,不能全塞上下文 │ ▼ 落盘到临时文件 │ ▼ 给模型回传:「输出已存到某文件,前 50 行预览如下...」 │ ▼ 模型按需用 read 工具读那个文件的具体部分
这个机制非常关键——它让 Agent 能处理「大输出」而不撑爆上下文。比如 Agent 跑了一个测试命令输出 10 万行,它不会把这 10 万行全读进来,而是拿到一个引用,需要哪段再读哪段。
💡 落盘 vs 截断的差别:截断是「丢掉后半段」,信息有损;落盘是「全保留,按需读」,信息无损。落盘更适合「大但可能有用」的输出,截断适合「后面大概率没用」的输出。运行时层会按情况选。
注意这层叫「LLM 侧工具运行时」,因为它紧贴 LLM 抽象层(第 6 章)。它的职责是「在工具输出交给 LLM 之前,把边界控制好」。可以理解为:
工具执行(第 01-03 节,领域核心层) │ ▼ 输出 │ LLM 侧工具运行时(本节) │ ├─ 模型输出限制适配 ├─ 大输出落盘 ├─ 输出 bounding │ ▼ 受控的输出 │ LLM 抽象层(第 6 章)── 构造请求 ──► 模型
它站在「工具」和「LLM」之间,守着模型上下文的入口。
这里要澄清一个分工——本节的输出边界控制 vs 第 9 章的上下文压缩,都管「不要撑爆上下文」,但层面不同:
| 机制 | 何时介入 | 干什么 |
|---|---|---|
| 本节 输出边界(运行时层) | 工具输出产生时 | 单次输出别太大(截断/落盘) |
| 第 9 章 压缩(会话层) | 整个上下文快超窗口时 | 整体压缩历史(摘要+近期) |
本节是「单次输出守门」,第 9 章是「整体上下文兜底」。二者配合:本节尽量让单次输出不爆,如果累积还是超了,第 9 章再做整体压缩。
Agent 想了解一个大日志文件的内容:
Agent: 执行 bash("cat huge.log") │ ▼ 工具执行,输出 10 万行 │ ▼ 运行时层介入: │ ├─ 10 万行远超模型输出限制 │ ├─ 落盘到临时文件 │ └─ 回传:「输出存某文件,前 50 行预览:...」 │ ▼ 模型看到预览,想看更多 │ Agent: 执行 read("临时文件", offset=100, limit=50) │ ▼ 读出第 100-150 行 │ ▼ 模型继续分析
整个过程中,10 万行日志从未全量进入上下文——靠的就是运行时层的落盘 + 按需读。这让 Agent 能处理「大输出」而不被它淹没。
读完第 5 章四节,你掌握了工具系统的三层抽象:
| 层 | 节 | 职责 |
|---|---|---|
| 定义层 | 01 | 工具定义 + 参数 Schema 编译 + 校验/截断/追踪 |
| 注册表层 | 02、03 | 汇总三类来源 + 按模型/权限过滤 + 上下文与权限联动 |
| 运行时层 | 04 | 模型输出限制 + 大输出落盘 + 输出 bounding |
这三层合起来,回答了「一个工具从定义到被模型调用、输出回流」的完整旅程。核心思想是:定义层管「是什么」、注册表层管「谁能用」、运行时层管「输出别炸」。第 6 章我们看工具结果回流后,LLM 抽象层如何把它喂给模型。
第 5 章结束。下一章讲 LLM 抽象层——工具结果回流后,如何构造 provider 中立的请求调模型。