企业智能体工程体系v1.1|企业智能体工程卷 · 第3期
无状态决策记忆——立场独立,错误不跨环节传染
作者:技术治理研究组
系列:企业智能体工程卷(发布版 v1.1)
主案例:CASE-CR-0042(信用提额申请)
本集对象:DecisionRecord · DecisionBoard
适合读者:架构师、技术负责人、AI 产品经理、企业级 Agent 开发者
📌 本文档声明
- 性质:本文为企业智能体工程化设计参考框架的第 3 期,聚焦多 Agent 链路中决策记忆的传递与隔离,提供架构思路与教学级示意代码,不构成生产级实现方案或法律合规意见。
- 证据锚定:文中案例(CASE-CR-0042)为教学示意,不对应任何真实客户系统。
- 系列定位:本篇在第 0 期(身份与审计)、第 1 期(技能契约)和第 2 期(决策四轴)的基础上,引入决策记录板(DecisionBoard),解决多环节决策的立场传递与冲突检测问题。
摘要
在第 1 期中,我们建立了SkillContract(技能契约)——明确了 Agent“能做什么、不能做什么”。在第 2 期中,我们建立了决策四轴 + P1 协议——让每个单点决策对齐企业价值。
但还有一个问题尚未解决:当决策链路跨越多个 Agent 时,错误会沿着链路传染。
CASE-CR-0042 的完整链路是:客服受理 → 数据拉信报 → 财务裁决。如果三个 Agent共用一份“可变脑”(共享状态/共享记忆),会发生什么?
| 环节 | 可能发生的错误 | 传染路径 |
|---|---|---|
| 客服 | 误判“低风险急单”,写下乐观标签 | → 数据直接继承该标签 |
| 数据 | 未独立复核,沿用“低风险”判断 | → 财务直接继承 |
| 财务 | 基于被污染的“低风险”结论自动批满 | → 坏账发生 |
错误静默传到底,每一个环节都有“说得过去的理由”,但最终企业价值被掏空。
本期引入DecisionBoard(决策记录板)作为多环节决策的“只追加记忆体”。其核心设计原则是:上游可写结论,下游可读结论,但下游必须独立判断,不能盲信上游推理。
一句话核心:无状态 ≠ 无记忆;禁止的是共享可变脑,而非禁止引用历史结论。
1. 问题:为什么“共享脑”是链路灾难
1.1 共享可变脑的典型症状
在多 Agent 链路中,如果所有 Agent共享同一份可变状态(如共享的 Memory、共享的 Context 对象),会出现三种典型症状:
| 症状 | 说明 | CASE-CR-0042 示例 |
|---|---|---|
| 偏见传染 | 上游的误判被下游无条件继承 | 客服写“低风险”,数据直接沿用 |
| 立场固化 | 早期结论影响后期判断,难以推翻 | 第一印象决定最终结果 |
| 归因困难 | 错误发生时,无法定位是哪个环节出了问题 | 坏账发生后,说不清是客服误判还是财务失职 |
1.2 理想模式 vs 现实模式
| 维度 | 现实模式(共享脑) | 理想模式(决策板) |
|---|---|---|
| 上游结论 | 下游直接采纳 | 下游可见,但必须独立判断 |
| 状态变更 | 任意环节可修改 | 只追加,不修改 |
| 冲突处理 | 静默覆盖 | 显式标记,禁止静默执行 |
| 错误传播 | 沿链路传染 | 在冲突点阻断 |
2. DecisionBoard:只追加的决策记忆体
2.1 核心概念
┌─────────────────────────────────────────────────────────────┐ │ DecisionBoard(只追加) │ ├─────────────────────────────────────────────────────────────┤ │ support.perceive ──write──▶ Board ──▶ data.plan(独立读) │ │ data.plan ──write──▶ Board ──▶ finance.act(独立读)│ │ finance.act ──write──▶ Board ──▶ 审计 / 人工复核 │ └─────────────────────────────────────────────────────────────┘三大设计原则:
| 原则 | 含义 |
|---|---|
| 只追加(Append-Only) | 已有记录不可修改、不可删除——保证历史可追溯 |
| 独立读(Independent Read) | 下游可引用上游的claim,但必须独立判断(不能复制立场) |
| 冲突显式化(Explicit Conflict) | 当上下游结论冲突时,显式标记,不进静默执行 |
2.2 与第 2 期四轴的关系
| 维度 | 第 2 期(四轴 + P1) | 第 3 期(DecisionBoard) |
|---|---|---|
| 作用范围 | 单点决策 | 多环节链路 |
| 核心问题 | 一个 Agent 如何对齐价值 | 多个 Agent 如何传递结论而非立场 |
| 关系 | 财务执行前仍跑四轴 + P1 | Board 记录四轴结论,但不替代四轴 |
3. CASE-CR-0042 剧本:错误如何被阻断
3.1 完整链路
阶段 1: support.perceive(客服感知) └── 客户声称“历史零逾期、急用款” └── 写入 Board: claim="客户自述低风险急用款", confidence=0.6 阶段 2: data.plan(数据规划) └── 独立拉取信用快照,发现近期负债上升 └── 写入 Board: claim="快照显示负债上升", confidence=0.85 └── 冲突探测: 与 support 的"低风险"矛盾 → 标记 stance_conflict 阶段 3: finance.act(财务执行) └── 读取 Board:看到两份冲突记录 └── 基于冲突 → 不自动批满,转人工复核 └── 写入 Board: claim="转人工复核,不自动批满"3.2 错误阻断点
| 错误源 | 阻断机制 |
|---|---|
| 客服误判“低风险” | data 独立复核,未继承该标签 |
| 数据发现冲突 | 显式标记stance_conflict,不静默传递 |
| 财务基于冲突决策 | 拒绝自动批满,转入人工通道 |
4. 最小代码:Board + 冲突检测
以下为教学级示意代码,展示 DecisionBoard 的只追加存储、独立读取和冲突探测机制:
from__future__importannotationsfromdataclassesimportdataclass,fieldfromdatetimeimportdatetime,timezonefromtypingimportAny@dataclass(frozen=True)classDecisionRecord:"""只追加的决策记录——一旦写入,不可修改。"""stage:str# 环节标识,如 "support.perceive"case_id:str# 关联案例编号claim:str# 本环节的结论/主张confidence:float# 置信度 (0.0 ~ 1.0)payload:dict[str,Any]=field(default_factory=dict)# 附加数据at:str=field(default_factory=lambda:datetime.now(timezone.utc).isoformat())classDecisionBoard:"""决策记录板——只追加,不修改,不删除。"""def__init__(self)->None:self._records:list[DecisionRecord]=[]defwrite(self,rec:DecisionRecord)->None:"""写入一条决策记录(只追加)。"""self._records.append(rec)deflatest(self,stage:str)->DecisionRecord|None:"""获取某个环节的最新记录。"""forrecinreversed(self._records):ifrec.stage==stage:returnrecreturnNonedefall_records(self)->list[DecisionRecord]:"""获取全部记录(用于审计和冲突检测)。"""returnself._records.copy()defhas_conflict_between(self,stage_a:str,stage_b:str)->bool:"""检测两个环节的结论是否存在冲突。"""ra=self.latest(stage_a)rb=self.latest(stage_b)ifraisNoneorrbisNone:returnFalse# 简单冲突规则:包含矛盾关键词optimistic={"低风险","通过","批准","无问题"}cautious={"风险","负债","审慎","拒绝","异常"}words_a=set(ra.claim)words_b=set(rb.claim)has_opt=any(kwin" ".join([ra.claim,rb.claim])forkwinoptimistic)has_cau=any(kwin" ".join([ra.claim,rb.claim])forkwincautious)returnhas_optandhas_cau# ===== CASE-CR-0042 演示 =====defsupport_perceive(board:DecisionBoard)->DecisionRecord:"""阶段 1:客服感知——客户自述。"""rec=DecisionRecord(stage="support.perceive",case_id="CASE-CR-0042",claim="客户自述历史零逾期、急用款,建议快速处理",confidence=0.6,payload={"ticket":"T-CR-0042","want":120000,"source":"customer_claim"},)board.write(rec)print(f"[support.perceive] 写入:{rec.claim[:30]}... (conf={rec.confidence})")returnrecdefdata_plan_independently(board:DecisionBoard)->DecisionRecord:"""阶段 2:数据规划——独立复核,不继承上游立场。"""# 读取上游结论(但不复制立场)upstream=board.latest("support.perceive")assertupstreamisnotNone# 独立判断(核心:不复制 claim,独立生成新的 claim)rec=DecisionRecord(stage="data.plan",case_id="CASE-CR-0042",claim="独立快照显示近期负债上升、现金流收紧,建议审慎评估",confidence=0.85,payload={"debt_trend":"up","cashflow_trend":"tight","upstream_claim":upstream.claim,# 引用但不复制立场},)board.write(rec)print(f"[data.plan] 写入:{rec.claim[:30]}... (conf={rec.confidence})")returnrecdefdetect_stance_conflict(board:DecisionBoard)->str|None:"""冲突探测:检测关键环节之间的立场矛盾。"""p=board.latest("support.perceive")d=board.latest("data.plan")ifpisNoneordisNone:returnNone# 冲突条件:一方乐观,一方审慎optimistic={"低风险","快速","无问题","急用"}cautious={"风险","负债","审慎","收紧","谨慎"}p_words=set(p.claim.split())d_words=set(d.claim.split())has_opt=any(kwinp.claimforkwinoptimistic)has_cau=any(kwind.claimforkwincautious)ifhas_optandhas_cau:returnf"stance_conflict: 感知偏乐观 vs 数据偏审慎 (p='{p.claim[:20]}...' d='{d.claim[:20]}...')"returnNonedeffinance_act(board:DecisionBoard)->DecisionRecord:"""阶段 3:财务执行——基于 Board 历史独立决策。"""# 1. 读取所有相关记录support_rec=board.latest("support.perceive")data_rec=board.latest("data.plan")# 2. 冲突检测conflict=detect_stance_conflict(board)# 3. 决策:有冲突则转人工ifconflict:claim="发现感知与数据冲突,转人工复核,不自动批满"confidence=0.9allowed=Falseelse:claim="无冲突,继续自动评估流程"confidence=0.8allowed=Truerec=DecisionRecord(stage="finance.act",case_id="CASE-CR-0042",claim=claim,confidence=confidence,payload={"allowed":allowed,"conflict":conflict,"support_claim":support_rec.claimifsupport_recelseNone,"data_claim":data_rec.claimifdata_recelseNone,},)board.write(rec)print(f"[finance.act] 写入:{rec.claim[:30]}... (conf={rec.confidence})")returnrecdefaudit_board(board:DecisionBoard)->None:"""审计:打印全部记录。"""print("\n=== 审计日志(只追加) ===")forrecinboard.all_records():print(f" [{rec.at[:19]}]{rec.stage}:{rec.claim[:40]}... (conf={rec.confidence})")# ===== 运行演示 =====if__name__=="__main__":board=DecisionBoard()# 阶段 1:客服感知support_perceive(board)# 阶段 2:数据独立复核data_plan_independently(board)# 冲突检测conflict=detect_stance_conflict(board)print(f"\n[冲突检测]{conflict}")# 阶段 3:财务执行finance_act(board)# 审计audit_board(board)运行输出:
[support.perceive] 写入: 客户自述历史零逾期、急用款,建议快速处理... (conf=0.6) [data.plan] 写入: 独立快照显示近期负债上升、现金流收紧... (conf=0.85) [冲突检测] stance_conflict: 感知偏乐观 vs 数据偏审慎 (p='客户自述历史零逾期、急用款...' d='独立快照显示近期负债上升、现...') [finance.act] 写入: 发现感知与数据冲突,转人工复核,不... (conf=0.9) === 审计日志(只追加) === [2026-08-06T...] support.perceive: 客户自述历史零逾期、急用款,建议快速处理... (conf=0.6) [2026-08-06T...] data.plan: 独立快照显示近期负债上升、现金流收紧,建议审慎评估... (conf=0.85) [2026-08-06T...] finance.act: 发现感知与数据冲突,转人工复核,不自动批满... (conf=0.9)5. 三个教训
基于 CASE-CR-0042 的 DecisionBoard 设计经验:
| 教训 | 含义 | 证据 |
|---|---|---|
| 无状态 ≠ 无记忆 | 禁止的是共享可变脑(Agent 间共享可变状态),而非禁止引用历史结论 | Board 只追加,下游独立读 |
| 独立复核有成本 | 关键节点(提额裁决)必复核;纯文案路径可快通道 | CASE-CR-0042 中财务不盲信客服与数据 |
| 冲突必须进队列 | 只写日志等于没治理——冲突要阻断执行,而非仅供事后查阅 | finance.act中冲突 → 转人工 |
6. 思考题
以下问题供团队内部讨论,帮助将 DecisionBoard 概念落地到具体场景:
冲突探测扩展:在 CASE-CR-0042 上,除了
support.perceivevsdata.plan,你还想在哪两个 stage 之间设冲突探测?例如data.planvsfinance.act?忽略冲突的后果:若
finance.act忽略stance_conflict强行自动批满,缺的是 P1(四轴)、P2(契约)还是审计?这三种情况分别应该由什么机制拦截?置信度阈值:在代码中,
support.perceive的置信度为 0.6(偏低),data.plan的置信度为 0.85(较高)。如果置信度差距较大,是否应该自动以高置信度结论为准?还是必须人工介入?
7. 下期预告
第 4 期:Agent-First 接口(ToolSpec)
将拉取信报和提额提议等能力封装为带有副作用声明的 ToolSpec,让工具调用可检查、可审计、可回滚。本期将 SkillContract + ToolSpec 组合为完整的 Agent 能力声明体系。
8. 延伸阅读
| 资源 | 说明 |
|---|---|
| Stateless Decision Memory for Enterprise AI Agents(arXiv:2604.20158) | 无状态决策记忆的学术框架 |
| Four-Axis Decision Alignment for Long-Horizon Enterprise AI Agents(arXiv:2604.19457) | 四轴决策对齐框架 |
| 本卷第 0 期:企业公民——Identity + AuditEvent | 身份与审计基础 |
| 本卷第 1 期:技能即契约——SkillContract + P2 | 能力边界契约化 |
| 本卷第 2 期:决策四轴——四轴 + P1 | 单点决策对齐 |
| 本卷第 4 期:Agent-First 接口(预告) | ToolSpec 工具声明 |
本文是「企业智能体工程卷」十期专栏的第 3 期。无状态决策记忆——立场独立,错误不跨环节传染,让多 Agent 链路从“盲信上游”进化为“独立判断、显式冲突”。欢迎转载,请注明出处与原文标题。