福生无量摸鱼天尊

agent系列(二):证据链的多模态建模

2026/01/22
9
0

0. 承上启下

环境有隐状态s_t,智能体看到观测o_t,执行动作a_t,环境转移并给新观测。用 (PO)MDP 写为:

s_{t+1}\sim P(\cdot\mid s_t,a_t),\quad o_t\sim O(\cdot\mid s_t),\quad a_t\sim\pi(\cdot\mid h_t)

其中历史

h_t=(o_{1:t},a_{1:t-1}),\qquad \tau=(o_1,a_1,o_2,a_2,\ldots,o_T,a_T)

而 ReAct 的关键不是“多写一段 thought”,而是把策略拆成 显式可记录的内部推理状态z_t可执行动作a_t

z_t\sim\pi_\theta^{\mathrm{reason}}(\cdot\mid h_t),\quad a_t\sim\pi_\theta^{\mathrm{act}}(\cdot\mid h_t,z_t)

它直接带来“轨迹可审计”的性质:每一步为什么这么做、做了什么、结果如何都落在轨迹里。

1. 多agent的层级建模

多 Agent 的层级化本质上是Plan agent做宏观策略而Subagent 做选项或技能,具体体现就是 Plan or QA 控制层 + Math、Research、Code、Image、Video、DB worker之类的worker层,这里就会存在一个天然的层级:

  • 宏观时间步k=1,\dots,K:Planner 做一次“派单”决策

  • 微观时间步t=1,\dots,T_k:被派到的 subagent 在工具环境里跑一段 ReAct 轨迹

定义一个工作区/黑板状态(evidence packets)作为宏观状态:

w_k=(q,\mathcal{M}_k,\mathcal{E}_{<k},\mathcal{A}_{<k})
  • q:原始问题

  • \mathcal{M}_k:记忆/中间变量(实体、约束、单位、版本、预算等)

  • \mathcal{E}_{<k}:已累计证据集合

  • \mathcal{A}_{<k}:已产出“工件”,比如 SQL、代码日志、关键帧、表格片段等

Planner 的一次派单是一个宏观动作:

u_k=(j_k,x_k,c_k)
  • j_k \in {\text{Math, Research, Code, Image, Video, DB}}:选哪个 subagent

  • x_k:子任务描述/检索 query/要执行的工具目标

  • c_k:上下文约束(已知实体、口径、预算、权限、必须引用、不可写入等)

因此 Planner 策略为:

u_k\sim\Pi_\phi(\cdot\mid W_k),\quad W_k=(w_{1:k},u_{1:k-1},r_{1:k-1})

其中r_k 是 subagent 返回。

1.1. subagent的ReAct

k 次派单给到 agentj_k,它在工具环境里跑一个 ReAct micro-trajectory:

z_{k,t}\sim \pi_{j_k}^{\mathrm{reason}}(\cdot\mid h_{k,t}),\quad a_{k,t}\sim \pi_{j_k}^{\mathrm{act}}(\cdot\mid h_{k,t},z_{k,t}),\quad o_{k,t+1}\sim O(\cdot\mid s_{k,t+1})

返回的不是一句话,而是一个可对齐的“任务返回包”

r_k = (\hat{y}_k,\mathcal{E}_k,\tau_k,\rho_k)
  • \hat{y}_k:task answer(局部结论/中间结论)

  • \mathcal{E}_k:证据集合(后面统一 schema)

  • \tau_k:可审计轨迹(动作/观测/日志)

  • \rho_k:校验/风险门控结果(schema 校验、权限、测试通过与否等)——你在文中强调 verifier/risk gate 的位置就是它

宏观状态更新:

w_{k+1} = \mathrm{Update}(w_k,r_k)

2. 多模态证据链数学建模

subagent 的证据链核心是强制每条证据变成一个带锚点的 typed tuple :

e=(\mathrm{id}, m, s, \alpha, \tau, u, v, p)
  • m:模态(text/table/image/video/code/db/math)

  • s:来源(doc id / url / db snapshot / commit hash / video id …)

  • \alpha:定位锚点(text span / table cell range / bbox / time segment / code line+stdout slice / SQL+row ids)

  • \tau:时间锚(抓取时间、数据版本时间、视频时间码)

  • u:单位/量纲(数值证据必备)

  • v:内容(片段/截图区域/关键帧引用/结果表片段/日志片段)

  • p:置信与校验信息(retrieval score、NLI 支持度、校验器结果、哈希等)

当然,现在的DAG玩的是Evidence Graph,多agent多模态下,证据链常常只是展示形态;计算上更自然的是证据图。定义:

G=(V,E),\qquad V = V_{\text{claim}}\cup V_{\text{evidence}}\cup V_{\text{anchor}}
  • V_{\text{claim}}:原子 claim 节点(回答被拆成的最小可判定断言)

  • V_{\text{evidence}}:证据节点(上面的e

  • V_{\text{anchor}}:语义锚点节点(实体/事件/时间段/指标口径/表格主键等)

边类型(可多重):

  • 支持/蕴含:e \rightarrow c

  • 反驳/冲突:e \dashv ce \leftrightarrow e^{\prime}

  • 同指/对齐:e \leftrightarrow a(evidence 与 anchor 对齐)

  • 推导依赖:c_i \rightarrow c_j(claim 间依赖)

给每条边定义可学习或可规则化的打分/势函数:

s(e,c)\in[0,1],\quad \phi_{\mathrm{conf}}(e,e^{\prime})\in\mathbb{R},\quad \psi(e,a)\in[0,1]

那么对于最终的回答,肯定是根据每个证据进行总结的,我们可以这样对回答做优化:

令最终回答拆成N 个原子 claim:

C=\{c_i\}_{i=1}^N,\qquad \mathcal{E}=\bigcup_{k=1}^K \mathcal{E}_k

一个典型的“证据选择 + 对齐”的目标:(覆盖度 - 一致性 - 成本or长度)

\max_{\mathcal{S}\subseteq \mathcal{E}} \sum_{i=1}^N \max_{e\in \mathcal{S}} s(e,c_i) - \lambda \sum_{e\neq e^{\prime}\in \mathcal{S}} \mathrm{Conflict}(e,e^{\prime}) - \mu\,\mathrm{Cost}(\mathcal{S})

然后答案合成是一个条件生成/条件推断:

\hat y = \mathrm{Synthesize}(q,\mathcal{S},G)