跳转至

ADR-0001:不使用编排框架,自研 DAG 引擎

  • 状态:已采纳
  • 日期:2026-09

背景

多智能体编排有现成方案(LangGraph / AutoGen / CrewAI)。项目的候选路线是: 直接用 LangGraph 快速搭出流程,或自研一个最小可用引擎。

决策

自研 engine/,不引入任何编排框架。仅依赖 asyncio、pydantic。

理由

  1. checkpoint 粒度:需要"每节点一次、纯 JSON、与业务表同库"的快照, 这样排障可以直接 SQL 查,恢复逻辑也能自己验证一致性。
  2. 降级语义:需要按角色定义降级产物("数据不足"的合法对象), 而不是抛异常或返回 None——框架的失败模型不匹配这个需求。
  3. 事件协议:需要 22 种业务事件、run 内单调 seq、精确的 SSE 续传语义。
  4. 可解释性:排障时需要能一句话说清"为什么这个节点没跑"。

代价

必须自己保证调度正确性:环检测、并行度、失败传播、取消、恢复一致性。 应对方式是把引擎的测试密度做到全项目最高,并用"重跑对照"验证恢复一致性。

后果

  • 引擎层不依赖 LLM/工具,可以脱离模型单测;
  • 换模型、换数据源不影响调度;
  • 代码量约 1600 行,其中测试约 600 行。

备选方案为何被否

  • LangGraph:上述三点都要在外面再包一层,最终代码量相近但排障要理解两套抽象;
  • Celery 任务编排:偏"任务分发",没有状态与依赖语义,等于自己写一半。