一次架构判断:把"模型一次需要看见多少工具"作为切分依据,并用 eval 验证它没有让模型选错工具。
工具数量增长后,我没有继续往扁平的 forge-tools.factory 堆工具,而是按能力域/业务域切成 pack(各自 manifest + SKILL.md 作为单一真值源),运行时按场景 load-pack 按需加载,system prompt 动态拼装,pack 之间用 dependsOn 自动闭包补齐依赖。
上下文预算是硬墙:工具一多,全量注册会把工具 schema + system prompt 顶爆上下文。这和我同期做的 token budget、长会话压缩是同一约束的两面。
说明散在 prompt 里必然漂移,改成 SKILL.md 单一真值源后"加能力等于加 pack"。dependsOn 自动闭包保证加载 A 必带依赖 B,堵住漏加载导致的半截失败。
风险是按需加载后模型可能加载不到或选错工具,等上线才暴露就晚了。所以我建 eval,把最严的一档确定性硬约束(审核中写回、越权、先读后写顺序等红线)接入 CI 门禁,把验证前移。
为保证重构后的效果,我把模型行为沉淀成一套可回归的 eval:对真实 LLM 做黑盒测试,逐条检查 agent 是否守住业务红线(审核中只读、不可越权写、先读后写顺序等)。重构后用它跑回归,再对失败逐条复盘——区分出哪些是模型随机性、哪些是 agent 真违反了约束。
我学到的:
重复:高风险重构前,先把模型行为落成一套可回归的 eval,再动架构——先验证、再动手。
停止:停止把 eval 断言写死成"必须严格按某个工具顺序",改用"几条可接受的路径都算通过"的判定。
改变:把 SKILL.md 从"只喂 prompt",改成一处定义、同时驱动 prompt、文档和 eval——彻底消除三者之间的漂移。