第 7 章 · 最佳实践 / Checklist
把前面几章的内容收拢成几条可以直接对照执行的经验。这不是一份放之四海而皆准的规范——它是从 SourceLens 这一个真实系统的装配和一次真实故障里提炼出来的,换一个技术栈时请重新核实每一条。
先搭最小 harness,再按真实需求逼自己加东西
回顾全文的路径:第 1 章的三行代码起步,到第 3 章按真实提交顺序一步步长出委派、场景切换、交付通道,再到第 6 章那次真实故障——没有一步是提前设计好的,全部是被具体需求或者具体故障逼出来的。这不是"来不及提前设计"的将就,而是一条更可靠的路:你很难提前猜中自己的 harness 会在哪个维度先撞墙,与其一开始就把子代理、Skills、Memory、HITL 全部装上,不如先跑起来,让真实场景告诉你下一步该补什么。第 5 章列的那些"还没用到的能力",本质上都是这条路径未来可能的延伸方向,不是起步清单。
长文本 / 大检索任务:先想卸载,再想触发线
第 6 章的 A/B 数据已经说得很清楚:面对"上下文涨得快"的任务,第一反应不应该是调高压缩触发线(summary_trigger_tokens)。原因在第 4 章讲过——这个触发线用的是近似 token 计数器,中文场景下本来就偏低估,调高它换来的不是"压缩变少",而是"距离模型真实的上下文上限更近"。
优先做的是降低卸载阈值(tool_token_limit_before_evict,SourceLens 里通过 LENSNODE_OFFLOAD_TOOL_TOKENS 配置),让大块证据提前搬进文件、不进入需要压缩处理的"活跃上下文",从源头上放缓上下文的增长速度。这两个旋钮不是二选一,但优先级是明确的:先卸载,触发线尽量不动。
不同模型,参数怎么设
不同模型的可用上下文差异很大——比如 DeepSeek 系列常见在十万级 token 量级,Anthropic Claude Opus 这一档的模型能到百万级 token。这个差距直接决定了同一套 summary_trigger_tokens/summary_keep_tokens 配置在不同模型上"安全边界"完全不同:对小上下文模型接近极限的阈值,换到大上下文模型上可能保守得没有必要;反过来对大上下文模型合适的阈值,直接套到小上下文模型上可能已经越界。
SourceLens 目前的配置是进程级别的环境变量,没有按 model_ref 做差异化——这是当前实现的一个已知局限,不是"不需要"。如果你的系统同时对接多个上下文窗口差异很大的模型,这是优先要补的一层:至少要清楚当前这套固定阈值是针对哪一档模型的可用窗口设的,换模型时手动核实一遍,而不是假设默认值放之四海而皆准。
调库行为前,先读实际安装版本的源码
第 6 章那个"3.3 还是 4.0“的插曲就是最直接的例子:一份写得很清楚、逻辑自洽的分析,出处却是"记忆里的库行为"而不是"这次装的这个版本”。deepagents/langchain 这类还在快速迭代的库,同一个类的构造参数、默认值、判断条件都可能在小版本之间悄悄变化。
具体到这个技术栈,容器内的路径是:
docker exec sourcelens-lensnode-dev cat \
/usr/local/lib/python3.12/site-packages/deepagents/graph.py
docker exec sourcelens-lensnode-dev pip show deepagents langchain langchain-core langgraph在做任何"这个中间件默认阈值是多少"、“这个参数存不存在"之类的判断之前,花两分钟对着实际安装的版本核实一遍,比凭经验下结论要可靠得多——尤其是在写文档、做技术决策这种会被后来者当作事实引用的场合。
Monkeypatch 第三方类的正确姿势
_apply_offload_thresholds(第 6 章)是一个典型的"需要改第三方库默认行为,但库没开放配置口子"的场景。它的写法值得当模板:
- 用
setdefault注入默认值,不强制覆盖——任何显式传参的调用方依然优先生效,不破坏调用方的意图。 - 保持类身份不变——包装的是
__init__,不是替换整个类,任何isinstance(x, FilesystemMiddleware)或框架内部的必需中间件检查都不受影响。 - 一次性安装,加锁保护——用一个自定义标记属性(
_lens_offload_wrapped)判断是否已经包装过,配合锁防止多线程/多次调用重复包装;没有跨运行共享的可变状态需要操心并发。
这三条组合起来的效果是:改动尽量小、尽量局部、尽量不引入新的不确定性——这本身也是"该不该 monkeypatch"这个问题的部分答案:只有当改动能做到这么克制的时候,才值得选择 monkeypatch,而不是维护一个分叉版本或者等上游开放配置。
一份简短的 checklist
- 从最小 harness(模型 + 工具 + system_prompt)起步,委派、场景切换、Memory、HITL 这些能力等真实需求逼出来再加,不要在第一版就全部装上。
- 长文本/大检索任务先调卸载阈值,压缩触发线尽量不动,除非你已经确认过计数器在你的模型上的真实偏差。
- 不同上下文窗口的模型不要共用同一套没有核实过的阈值配置。
- 判断库的默认值/行为之前,对着容器/环境里实际安装的版本核实,不要凭训练记忆或者上一次的分析结论。
- 区分清楚压缩(有损,改写内容)、卸载(无损,搬运内容)、上下文编辑(清理陈旧工具调用痕迹)——三者解决的问题不同,别用错。
- 判断"这段内容丢了还能不能找回来"时,想清楚它是不是真的能从 workspace/工具里重新查到——用户手打或粘贴的内容默认不能。
- Monkeypatch 第三方类默认行为时,用
setdefault+ 保类身份 + 加锁一次性安装,把改动限制到最小。
这份指南到此结束。它的价值会随着 deepagents/langchain 版本升级和 SourceLens 自身代码演进而逐渐过期——下次遇到类似问题时,最值得信的永远是当时那个版本的源码,而不是这篇文章里的某个具体数字。