有个任务要读 40 个文件做交叉分析,跑一半就报 context length exceeded。
问题不在模型,在我给的东西太多。三个改动:
- 工具输出加截断
读文件工具默认返回全文,改成超过 300 行只返回前 200 行 + 结构摘要(函数名列表)。模型需要细节会再读,不需要就省了。
- 中间结果落盘
分析完一个文件,结论写进临时文件,上下文里只留「已处理 X,结论见 tmp/x.md」一行。需要时再读回来。
- 历史消息压缩
超过 20 轮,把前面的对话让模型自己总结成 500 字,替换掉原文。
三招下来,同样任务从爆上下文变成用掉 40% 窗口。
最重要的认知:上下文不是越大越好。塞太多无关信息,模型注意力会被稀释,准确率反而下降。
主楼曾经也以为是大窗口的问题,后来发现是注意力稀释。
我是反过来做的:先让它写方案,我改完再让它实现,返工少很多。
继续逛逛