每个法律结论都要可追溯:法律 AI 的运行时证据链设计
一个法律 AI 系统最大的风险不是"答错",而是"答错时看起来完全正确"。模型引用《民法总则》第一百八十八条说"诉讼时效三年"——内容完全正确,但这部分法律已随民法典施行而废止,依据挂在一部失效的法律上。这种错误在法律文书里是硬伤,而且只有回库查证才能发现。本文记录我们为法律问答系统设计的运行时证据链:答案生成之后、交付之前,每一条法条引用都被提取、回库核验、分级标记,并最终沉淀为可导出的审计证据。
一、问题的本质:模型不知道自己不知道
先看一组我们建库时统计的数据。我们的法规库目前收录 32,245 部法律、993,654 条条文,其中:
| 时效状态 | 条数 | 占比 |
|---|---|---|
| 现行有效 | 902,796 | 90.9% |
| 已废止 | 80,104 | 8.1% |
| 已修改 | 10,754 | 1.1% |
这个分布对大模型是一个残酷的设定:训练语料里,已废止法律文本的存量远大于其在新法体系中的替代者。《合同法》施行了二十年,民法典才施行几年——语料中《合同法》第一百零七条(违约责任)出现的频次远高于民法典第五百七十七条(同一制度的现行条文)。模型不是"不小心"引用废止法,而是它的知识分布天然偏向历史语料。
由此产生的引用幻觉至少有四种形态:
- 编造条号:《民法典》共 1260 条,模型引用"第一千二百八十九条"——根本不存在
- 引用已废止法律:《合同法》《物权法》《婚姻法》……九部单行法已于 2021 年 1 月 1 日随民法典施行同时废止
- 引用未施行版本:新法已公布、尚未到施行日,条文还不具有现行效力
- 条号漂移:2023 年修订的《公司法》条号大改,模型还在用旧条号对应新制度
对付这四种形态,"提示词里写明请勿编造"是无效的——模型在编造时的主观体验和正确引用时完全一样,它没有区分两者的内部信号。唯一的解法是把核验放到模型外部:答案出来后,用确定性程序回库查证每一条引用。
这就是运行时证据链的出发点:不信任模型的自我报告,只信任查库结果。
二、证据链的四个环节
整条链路由四个环节组成:提取 → 核验 → 门控 → 留痕。
LLM 答案 ──提取──> 引用清单 ──查库──> 四档核验 ──计算──> 可核验率
│
角标渲染 <── 留痕 ── 质量门决策 <──┘
证据导出 (放行 / 反幻觉重跑)
图:从 LLM 答案到可审计证据的完整链路——提取、核验、门控、留痕。
2.1 提取:从自然语言里扫出引用
第一环节是引用提取。系统用规则扫描答案正文,识别所有形如 《中华人民共和国X法》第Y条 的引用(含连写式如"第 1145 至 1149 条"与列表式)。这一步刻意不用 LLM——提取本身必须零幻觉,否则后续核验建立在不可靠的地基上。
提取结果是一个引用清单,每项包含法律名称与条号。一份典型答案会包含 3~10 条引用。
2.2 核验:四档分类
每条引用被回库查询,按核验结果落入四档:
| 档位 | 判定条件 | 含义 |
|---|---|---|
| 现行有效(verified) | 命中且状态为"有效",且施行日不晚于当日 | 可以放心引用 |
| 已废止(deprecated) | 命中但状态非"有效"(已修改 / 已废止) | 引用了一件失效的依据 |
| 尚未生效(notYetEffective) | 命中且标为"有效",但施行日在未来 | 新法未施行,不得作为现行依据 |
| 未在库(unverified) | 未命中 | 要么是编造的条号,要么超出库的覆盖范围 |
四档而非三档("现行有效 / 已废止 / 未在库")是实践中踩出来的:未施行版本必须从"有效"里单独拆出来。一部新法从公布到施行常有半年到一年窗口期,这段时间里它状态是"有效"(终将生效),但把它当现行依据引用是错的——比如 2023 年修订的《公司法》公布于 2023 年 12 月 29 日、施行于 2024 年 7 月 1 日,窗口期内引用其条文论述"现行公司法"就是时际法错误。
2.3 门控:可核验率与 70% 阈值
核验完成后计算可核验率:
这个比率进入质量门(我们的多 Agent 协作协议中的末端质量评估,详见《法律 AI 多 Agent 协作:结构化信封协议与质量门防幻觉实践》)。判定规则:
- 可核验率 ≥ 70%:放行,进入正常交付
- 可核验率 < 70% 且存在"库有法无此条":触发反幻觉重跑
- 可核验率 < 70% 但引用只是超出库覆盖:标记数据边界,不武断重跑
第二条的区分很重要。"库有法无此条"指《民法典》在库中、但第 1289 条查无——这是编造的高置信信号,因为整部法都在,唯独这条不存在。而如果引用的是一部库外的地方性法规,查不到只说明覆盖不足,不能倒推为编造。把这两种"未在库"分开处理,避免了误伤。
阈值设 70% 而非 100% 是现实的折中:一份引了 10 条法条的高质量答案,如果 9 条核验通过、1 条是库外法规,按 100% 阈值就要整篇重跑——成本不可接受,且重跑也解决不了覆盖问题。70% 允许少量边界引用存在,同时把成片编造(可核验率通常跌到 50% 以下)挡在门外。
2.4 重跑:注入可核验的事实,而非笼统告诫
触发重跑时,注入的提示不是"请勿编造法条"这类空泛约束,而是查库得到的可核验事实:
《中华人民共和国民法典》第一条至第一千二百六十条,共 1260 条。前述答案中引用的第一千二百八十九条不存在。
给模型一个精确的边界事实,它才能定向修正;只给道德劝诫,重跑只是再掷一次骰子。这条原则贯穿我们的质量门设计:每次重跑必须携带定向改变指令,禁止原样空跑。
三、用户看到什么:透明度设计
证据链不只是后台机制——它的每一个判断都要让用户看见。信任来自可验证,而非可交互。
3.1 三色角标
答案正文中的每条引用带状态角标:
- 🟢 有效:绿框,现行条文,可点击展开条文原文
- 🟡 已修改:黄框,提示该条已有修订版本
- 🔴 已废止:红框,明确标出"已废止"及废止日期,并给出功能等价的现行条文(如《合同法》第 107 条 → 民法典第 577 条)
对"未在库"的引用,角标如实显示"未能核验",绝不伪装成通过。承认不知道,是可信系统的第一特征。
3.2 思考过程里的校验留痕
答案生成过程中,思考流里会出现一步"引用效力校验",内容形如:
已校对 6 条 · 现行有效 5 · 已废止 1 · 未在库 0
用户不需要展开每条引用,扫一眼这行摘要就知道这篇答案的引用质量。当出现"已废止 1"时,用户自然会去看那条红标引用——透明度把核验成本从"逐条怀疑"降到"一眼扫过"。
3.3 尚未生效的显式拦截
当用户的问题涉及已公布未施行的新法(例如窗口期内问新公司法),系统的前提核验环节会主动注入提示:库内该法仅有未施行版本,不得将其作为现行规定陈述,回答时必须区分"现行规定"与"即将施行的新规"。前端引用列表同样标注"属于尚未生效的新版,不得作为当前适用依据"。
这是时际法的工程化:不是把新法藏起来(用户研究立法沿革时需要看到它),而是给它一个明确的法律效力标签。
四、可审计:质量证据包
角标和校验摘要服务于对话中的用户。还有一类消费者需要更深层的证据:管理者与审计者——他们要回答的问题是"这个系统上个季度交付的法律结论,质量如何?出了问题能不能定位到具体会话?"
为此我们把质量门的全过程留痕做成了可导出的证据包:
| 证据包内容 | 说明 |
|---|---|
| 未命中条号 | 引用了哪部法第几条、该法实际共几条(编造的直接证据) |
| 缺依据论断 | 模型下了结论但未标注来源的原句摘录 |
| 未通过标准 | 质量门各评估项的逐项结果 |
| 数字冲突 | 答案中期限/金额/比例与法条原文的矛盾点 |
| 尾部漏审 | 长文档尾部条款未被复核覆盖的分布 |
| 轮次记录 | 每次重跑的尝试序号、得分、失败信号、最终终态 |
导出为带 JSON Schema 的结构化数据包(manifest + 聚类统计 + 案例明细),可以直接喂给分析流程。一个设计细节:证据包对用户身份匿名化,而"匿名 ID → 真实会话"的映射表单独落盘在服务器本地——审计者能追溯,数据包流出时不泄漏用户身份。匿名与可追溯不是对立的,靠的是把回链权限物理隔离在服务器侧。
五、诚实边界:这套链路拦不住什么
任何防幻觉机制都有能力边界,说清楚边界比宣称拦截率更重要。这条证据链的盲区:
条号正确、结论错误。模型引用《劳动合同法》第八十二条说"未签书面合同可主张三倍工资"——条号真实存在、现行有效,四档核验全部通过,但条文明文规定的是二倍。存在性校验只保证"引用的法条存在且有效",不保证"法条内容支持该结论"。要堵这个缺口,需要把法条原文与模型表述做语义比对——查库接口已经返回条文全文,原料就绪,这是我们明确的下一步。
编造案例编号。"最高人民法院指导案例第 247 号"——当前提取规则只识别法条引用格式,不识别案例编号。我们在内部测试中观察到有模型为不存在的指导案例编出完整的"案名 + 当事人 + 裁判要点"三件套,外行完全看不出破绽。案例库的引用核验是第二个待建环节。
稀释效应。可核验率是按比例计算的:引 10 条、编 1 条,可核验率 90%,不触发重跑(角标仍会标红那一条)。对"单条编造混在大量正确引用里"的攻击面,链路的防御是标记而非拦截——这是比例阈值机制的固有代价。
库外引用。引用超出库覆盖范围的地方性法规、部门规章时,"未在库"档位无法区分"编造"与"真实但未收录"。目前按数据边界处理,不触发重跑。
这四条边界里,前两条是能力缺口(正在补),后两条是机制设计的已知权衡。把它们写进公开文档的原因和设计这套链路的原因是同一个:可信系统必须经得起"你到底能保证什么"的追问。
六、与评测期方案的关系
讨论法律 AI 质量时,行业里更常见的是评测期方案:构建基准测试集,用 LLM-as-a-judge 或人工评审给系统打分。Harvey 在其多 Agent 合同审查系统的技术文章中披露的做法(三个前沿模型组成评审委员会独立打分聚合)就是典型代表。
评测期与运行时是互补的两层:
| 维度 | 评测期(基准测试) | 运行时(证据链) |
|---|---|---|
| 作用点 | 发版前,离线 | 每次请求,在线 |
| 回答的问题 | "这个版本平均质量多高" | "这一条答案是否可信" |
| 代价 | 高(人工标注、多模型评审) | 低(查库 + 规则计算) |
| 失效模式 | 评测集与真实分布漂移 | 只覆盖可符号化验证的维度 |
只有评测期的系统,交付时是开环的——上线后质量衰减无从感知。只有运行时的系统,容易在"可测量的维度"上过拟合(引用全部真实,但结论质量平平)。两层叠加,加上把运行时证据回流为评测素材(我们的质量证据包正是为此设计),才构成完整的质量闭环。
总结
| 设计决策 | 选择 | 解决什么问题 |
|---|---|---|
| 核验位置 | 模型外部,答案生成后 | 模型对自身幻觉无内部信号 |
| 提取方式 | 规则扫描,不用 LLM | 提取环节自身必须零幻觉 |
| 核验粒度 | 条级四档(含未施行单独成档) | 时际法错误:新法公布≠现行有效 |
| 门控阈值 | 可核验率 70% + 编造信号分档 | 避免库外覆盖误伤正常答案 |
| 重跑策略 | 注入"该法共 N 条"的可核验事实 | 笼统告诫导致重跑无效 |
| 用户透明 | 三色角标 + 校验摘要行 | 信任来自可验证而非可交互 |
| 审计留痕 | 匿名证据包 + 本地回链映射 | 事后可追溯且不泄漏身份 |
这条证据链的哲学和我们的多 Agent 协议一脉相承:不追求让模型不犯错,而是让每一次犯错都留下可核验的痕迹,并在造成伤害前拦截可拦截的部分。 法律场景对"依据"的要求高于对"文采"的要求——把依据做成证据链,是这个要求下最直接的工程回答。
参考文献
- 中华人民共和国民法典(2020 年 5 月 28 日通过,2021 年 1 月 1 日施行;同日废止《合同法》《物权法》《婚姻法》等九部法律)
- 中华人民共和国公司法(2023 年 12 月 29 日修订通过,2024 年 7 月 1 日施行)
- Patel, Felgueres & Huang. "How We Rebuilt Playbook Review as a Multi-Agent System." Harvey Blog, Sep 2026.(评测期 LLM-as-a-judge 委员会方案的公开示例)