法律 AI 为什么会引用已废止的法律:百万法条库的版本管理工程
问任何一个通用大模型"根据《合同法》第一百零七条,违约责任应当如何承担",多数模型会流畅作答——但《合同法》已随民法典施行于 2021 年 1 月 1 日废止。模型不是出了 bug:训练语料里《合同法》施行二十年的文本存量,远大于民法典施行几年的存量。要纠正这个系统性偏差,靠的不是提示词,而是数据侧的版本管理。本文记录我们搭建百万级法条库时在版本治理上的工程决策:条级四态模型、版本仲裁、未施行拦截,以及这套机制的诚实边界。
一、法律文本的版本问题有多特殊
通用 RAG 系统的知识库几乎没有"版本"概念——一篇技术文档更新了,旧版直接覆盖。法律文本完全不同,它的版本结构有三个独特维度:
版本随时间分叉,且旧版本长期"活着"。《物权法》2007 年施行、2021 年废止,但它没有从世界上消失——历史合同引用它、旧判例依据它、法学论文研究它。一部法律的生命周期是:尚未生效 → 现行有效 → 已修改 / 已废止,每个阶段都有真实的检索需求(研究沿革、审查历史合同、追溯旧案)。
同一条文可能多版本并存。修订期的《公司法》就有三个版本同时在库:2018 版(已废止)、2023 修订版(施行后现行有效)、以及施行日前的"已公布未施行"状态。检索"公司法股东知情权",三个版本里都有相关内容,但只有一个是"现行可引"的答案。
条号在版本间漂移。2023 年《公司法》修订把条文从 218 条改到 266 条,大量制度换了条号:异议股东回购请求权从第 74 条移到第 89 条,董监高忠实义务从第 148 条移到第 180 条。旧条号在新版里可能仍存在——但对应的是完全不同的制度。这是版本管理里最阴险的陷阱:用条号做主键,会在版本切换时静默错位。
因此,法律 AI 的知识库必须回答通用 RAG 不需要回答的问题:"此刻,这条法律的这个条文,处于什么效力状态?" 答错的代价不对称——研究沿革时引了新条文,顶多不够精确;出法律意见时引了废止条文,是执业硬伤。
二、条级四态:状态模型的第一个决策
我们的法规库当前规模:32,245 部法律、993,654 条条文,其中现行有效 902,796 条、已废止 80,104 条、已修改 10,754 条。
每条条文携带一个状态字段,取值四个枚举:
| 状态 | 语义 | 典型来源 |
|---|---|---|
| 有效 | 现行可引 | 施行日已到的现行版本 |
| 已修改 | 该条被修订,新版在库 | 修订法条文的旧版本 |
| 已废止 | 整部法律或该条已失效 | 被新法替代的单行法 |
| 尚未生效 | 已公布、施行日在未来 | 立法窗口期的新法 |
两个容易被忽略的设计细节:
状态挂在"条"而非"法"上。整部废止的法律(如《婚姻法》)其条文状态自然是"已废止",但修订场景里同一部法律内部状态是混合的——2023 版《公司法》施行后,2018 版整部标"已废止",但新法在公布到施行的窗口期内,其条文状态是"尚未生效"。条级状态让这两种场景用同一套模型表达。
"尚未生效"独立成态,而不是"有效"加日期字段。早期方案里我们用 effectiveDate 做惰性判断(取用时比较当天日期),后来发现它会漏掉一个关键场景:用户明确问"新公司法怎么规定"时,系统应该展示新法条文但声明其未施行,而不是因为"未生效"就把它当不存在。独立状态让"展示"与"效力判定"解耦——检索可以按需放行,效力判定一律排除。
三、版本仲裁:同一部法律谁是"现任"
当同一部法律存在多个版本时(修订前后、废止旧法与施行新法),库需要一个确定性的答案:检索默认返回谁?这由版本仲裁器决定。
仲裁规则是一张状态竞争力排序表:
有效(3) > 已修改(2) > 已废止(1) > 尚未生效(0)
同法多版本并存时,竞争力最高的版本成为该法的"现任代表",供默认检索引用;其余版本进入版本链,供沿革研究穿透查询。两个务实考虑:
为什么不简单地"旧版本删掉"? 因为历史需求真实存在。律师审一份 2019 年签的合同,需要知道签约当时的《合同法》条文;做立法沿革研究,需要逐版对照。删除旧版本会让这些查询无声地返回错误时代的内容——比返回"已废止版本 + 明确状态标签"危险得多。
为什么不按日期自动判断? 施行日期字段有噪声(部分历史数据的公布日与施行日不全),日期比较逻辑分散在各处时,一处时区或口径错误就是全局性的。集中在仲裁器做单一决策点,其余模块只消费仲裁结果——效力判定逻辑必须有且只有一个实现。
四、未施行拦截:三个环节的链式防御
"已公布未施行"的法律是最容易漏的一类,因为它太像有效法律了——官方发布、全文可得、媒体在讲。我们做了三层防御:
建库层:新法录入时状态即为"尚未生效",施行日字段单独维护,到日由例行任务翻转为"有效"。
检索层:默认检索的 SQL 里硬过滤未施行版本——查询结果里不会混进还没生效的条文。这一层是"防污染":用户问"现行公司法",拿到的一定是施行中的版本。
前提核验层:但用户问"新公司法"呢?硬过滤会让答案完全绕开新法——这也不对。前提核验环节检测到问题涉及"库内仅有未施行版本的法律"或"引用了未施行条文"时,向回答注入明确约束:
库内该法目前仅有未施行版本,无法提供经库校验的现行依据。回答时必须区分"现行规定"与"即将施行的新规",严禁把新版内容当作现行规定陈述。
三层各自把关,共同实现一个精确的行为:新法可见、可用,但永远不被当成现行法。前端的引用列表对这类条文显示专门标注:"属于尚未生效的新版,不得作为当前适用依据"。
图:四态版本模型与未施行拦截的三层防御——建库、检索、前提核验各司其职。
五、条文之外:判例与法条的关联边
法条库的版本管理只是底座的一半,另一半是关联关系。判例与法条之间存在天然的引用关系——裁判文书里"依据《X法》第Y条"的表述,可以结构化为图上的边。
我们把判例对法条的援引建成了图边(case_legal_basis):检索一个案由时,能顺带拉出相关判例援引的法条清单;反过来,法条详情也能展示"哪些判例适用了本条"。这带来一个防幻觉上的额外收益——当模型声称"司法实践中依据《X法》第Y条处理此类纠纷"时,这条边提供了可核验的第三条路径:不光查条文存在性,还能查这条条文在判例体系里是否真的被援引过。
诚实交代现状:反向查询(从法条拉判例列表)的数据表已建好(16,074 条关联边),但查询接口与前端入口还在路上——当前版本用户能感受到的只有正向链路(案由 → 法条清单)。
六、天花板:存在性校验拦不住条号漂移
这套版本管理能拦住"引用已废止法律""引用未施行法律""编造条号",但有一个形态天然漏网——条号漂移后的"存在性错觉":
问:《公司法》第七十四条规定的异议股东回购请求权,行使条件是什么?
旧版事实:2018 版《公司法》第 74 条 = 异议股东回购请求权 新版事实:2023 版《公司法》第 74 条 = 有限责任公司可以设经理;回购请求权移至第 89 条
模型答"第 74 条是异议股东回购请求权",查库:第 74 条存在、状态有效——四态校验全部通过,放行。但条文内容是"设经理",模型引用的其实是已废止的旧版条号。
这不是实现缺陷,而是存在性校验的结构性天花板:它验证"《X法》第Y条存在且有效",不验证"第Y条的内容是模型所声称的制度"。条号漂移恰好构造了"条号真实存在 + 内容张冠李戴"的组合,把两个检查都骗过。
补丁是现成的方向:查库接口已经返回条文全文,把条文原文与模型的表述做语义比对,"第 74 条内容为设经理,与你所述的回购请求权不符"就能被检出。原料已就绪,比对环节在建设中。
把这个案例写出来,是想说明我们对这套机制的态度:版本管理不是"做了就免疫幻觉"的银弹,而是把可判定的错误形态逐一封死的过程。每封死一类,剩下的盲区就更清晰——清晰的盲区比模糊的安全感有价值。
七、给同行的三条经验
如果要在别的垂直领域(医疗指南、财务准则、技术规范)复刻这套版本管理,可迁移的决策有三条:
1. 状态模型宁可多一态,不可一态多用。"尚未生效"独立成态的成本是一个枚举值,收益是展示与效力判定解耦。任何"用日期字段现场算"的方案都会在多处判断逻辑中埋下口径不一致的雷。
2. 效力判定收敛到单点。状态竞争力排序集中在一个仲裁器里,检索、核验、UI 全部消费仲裁结果。散落在各模块的日期比较是版本类 bug 的头号来源。
3. 旧版本入库打标,而不是删除。历史检索需求真实存在,删除旧版会让历史查询静默错位。"返回旧版 + 醒目状态标签"在任何需要追责的场景里都优于"返回新版 + 无提示"。
总结
| 层次 | 机制 | 拦截的幻觉形态 |
|---|---|---|
| 数据层 | 条级四态(有效/已修改/已废止/尚未生效) | 引用废止法律、引用未施行新法 |
| 仲裁层 | 状态竞争力排序,单点决策 | 版本混选、检索污染 |
| 检索层 | 未施行硬过滤 | 新法条文混入"现行"结果 |
| 核验层 | 前提注入 + 引用回查(返回全文) | 把新法当现行法陈述 |
| 关联层 | 判例-法条引用边 | "实践中依此条处理"类断言 |
| 待建 | 条文原文与模型表述的语义比对 | 条号漂移的存在性错觉 |
99 万条法条的版本管理,本质上是在给"法律的现在时"建立工程定义:什么是现行、什么是历史、什么是未来。模型的知识分布天然偏向历史语料,而这个库的任务是让每一次引用都能被拉回到"现在"来核验。上表中最后一行还空着——我们把已知的天花板留在表格里,而不是藏在宣传语里。
参考文献
- 中华人民共和国民法典第一千二百六十条(九部单行法同日废止清单)
- 中华人民共和国公司法(2023 年修订,2024 年 7 月 1 日施行)
- 本站《每个法律结论都要可追溯:法律 AI 的运行时证据链设计》(引用核验链路的展开)