企业智能体工程体系v1.1|企业智能体工程卷 · 第3期·无状态决策记忆——立场独立,错误不跨环节传染
2026/8/7 5:25:40 网站建设 项目流程

企业智能体工程体系v1.1|企业智能体工程卷 · 第3期

无状态决策记忆——立场独立,错误不跨环节传染

作者:技术治理研究组
系列:企业智能体工程卷(发布版 v1.1)
主案例:CASE-CR-0042(信用提额申请)
本集对象:DecisionRecord · DecisionBoard
适合读者:架构师、技术负责人、AI 产品经理、企业级 Agent 开发者

📌 本文档声明

  1. 性质:本文为企业智能体工程化设计参考框架的第 3 期,聚焦多 Agent 链路中决策记忆的传递与隔离,提供架构思路与教学级示意代码,不构成生产级实现方案或法律合规意见。
  2. 证据锚定:文中案例(CASE-CR-0042)为教学示意,不对应任何真实客户系统。
  3. 系列定位:本篇在第 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 如何传递结论而非立场
关系财务执行前仍跑四轴 + P1Board 记录四轴结论,但不替代四轴

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 概念落地到具体场景:

  1. 冲突探测扩展:在 CASE-CR-0042 上,除了support.perceivevsdata.plan,你还想在哪两个 stage 之间设冲突探测?例如data.planvsfinance.act

  2. 忽略冲突的后果:若finance.act忽略stance_conflict强行自动批满,缺的是 P1(四轴)、P2(契约)还是审计?这三种情况分别应该由什么机制拦截?

  3. 置信度阈值:在代码中,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 链路从“盲信上游”进化为“独立判断、显式冲突”。欢迎转载,请注明出处与原文标题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询