把 Microsoft-Decision-1 当成一次可回放的事务看待:输入侧只接受结构化字段,输出侧必须写一条带理由的审计记录。判断标准不是“能不能跑通”,而是事后拿这条记录,不看原始聊天记录,也能还原当时依据了什么、谁改过、改前改后分别是什么。输入结构到什么程度,取决于决策类型和复核要求;可以先从最小字段集开始,缺失字段时显式记录并拒绝默认放行。
决策记录是否可审计,通常取决于输入是否被收敛为有限字段,以及输出是否保存了标签、理由、时间戳和输入摘要。建议先用最小字段集跑通链路,再按复核需求补字段。注意:字段缺失时不要默认放行,要显式记录缺失原因和处置动作;人工复核动作必须写回同一条记录,否则审计链会断在外部表格里。
列出决策前必须结构化的输入字段
统一输入格式,减少自由文本歧义。建议至少包含字段名、类型、允许值、缺失处理四列。下面是一个通用接入骨架,字段名可按实际服务替换,但类型和缺失处理要明确。
| 字段名 | 类型 | 允许值 | 缺失处理 |
|---|---|---|---|
| request_id | string | 非空 | 拒绝决策,返回 400 |
| subject_id | string | 非空 | 拒绝决策,记录 missing_subject |
| decision_type | enum | access, risk, policy, manual | 拒绝决策,记录 missing_type |
| score | number | 0-100 或 null | 显式写 null,标记 score_missing |
| context | object | 扁平键值对,键不超过两层 | 空对象 {},标记 context_missing |
| submitted_at | string | ISO8601 | 用服务端接收时间替代,并记录时间来源 |
缺失处理不要用默认值静默填充。例如 score 缺失时写 null,并在审计记录里标记 score_missing,让后续复核能看到“当时没有这个值”。如果业务允许缺失,就在允许值里写清楚“缺失时按最小值处理”之类,但必须可验证。
规定输出记录里必须保留的决策依据
让输出不只有一个标签。输出记录建议至少保留输出标签、理由摘要、时间戳、输入摘要。理由摘要不是让模型写小作文,而是用一句话写清触发了哪条规则或哪个阈值。
| 字段 | 说明 | 示例 |
|---|---|---|
| decision | 输出标签 | allow / deny / review |
| reason_summary | 简短说明依据,不超过 200 字 | score >= 80 且 decision_type=risk |
| decided_at | ISO8601 时间戳,服务端生成 | 不写具体值,用变量占位 |
| input_digest | 对关键输入字段做 hash 或保留原始值 | sha256(request_id+subject_id+score) |
输入摘要要能定位到原始输入。如果输入量不大,建议直接保留关键字段原值;如果输入含敏感信息,用 hash 并单独保存映射。注意:理由摘要不能只写“模型判断”,要能指向具体规则或阈值,否则回放时无法解释。
把人工复核动作写入同一条审计记录
保证复核不是散落在外部。复核动作应该 append 到同一条决策记录,而不是另存一个表格。至少包含复核人、复核时间、修改前后值、备注。
{ audit_id: '与 decision 记录同 id', reviewer: '复核人标识', reviewed_at: 'ISO8601', before: { decision: 'deny', reason_summary: '...' }, after: { decision: 'allow', reason_summary: '...' }, note: '备注,说明为何改判' }如果复核没有修改,就写 before 和 after 相同,备注写“维持原判”。这样后续回放时,能看到某条决策被谁在什么时间点确认过。注意:复核人不能是空字符串,也不能用“系统”代替,否则审计时无法追责。适用场景是任何需要人工介入的决策;操作动作是追加审计字段;验证方式是查询同一条 audit_id 下是否有 reviewer 和 reviewed_at;风险边界是如果复核人字段允许为空,审计链会断。
用历史样本检查输出记录能否还原决策过程
验证审计字段是否够用。做法是取一条历史决策记录,尝试只凭记录里的输入摘要和理由摘要,重新跑一遍决策,看结果是否一致。样本回放步骤:
- 从审计日志里选一条已归档的决策记录,复制其 input_digest 和 decision。
- 用 input_digest 对应的原始输入(或重新解析摘要)调用同一版本的决策逻辑。
- 比对重跑结果与记录中的 decision 是否一致。如果一致,说明记录够用;如果不一致,记录缺失字段。
常见缺失字段包括:规则版本、模型版本、阈值配置、输入字段的完整快照。补字段建议:如果缺少规则版本,在输出记录里增加 rule_version;如果缺少模型版本,增加 model_version;如果输入摘要太粗,增加 input_snapshot 或至少保留参与决策的字段值。补完后,用同样的样本回放步骤再验一遍,直到不依赖外部上下文就能解释当时为什么得出那个标签。这个检查适合在切换决策逻辑或调整阈值前后做,操作动作是固定样本回放,验证方式是重跑结果与历史结果一致,风险边界是样本不能只挑简单案例。