ADR-010 — 输出端凭证类内容过滤的位置
决策
LLM 输出(可能含幻觉生成的凭证样式字符串)的过滤在 两处进行:
- 综合层(Evidence + Synthesis 子系统)语义级过滤:综合层产出
StructuredCognitionResult前对main_answer / supporting_evidence / counter_evidence / invalidation_conditions / uncertainty_and_gaps / sources各字段做一次过滤 - Output Pipeline 格式级过滤:最终流式 / 一次性输出给用户前,再做一次格式级扫描
两处复用 m0-walking-skeleton §10 同一套凭证识别 patterns,方向相反(输入端识别用户输入中的凭证,输出端识别模型输出中的凭证样式)。
M0 阶段最小实施:
- 综合层过滤:仅规则路径(grep 正则),无 LLM 二次判断
- Output Pipeline 过滤:同上 + 高熵 base64 / hex 串启发式(即使不命中明确 pattern,长度 ≥40 且熵 ≥4.5 的字符串触发警告 banner,不剥除)
- 命中处理:
- 高置信度(多条 pattern 同时命中或单条高置信度 ≥0.9):剥除该段 + 占位符
[REDACTED_<reject_category>]+ 用户 banner "输出包含可能凭证样式,已过滤" - 中置信度(单条 0.7-0.9):保留 + 加 banner 提示
- 低置信度(仅启发式命中 < 0.7):日志记录,不剥除
- 高置信度(多条 pattern 同时命中或单条高置信度 ≥0.9):剥除该段 + 占位符
- 误报处理:用户可在审计 trail 中查询过滤事件 + 通过
finbayes audit list --type=output_filter看每次过滤详情
M1+ 演化空间:
- LLM 辅助二次判断(高置信度 case 的复核,避免误剥)
- 字段级语义白名单(如
sources.url字段中 https 路径 query 参数中的 token 视为正常 URL 不剥) - 用户自定义白名单(用户明示某类长字符串是其工作流的正常输出)
上下文
LLM 可能在生成内容时幻觉地输出凭证样式字符串:
- 写"演示代码"含 fake API key(如
sk-xxxxxxxxxx占位) - 编"举例链上地址 + 私钥"
- 引用用户先前输入中残留的凭证片段(更危险)
即便不是真凭证,让"看起来像凭证的字符串"流向用户都增加误用风险。
两个候选过滤位置:
| 候选 | 优点 | 缺点 |
|---|---|---|
| 仅综合层语义级 | 离 LLM 最近,能感知语义上下文(如 sources.url 字段中长 token 是 URL query 参数) | 综合层职责增加;用户绕过综合层(如未来 raw streaming)会漏 |
| 仅 Output Pipeline 格式级 | 集中点检查,所有路径都过;与输入端 hook 对称 | 离 LLM 远,丢失语义上下文,误报率高 |
业界经验(OpenAI Moderation / Anthropic CSAM filter / Cloudflare WAF)均采用多层防御:模型层 + 管道层 + 出口层。本 ADR 选两处而非单处。
后果
收益:
- 凭证不变量端到端阻断闭环(输入 hook + 综合层 + Output Pipeline 三处覆盖)
- 与输入端 hook 共享 patterns(m0-walking-skeleton §10),维护成本低
- 误报有用户可见兜底(banner + 审计 trail 查询)
成本:
- 每次输出走两次正则扫描(性能开销小,估 < 5ms / KB 输出)
- 误报会让用户感到困扰 → M1+ 引入语义白名单
残余风险:
- M0 阶段没有 LLM 辅助二次判断,误报率可能 5-15%
- 高熵启发式可能误伤合法的长 base64 数据(如 base64 编码的图片摘要) → M0 阶段不剥除仅 banner,M1+ 收紧
备选方案
考虑过未采用:
- 仅综合层:上方 cons
- 仅 Output Pipeline:上方 cons
- 三层(综合层 + Output Pipeline + 用户客户端层):过度工程,第一阶段不需要
关联
- 触发章节:CHAP-17 边界与安全("输出端过滤的两个候选位置"段)
- 影响章节:CHAP-09 Evidence + Synthesis / Output Pipeline 子系统 / CHAP-17 / CHAP-20 测试体系
- M0 实施承接:m0-walking-skeleton.md §2 接口子集(
run_output_boundary_hookM0 implement)+ §10 凭证识别正则基线(同一套 patterns 反向扫描) - 关联 ADR:ADR-004(任务识别)/ ADR-008(Provider 接口)—— 三条 ADR 共同覆盖 M0 关键接口
- 后续:M3+ 引入 LLM 辅助二次判断时起新 ADR 或本 ADR patch