SQL 工具在数据从网络线路传出时即发送行。智能体调用它并期待得到结果。而一年前编写的运行环境(当时所有工具都是请求-响应式的)在调用模型之前,会尽职地将整个流缓冲成一个单一字符串。40 秒后,缓冲区达到了 200 KB,上下文窗口被消耗了一半,智能体正在对一个查询的第 47,000 行进行推理,而它本可以在第 30 行就停止。没有人故意设计这种失败——这仅仅是因为将“工具已返回”视为规划器唯一响应事件的结果。
向流式工具的转变正在规划器尚未察觉的情况下发生。SQL 引擎发出渐进式结果集。文档提取器生成分页。搜索 API 在相关性评分稳定后按批次返回命中结果。MCP 的 Streamable HTTP 传输协议(2025-03-26 规范中 HTTP+SSE 的替代方案)使增量响应成为一流的传输模式,而不再是一项稀有的功能。传输层已经准备就绪,但其上的规划器还没有。
大多数智能体运行环境仍将工具调用建模为 result = tool(args) —— 一个返回类型为单一聚合值的函数。当底层工具使用流式传输时,运行环境唯一的诚实选择是等待直到 EOF(传输结束)、按硬性的字节限制截断,或者停止读取并丢弃剩余部分。这些选择都没有让模型参与决策。真正有趣的举措几乎没人尝试:让模型在流传输过程中决定何时已经看够了。
缓冲并移交的失败模式
默认的集成路径将流式工具变成了同步工具。运行环境打开流,将数据块累积到缓冲区中,等待关闭事件,然后将整个有效载荷作为下一条用户消息交给模型。从模型的角度来看,工具的行为与缓慢的请求-响应调用没有区别。从系统的角度来看,有三件事已经悄然崩溃。
第一处崩溃是上下文窗口的计算。一个返回 50,000 行中等宽度 JSON 的 SQL 查询可能会产生超过 800 KB 的工具输出。在 200K token 的上下文窗口中,加上通常已经包含系统提示词、先前的工具调用和用户历史记录的智能体状态,一次贪婪的缓冲在模型开始推理结果之前就消耗了三分之一的预算。执行轨迹中的第二次工具调用空间比第一次少。第五次调用则必须剔除一些内容——通常是智能体最需要记住的用户请求部分。最近关于智能体中上下文窗口溢出的研究指出,工具输出膨胀是排名前三的失败模式,甚至排在长指令或草稿纸推理之前。
第二处崩溃是延迟。运行环境无法询问“这些够了吗?”,因为直到 EOF 之前模型都不在链路中。如果工具是按需分页的——例如一个文档提取器,每当上一页被确认时就产生一个新页面——“缓冲并移交”模式产生的流将永远无法到达 EOF,直到触发某些外部超时。智能体停止读取的决定被委托给了挂钟截止时间,而不是智能体自身关于第 30 行是否已经回答了问题的判断。
第三处崩溃是隐形的。在运行环境层进行截断是标准的退路,而 OpenAI Codex 等项目的 issue 队列将其追踪为智能体困惑的常态化来源:模型看到的工具结果只是工具实际输出的前缀,如果团队处理得当,会带有一个类似 [truncated] 的页脚;如果没处理好,则完全没有标记。模型会对部分数据集进行推理,仿佛它是完整的。输出会以追踪日志无法察觉的方式变得极其错误,因为从追踪的角度来看,工具返回了一个值,而模型接受了它。
规划器可以推理的流式工具契约
修复方法不是“逐个 token 地流向模型”——这解决的是 UX 问题(感知到的响应延迟),而不是规划问题。修复方法是教会规划器某些工具是增量发出的,并赋予它参与流的原始语。
最小可行契约由四部分组成:
工具描述符中的 streaming 标志。 工具目录已经声明了名称、参数和描述;添加一个布尔值(或更丰富的模式枚举:request_response、chunked、paginated、unbounded),以便规划器提前知道是否可以预期工具返回一个完整的结果。看到 streaming: true 的规划器应该构建其提示词以建模部分结果,设置中断路径,并且永远不要期待收到单一的“工具返回了 X”的消息。
模型可以在流中途读取的运行摘要。 随着数据块的到来,包装器累积一个运行摘要——目前看到的行数、架构(schema)、采样头部、关键列的最小值/最大值、以及“数据是在收敛还是仍在扩大取值范围”的信号。每隔 N 个数据块(或 N 秒),包装器将摘要作为思考层消息发送给模型。模型现在拥有的是不确定性下的证据而不是最终值。它可以根据已看到的内容提前停止、优化计划或承诺等待更久。
智能体预先表达的 consume_until 谓词。 规划器发出的不是“获取所有行”,而是带有停止条件的获取请求:consume_until: count >= 30 AND distinct_user_ids >= 10。包装器在数据块落地时评估该谓词,并在满足条件时关闭上游连接。智能体现在已将其预算外部化为运行时可以执行的结构化形式,而无需每次都回传给模型。这与 LLMCompiler 模式的形式相同——规划器发出带有结构化停止条件的 DAG,而不是在每个节点都与运行时交互。
预算感知的终止路径。 每个流式工具调用都从智能体的外层循环继承挂钟时间和 token 预算。包装器强制执行这些预算:达到预算上限时,连接关闭,摘要成为结果,并告知模型流已被截断以及该摘要代表什么。应用于流传输的智能体截止日期衰减逻辑防止了失控分页类错误——一个“如果你永远等待最终会返回所有内容”的工具再也无法劫持智能体循环。
这四个部分相互组合。看到 streaming: true 的规划器知道要发出 consume_until。摘要让规划器在谓词触发之前察觉到“我已经得到了所需的”,并发出显式的提前停止。预算限定了最坏情况。这些原始语都不需要基础模型的改变;它们完全存在于运行环境和工具包装器中。
真实系统中的流式改造现状 在现有请求-响应(request-response)型 Agent 中适配流式传输(streaming)的团队通常会依次发现:延迟计算逻辑崩溃了、上下文计算逻辑崩溃了,且评估套件对“部分结果”路径的覆盖率为零,因为每个记录的追踪(trace)都以完整的工具结果结束。
延迟计算逻辑的崩溃表现为一个“断崖”。以前在 800ms 内返回的搜索工具现在变成了流式混合模式;90% 的查询在 1.2s 内完成,但长尾效应受限于最慢的后端而非中位数。Agent 的外层循环 SLA 是在 800ms 作为最坏情况时设定的。在“缓冲并移交”(buffer-and-hand-off)模式下,p99 延迟现在超过了面向用户的截止时间。而采用“摘要与消费直到”(synopsis-and-consume_until)模式,p99 延迟会回到规划器(planner)推理时的预算范围内 —— 一旦答案在统计上趋于稳定,Agent 就会停止读取。
上下文计算逻辑的崩溃表现为“剔除”。Agent 的工作内存设计假设工具结果平均为 4K token;而流式工具将平均值推向 40K 且带有长尾分布。为了给原始数据行腾出空间,对话历史开始丢失用户的原始问题。修复方法是结构性的 —— 摘要进入上下文,原始数据行进入一个可通过引用寻址的侧信道(即“内存指针”模式,模型看到一个句柄和摘要,并可以调用后续工具通过 id 深入查看特定行)。现在,模型在 O(KB) 而非 O(MB) 的工作内存上进行推理,而工具层仍持有完整的有效载荷以备按需使用。
评估覆盖率的崩溃是隐性的。回归测试集中的每个记录轨迹都是针对旧的请求-响应套件捕获的。在新的流式套件下回放它们会产生 完全相同 的结果,因为“摘要加最终结果”路径在完成流时会折叠到相同的最终状态。Bug 存在于中断的流、提前停止的分支、摘要驱动的决策中 —— 而这些都不会出现在语料库中。构建评估覆盖率意味着要记录行使这些路径的新轨迹:在第 30 行触发的 consume_until、触发提前停止的摘要、将部分结果交还给规划器的预算中止。如果没有这些,评估套件证明的是生产系统极少表现出的行为。
将流式传输作为规划器的一等公民 架构上的转变在于团队如何定义“工具结果”这一概念。在请求-响应的世界里,工具结果是一个“值”:不透明、内聚、存在或不存在。在流式工具的世界里,工具结果是一个“轨迹” —— 一个包含部分状态的序列,带有关于它是如何终止的以及沿途可观察到什么的元数据。规划器的提示词(prompt)、工具目录的 schema、评估集的记录轨迹以及追踪查看器的 UI,都需要一个轨迹模型而非数值模型。
那些规避这一问题的套件 —— 以“模型不是针对部分结果训练的”为由,将流式传输隐藏在“缓冲并移交”层之后 —— 正在取得短期胜利,但这会演变成长期债务。当提示词清晰地界定部分结果时,模型完全有能力对其进行推理:“在无限流的第 12 个分片时,这是你观察到的内容;你可以继续、细化或停止。”模型无法做到的是从一个被当作完整答案接收的缓冲二进制大对象(blob)中凭空创造出这种脚手架。
做的出色的团队是将流式工具契约视为规划器层(planner-layer)的问题,而非传输细节。MCP Streamable HTTP 规范提供了一种传输格式;规划器提供契约;包装器强制执行这两者。销售 AI Agent 集成的流式数据库供应商已经模拟了物化视图和“从游标消费”(consume-from-cursor)语义 —— 这些抽象正是规划器需要的“摘要与消费直到”模式。组件已经齐备;集成工作主要是文化上的,即必须有人决定“工具已返回”不再是一个原生事件,而是一个派生事件,是根据规划器允许观察的部分状态流计算得出的。
能够区分“值”与“轨迹”的 Agent,其延迟、上下文预算和评估覆盖率在底层工具开始流式化时都能保持稳健。而做不到这一点的 Agent,其性能会随着工具链的现代化而悄然下降 —— 其团队将花费一个季度的时间去发现、调试和撤销没人故意发布的行为变化。
会员专享
余下内容仅对会员开放。 会员可读完整内容 —— 每一个公开发布的观点背后,那些框架、决策与推理的全貌。
— 完整文章,包含未公开存档的部分 — 可落地的工作框架,附带权衡与决策依据 — 新文章抢先看,先于公开发布 登录以继续阅读→ 随时取消 · 一次订阅,畅读全部