第 2 章 稳态:让一次成功变成次次可解释
第一章结束时,你已经让系统跑了起来。现在真正的挑战才刚开始:你明天再跑一次,它还能像今天这样可靠吗?
很多人一提“复现”就紧张,仿佛必须每个字符、每个数字都完全一样。真实世界不是这么运作的。对 EvoScientist 这样的多组件系统来说,更重要的复现标准是:行为链路稳定、关键差异可追踪、结果边界可说明。
费曼会说,科学不是追求“神奇地总是一样”,而是追求“为什么不一样也能解释清楚”。
先看配置这一层。EvoScientist.py 的 _ensure_config() 会把配置缓存并同步到环境,这相当于给会话建立了一个稳定的“实验条件”。如果你今天用某个 provider/model,明天默默换了另一个,再来讨论“系统是不是不稳”,这个问题本身就不成立。真正要固定的,不只是模型名,还包括 auto_approve 和 enable_ask_user,因为它们会改变执行分支,等于你悄悄换了实验流程。
再看 MCP。系统在 _load_mcp_tools_cached() 里做了一个很聪明的动作:按配置签名缓存工具连接结果。配置没变,就不反复重连。你可以把它想成实验室门口的登记本:人员和设备都没变,就不需要每次重新布置场地。这个机制直接降低了反复开新会话时的抖动感。
很多“复现失败”其实还有一个隐形元凶:路径漂移。paths.py 把当前目录作为工作区根,派生出 memory/、skills/ 等状态目录。你从不同目录启动,就像在不同实验室做同名实验。结果不同并不神秘,只是上下文不同。
稳态还包含“失败时的姿态”。ToolErrorHandlerMiddleware 让工具异常变成可读错误消息,交还 agent 继续决策;AskUserMiddleware 在关键信息缺失时中断并询问用户。稳定系统不是从不出错,而是出错后路径仍然清晰、可重走、可复盘。
当你能做到这几点:固定配置、固定工作区、固定工具暴露、记录关键分支,你就从“会用 EvoScientist”进入“会驾驭 EvoScientist”。下一章我们继续往前:不仅要跑得稳,还要看懂结果背后到底发生了什么。