工具结果截断 上下文与记忆

别名: truncate

在入口处拦下上下文最大的消耗者——工具结果:`read_file` 一次返回 50KB,直接回填会烧掉大半窗口。截断要带省略号标记,让模型知道「这段结果被截断了」,需要时可以重新读完整内容——截断 ≠ 静默丢弃。

它是什么

工具结果截断(truncate)在入口处拦下上下文最大的消耗者——工具结果:read_file 一次返回 50KB,直接回填会烧掉大半窗口(第 08 章executeTool 回填处约定「结果过大先截断」)。滑动窗口和摘要都在「事后收拾」,而截断在源头拦截,比事后收拾便宜得多:

function truncate(text, maxLength, marker = '…') {
  if (text.length <= maxLength) return text;
  return text.slice(0, maxLength - marker.length) + marker;
}

截断 ≠ 静默丢弃

marker(省略号)不是装饰——模型需要知道「这段结果被截断了」,才会在需要时重新读完整内容。进阶做法是把旧工具结果替换成一行占位符([Earlier tool result compacted. Re-run if needed.])——旧结果对当前工作基本无用,占着几千 token 纯属浪费,这是「0 成本的滑动窗口」:不做摘要、不丢结构,纯粹把旧的大文本换成一行字。

小结

三条:截断在工具执行层做(一行 truncate 的事);带标记让模型知道还有更完整的内容可读;占位符替换旧结果是对多轮工具调用的免费优化。完整治理见第 09 章

相关词条

出现在这些章节