在堆满卷宗的档案室里,老侦探陈默接了一桩“货款拖欠”的新案。他不需要证词里出现一模一样的字眼,而是靠几十年的直觉——“这种磨磨蹭蹭不付钱的做派,和去年那起合同纠纷如出一辙”。他迅速翻出几份旧判决,法官的裁判思路刚好能参考。这种“看着不像、骨子里像”的找案功夫,正是语义检索要教给计算机的本事。传统关键词检索像只会认字面的实习生:必须逐字匹配才能找到答案,换个说法就彻底抓瞎。语义检索则给计算机装上了一副“老侦探的眼睛”,让它理解含义、分辨神似,在海量案例库里快速锁定真正相关的参考判例。这篇文章带你从零看懂语义检索的全流程:如何把文字变成坐标、如何建库加速、如何排序优化、如何让模型更懂法律行话。

岗位关联

对 AI 从业者而言,语义检索是 RAG、智能问答、法律科技等场景的基石能力。掌握它,等于掌握了让 AI“读懂含义”的钥匙,能直接提升你在行业落地中的方案设计与调优水平。

目录
  1. 可视化演示
  2. 语义检索概述
  3. 向量化表示
  4. 向量数据库
  5. 稠密检索技术
  6. 法律模型微调
  7. 相关性排序
  8. 反馈优化机制
  9. 行业落地实践
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示查询向量在案例语义空间中的匹配、Top-K相似案例检索与按语义相关度和法律权威性综合排序,理解如何在海量判例中快速定位相关参考案例。支持三种模式切换与播放暂停。

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

语义匹配 理解意图超越字面匹配 语义相似 表述不同也能匹配语义相近的案例。

语义检索概述

陈默翻开新案卷,受害者说“对方收了货却一直拖钱”。如果只按字眼找旧案,“拖钱”两个字在档案里几乎不会出现,年轻警员用关键词一搜,屏幕上空空如也。陈默却笑了——他知道“拖钱”“拖欠货款”“未按期付款”在案子里是一回事。这种透过字面看本质的本事,就是语义检索的雏形。

传统关键词检索依赖字面匹配,查询语句里没有的词,文档写得再相关也搜不到。法律文书又特别爱换着说法表达同一个意思,同义词、省略主语、口语与法言法语的鸿沟,让关键词匹配频频失灵。语义检索则换了一条路:它不数词,而是理解查询和文档各自“表达了什么意思”,再判断两者是不是同一种纠纷。

技术上看,语义检索把查询 Q 与候选文档 D 分别编码成语义表示,再由一个函数计算它们之间的相关程度:

对陈默来说,$g$ 就是他几十年的办案直觉;对计算机来说,$g$ 是一个可学习的深度模型。文章后面几节,就是一步步拆解这个过程:如何编码、如何建库、如何让这个“直觉”越来越敏锐。

sim(Q,D)=g(eq,ed)\displaystyle \text{sim}(Q, D) = g(\mathbf{e}_q, \mathbf{e}_d)
检索系统不再问“有没有出现同一个词”,而是问“这两段话是不是在讲同一类事”。
  1. 查询 Q$Q$ 表示用户输入的检索条件,例如“对方拖欠货款不还”。
    Q="对方拖欠货款不还"Q = \text{"对方拖欠货款不还"}
  2. 候选文档 D$D$ 是案例库中的一份判决书,可能通篇没写“拖欠”两字。
    D="合同违约赔偿纠纷判决书"D = \text{"合同违约赔偿纠纷判决书"}
  3. 语义向量 $\mathbf{e}_q$、$\mathbf{e}_d$两者分别是查询和文档经编码得到的语义坐标,含义相近则坐标相近。
    eq=Enc(Q),ed=Enc(D)\mathbf{e}_q = \text{Enc}(Q), \quad \mathbf{e}_d = \text{Enc}(D)
  4. 匹配函数 $g$$g$ 把两个向量映射为一个相似度分数,是检索系统的“直觉中枢”。
    g(eq,ed)∈[0,1]g(\mathbf{e}_q, \mathbf{e}_d) \in [0, 1]

向量化表示

陈默有个习惯:每翻完一个旧案,他会在脑中画一张“案件画像”,横轴是作案动机,纵轴是手段类型,再标注上金额大小和关系亲疏。新案一来,他脑子里自动生成画像,找旧案就是比画像的相似度。计算机没有“脑内画像”,但它有更硬核的工具——向量。

向量化表示(Embedding)就是把一段文本转换成一串数字坐标。比如“拖欠货款”可能映射成 $(0.85, -0.35)$,“合同违约”映射成 $(0.82, -0.32)$,它们靠得很近;而“离婚纠纷”映射成 $(-0.20, -0.90)$,离得远远的。这些数字不是人写的,而是神经网络在大量文本上自主学习出来的。

从形式上讲,文本编码器把原始文本映射到高维空间中的一点:

向量化把“难以比较的文字”变成了“可以算距离的数字”。陈默的“案件画像”靠经验积累,而模型的编码能力则来自海量语料的自监督学习——它见过太多法律文本,自然就明白“拖欠”“违约”“未付”这些词是一伙的。

e=Encoder(text)\displaystyle \mathbf{e} = \text{Encoder}(\text{text})
向量代表“语义坐标”:意思越像,坐标越近;意思越远,坐标距离越大。
  1. 输入文本 text$\text{text}$ 是任意长度的法律文本,比如一句案情摘要或一整篇判决书。
    text="原告主张被告违约赔偿损失"\text{text} = \text{"原告主张被告违约赔偿损失"}
  2. 编码器 Encoder$\text{Encoder}$ 是预训练语言模型,如 BERT 类结构的神经网络,负责把文字“读”成数字。
    Encoder(⋅)\text{Encoder}(\cdot)
  3. 输出向量 $\mathbf{e}$$\mathbf{e}$ 是该文本的语义坐标,常见维度为 768 或 1024,是后续检索的基本单位。
    e∈R768\mathbf{e} \in \mathbb{R}^{768}

向量数据库

档案室有上百万份卷宗,陈默不可能每接一案就把全部卷宗翻一遍。他有一本手写“检索册”,把每份卷宗按“动机—手段—标的”编成索引卡片,先粗筛出几十份最可能相关的,再逐份细看。向量数据库就是那本检索册的计算机版。

当案例库膨胀到百万级后,逐条计算相似度会慢得无法接受。向量数据库用专门的索引结构(如 HNSW、IVF)把高维空间划分成区域,查询时先在索引里定位附近区域,再在候选集内精算。这种策略叫近似最近邻(ANN),牺牲一点精度换取秒级响应:

陈默的信条是“检索册求快,卷宗求准”。向量数据库也一样:先用 ANN 快速圈定候选集,再对候选集精排。这样既享受了海量库的覆盖面,又不让等待时间吓跑用户。

ANN(q,K)=argtopK{sim(q,di)∣di∈C}\displaystyle \text{ANN}(q, K) = \text{argtop}_{K}\left\{ \text{sim}(q, d_i) \mid d_i \in \mathcal{C} \right\}
向量数据库不保证返回“最相近的那一个”,但保证返回“很相近的那一批”,而且快得让用户无感。
  1. 检索集合 $\mathcal{C}$$\mathcal{C}$ 是全部案例向量的集合,相当于档案库里所有卷宗的编号。
    C={d1,d2,…,dN}\mathcal{C} = \{ d_1, d_2, \dots, d_N \}
  2. 相似度函数 $\text{sim}$$\text{sim}(q, d_i)$ 计算查询向量与第 $i$ 个案例向量的语义接近程度。
    sim(q,di)=cos⁡(eq,edi)\text{sim}(q, d_i) = \cos(\mathbf{e}_q, \mathbf{e}_{d_i})
  3. 选择算子 $\text{argtop}_K$$\text{argtop}_K$ 表示取出相似度排在前 $K$ 名的案例下标。
    argtopK{⋅}\text{argtop}_{K} \{ \cdot \}

稠密检索技术

陈默带过一个实习生,记性极好但只认关键词,查“欺诈”就绝不看写“骗”的卷宗。陈默告诉他:要像画素描一样把案子的每个角度都画进去——动机、手法、受害人类型、金额段位——这种“把全部细节揉进一幅画”的做法,就是稠密。

稠密检索(Dense Retrieval)用深度神经网络把整段文本压缩进一个稠密向量,每个维度都承载语义信息。最常见的是双塔模型:左边一塔编码查询,右边一塔编码文档,各自输出向量后在顶部计算相似度。两塔结构让海量文档可以离线预编码,查询时只需在线编码一个查询向量,再与库内向量比对:

陈默的“素描画”把案子的骨架、血肉、神态都画了进去;稠密向量则把文本的词汇、句法、语境信息压缩进坐标。相比只会数词的稀疏向量,稠密向量更能抓住“神似”,这正是语义检索超越关键词检索的根本原因。

cos⁡(a,b)=a⋅b∥a∥ ∥b∥\displaystyle \cos(\mathbf{a}, \mathbf{b}) = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \, \|\mathbf{b}\|}
余弦相似度只看两个向量的方向是否一致,屏蔽了文本长度的干扰。
  1. 向量点积 $\mathbf{a} \cdot \mathbf{b}$$\mathbf{a} \cdot \mathbf{b}$ 将两向量各维度相乘后求和,衡量“同向分量”的大小。
    a⋅b=∑i=1naibi\mathbf{a} \cdot \mathbf{b} = \sum_{i=1}^{n} a_i b_i
  2. 向量模长 $\|\mathbf{a}\|$$\|\mathbf{a}\|$ 表示向量的长度,由各维度平方和开方得到。
    ∥a∥=∑i=1nai2\|\mathbf{a}\| = \sqrt{\sum_{i=1}^{n} a_i^2}
  3. 比值归一用点积除以两向量模长的乘积,把相似度压缩到 $[-1, 1]$,数值越大表示方向越一致。
    cos⁡(a,b)∈[−1,1]\cos(\mathbf{a}, \mathbf{b}) \in [-1, 1]

法律模型微调

陈默的徒弟学了三年刑侦理论,一到法律档案室还是犯怵:“合同”“债权”“不可抗力”这些词在学校没听过。陈默把徒弟按在档案室里连读了三个月判决书,边读边指点门道。徒弟终于开窍。模型也一样,通用的预训练模型再聪明,没见过法律行话就白搭。

法律领域预训练模型微调分两步。第一步是领域预训练:用海量法律文书(判决书、法条)让通用模型继续训练,熟悉法律术语的搭配。第二步是任务微调:构造“查询—相似案例对”,用对比学习拉近语义相近案件的距离。对比学习的核心损失是 InfoNCE:

徒弟读完三个月卷宗,一眼就能看出“合同违约”和“货款拖欠”是近亲;模型微调完,语义空间里法律概念的位置也发生了类似的重排。这就是法律模型微调的意义——让通用模型的“直觉”变成专家级的“直觉”。

L=−log⁡exp⁡(sim(q,d+)/τ)∑j=1Nexp⁡(sim(q,dj)/τ)\displaystyle \mathcal{L} = -\log \frac{\exp(\text{sim}(q, d^{+}) / \tau)}{\sum_{j=1}^{N} \exp(\text{sim}(q, d_{j}) / \tau)}
微调的目标很朴素:让“对的案例”得分高,让“无关案例”得分低。
  1. 正例 $d^{+}$$d^{+}$ 是与查询 $q$ 语义相关的案例,训练时希望它与 $q$ 的相似度尽量高。
    sim(q,d+)→大\text{sim}(q, d^{+}) \to \text{大}
  2. 温度参数 $\tau$$\tau$ 控制分数的锐利程度,越小则对困难负例越敏感,模型的区分力越强。
    τ>0\tau > 0
  3. 负例求和 $\sum_{j=1}^{N}$分母把所有候选(含负例)的指数分数求和,形成归一化的概率分布。
    P(d+∣q)=exp⁡(sim(q,d+)/τ)∑j=1Nexp⁡(sim(q,dj)/τ)P(d^{+} \mid q) = \frac{\exp(\text{sim}(q, d^{+}) / \tau)}{\sum_{j=1}^{N} \exp(\text{sim}(q, d_{j}) / \tau)}
  4. 负对数似然取 $-\log$ 后,模型越准、概率越接近 1,损失越小,训练朝着“正例越突出”的方向进行。
    L=−log⁡P(d+∣q)\mathcal{L} = -\log P(d^{+} \mid q)

相关性排序

陈默的检索册每次粗筛出几十份卷宗,但他递给同事的往往只有三五份。他会把“手法几乎一致、标的额接近、法院层级相同”的旧案放最上面,把“只有部分相似”的放后面。这种精细的排座次,就是相关性排序。

语义检索的排序不能只靠向量相似度。向量分数衡量语义接近程度,但法律场景还需要考虑法院层级(最高人民法院的判例比基层法院更有参考价值)、判决年份(近年的判决更能反映裁判趋势)、争议焦点吻合度等。因此最终排序分常采用加权融合:

陈默的“排座次”看似随意,其实暗含了一套权重系统:语义分告诉他“像不像”,元特征告诉他“值不值得参考”。两者一加权,排在前面的就是既像又有分量的判例。

scorei=α⋅simvec(q,di)+β⋅fmeta(q,di)\displaystyle \text{score}_i = \alpha \cdot \text{sim}_{\text{vec}}(q, d_i) + \beta \cdot f_{\text{meta}}(q, d_i)
排序分 = 语义相似度 × 权重 + 元特征打分 × 权重,两者互补才能排出真正“有用”的参考案例。
  1. 向量相似度 $\text{sim}_{\text{vec}}$$\text{sim}_{\text{vec}}(q, d_i)$ 是第 $i$ 个案例与查询的语义匹配分数,由余弦相似度得到。
    simvec(q,di)∈[−1,1]\text{sim}_{\text{vec}}(q, d_i) \in [-1, 1]
  2. 元特征函数 $f_{\text{meta}}$$f_{\text{meta}}(q, d_i)$ 综合法院层级、年份、法条引用等辅助信息打分。
    fmeta(q,di)∈[0,1]f_{\text{meta}}(q, d_i) \in [0, 1]
  3. 权重系数 $\alpha$、$\beta$$\alpha$ 与 $\beta$ 调节两类信号的比重,通常由验证集调参或在线学习确定。
    α+β=1\alpha + \beta = 1

反馈优化机制

陈默有个复盘本。今年初他发现:把“标的额超过五百万”排太靠后导致错过一个关键判例后,他在本子上加了一行批注“金额权重上调”。以后每次粗筛,金额相近的案子自动往前挪。这种从结果里学经验的过程,就是反馈优化。

检索系统的排序参数不能拍脑袋定死,需要用户行为来调优。用户在结果列表上的点击、收藏、引用,都是隐式反馈信号。点击率高的排序方案被保留,点击率低的(用户翻了两页就放弃)则触发参数调整。在线学习框架下,排序权重按梯度方向逐步更新:

陈默的复盘本是纸质的,检索系统的反馈闭环却是自动的:用户行为产生信号,信号驱动权重更新,权重更新改善下一次排序,周而复始。就像老侦探的经验越攒越多,系统也越用越顺手。

w←w−η∇wLrank\displaystyle \mathbf{w} \leftarrow \mathbf{w} - \eta \nabla_{\mathbf{w}} \mathcal{L}_{\text{rank}}
系统把“用户的真实选择”当作老师,每一次滑动和点击都在帮它微调权重。
  1. 排序权重 $\mathbf{w}$$\mathbf{w}$ 是排序模型中各特征的权重向量,决定每种信号的影响力。
    w=[wsim,wcourt,wyear,… ]\mathbf{w} = [w_{\text{sim}}, w_{\text{court}}, w_{\text{year}}, \dots]
  2. 排序损失 $\mathcal{L}_{\text{rank}}$$\mathcal{L}_{\text{rank}}$ 衡量当前排序与用户偏好之间的差距,如用户点击了排在第 5 位的案例,说明排序应调整。
    Lrank=−∑点击log⁡P(点击∣di)\mathcal{L}_{\text{rank}} = -\sum_{\text{点击}} \log P(\text{点击} \mid d_i)
  3. 梯度 $\nabla_{\mathbf{w}}$$\nabla_{\mathbf{w}}$ 表示损失对权重的偏导方向,指引权重朝降低损失的方向移动。
    ∇w=[∂L∂w1,∂L∂w2,… ]\nabla_{\mathbf{w}} = \left[ \frac{\partial \mathcal{L}}{\partial w_1}, \frac{\partial \mathcal{L}}{\partial w_2}, \dots \right]
  4. 更新步长 $\eta$$\eta$ 是学习率,控制每次调整的幅度,太大易震荡,太小收敛慢。
    0<η<10 < \eta < 1

行业落地实践

警局新成立了案件研判中心,陈默把整套“画像—检索—排座—复盘”的方法沉淀成了标准流程:新案录入后先自动画像,再进检索册粗筛,精排后由资深警探复核,复核结果回流复盘。法律团队的语义检索落地,同样是一条完整的流水线。

落地首先要构建案例向量库:收集历史判决书,清洗去重后送入微调过的编码器,生成向量并写入向量数据库。接着搭建检索服务:查询进来后编码、近邻搜索、排序融合,以 API 形式输出 Top-K 参考案例。整个系统需要持续评估,核心指标是召回率:

老侦探的经验从个人智慧变成了组织能力;语义检索系统也把律师的点滴经验转化成了可复用的技术资产。当一个法律团队拥有了“懂语义”的检索系统,海量判例就不再是沉重的档案,而是随时听候调遣的智囊团。

Recall@K=∣相关案例∩TopK∣∣相关案例∣\displaystyle \text{Recall}@K = \frac{|\text{相关案例} \cap \text{Top}K|}{|\text{相关案例}|}
Recall@K 回答了一个关键问题:真正相关的案例,系统到底捞回来了没有。
  1. 相关案例集合$\text{相关案例}$ 是人工标注的、与查询真正相关的全部判例,是评估的“标准答案”。
    相关案例={d1∗,d2∗,… }\text{相关案例} = \{ d^{*}_1, d^{*}_2, \dots \}
  2. 返回结果交集 $\text{Top}K$$\text{Top}K$ 是系统返回的前 $K$ 个结果,交集计算捞回的相关案例数。
    相关案例∩TopK\text{相关案例} \cap \text{Top}K
  3. 比值 $|\cdot|/|\cdot|$用交集数量除以相关案例总数,得到召回率——数值越大,说明系统“漏网”越少。
    Recall@K∈[0,1]\text{Recall}@K \in [0, 1]

AI 应用场景

律所类案检索平台

阶段:语义检索 + 相关性排序

解决的问题:传统法条检索依赖律师手动输入关键词,换个说法就可能漏掉关键判例;新律师经验不足时,更是大海捞针。语义检索让律师直接用自然语言描述案情,系统理解含义后返回相似判例,并标注相似度分数。

具体案例:某律所接入语义检索平台后,一名律师输入“客户被拖欠工程款,对方以质量不合格为由拒付”,系统在 0.3 秒内返回了 20 份相似判例,其中一份最高院判决的裁判思路与本案几乎同一脉络,成为案件突破口。

企业法务合同风险预警

阶段:向量化表示 + 向量数据库

解决的问题:企业法务审核合同时,难以快速判断条款背后的潜在纠纷风险。语义检索可将合同条款与历史纠纷案例比对,提前预警高危条款。

具体案例:某制造企业将历年供应链纠纷判决书构建为案例向量库,新采购合同条款逐段编码检索,系统提示“交货期条款表述与三起违约纠纷高度相似”,法务据此修改条款,规避了一次潜在诉讼。

智能法律问答引用支撑

阶段:稠密检索 + 用户反馈优化

解决的问题:法律问答机器人生成回答时,需要引用真实判例支撑结论,否则用户不敢采信。语义检索帮助机器人从案例库中找到与问题最匹配的判决依据。

具体案例:某法律咨询 App 使用语义检索为问答系统提供判例支撑,并根据用户点击行为持续优化排序。上线三个月后回答被采纳率提升了 22%,用户投诉“答非所问”的比例显著下降。

Python 演示

python62 行
# -*- coding: utf-8 -*-"""迷你语义检索:词向量平均 + 余弦相似度演示案例检索"""import mathimport re # 手工构造的"语义词典":语义相近的词,向量也相近WORD_VECTORS = {    "拖欠": (0.85, -0.35), "拖延": (0.80, -0.30), "违约": (0.82, -0.32),    "货款": (0.70, 0.40), "合同": (0.72, 0.38), "赔偿": (0.68, 0.35),    "诈骗": (-0.90, 0.55), "欺诈": (-0.88, 0.52), "骗取": (-0.85, 0.50),    "骗": (-0.86, 0.50),    "离婚": (-0.20, -0.90), "婚姻": (-0.18, -0.88), "抚养": (-0.25, -0.80),    "破裂": (-0.15, -0.85), "财产": (0.20, -0.75),} DEFAULT_VEC = (0.0, 0.0) def sentence_vector(text):    words = re.findall(r"[\u4e00-\u9fa5]+", text)    hits = [WORD_VECTORS[w] for w in words if w in WORD_VECTORS]    if not hits:        return DEFAULT_VEC    n = len(hits)    return (sum(v[0] for v in hits) / n, sum(v[1] for v in hits) / n) def cosine_sim(a, b):    dot = a[0] * b[0] + a[1] * b[1]    na = math.sqrt(a[0] ** 2 + a[1] ** 2)    nb = math.sqrt(b[0] ** 2 + b[1] ** 2)    if na == 0 or nb == 0:        return 0.0    return dot / (na * nb) class MiniSemanticSearch:    def __init__(self, cases):        self.cases = cases        self.vectors = [sentence_vector(c) for c in cases]     def search(self, query, top_k=3):        qv = sentence_vector(query)        scored = []        for i, vec in enumerate(self.vectors):            scored.append((cosine_sim(qv, vec), i))        scored.sort(key=lambda x: x[0], reverse=True)        return [(self.cases[i], round(s, 3)) for s, i in scored[:top_k]]  if __name__ == "__main__":    case_base = [        "合同违约赔偿纠纷",        "货款拖欠追索案",        "合同诈骗罪认定",        "离婚财产分割案",        "婚姻破裂子女抚养纠纷",    ]    engine = MiniSemanticSearch(case_base)    queries = ["对方拖延支付合同款项", "虚假交易骗走货款", "感情破裂要分财产"]    for q in queries:        print("查询:", q)        for case, score in engine.search(q):            print("  ->", case, score)        print()
目的:用极简的词向量字典模拟语义检索核心流程——文本编码为向量、余弦相似度计算、Top-K 排序输出。运行后可见,查询语句不需要与案例出现相同字眼,也能命中语义相近的判例。
  1. sentence_vector(text)把句子分词后查“语义词典”,取平均向量作为整个句子的语义坐标。这模拟了真实系统里编码器的工作。
  2. cosine_sim(a, b)计算两个向量的余弦相似度,只看方向是否一致,不受文本长短影响。
  3. MiniSemanticSearch.__init__案例入库时一次性完成向量化,模拟离线预编码,线上查询无需重复计算。
  4. scored.sort(key=lambda x: x[0], reverse=True)按相似度分数降序排列,对应生产系统中的精排阶段。

常见误区

误区以为语义检索跟百度百科一样,先把关键词替换成同义词,再拿去搜。比如输入“拖欠”,就自动扩展出“拖欠、欠款、未付”再去匹配。

正解同义词表是人工维护的,规模有限,遇到没见过但语义相近的表达依然束手无策。语义检索是端到端学习出来的:模型从海量文本中自行领悟“哪些表达在语义上等价”。它不需要人告诉它“拖欠≈违约”,而是在海量句子里自己学到的。这就像老侦探不会背同义词表,而是看了太多案子后自然明白“这种拖法就是那类纠纷”。

为何常见:人天然习惯用“词语替换”来理解语义,因为这是语言学习的启蒙方式,容易把语义检索想象成同义词扩展的自动化版本。

误区很多人以为向量数据库做的是“遍历所有向量找出最近邻”,返回的就是数学上绝对最相近的案例。

正解向量数据库用的是 ANN(近似最近邻),通过索引结构牺牲少量精度换取数量级的速度提升。它可能漏掉那个“理论上最接近”的向量,但返回的前 K 个仍然有足够参考价值。就像陈默的检索册按类别粗筛,偶尔会漏掉一份分类放错的卷宗,但不会影响整体破案效率。

为何常见:数据库的名字容易让人联想到“精确查询”,而实际的高维近邻搜索在百万级规模下几乎不可能保证精确。

误区认为微调就是“拿法律判决书让 BERT 再跑几天”,跑完自然就懂法律。

正解领域预训练只是第一步,让模型熟悉法律词汇的上下文;真正的检索能力提升依靠“查询—相似案例对”的对比学习微调。没有针对检索任务的微调,模型虽然“读得懂”法律文本,却未必知道“哪些案情算相似”。就像徒弟读了三个月书,还得师父带他看出“这个案子和那个案子是一路货色”。

为何常见:预训练和微调两个概念对初学者容易混淆,加上“继续训练=变厉害”的朴素直觉,导致误把语言建模当成了全部任务。

面试题

Q1. 语义检索相比关键词检索的核心优势是?

单选题 · easy

  • A.检索速度更快
  • B.无需构建索引
  • C.能理解语义含义← 正确答案
  • D.存储空间更少

答案:C。语义检索通过把文本映射为语义向量来匹配含义,能处理同义改写、换种说法等关键词无法应对的情况。检索速度、索引、存储都取决于具体实现,并非语义检索的本质优势。就像老侦探靠“神似”找案,而不是靠证词里的字眼。

Q2. 文本向量化的核心作用是?

单选题 · easy

  • A.把文本压缩成短字符串
  • B.把文本映射为空间坐标← 正确答案
  • C.把文本翻译成英文
  • D.把文本拆分成单字

答案:B。向量化是把文本编码成高维向量,让语义相近的文本在向量空间中相互靠近。它不关心字符长度、不涉及翻译、更不是简单拆分,而是把“含义”变成可计算的距离。

Q3. 用户反馈优化中最常见的隐式反馈信号是?

单选题 · easy

  • A.用户的点击行为← 正确答案
  • B.用户的注册信息
  • C.用户的上网时长
  • D.用户的设备类型

答案:A。检索系统把用户点击了哪些结果、跳过哪些结果当作排序质量的信号。点击行为不需要用户额外操作,却是最直接的“哪个更相关”的投票。注册信息、上网时长、设备类型与案例相关性无关。

Q4. 双塔模型中的两个塔分别编码什么?

单选题 · mid

  • A.查询语义与文档← 正确答案
  • B.两个互不相同的文档
  • C.查询中的两个独立句子
  • D.文档的前后半段内容

答案:A。双塔模型一个塔编码查询(query),另一个塔编码候选文档(document),两个输出向量在顶层计算相似度。这种结构允许文档离线预编码,使海量案例库的在线检索成为可能。

Q5. 余弦相似度主要衡量两个向量的什么性质?

单选题 · mid

  • A.向量长度的大小差异
  • B.向量方向的一致性← 正确答案
  • C.两个向量间的绝对距离
  • D.向量维度的大小关系

答案:B。余弦相似度用点积除以模长乘积,抵消了向量长度的影响,只看方向是否一致。语义检索更关心“语义方向”是否相同,而非向量的绝对长度。

Q6. 关于 Recall@K 指标,下列说法正确的是?

单选题 · mid

  • A.K 值越大,评估标准越苛刻
  • B.衡量前 K 个结果对相关案例的覆盖程度← 正确答案
  • C.只关心第一个结果是否准确
  • D.数值越小代表检索效果越好

答案:B。Recall@K = 前 K 个命中相关案例数 ÷ 相关案例总数。K 越大覆盖越多,指标通常越高而非更苛刻;它不只看第一名,而是看整个前 K 集合;数值越大说明漏得越少,效果越好。

Q7. 排序模型融合元特征(法院层级、年份)的目的是?

单选题 · mid

  • A.减少向量数据库的存储量
  • B.让排序同时考虑语义与权威性← 正确答案
  • C.加快向量索引的构建速度
  • D.替代用户反馈优化机制

答案:B。向量相似度回答“像不像”,元特征回答“值不值得参考”。高院判例比基层判例更有参考价值,近年判决更能反映裁判趋势,融合后排序结果更贴合法律实务需求。

Q8. 关于向量数据库的索引结构,说法正确的有哪些?

多选题 · mid

  • A.用 ANN 加速近似搜索← 正确答案
  • B.每次查询都遍历全部向量
  • C.把高维空间划分区域粗筛← 正确答案
  • D.返回结果保证全局最优

答案:AC。向量数据库通过 ANN 索引(如 HNSW、IVF)把高维空间分区,先粗筛再精算,避免全量遍历。正因是近似搜索,不保证全局最优,但换取毫秒级响应。

Q9. 对比学习损失中的温度参数 τ 的作用是?

单选题 · hard

  • A.控制梯度更新的步长
  • B.控制相似度分布的锐利程度← 正确答案
  • C.控制向量的编码维度
  • D.控制负例的采样数量

答案:B。τ 越小,指数函数对相似度差异越敏感,正例与负例的分数差距被放大,模型区分力更强但训练难度上升;τ 越大则分布越平滑。它与学习率、维度、采样数无关。

Q10. 法律领域模型微调的合理做法包括?

多选题 · hard

  • A.用法律语料继续预训练← 正确答案
  • B.让模型熟悉法律词汇搭配← 正确答案
  • C.用对比学习拉近相似案件← 正确答案
  • D.完全不需要任务标注数据

答案:ABC。完整的微调策略分两步:先用法律语料继续预训练让模型熟悉术语,再用“查询—相似案件对”做对比学习优化检索能力。B 正是领域预训练的目的。完全不标注数据做不了对比学习,D 错误。