工具返回超长日志把上下文塞爆:我做的摘要截断、关键行抽取和上下文预算

25 阅读3分钟

“工具刚跑完一段构建日志,上下文立刻爆了,后面的推理全乱,像被人塞了一本说明书。”

图:MikeRun / Wikimedia Commons / CC BY-SA 4.0

这是上周我们办公室给本地 Agent 接构建工具之后发生的事。同事小陈让 Agent 读一次失败日志再总结原因,工具原样把几千行输出塞回对话。模型还没开始分析,上下文预算已经被日志占满,后面连问题本身都记不清。

我问他:“日志里真正有用的大概多少行?”

他把屏幕往下翻:“错误就那么十几行,前面全是下载进度和无关警告。”

一、先别急着怪模型记性差

小陈一开始以为是模型窗口太小。我们换了一个上下文更大的本地档,问题还在:工具返回太长,再大的窗口也会被一次调用吃掉大半。说明根因是工具输出没有截断和摘要,不是单纯换更大模型能解决的。人眼扫日志会跳过进度条,模型却把每一行都当成同等重要。

图:Colin / Wikimedia Commons / CC BY-SA 4.0

二、我们怎么改

第一步,摘要截断。工具返回超过约定长度就先截断,只保留尾部失败相关段落和开头的命令摘要;完整日志落到本地文件,对话里只留路径和摘要。Agent 需要细节时再按需读取片段,而不是一次灌进上下文。

第二步,关键行抽取。对构建、测试这类日志,优先抽取含错误、失败、超时、退出码的行,以及紧邻前后各若干行。进度条、重复警告默认丢弃。抽取规则写死在工具包装层,不依赖模型自己记得删掉废话。

第三步,上下文预算。每次工具调用前估算将占用的字数,超过本轮预算就强制走摘要路径;多工具串联时给每个工具留配额,禁止某一个工具独占。预算打满就提示人先看摘要,再决定要不要展开某一段。

三、验收数字

我们准备了十份真实失败日志,长短不一。改之前,Agent 直接吃全文,十次里有七次后半段推理跑偏或答非所问;改成摘要截断加关键行抽取以后,十次都能指出真正失败点,且上下文占用稳定在预算内。我们还故意塞了一份超长成功日志,确认不会因为看起来很重要就整份灌进去。

图:Abigor / Wikimedia Commons / CC BY-SA 3.0

另外我又加了三道题:只要摘要、只要错误行、需要展开某一段。三道都按预期走,没有偷偷把全文塞回对话。换人值班按同一套规则跑,结果也一致。

四、几点体会

工具返回不是越全越好,上下文是稀缺资源。截断、关键行、预算三件套,比换更大窗口更可控。完整日志留给文件,对话里只留能支撑下一步的信息。验收要用真日志,空口说差不多短一点不够。包装层把规则写死,比每次口头叮嘱模型更靠谱。

你们给本地 Agent 接工具时,有没有被超长日志塞爆上下文?欢迎评论区交流做法。

我把这次摘要截断和预算验收的记录整理在 evafang.com ,需要时可参考。