想象这样一个画面:你走进一间挂满上万张照片的档案室,手里捏着一张刚刚拍摄的委托人照片。你的任务,是从这一整面墙的照片里,找出与手中照片“长得最像”的那几张——不是逐张端详比对,而是一眼扫过,先圈出几个大范围候选,再慢慢细看五官、脸型、神态,最终挑出最有参考价值的三五张。 这就是 AI 时代“相似案例检索”的真实写照。在 AI+法律的场景里,法官和律师每天都要面对成百上千份历史判决书。当一份新案件摆在案头时,理想的做法是:让机器自动从庞大的历史案卷库中捞出与当前案件情节最相近、争议焦点最吻合的既往判决,供裁判参考。这就是“案例检索:相似案例”要解决的核心问题。 整篇文章,我们会沿着这套“照片墙找人”的思路展开:先学如何把一张“照片”(案件文本)变成机器能看懂的数字特征,再学如何度量“长得像不像”(相似度计算),接着学会如何在照片墙里快速翻找(索引与检索),最后看看这套技术在真实法律工作中如何落地、会遇到什么坑、以及怎样评价它找得准不准。

岗位关联

对 AI 从业者而言,相似案例检索是“文本向量化 + 相似度计算 + 检索架构”三件套最典型的业务落地场景。掌握这套方法论,你不仅能做法律 AI,还能迁移到客服知识库、医疗病历匹配、政策文件检索等几乎所有“以文找文”的领域,是 NLP 工程能力的直接体现。

目录
  1. 可视化演示
  2. 检索入门
  3. 文本特征化
  4. 相似度计算
  5. 索引与检索
  6. 法律场景落地
  7. 挑战与优化
  8. 效果评估改进
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

检索入门

故事仍然从“照片墙”开始。要知道,照片墙上的每一张照片都不是凭空出现的,它们背后都对应着一个真实的人、一个完整的故事。法律界的“照片墙”,就是法院积累几十年形成的裁判文书库;而“正在找人的照片”,就是法官手上正在处理的新案件。所谓相似案例,简单说就是案由相近、情节相似、争议焦点高度重合的历史判决。比如都是“借款纠纷”,都涉及“逾期不还”,都争论“利息是否过高”——这些相似点越多,参考价值就越大。

但这里有一个关键认知:相似案例检索,本质上是一种模糊查找,而非数据库里的精确匹配。精确查找像“按身份证号找人”,输入号码,输出唯一确定的结果;而相似检索像“看照片找人”,没有唯一标准答案,只有“像或不像”的排序。这引出了检索系统的核心目标:从案例库中找出与查询案件最相似的那个(或那批)案例:

回到照片墙:我们不可能拿着一张照片,把墙上每一张都仔细端详一遍——人做不到,机器也做不到。所以聪明的做法是先把“像”拆解成可计算的要素:五官轮廓、发型、气质。对应到法律案例,这些要素就是“案由、标的额、争议焦点”。把案子拆成要素、把要素变成数字,是机器“看照片”的第一步。

c∗=arg⁡max⁡c∈C sim(q,c)c^{*} = \mathop{\arg\max}_{c \in \mathcal{C}} \ \text{sim}(q, c)
  1. 候选集合$\mathcal{C}$ 表示全部历史案例组成的集合,相当于整面照片墙。搜索范围是所有案例而非某一条记录。
    C={c1,c2,c3,…,cN}\mathcal{C} = \{c_1, c_2, c_3, \dots, c_N\}
  2. 相似度函数$\text{sim}(q, c)$ 是一个“打分器”,输入查询案例 $q$ 和历史案例 $c$,输出一个数值,数值越大代表二者越像,就像人眼对两张照片的“眼缘”评分。
    sim(q,c)∈[0,1]\text{sim}(q, c) \in [0, 1]
  3. 取最大值$\arg\max$ 表示“使得分数最大的那一个”。整个表达式读作:在所有案例中,挑出与 $q$ 相似度得分最高的案例 $c^{*}$。
    c∗=arg⁡max⁡c∈Csim(q,c)c^{*} = \arg\max_{c \in \mathcal{C}} \text{sim}(q, c)

文本特征化

照片墙的比喻继续延伸:人眼能看到五官,但计算机只能看到像素点。要让机器“看懂”一份判决书,必须先把文字翻译成数字清单。这个翻译过程,就是文本特征化——通俗讲,就是“把一段话拆成零件,再给每个零件称重”。

第一步是分词:把连续的句子切分成有意义的词。中文不像英文天然有空格,需要专门算法切分。比如“甲方逾期未还款”,可以切出“甲方”“逾期”“未”“还款”。第二步是词袋模型:忽略语序,只统计每个词在文档中出现了多少次,像一个只数零件种类和数量、不管安装顺序的仓库管理员。但问题来了:有些词(如“甲方”“纠纷”)在几乎所有文书里都出现,它们的“存在感”很弱;而“逾期”“翻新机”这类只在少数案件中出现的词,辨识度极高,应该赋予更高权重。于是有了第三步——TF-IDF 加权:

经过这三步,每一份判决书都被表示成一个“特征向量”——一个很长很长的数字清单,每个位置对应一个词,数值就是它的 TF-IDF 权重。照片墙上的每张“脸”,终于变成了机器可以计算的数学对象。

TF-IDF(t,d)=count(t,d)∑u∈dcount(u,d)×ln⁡N1+df(t)\text{TF-IDF}(t,d) = \frac{\text{count}(t,d)}{\sum_{u \in d} \text{count}(u,d)} \times \ln\frac{N}{1 + \text{df}(t)}
  1. 词频 TF$\text{count}(t,d)$ 是词 $t$ 在文档 $d$ 中出现的次数,除以该文档的总词数作归一化,让长文档和短文档可以公平比较。
    TF(t,d)=count(t,d)∑u∈dcount(u,d)\text{TF}(t,d) = \frac{\text{count}(t,d)}{\sum_{u \in d} \text{count}(u,d)}
  2. 逆文档频率 IDF$N$ 是案例库总文档数,$\text{df}(t)$ 是包含词 $t$ 的文档数。$\ln\frac{N}{1+\text{df}(t)}$ 表示:越少文档包含这个词,这个词的“稀有分数”越高。
    IDF(t)=ln⁡N1+df(t)\text{IDF}(t) = \ln\frac{N}{1 + \text{df}(t)}
  3. 乘积组合把 TF 和 IDF 相乘,既看词在本文档中的热度,又看它在全库中的稀缺度——就像选“最像的照片”时,不只看眼前这张脸出现得多频繁,还要看这张脸在整个档案库里有多独特。
    TF-IDF(t,d)=TF(t,d)×IDF(t)\text{TF-IDF}(t,d) = \text{TF}(t,d) \times \text{IDF}(t)

相似度计算

有了数字清单,回到照片墙的核心动作:“像不像”该怎么算?两个案例的文档,如果它们的高权重词高度重合,案情大概率就相近。最直观的度量有两个。

第一个是 Jaccard 系数:把两个文档各自的词集合看作两个圈子,重合的成员数除以两个圈子合并后的总人数,比值越高越相似。它简单但对“词频”不敏感——同样出现“逾期”,出现一次和出现十次在 Jaccard 眼中没区别。第二个更常用的是 余弦相似度:把两个 TF-IDF 向量放在高维空间里,计算它们之间的夹角。夹角越小,说明两个案例在各个维度上的“分量分布”越一致。公式如下:

细心的读者会发现,不同要素对“相似”的贡献并不相等。借款金额、借款期限这些核心情节,理应比“甲方”“乙方”这类套话词更能决定两个案子像不像。所以在工程实践中,我们还会人为放大关键要素的权重,比如把“诈骗”“过失致人死亡”这类定性词设为核心特征词。这就是权重调节:让照片墙上的“眼睛”“鼻子”比“背景色”更有发言权。

sim(A,B)=cos⁡θ=A⋅B∥A∥×∥B∥=∑i=1nAiBi∑i=1nAi2×∑i=1nBi2\text{sim}(A, B) = \cos\theta = \frac{A \cdot B}{\|A\| \times \|B\|} = \frac{\sum_{i=1}^{n} A_i B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \times \sqrt{\sum_{i=1}^{n} B_i^2}}
  1. 向量点积分子 $A \cdot B$ 把两个向量的每个对应分量相乘后累加,结果衡量两个向量在各维度上的“共同倾向”。如果两个案例都强烈依赖“逾期”这个维度,点积就会被拉高。
    A⋅B=∑i=1nAiBiA \cdot B = \sum_{i=1}^{n} A_i B_i
  2. 向量模长$\|A\|$ 是向量自身的长度,由所有分量的平方和开根号得到。它用于消除文档长度差异带来的影响——短文档向量天然“短”,归一化后也能和长文档公平比较。
    ∥A∥=∑i=1nAi2\lVert A \rVert = \sqrt{\sum_{i=1}^{n} A_i^2}
  3. 余弦归一点积除以两个模长的乘积,结果被压缩到 $[-1, 1]$,这就是两个向量夹角的余弦值。夹角 $0°$ 为完全同向(最相似),$90°$ 为不相关。
    cos⁡θ=A⋅B∥A∥×∥B∥\cos\theta = \frac{A \cdot B}{\lVert A \rVert \times \lVert B \rVert}

索引与检索

照片墙如果只有几百张照片,逐一比对完全可行。但真实的法律案例库动辄百万篇,逐篇计算余弦相似度的代价是灾难性的。这时候需要给照片墙建立索引——就像图书馆的目录卡片,不必翻遍每一本书,只需查目录就能锁定可能相关的书架。

法律检索系统中的索引叫倒排索引。正常思路是“文档 → 包含哪些词”,倒排索引反其道而行:“词 → 哪些文档包含它”。比如“逾期”这个词,倒排表里记录着【案例 3、案例 5、案例 12】。当查询案件里出现“逾期”时,系统直接查这个词的倒排表,立刻定位到包含该词的所有案例。这些被定位到的案例,就构成了候选集,也就是照片墙寻人时“一眼扫过圈出的大范围”。

检索流程由此分成两段。第一段是候选召回:用倒排索引快速挑出所有与查询共享至少一个关键词的文档,它的原则是“宁可多抓,不可错过”,讲究快;第二段是精确排序:只在候选集内部逐一计算 TF-IDF 余弦相似度,按分数从高到低排列,讲究准。整体打分公式可以理解为:

回扣照片墙的比喻:整个检索过程就像“先扫一眼全场圈出十个人,再逐一走到面前辨认五官,最后选出最像的三位”。没有倒排索引这双“快速扫描眼”,就没有办法在海量照片里做到秒级响应。

score(c,q)=∑t∈qTF-IDF(t,c)\text{score}(c, q) = \sum_{t \in q} \text{TF-IDF}(t, c)
  1. 遍历查询词取查询案件 $q$ 分词后的所有词 $t$,逐个进入倒排索引查找。这相当于把照片上“看得见的五官”逐一列出清单。
    t∈qt \in q
  2. 累加案例权重对每个查询词 $t$,取它在候选案例 $c$ 中的 TF-IDF 值并累加。如果案例 $c$ 对查询中多个重要词都有高权重,它的总分就会遥遥领先。
    score=∑t∈qTF-IDF(t,c)\text{score} = \sum_{t \in q} \text{TF-IDF}(t,c)
  3. 排序取 Top-K计算完所有候选案例的得分后按降序排列,取前 $K$ 个返回给用户。
    Top-K=sort(score(c,q))[:K]\text{Top-}K = \text{sort}(\text{score}(c,q))[:K]

法律场景落地

照片墙寻人学会了,法律场景怎么用?AI+法律中,相似案例检索有三个最典型的落地点。

第一是类案推送。法官在审理新案件时,系统根据起诉状文本自动检索历史相似判决,推送到审判流程系统中。法官可以参考这些类案的裁判理由和法律适用,确保“同案同判”——这是我国司法改革反复强调的原则。第二是量刑参考。在刑事领域,检索相似情节、相似金额、相似罪名的判例,观察历史量刑分布,协助法官把量刑幅度框定在合理区间内。第三是文书辅助。律师撰写“类案检索报告”(部分地区法院明确要求提交)时,系统自动生成包含相似案例清单、相似度排序、裁判要点摘要的初稿,节省大量人工翻阅时间。

这套系统的排序逻辑,往往不是单一维度,而是把多个相似度分数融合起来:

在真实产品中,这个 $\alpha$ 通常不是拍脑袋定的,而是用法官的历史采纳行为做回归拟合出来的。这正是照片墙寻人经验的升华:灯光打在哪、先看脸还是先看衣着,都来自对真实“找对人”行为的统计学习。

Score(c)=α⋅sim案情(q,c)+(1−α)⋅sim焦点(q,c)\text{Score}(c) = \alpha \cdot \text{sim}_{\text{案情}}(q, c) + (1 - \alpha) \cdot \text{sim}_{\text{焦点}}(q, c)
  1. 案情相似度$\text{sim}_{\text{案情}}$ 衡量新案件与历史案例在整体事实描述上的相似程度,比如借款金额、担保方式、还款期限等。
    sim案情(q,c)\text{sim}_{\text{案情}}(q,c)
  2. 焦点相似度$\text{sim}_{\text{焦点}}$ 专门衡量争议焦点是否一致,比如是“利息过高”还是“借款主体资格”。焦点一致比情节相似更具参考价值。
    sim焦点(q,c)\text{sim}_{\text{焦点}}(q,c)
  3. 加权融合$\alpha$ 是经验调节系数(通常取 0.4~0.6),控制两个指标的相对重要性。$\alpha$ 调大,检索结果更贴近事实情节;调小,更贴近争议焦点。
    Score(c)=α⋅sim案情+(1−α)⋅sim焦点\text{Score}(c) = \alpha \cdot \text{sim}_{\text{案情}} + (1-\alpha) \cdot \text{sim}_{\text{焦点}}

挑战与优化

照片墙寻人看起来美好,真实世界中却布满陷阱。第一个大坑是同义多词——“拖欠货款”“未付货款”“欠款未结”其实指向同一件事,但字面完全不同。纯关键词匹配会漏掉大量实质相似却说法不同的案例。破解方法有两类:一是引入法律同义词典做查询扩展,把“拖欠”自动扩展为“未付、拒付、逾期支付”;二是改用词向量/句向量表征,让语义相近的词在向量空间中天然聚集,“拖欠”和“未付”的距离自然很近。查询扩展可以形式化为:

第二个大坑是长文本处理。一份判决书动辄上万字,全文做 TF-IDF 会让关键情节被大量程序性文字稀释。工程上常用“分段 + 加权”策略:把文书拆成“本院查明”“本院认为”“判决如下”等段落,给“本院认为”这类说理部分更高的权重。第三个挑战是性能优化:当案例库达到百万级时,倒排索引 + 内存缓存、候选集粗排过滤、甚至 GPU 批量向量运算都会被组合使用,确保法官输入案情的三秒内能等来检索结果。

q′=⋃t∈q({t}∪syn(t))q' = \bigcup_{t \in q} \left( \{t\} \cup \text{syn}(t) \right)
  1. 遍历原查询词从查询 $q$ 中逐个取出词 $t$。
    t∈qt \in q
  2. 查同义词表$\text{syn}(t)$ 返回法律词典中词 $t$ 的所有同义表达,如“欠款→拖欠、未付、拒付”。
    syn(t)\text{syn}(t)
  3. 合并成扩展查询把原词与同义词全部并入新查询集 $q'$,扩大召回面,减少漏检。
    q′=⋃t∈q({t}∪syn(t))q' = \bigcup_{t \in q} \left( \{t\} \cup \text{syn}(t) \right)

效果评估改进

照片墙找人找得好不好,不能靠嘴上说“感觉挺像”。必须让评估指标说话。检索系统最核心的两个指标是精确率(Precision) 和召回率(Recall)。想象法官标记了 100 个“真正相似”的案例,系统检索返回了 30 个,其中 20 个被法官认可为真相似。那么精确率就是 20/30 ≈ 66.7%,召回率是 20/100 = 20%。

指标确立之后,进入人工评估反馈环节:法官或法律专家对检索结果逐条打分“相似/不相似/部分相似”,这些标注数据回流到系统中,用来调整权重 $\alpha$、扩充同义词表、甚至微调向量模型,形成“检索 → 评估 → 调优 → 再检索”的迭代闭环。这就像照片墙寻人的老手把“看特征的眼光”不断传授给新手,让整套系统越用越聪明。

P=TPTP+FP,R=TPTP+FNP = \frac{TP}{TP + FP}, \quad R = \frac{TP}{TP + FN}
  1. 真正例 TP系统检索出来,且人工确认确实相似的案例数。这是检索系统的“命中”。
    TP=系统查准且实际相关TP = \text{系统查准且实际相关}
  2. 假正例 FP 与假负例 FNFP 是系统找出来但实际不相似的“噪音”;FN 是系统没找出来但实际相似的“漏网之鱼”。
    FP+FN=全部错误FP + FN = \text{全部错误}
  3. 两个比例$P$ 关注“找出来的东西里有多少是对的”,$R$ 关注“该找的东西里找到了多少”。二者此消彼长,工程上常用 $F_1 = \frac{2PR}{P+R}$ 做综合平衡。
    F1=2PRP+RF_1 = \frac{2PR}{P+R}

AI 应用场景

法官办案智能类案推送

阶段:检索召回 + 精排排序 + 结果推荐

解决的问题:传统方式下,法官审理新案时依赖个人记忆和经验检索类案,不仅耗时,还容易遗漏与本案高度相似但法条表述不同的历史判决,导致“同案不同判”的风险。AI 系统把新案件的起诉状、答辩状做特征化,在全量裁判文书库中检索相似度 Top-10 类案,推送到审判系统侧边栏,法官一键查看相似案例的裁判要旨与法律适用。

具体案例:某基层法院处理一起“车位买卖合同纠纷”时,系统检索到 5 份标的额相近、均为“开发商逾期交付车位”的既往判决,其中 3 份判赔违约金按日万分之二计算,法官据此作出同尺度判决,当事人服判息诉。

刑事量刑幅度参考

阶段:要素抽取 + 加权相似度计算 + 统计聚合

解决的问题:量刑均衡是刑事审判的敏感议题。传统人工检索量刑案例需要从罪名、金额、情节、认罪态度等多个维度反复筛选,效率低且口径不一。AI 系统先抽取当前案件的量刑要素(罪名、金额、受伤人数、自首立功等),再对相似案例做加权匹配,最后统计出相似案例的量刑区间分布供法官参考。

具体案例:某诈骗案涉案金额 18 万元,系统检索出 42 个金额在 10~30 万元、均为“初犯+全额退赃”的相似判例,统计显示量刑集中在有期徒刑三年至三年六个月,法官参考该区间作出判决。

律师类案检索报告自动生成

阶段:候选召回 + 精排 + 文本摘要生成

解决的问题:诉讼律师在立案前需向法院提交《类案检索报告》,传统手工编写要翻阅数十份判例并提炼案情、裁判理由,耗时数小时。AI 系统接受案情描述后自动完成检索,并按法院要求的模板生成报告初稿,包含案例基本信息、相似度排序、裁判要点摘要,律师只需人工复核微调。

具体案例:某知识产权诉讼团队代理一起“短视频背景音乐侵权”案,系统从 200 万份知产判决中检索出 12 份高度相关判例,自动生成 8 页检索报告,律师复核后直接提交,撰写时间从 6 小时缩短到 40 分钟。

Python 演示

python76 行
# -*- coding: utf-8 -*-import mathimport re SAMPLE_CASES = [    "甲方向乙方借款十万元,约定三个月内归还,逾期未还",    "甲方向乙方借款五十万元,约定一年内归还,逾期未还",    "甲方出售房屋给乙方,乙方支付全款后甲方拒绝过户",    "甲方将房屋出租给乙方,乙方擅自转租引发纠纷",    "甲方购买乙方手机一部,后发现为翻新机要求退货",    "甲方委托乙方保管名贵手表,乙方不慎遗失",    "甲方与乙方签订劳动合同,乙方无故被辞退",    "甲方向乙方购买货物一批,乙方迟延交货造成损失",] def tokenize(text):    """简易中文分词:按相邻两字切分,避免引入外部依赖"""    text = re.sub(r"\s+", "", text)    if len(text) <= 1:        return [text]    return [text[i:i + 2] for i in range(len(text) - 1)] def build_tfidf(cases):    doc_tokens = [tokenize(c) for c in cases]    df = {}    for toks in doc_tokens:        for tok in set(toks):            df[tok] = df.get(tok, 0) + 1    n = len(cases)    idf = {}    for tok, d in df.items():        idf[tok] = math.log((n + 1) / (d + 1)) + 1.0    vectors = []    for toks in doc_tokens:        tf = {}        for tok in toks:            tf[tok] = tf.get(tok, 0) + 1        vec = {}        for tok, cnt in tf.items():            vec[tok] = cnt / len(toks) * idf[tok]        vectors.append(vec)    return idf, vectors def cosine(a, b):    common = set(a) & set(b)    if not common:        return 0.0    dot = sum(a[k] * b[k] for k in common)    norm_a = math.sqrt(sum(v * v for v in a.values()))    norm_b = math.sqrt(sum(v * v for v in b.values()))    if norm_a == 0 or norm_b == 0:        return 0.0    return dot / (norm_a * norm_b) def search(query, cases, idf, vectors, top_k=3):    qtoks = tokenize(query)    qtf = {}    for tok in qtoks:        qtf[tok] = qtf.get(tok, 0) + 1    qvec = {}    for tok, cnt in qtf.items():        if tok in idf:            qvec[tok] = cnt / len(qtoks) * idf[tok]    scored = []    for idx, vec in enumerate(vectors):        scored.append((cosine(qvec, vec), idx))    scored.sort(reverse=True)    return [(cases[idx], round(score, 4)) for score, idx in scored[:top_k]] if __name__ == "__main__":    idf, vectors = build_tfidf(SAMPLE_CASES)    query = "甲方向乙方借款二十万元,逾期未归还"    print("查询案例:", query)    print("最相似的三个案例:")    for case, score in search(query, SAMPLE_CASES, idf, vectors, 3):        print("  相似度 %.4f  %s" % (score, case))
目的:用约 60 行代码实现一个完整的 TF-IDF + 余弦相似度类案检索器,输入一段新案情描述,自动从案例库中返回最相似的 Top-3 历史案例。
  1. def tokenize(text):简易中文分词函数,按相邻两字切分,中文场景免装分词库即可运行。
  2. idf[tok] = math.log((n + 1) / (d + 1)) + 1.0计算逆文档频率,词越稀有、数值越大,防止“甲方”等高频词喧宾夺主。
  3. vec[tok] = cnt / len(toks) * idf[tok]词频除以文档长度做归一化,再乘 IDF,得到每个词的 TF-IDF 权重。
  4. common = set(a) & set(b)取两个向量共有的特征词集合,只有共同的词才对相似度有贡献。
  5. dot / (norm_a * norm_b)标准余弦相似度计算,结果越接近 1 表示两个案例越像。
  6. scored.sort(reverse=True)按相似度分数从高到低排序,取前 top_k 作为检索结果。
  7. search(query, SAMPLE_CASES, idf, vectors, 3)程序入口,用新案情检索案例库并打印 Top-3。

常见误区

误区两个判决里都出现了“借款”“逾期”,就认为它们是相似案例,直接拿来当裁判参考。我刚开始做类案检索时,就按关键词重合度排序,结果推荐了一堆“借款纠纷”却案情南辕北辙的文书。

正解相似案例的核心是“情节与争议焦点相似”,而不是“字面词汇相似”。同一借款纠纷,A 案争议在利息计算,B 案争议在夫妻共同债务认定,关键词高度重合但法律问题完全不同。TF-IDF 赋予“利息”“夫妻共同债务”这类区分性词汇更高权重,正是为了把“真相似”和“假相似”分开。

为何常见:人脑天然依赖字面重合度做快速判断,这是最省力的直觉;再加上早期检索工具确实只用关键词匹配,容易形成思维惯性。

误区评分模型给出相似度 0.95 的案例,就认为它应当作为判决依据,几乎不需要人工审查。觉得数字高代表算法认定“这就是同案”。

正解检索相似度衡量的是“文本内容像不像”,不等于“裁判规则应当适用于本案”。高相似度案例可能存在主体资格不同、法律已修改、指导性案例另有裁判规则等情况。系统输出只是“参考资料”,决定是否采信必须由法律人结合法律适用做专业判断。检索系统是地图,不是自动驾驶的方向盘。

为何常见:技术人员习惯信任模型输出的分数,容易把“统计相关”误解为“因果必然”,忽略了法律场景对可解释性和人工复核的刚性要求。

误区词表有十万个词,就把每个案例表示成十万维向量,认为维度越多包含的信息越全,检索就一定更准。

正解TF-IDF 向量是高度稀疏的,一个案例可能只有几百个非零维度,绝大多数维度都是 0。在高维稀疏空间里,余弦相似度容易受到无关维度噪声干扰,且存储和计算开销剧增。工程上常用特征筛选、降维(如 PCA)或改用稠密的句向量模型,反而在效率和效果上同时占优。

为何常见:“更多 = 更好”是日常经验的自然外推,而忽略了高维稀疏数据特有的“维度灾难”问题。

误区法律文书用词规范,检索时把所有关键词逐一匹配,能找到的案例已经很全了,认为语义向量是过度设计。

正解法律文本虽规范,但当事人的非专业表述(如把“逾期交房”写成“房子拖了半年才给”)在起诉状中大量存在。同义多词问题靠穷举关键词永远无法根治,而预训练语言模型生成的句向量天然把“交房延迟”和“逾期交房”映射到相近位置,能显著提升召回率。关键词检索是基础盘,向量语义是放大器,二者配合才是工程正解。

为何常见:容易只见自己的成功案例,忽略覆盖不到的边界场景;且关键词系统直观、好解释,让人误以为“看不到的问题就不存在”。

面试题

Q1. 在“照片墙找相似面孔”的比喻中,检索系统的核心任务是什么?

单选题 · easy

  • A.把所有照片按拍摄时间排序展示
  • B.从海量照片中找出最像的那几张← 正确答案
  • C.为每张照片编写详细的文字备注
  • D.把全部照片压缩成统一格式

答案:B。检索系统的本质是“从海量候选中找出与查询最相似的 Top-K”——就像在照片墙找人时圈出最像的几张。按时间排序是归档,写备注是标注,压缩是存储优化,都不是检索的核心任务。

Q2. TF-IDF 中的 IDF 主要衡量什么?

单选题 · easy

  • A.某个词在单个文档中出现的次数
  • B.某个词在整个案例库中的稀有程度← 正确答案
  • C.某个文档在数据库中的编号大小
  • D.查询语句与文档之间的时间差

答案:B。IDF(逆文档频率)用 $\ln(N / \text{df}(t))$ 度量一个词在多少文档中出现过,出现得越少越稀有、权重越高。词频(TF)才统计单文档内出现次数,选项 A 是 TF 的概念,C、D 与文本权重无关。

Q3. 余弦相似度直接衡量两个向量的什么?

单选题 · easy

  • A.两个向量的长度大小之差
  • B.两个向量的方向夹角大小← 正确答案
  • C.两个向量的维度数量多少
  • D.两个向量的所有元素之和

答案:B。余弦相似度计算的是两个向量的夹角余弦值,夹角越小越相似,与向量长度无关。所以长短不同的文档也能公平比较——这才是它常用于文本检索的原因。

Q4. 倒排索引的核心作用是什么?

单选题 · mid

  • A.让文档在服务器中按照顺序正向排列
  • B.由关键词快速定位包含它的所有文档← 正确答案
  • C.把文档内容无损压缩成一半大小
  • D.将查询句子拆分成一个个汉字

答案:B。倒排索引是“词 → 文档列表”的映射表。查询时直接查词条找到对应文档集合,避免全库扫描。正向排列是存储问题,压缩是存储优化,拆分汉字是分词——均不是倒排索引的作用。

Q5. 检索流程中“召回”阶段的首要目标是什么?

单选题 · mid

  • A.精确计算每个候选与查询的相似度
  • B.用宽松条件快速获取候选文档集合← 正确答案
  • C.将查询语句翻译成另一种自然语言
  • D.把已有文档按日期重新排列归档

答案:B。召回阶段的核心是“宁多勿漏、速度优先”,用倒排索引等低成本方式快速缩小范围,把精确打分留给精排阶段。选项 A 是精排阶段的任务,C、D 与检索流程无关。

Q6. 纯关键词匹配检索法律案例效果不佳的原因有哪些?

多选题 · mid

  • A.同义表达方式多种多样← 正确答案
  • B.不同案情要素权重不同← 正确答案
  • C.法律文书篇幅普遍都很长
  • D.检索系统缺少联网搜索功能

答案:AB。同义不同词(如“拖欠”与“未付”)导致漏召,案情要素权重差异(认定焦点与程序套话权重应不同)导致排序失真,这两点正是 TF-IDF 与同义词扩展要解决的问题。篇幅长并不是关键词匹配失效的直接原因,联网功能与文本相似度无关。

Q7. 用 bigram 分词法处理“民间借贷纠纷”这六个字,能提取出几个特征词?

单选题 · extreme

  • A.恰好得到四个相邻二元特征词
  • B.得到五个相邻交叠的二元特征组← 正确答案
  • C.只能得到一个完整的整词特征项
  • D.得到六个彼此独立的单字特征项

答案:B。bigram 按相邻两字滑动切分:“民间、间借、借贷、贷纠、纠纷”共 5 个二元组(长度 6 的字串产生 n-1=5 个)。四个与六个均不符合 n-1 规律,整词切分属于词典分词而非 bigram。

Q8. 关于 TF-IDF 权重的描述,下列说法正确的是?

单选题 · hard

  • A.全库出现越频繁的词权重越高
  • B.区分度高的稀有词权重更高← 正确答案
  • C.权重只由文档字数来决定
  • D.权重与词语出现位置相关

答案:B。IDF 让稀有词的权重更高,因为它们区分能力强;“甲方”“纠纷”这类高频词被自动降权。如果高频词权重高,所有文档都会因共有词而虚高相似度。权重与位置无关,也不只由长度决定。

Q9. 评估类案检索系统效果时,通常使用哪些指标?

多选题 · mid

  • A.精确率(Precision)← 正确答案
  • B.召回率(Recall)← 正确答案
  • C.法院采纳判决的总数
  • D.页面加载所需的时间

答案:AB。精确率衡量“检索结果中有多少真相似”,召回率衡量“真相似案例中有多少被找到”,两者共同刻画检索质量。法院采纳数是业务效果而非检索指标,页面加载时间属系统性能指标,与检索准确度无关。

Q10. 以下哪两项措施能有效缓解法律检索中的“同义不同词”问题?

多选题 · hard

  • A.引入法律词典进行同义词扩展查询← 正确答案
  • B.采用预训练语言模型的语义向量← 正确答案
  • C.增加检索服务器的磁盘存储空间
  • D.强制所有起诉状使用统一规范词

答案:AB。同义词扩展把“拖欠”扩展为“未付、拒付”等穷举变体,语义向量则让含义相近的词在向量空间自动聚集,二者分别从词典和表示层面解决同义问题。加存储不改变匹配逻辑;强制统一用词在现实中不可行——起诉状来自公众,无法约束。