主题
12 · 原子业务需求解构与源码级实现方法
严格按 11 框架 v2 执行:实现真实性闸(§C)+ 四角色对抗评审(§D)+ 原子业务需求为单元(§E)+ 底座级判据(§F)+ PMO 诚实留痕(§G)。 证据级标注:T0 运行实测 / T1 执行路径源码 file:line / T2 接口 / T3 spec·wiki(仅意图)。本文结论均 ≥T1。
§0 S′1 依赖真实性裁决(命门核验 · 三依赖走 §C 闸)
09 底座有三个"复用 deer-flow 原生"的承重假设。对抗式源码核验(T1)裁决如下——这是 v2 框架首次在下结论前自拦乐观:
裁决 1:项目事实集 ≈ 原生记忆 —— ❌ 推翻(判级:夸大/不适用)
| 维度 | 实际实现(T1) | 结论 |
|---|---|---|
| 存储形态 | agents/memory/storage.py:24-40 facts 是无索引数组(id/content/category/confidence/source);无谓词/实体/会议索引 | 不可精确查询/溯源 |
| 一致性 | memory/queue.py:120-138 同 thread LWW 覆盖、updater.py:425-466 30s 去抖 + LLM 抽取 | 丢事实、无强一致、精修后下游立即读必读到旧值 |
| 项目隔离 | memory/namespace.py:30 仅前缀;updater.py:update_memory() 签名无 project_id(update_memory_from_conversation 却传它 → TypeError 待发);scope_extraction.py 有逻辑但无调用方 | per-project 隔离未实装 |
| 消费 | memory/prompt.py:202-318 仅按 confidence 排序截断注入 system prompt(≤2000 tok),无 query API | 下游无法按业务检索 |
→ 裁决:原生记忆是"个人上下文摘要器",不是"可查询可溯源强一致的项目事实库"。事实集必须 acdm-backend 自建(PG + 全文/向量检索 + 审计链)。 修正 05 GAP-6:选 6A/6C(a-cdm PG/物化视图),显式否决 6B(原生记忆)。原生记忆保留其本职(个人偏好注入)。
裁决 2:HITL 澄清可异步回灌续跑 —— ⚠️ 部分(判级:机制真实,异步待办层缺失)
| 能力 | 实际实现(T1) | 结论 |
|---|---|---|
| 中断 | clarification_middleware.py:144-147 Command(goto=END) | 真实 |
| 持久化 | runtime/runs/worker.py:72-121 checkpoint 绑定(SQLite/PG) | 真实 |
| 续跑 | langgraph_client.py:204-257 update_state() + runs.wait(input=None);worker.py:156-165 {}→None 从 checkpoint 续跑;ba_report 生产验证 | 真实,增量(只跑中断后节点) |
| 结构化/owner/异步待办 | tools/builtins/clarification_tool.py:7-18 仅 question/type/context/options(字符串);无 suspicious_id/offset/owner;同会话设计 | 缺失,须自建 |
→ 裁决:中断-持久化-续跑是真实且经 ba_report 生产验证的范式;但"异步、面向责任人、批量可疑点待办"层 deer-flow 没有,须 acdm-backend BFF 自建(awaiting_clarification 表 + API + IM + update_state 桥)。Aegra/vendored 零改动。
裁决 3:任务流=可持久/审阅/回滚/续跑契约 —— ❌ 当前会议管道没有,但范式已验证(判级:占位,须按 ba_report 重建)
| 维度 | 实际实现(T1) | 结论 |
|---|---|---|
| 会议管道 | pipelines/meeting_aggregator_realtime/pipeline.py:121 graph.compile() 无 checkpointer、无 interrupt;insights_service.py:753 join_stream 仅转发非 resume;progress 事件无 payload;cache 后置 | 一次性 SSE,无契约边界 |
| 平台是否支持 | ba_report/pipeline.py:140 graph.compile(interrupt_before=…, checkpointer=…) + langgraph.json:15-17 checkpointer 工厂存在 | 平台支持,会议管道没用 |
| 节点级查看/回滚 | langgraph_client.py 无 get_state 调用;无节点级 API | 缺失 |
→ 裁决:09 的"任务流契约"在现会议代码=0;但 ba_report 已在 Aegra 上跑通 checkpointer+interrupt+update_state 续跑——这是"事半功倍"的真实复用对象。09 任务流须按 ba_report 范式重建编排(非复用占位会议代码),节点级查看/回滚需 BFF 补 get_state。
§0 总结(诚实):09 方向(05×原生)成立且更扎实,但"事半功倍"= 复用 ba_report 这条生产验证范式 + 自建 PG 事实集,不是复用占位会议代码。三裁决已回填 10 §3 台账;[00 §E] 偏差控制由 [11 §C 闸] 取代并首次生效。
§1 修正后的底座架构(以 ba_report 范式为骨,a-cdm PG 为事实底座)
项目事实集 = acdm-backend 自建 PG(project_facts:可查询/审计链/强一致/按 project 硬隔离)
▲ 读 ▲ 提问/回灌
│ │
任务流(LangGraph Pipeline,按 ba_report 范式 compile(checkpointer=,interrupt_before=)):
ingest → refine → extract(带 char offset) → verify(程序校验 quote⊂源文)
→ [可疑/低置信/冲突] interrupt ──▶ acdm-backend BFF:awaiting_clarification 待办
│ (owner 指派 + IM 通知 + 异步)
│ 人答 → update_state(answers) ───┘
└─◀ runs.wait(None) 从中断节点续跑(仅重算受影响项)→ commit 入 project_facts
▼
跨会聚合 / 待办 / Check / 复盘 —— 只读 project_facts(真 embedding/实体消歧关联)- vendored(deer-flow harness)改动 ≈ 0:只在
skills/custom改 prompt、按 ba_report 范式新建会议任务流 pipeline(pipelines/是可加目录,注册langgraph.json/aegra.json)、可选小扩clarification_tool参数(向后兼容)。 - acdm-backend 自建(原生确不承载,§0 已举证):
project_facts库 +awaiting_clarification待办 + 节点级get_stateBFF。 - 05 模型映射:项目工作台=project_facts+配置;任务卡=awaiting_clarification/待办 overlay;任务流=ba_report 范式 pipeline;人审/回滚=interrupt+update_state;双触发=主动 invoke + 事件/cron。
§2 原子业务需求解构(ABR · 全链路 · 每条走 §D 四审)
字段见 [11 §E]。源码现状已走 §C 闸判级。实现方法只列推荐 + 关键取舍(完整多方案见 §3 承重项)。
| ABR | 期望(T3 意图) | 用户价值/反孤岛 | 验收(可用▏好用) | 源码现状(§C 判级,T1) | 实现方法(原生×05,推荐) | 底座性(§F) |
|---|---|---|---|---|---|---|
| A1 摄入 | 口水稿/纪要入卡并绑定会议 | 组织者上传即建卡,可追溯 | 文件入卡+元数据▏多源统一 | 文件上传 live(T1 file_service) | 任务流 ingest 节点,复用现上传 | 高(领域无关"原始材料入卡") |
| A2 精修 | 清洗/分块/说话人归一/结构化口水稿 | 修"垃圾进垃圾出"根 | 精修文本可读▏长会不丢中段(多 pass) | 缺失(无精修,单 mega-prompt 一遍) | refine 节点:分块+多 pass+说话人归一(LLM,确定步骤) | 高(通用"噪声文本→结构化") |
| A3 抽取带offset | 事实抽取每条带 transcript char/行 offset | 可溯源前提 | 每条带 offset▏分类准(分任务非 mega-prompt) | 占位/夸大(单 prompt、quote 无 offset,§0 裁决3) | extract 节点拆成"分类型小 prompt + 强制结构化 offset" | 高(通用"带证据抽取") |
| A4 引文校验 | 程序校验 quote 子串确在源文,否则丢/标可疑 | 防幻觉硬闸(非 LLM 自律) | 无效 offset 100% 被拦▏可疑入 A5 | 缺失 | verify 节点:纯程序 substring/对齐校验,acdm-backend 侧(可改) | 高(通用"产物可信闸") |
| A5 可疑点HITL | 可疑/低置信/冲突→澄清待办向责任人提问,人答回灌续跑 | 论证 05 双主体回环;不猜 | 待办指派 owner+IM▏人答增量续跑 | 机制真实(ba_report)+异步待办层缺失(§0 裁决2) | interrupt + acdm-backend awaiting_clarification 待办 + update_state 回灌 | 高(通用"AI 不确定→人决策"原语) |
| A6 入事实集 | 精修+人确认事实写 project_facts(带 offset/确认人/时间) | 单一真相 | 写入强一致+审计链▏下游立即可读 | 须自建(原生记忆不胜任,§0 裁决1) | acdm-backend project_facts 事务写 | 底座核心(领域无关事实库) |
| A7 跨会聚合 | 同事项跨会归并/演进/风险升级,真关联 | 项目级洞察 | 归并准(真 embedding/实体消歧)▏读事实集不重扫 | 占位(ZeroEmbedding+空 canonical→只看日期,§09§1) | 读 project_facts + 真 embedding + 实体消歧 reducer | 中(会议偏多,可抽象) |
| A8 待办派生 | action 事实→人审待办池(proposed→confirmed…) | 闭环到执行 | 派生+状态机+至少一处同步▏跨会归并 | 缺失(无 project_todos) | 待办 overlay=05 任务卡;读 project_facts | 高(=05 任务卡通用) |
| A9 Check 注入 | 下会开场注入上次进度+偏差 | 跨会连续性 | 开场自动注入▏偏差标红 | 缺失 | before_agent 中间件(custom_middlewares)读 project_facts | 高(通用"上下文注入") |
| A10 PDCA 复盘 | 周/月复盘+改进项完成率 | 管理层价值,差异化 | 复盘 skill▏完成率仪表<50%报警 | 缺失(只有占位报告) | 原生 skill,读 project_facts | 中 |
四审记录(摘要):架构师否决"在占位会议管道上补"(双源漂移)→ 改 ba_report 范式重建;AI 专家要求 A3 拆小 prompt+A4 程序硬闸(非 prompt 自律);PMO钉死先 A1–A6 单会闭环再 A7–A10;业务顾问要求 A8 必须真同步进既有执行系统否则=孤岛。
§3 承重架构决策(多方案 + 7 维取舍 + 推荐 + devil's advocate)
7 维见 00 §B.2:①功能②可信③闭环④可逆⑤性能成本⑥可运维⑦原生杠杆。
D-1 任务流编排:如何获得 05 契约(持久/中断/审阅/回滚/续跑)
- 方案 a:复用现
meeting_aggregator_realtime(一次性 SSE)打补丁。①2②1③1④1⑤2⑥2⑦2 — devil:双源漂移、§0 裁决3 已证 0 契约。弃。 - 方案 b(推荐):按 ba_report 范式新建会议任务流 pipeline:
compile(checkpointer=get_checkpointer(), interrupt_before=[clarify_node]),BFF 用update_state+runs.wait(None)续跑。①3②3③3④3⑤2⑥3⑦3 — 复用生产验证范式,vendored 零改。devil:聚合从"一次性"变"可中断",延迟模型变复杂 → 缓解:无可疑点时不中断,直通。 - 方案 c:换外部编排(Prefect/Airflow)。①3②3③3④3⑤2⑥1⑦0 — 违原生杠杆、运维重。弃。 → 推荐 b:ba_report 是 a-cdm 自己已跑通的 HITL+checkpoint+resume 实例,这才是真"事半功倍"。
D-2 项目事实集存储
- a(推荐):acdm-backend 新
project_facts(PG;字段:project_id/fact_id/kind/text/owner/offset(file,char_start,char_end)/source_meeting/confidence/status/confirmed_by/version/supersedes/created_at)+ 全文检索,后续可加向量。①3②3③3④3⑤3⑥3⑦1(自建但 §0 已举证原生不胜任)。 - b:原生记忆 namespace。§0 裁决1 已证 ❌(无查询/无强一致/隔离未实装)。弃。
- c:复用现 L1/L2 cache 当事实集。devil:cache 是聚合产物非真相源,且基于占位抽取 → 弃为真相源,仅作派生物化视图(沿 [05 GAP-6 6C] 但真相=project_facts)。 → 推荐 a,且设计为领域无关
project_facts(非meeting_facts)以满足 §F 底座性(会议只是 source 之一)。
D-3 可疑点 HITL 待办层
- 推荐:deer-flow 侧
clarification_tool可选加suspicious_point_id/source_offset/structured_options(向后兼容,vendored 最小);acdm-backend 新awaiting_clarification(thread_id/point_id/assignee/status/due/answer)+ API + IM 通知 +update_state回灌桥。①3②3③3④3⑤3⑥3⑦2。devil:中断态久挂的 thread 生命周期/超时 → 设 due + 升级策略(05 开放问题 1,本文 §5 定)。
D-4 抽取与防幻觉(治"错漏多/不可溯源")
- 推荐:A3 拆分——先 refine(A2)→ 再"按类型分小 prompt 抽取"(decision/risk/action…各自专注,非单 mega-prompt)→ 每条强制带候选 offset → A4 程序校验
text/quote是否真子串/可对齐到精修文本,失败→丢或转 A5。①3②3⑤2(多次 LLM 但单类小、可并发)。devil:多次 LLM 成本↑ → 缓解:精修后文本短、小 prompt 快、可并发;比单 mega-prompt+thinking 4-6min 串行更快更准(§09§1 反例)。
D-5 真关联(治跨会"只看日期")
- 推荐:A7 用真 embedding service + 实体 canonical 消歧替换
ZeroEmbeddingService+空canonical_entity_map;关联/归并读project_facts。①3②2⑤2⑥2⑦2。devil:embedding 选型/成本/中文 → 留 §5 继续探讨(可先 entity 消歧拿大头,embedding 后置)。
§4 标杆最小闭环 M1(重定义,T0 验收)
目的:用最小范围 T0 证明 05 模型可行(论证北极星),不贪多。
范围:单项目 + 单场会议,A1→A2→A3→A4→A6 跑通(A5 先做"标记可疑"不强制人答,A7–A10 不在 M1)。 技术骨:新会议任务流 pipeline(ba_report 范式,compile(checkpointer=));refine/extract/verify 节点;acdm-backend project_facts 写入。 可证伪验收门(全部 T0):
- 一场真实会议跑完,产出 N 条事实,随机抽 20 条 100% 可点回精修文本精确 offset 且引文程序校验通过(可信);
- 无效 offset 项 0 条进 project_facts(被 A4 拦,可疑入标记)(防幻觉硬闸);
- project_facts 写入后下游立即可精确查询到(强一致,治原生记忆 30s 问题);
- 端到端单会 < 现状(占位 4-6min/场),且分类错误率人审显著优于占位(对比 §09§1)。 止损位:M1 不达门 → 回 §3 重选方案,不进 M2。
§5 开放问题(供继续探讨 · 决策点)
- 中断态 thread 生命周期:可疑点待办久挂未答,thread/checkpoint 如何超时/升级/GC?(05 开放问题 1)建议:due + 到期降级为"AI 暂定+标低信"入事实集并持续提醒,不永久阻塞。
- 事实集冲突治理:跨会矛盾事实(A 说 X,B 说 ¬X)在 project_facts 里是并存+标 conflict 还是仲裁?建议沿 spec"诚实呈现不仲裁"+ 升级为澄清待办。
- embedding 选型:中文、成本、是否自托管;能否先纯实体消歧(canonical)拿 80% 效果,embedding 二期。
- 底座抽象边界:
project_facts+ 任务流 + HITL 待办 抽到什么粒度才既领域无关又不过度设计?需一个非会议业务纸面复用验证(§F 判据3,北极星判据4)——建议选一个真实 A-CDM 业务做 1 页演练。 - 写成 OpenSpec change:本文 §1/§3 的底座契约应正式化为 openspec change(真相源),避免又一份会被打叉的 spec;何时切入?
- vendored 最小扩展的上游策略:
clarification_tool加参数是否走 cherry-pick/上游 PR,避免 vendored 漂移?
§6 PMO 结论(诚实 · 无 T0 不称达成)
- 现状:已完成的是诚实基线 + 经源码验证的方法,尚无任何运行成果;05 模型"可行"仍是 待 M1 T0 证明 的命题。
- 方向判定:成立且更扎实——三依赖核验把"复用对象"从"占位会议代码"纠正为"ba_report 生产范式 + 自建 PG 事实集",这反而降低了风险(有可抄的真实例)。
- 建议序(承 [10 §5]):1 止损重部署 → 2 把 §1/§3 写成 OpenSpec change(底座契约真源)→ 3 M1(ba_report 范式跑通 A1–A6,T0 验收)→ 4 §5 开放问题逐个定。每步过 [11] §C 闸 + §D 四审 + §G 留痕。