ADR-0001:不使用编排框架,自研 DAG 引擎¶
- 状态:已采纳
- 日期:2026-09
背景¶
多智能体编排有现成方案(LangGraph / AutoGen / CrewAI)。项目的候选路线是: 直接用 LangGraph 快速搭出流程,或自研一个最小可用引擎。
决策¶
自研 engine/,不引入任何编排框架。仅依赖 asyncio、pydantic。
理由¶
- checkpoint 粒度:需要"每节点一次、纯 JSON、与业务表同库"的快照, 这样排障可以直接 SQL 查,恢复逻辑也能自己验证一致性。
- 降级语义:需要按角色定义降级产物("数据不足"的合法对象), 而不是抛异常或返回 None——框架的失败模型不匹配这个需求。
- 事件协议:需要 22 种业务事件、run 内单调 seq、精确的 SSE 续传语义。
- 可解释性:排障时需要能一句话说清"为什么这个节点没跑"。
代价¶
必须自己保证调度正确性:环检测、并行度、失败传播、取消、恢复一致性。 应对方式是把引擎的测试密度做到全项目最高,并用"重跑对照"验证恢复一致性。
后果¶
- 引擎层不依赖 LLM/工具,可以脱离模型单测;
- 换模型、换数据源不影响调度;
- 代码量约 1600 行,其中测试约 600 行。
备选方案为何被否¶
- LangGraph:上述三点都要在外面再包一层,最终代码量相近但排障要理解两套抽象;
- Celery 任务编排:偏"任务分发",没有状态与依赖语义,等于自己写一半。