🧠 第十一章 医疗与法律:重塑精准诊疗与服务流程
📄 一句话概括

同样的查询, 纯文本检索的 top5 精确率只有 27%—— top5 里平均只有 1.3 个和查询同案由。加上案由过滤后精确率到 80%,top5 全是同案由。 top1 相似度只有 0.598 到 0.657——按「大于 0.5 才算命中」去卡,相关和不相关全混在一条线上。

📝 本节和前面几节的关系

上一节把文书拆成字段。 这一节回到「找资料」这件事:律师花在检索上的时间,往往比花在写作上的还多。 而检索的第一课是——「像」有很多种。

一、找类案,找的不是「文字像」

律师要的「类案」,指的是「法律问题相同、裁判思路可比」。 而文本相似度量的只是「用词重合」。这两个东西经常不是一回事。 举个最典型的例子: 「违约金过高要求酌减」这个争议焦点,在买卖合同里有,在房屋租赁合同里也有,在借款合同里还有。 三者的用词高度重合——违约金、过高、酌减、实际损失——但裁判规则完全不同: 买卖合同看实际损失,租赁看剩余租金,借款受利率上限约束。 所以「字面最像的那个案子」,经常是「法律上最不该参考的那个」。 这是法律检索与通用检索最本质的差别。 这一节的 Demo 就造这个局面:100 份判决摘要, 5 个案由 × 5 类焦点,同一个焦点词在不同案由下反复出现。 查询是律师按事实写的(不含案由名),所以纯文本检索只能靠焦点词匹配。

二、纯文本检索撞上同词异案

查询 相关案数 纯文本 top5 加过滤 top5
买卖合同/违约金过高 4 20% 80%
买卖合同/责任划分 4 20% 80%
借款合同/违约金过高 4 0% 80%
借款合同/责任划分 4 60% 80%
劳动争议/违约金过高 4 20% 80%
劳动争议/责任划分 4 40% 80%
先看两列的平均值:27% 对 80%。
纯文本方案里,top5 平均只有 1.3 个和查询同案由——另外 3.7 个是别的案子的。
借款合同/违约金过高那一行是 0%——五个结果全是别的案由的案子,一个都没蒙对。
这就是同词异案最坏的样子。
为什么?因为查询是律师按事实写的,里面根本不提案由名。
它只带着「违约金」「酌减」「实际损失」这几个词——而这些词,买卖合同和房屋租赁里都用。
反过来说,如果查询里写了案由名,纯文本也能对——
但那说明「有用的是案由这个字段,不是文本相似度」。
这个观察直接指向下一步。

三、结构化过滤是最便宜的先验

加过滤之后,top5 平均 5.0 个同案由,精确率从 27% 抬到 80%。 注意 80% 是上限——因为每个查询的相关案子只有 4 个, top5 最多只能装 4 个相关的,5 分之 4 就是 80%。 这里的关键不是相似度算得更准了,是先砍掉了一大片根本不可能的区域。 候选集从 100 份缩到 20 份,剩下的排序自然干净。 法律领域有现成的强结构:案由、法条、审级、地域、时间。 这些字段在法院系统里本来就是结构化的——立案时就填了案由,判决书上就写了援引的法条。 把案由当硬过滤条件,等于免费拿到一个极准的先验。 这件事的通用版本叫「混合检索」:先用结构化条件缩小范围,再用语义排序。 电商、招聘、专利检索都在用同一招。 凡是领域里有可靠的结构化字段,先过滤总是比纯语义更划算——因为过滤的成本几乎为零, 而语义排序的不确定性很高。

四、相似度那个绝对值不可信

top1 相似度落在 0.598 到 0.657。 这个区间很窄,而且相关和不相关在这条线上是混着的。 用同一个绝对值阈值去卡,靠前的能过、靠后的过不了——但过与不过跟「相不相关」没有稳定关系。 原因是字二元组余弦只反映「共用了多少个两字片段」,它不知道哪个片段是法律上有意义的。 「本院认为」「依法」「证据」这些高频词在所有文书里都有,它们贡献了大量相似度, 却不携带任何区分信息。 所以字面相似度的绝对值不可比,只能比排序——这一点和第 38 课的检索 Demo 是同一个坑。 同一套向量,换一批语料,绝对值的量纲就变了。 推论很直接:类案检索的正确用法是「排前几名给人看」,不是「超过阈值自动推送」。 因为自动推送需要绝对判据,而这里根本没有绝对判据。 凡是看到「相似度 0.85 以上自动关联」这类设计,第一个要问的就是「这个 0.85 是怎么定的、 换了语料还成立吗」。 一个更稳的替代做法是「相对判据」: 看第一名和第二名差多少。 如果第一名的分数远高于第二名,这个结果更可信;如果前五名挤在一起,就说明这一批都不靠谱。 这个信号比绝对阈值可靠得多,而且不需要标定。

五、落地:三步,从便宜到贵

① 先建结构化索引。 案由、法条、审级、年份、地域、文书类型——这些字段有就一定要用。 它们几乎零成本,而且效果比任何 embedding 都稳。 ② 再做语义排序,但只在候选集里做。 先过滤到几百份,再排序,既省算力又提准确率。 反过来在全库上做向量检索,既慢又不准。 ③ 输出要给「为什么」。 律师不会因为「相似度 0.62」就采信一个判例。 要给的是「同案由、同焦点、援引同一条司法解释」。 可解释性在这里不是加分项,是能不能用的前提。 最后一句:法律检索的核心竞争力,不在向量模型,在结构化字段的质量。 谁能把案由、法条、争点标得又全又准,谁的检索就好用。

六、动手 Demo:类案检索:加上案由过滤,top5 精确率从 27% 到 80%

造 100 份合成判决摘要(5 个案由 × 5 类争议焦点,每组合 4 份),正文由案由名加焦点词拼成。 查询按「律师写的事实」构造:只含焦点词和几个通用词,不含案由名。 比较两种检索的 top5 精确率:纯文本字二元组余弦,以及先按案由过滤再排序。

def bg(s):                             # 字二元组集合
    s = re.sub(u"[^\\u4e00-\\u9fff]", u"", s)
    return set(s[k:k + 2] for k in range(len(s) - 1))

def cos(a, b):
    return float(len(a & b)) / (len(a) * len(b)) ** 0.5

r1 = top5(qv, docs)                            # 全库排
r2 = top5(qv, [d for d in docs if d[u"c"] == c])   # 先按案由过滤
p = sum(1 for _, d in r if d[u"i"] in truth) / 5.0

实跑输出:

--------------------------------------------------------------------
类案检索:加上案由过滤,top5 精确率从 27% 到 80%
--------------------------------------------------------------------
  案件库                   100 份合成判决摘要,5 个案由 × 5 类焦点
  检索方式                 字二元组集合余弦,无模型、无向量库
  查询                     6 个,真值=同案由且同焦点
  top1 相似度区间          0.598 ~ 0.657

  查询                   相关案数   纯文本 top5   加过滤 top5
  ----------------------------------------------------------
  买卖合同/违约金过高          4           20%           80%
  买卖合同/责任划分            4           20%           80%
  借款合同/违约金过高          4            0%           80%
  借款合同/责任划分            4           60%           80%
  劳动争议/违约金过高          4           20%           80%
  劳动争议/责任划分            4           40%           80%

  **先看两列的平均值:27% 对 80%。**
  **纯文本方案里,top5 平均只有 1.3 个和查询同案由——另外 3.7 个是别的案子的。**
  为什么?**因为查询是律师按事实写的,里面根本不提案由名。**
  **它只带着「违约金」「酌减」「实际损失」这几个词——而这些词,买卖合同和房屋租赁里都用。**
  **加过滤之后,top5 平均 5.0 个同案由**,精确率跟着抬起来。
  **这里的关键不是相似度算得更准了,是先砍掉了一大片根本不可能的区域。**
  **法律领域有现成的强结构:案由、法条、审级、地域、时间。**
  **把案由当硬过滤条件,等于免费拿到一个极准的先验。**
  还有一个数字要看:**top1 相似度落在 0.598 到 0.657。**
  **用同一个绝对值阈值去卡,靠前的能过、靠后的过不了——****但相关和不相关在这条线上是混着的。**
  **字面相似度的绝对值不可比,只能比排序**——这一点和第 38 课的检索 Demo 是同一个坑。
  **所以类案检索的正确用法是「排前几名给人看」,不是「超过阈值自动推送」。**
  要说明:案件文本是我**按焦点词合成的**,真实判决书几万字、说理会绕,**相似度分布会更平**。
  **但「结构化字段过滤优于纯文本」这个结论,在真实检索系统里反复被验证。**

27% 到 80% 这个跨度,来源不是「模型变强了」,是「候选集变对了」。 过滤这一步几乎没有计算成本,却拿走了大部分收益。 这是检索系统里性价比最高的一个改动。 注意 80% 已经是上限——每个查询只有 4 个相关案子,top5 最多装 4 个。 所以别把 80% 当成「还有 20% 的提升空间」,要提升得先扩大相关案子的数量,那是另一件事。 「纯文本平均 1.3 个同案由」这个数比精确率更直观: 一份判决书里,5 个参考案例只有 1.3 个是同一类案子。 这个结果给律师看,他不会用第二次。 要说明:案件文本是我按焦点词合成的, 真实判决书几万字、说理会绕、焦点词会散落在不同段落,相似度分布会比这里更平。 但「结构化字段过滤优于纯文本」这个结论,在真实的检索系统里反复被验证。 另外这里假设案由是现成的结构化字段—— 现实中法院系统确实如此,但如果要自己从文本里判案由,那又是一层误差。

30 秒实验

  1. 把查询里加上案由名,重跑纯文本那一列。 精确率会明显上升——但它上升的原因恰恰是「案由信息进去了」,反过来证明了过滤的价值。
  2. 把通用词(「本院认为」「依法」等)从文本里去掉,重跑。 纯文本的精确率会好一些——那些词只贡献相似度、不贡献区分度。
  3. 把每个组合的案子从 4 份加到 10 份,看重跑的上限。 top5 最多装 5 个相关案子,理论上限变成 100%。

常见误区

  1. 「文本相似的案子就是类案」。同词异案大量存在,违约金争议在三种合同里都用同一批词。
  2. 「相似度 0.8 以上就可以自动关联」。 本 Demo 的 top1 只有 0.598 到 0.657,相关与不相关混在一条线上。
  3. 「上向量模型就能解决」。 不加结构化过滤,语义再强也分不清「买卖合同里的违约金」和「租赁合同里的违约金」。
自测三问(点开对答案) 1. 为什么纯文本检索会把别的案由的案子排在前面? —— 查询不含案由名,只带焦点词;不同案由共用同一批焦点词,字面上高度重合,但裁判规则不同。 2. 加案由过滤后精确率到 80%,为什么说 80% 是上限? —— 每个查询只有 4 个相关案子,top5 最多装 4 个,4 ÷ 5 = 80%。要提高得先有更多相关案子。 3. 为什么相似度的绝对值不能当阈值用? —— 字二元组余弦只反映用词重合,受语料和文档长度影响,换一批语料量纲就变。 只能在同一批结果内部比排序。

检索解决的是「找到参考」。 最后一节换成企业内部的场景: 合同签之前的合规检查。这件事看起来最简单——对着清单打勾——但它两种错都很难缠。

相关笔记