小林要装修老房子,手里攥着两家公司的报价单——“东升装饰”和“西城家装”。乍一看,两份单子几乎一样:都列了水电改造、地板、墙面、厨卫四大项。可细看之下,猫腻全藏在小字里:东升写“实木复合地板,260元/平”,西城写“强化地板,180元/平”;东升包两年质保,西城包五年;东升的报价含拆除费,西城的拆除费要另算。肉眼一条条对下来,小林头晕眼花,还生怕漏看一行。这与律师审查合同时的处境完全一样:拿到一份修订版合同,必须搞清楚“对方到底改了哪里、改得是否对我有利”。AI 合同审查里的对比分析,正是用算法替小林和律师完成这份“逐行找不同”的苦差事——先对齐文本,再提取差异,接着判断利弊,最后评级出报告。这节课,我们就跟着这套流程走一遍。

岗位关联

对 AI 从业者而言,掌握合同对比分析的算法链路与工程优化,是进入法律科技赛道最实用的敲门砖,能直接支撑合同审查产品的核心功能设计。

目录
  1. 可视化演示
  2. 概念与价值
  3. 对齐算法
  4. 差异提取
  5. 语义分类
  6. 风险评级
  7. 报告生成
  8. 优化策略
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示AI合同审查对比分析:版本差异diff标记新增删除修改、语义向量空间相似度聚类、合同条款与标准模板偏差检测三模式交互切换。

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

合同版本差异比对 逐条比对v1与v2版本,标记新增(+)、删除(-)、修改(!)三类变更 付款条件30d→45d修改、仲裁条款删除、责任上限新增为关键变更 diff = LCS(text_v1, text_v2) + semantic_align 版本diff是合同审查的基础功能

概念与价值

小林把东升和西城两份报价单摊在餐桌上,左看右看,越看越心虚:好像差不多,又好像处处不同。他决定一项一项核对——水电、地板、油漆、吊顶——把两个版本并排摆好,盯着每一行看。这个“并排、逐项、找差异”的动作,就是“对比分析”在现实世界里的朴素形态。

合同审查中的对比分析(Comparative Analysis),是把两份合同文本(比如旧版与修订版、供应商合同与自家模板)交给算法,让机器自动完成小林手工做的活:把文字对齐、把差异挑出来、把差异的含义讲清楚。它是 AI+法律领域最基础也最高频的文本处理任务之一,支撑着合同版本管理、风险管控、竞标比选等核心场景。

对比分析通常回答三类问题。第一,版本审阅:对方把我方的合同改成了什么样,哪些承诺被悄悄拿掉?第二,模板差距:供应商合同与公司标准条款差在哪,是否踩了合规红线?第三,横向比选:两家竞标方给出的合同条款孰优孰劣?价值也显而易见:一位律师逐字读完五十页合同需要数小时,而 AI 先把“哪里变了”圈出来,律师只需在差异处集中判断,审阅时间可缩短到原来的十分之一。

小林需要的正是这个数字:看了差异率,他就知道东升和西城到底是“同一套路”还是“两套打法”。若差异率只有 0.1,大可按价格拍板;若高达 0.6,就得打起十二分精神,逐条谈判了。

γ=NdiffNtotal\displaystyle \gamma = \frac{N_{\text{diff}}}{N_{\text{total}}}
差异率 = 发生变化的条款数 ÷ 合同总条款数,用来快速衡量一份合同被改动得“有多狠”。
  1. 分子变更条款数:把被修改、新增或删除的条款全部数一遍,得到变化的绝对数量。
    NdiffN_{\text{diff}}
  2. 分母总条款数:两份合同合并去重后的全部条款数量,作为比较的基准盘子。
    NtotalN_{\text{total}}
  3. 相除归一两者相除得到 0 到 1 的差异率,越接近 1 说明几乎被重写,接近 0 则是小修小补。
    γ=NdiffNtotal\gamma = \frac{N_{\text{diff}}}{N_{\text{total}}}

对齐算法

小林把两份报价单并排铺开,最先犯难的是一件事:东升的第 5 项“墙面基层处理”,到底对应西城的哪一行?两份单子的顺序不一样,叫法也不一样。只有先把“谁跟谁是一对”搞清楚,后面的比较才有意义。这个“配对”动作,在 AI 合同对比里叫文本对齐。

文本对齐(Text Alignment)是整条流水线的地基。它的目标是为两份合同中“描述同一事项”的文本单元——小到一个短语、大到一条条款——建立一一对应关系。对齐错了,后面所有判断都会跟着错。

最简单的对齐靠文本相似度:把句子拆成词的集合,用 Jaccard 相似度衡量重叠程度。进阶做法把问题建模成序列比对,用动态规划求最小编辑代价,思路与下节讲到的编辑距离一脉相承。再进一步,把条款编码成语义向量后计算余弦相似度,即使“质保期 2 年”与“保修期限为两年”没有共同词,也能因语义相近而正确配对——这正是段落级对齐的底气。

对小林来说,对齐就是给两份报价单的项目行挂上“配对绳”。东升的“铲墙皮”如果错配到西城的“贴壁纸”,后面所有比较都会被带偏;所以对齐这一步,宁可保守,不可冒进。

J(A,B)=∣A∩B∣∣A∪B∣\displaystyle J(A,B) = \frac{|A \cap B|}{|A \cup B|}
一句话类比:两个句子各自拥有的“词牌”取交集,除以两家合起来的“词牌”总数——重合比例越高,越可能是说同一件事。
  1. 交集数一数 A、B 两个句子共有的不重复词语,得到共同词牌数。
    ∣A∩B∣|A \cap B|
  2. 并集把 A、B 两句话出现过的词语合并去重,数出两家总牌数。
    ∣A∪B∣|A \cup B|
  3. 相除得相似度交集中的牌数除以并集中的牌数,得到 0 到 1 的值;词集合完全相同为 1,一个词都不沾为 0。
    J(A,B)=∣A∩B∣∣A∪B∣J(A,B) = \frac{|A \cap B|}{|A \cup B|}

差异提取

配对完成,小林开始找不同。他很快发现,真正的“不同”不止一种:东升写“实木复合地板”,西城写“强化地板”,这是改;东升单子里有“拆除费 3000 元”,西城根本没有这一项,这是增删。AI 做同样的事,步骤叫差异提取。

差异提取(Difference Extraction)的核心任务是判断对齐后的条款之间发生了哪类变化:新增(insertion)、删除(deletion)、修改(modification)。抽象的编辑距离模型把“把 A 变成 B”所需的最少操作数算出来,操作序列自然揭示了差异所在。

具体实现时,编辑距离的动态规划递推式如下。工程上常用 SequenceMatcher 之类的实现直接取得操作块;随后针对“修改”再细看:若两段文本相似度高于阈值(如 0.6),判定为改写;低于阈值则拆成“删除+新增”。对于数值型内容(金额、日期、百分比),还要做模式抽取和数值对比,精确报告“5%→8%“这种变化,而不是笼统说”文字不同”。关键条款(违约责任、管辖、保密)一旦发生修改,会被单独标记,进入后续风险评级。

对小林而言,差异提取就像在报价单上用四色荧光笔做标记:绿色划掉不存在的拆除费,红色圈出地板材质的变化,黄色高亮数字变动。有了这份标记,他不用再逐字读第二遍。

D(i,j)=min⁡{D(i−1,j)+1删除D(i,j−1)+1插入D(i−1,j−1)+[ai≠bj]替换\displaystyle D(i,j) = \min \begin{cases} D(i-1,j) + 1 & \text{删除}\\ D(i,j-1) + 1 & \text{插入}\\ D(i-1,j-1) + [a_i \ne b_j] & \text{替换} \end{cases}
类比:把字符串 A 一步一步“编辑”成 B,每次插入、删除、替换各花 1 块钱,递推式就是在问:从末尾往前,最少花多少钱?
  1. 边界条件空串变成 j 个字符只能靠 j 次插入,这是递推的出发点。
    D(0,j)=j,D(i,0)=iD(0,j) = j, \quad D(i,0) = i
  2. 删除操作删掉 A 的第 i 个字符,代价 1,再处理前 i-1 个字符的问题。
    D(i−1,j)+1D(i-1,j) + 1
  3. 插入操作给 A 补上 B 的第 j 个字符,代价 1。
    D(i,j−1)+1D(i,j-1) + 1
  4. 替换或保留若两字符相同,代价 0;不同则代价 1。三种操作取最小值。
    D(i−1,j−1)+[ai≠bj]D(i-1,j-1) + [a_i \ne b_j]

语义分类

标记完差异,小林开始纠结:这些不同到底是好是坏?质保从两年变五年,明显是好事;可总价后面那句“不含拆除费”就是坏消息。要判断好坏,得先读懂每句话的“意思”。这一步在 AI 流程中叫语义分类。

语义分类(Semantic Classification)要回答两个问题:这条差异在说什么(条款意图)?它对我方有利、不利还是中性(差异类型)?条款意图包括付款、违约、保修、终止、管辖、保密等;差异类型则直接服务于谈判策略——哪些要争,哪些可以让。

实现上,先把条款文本用预训练语言模型(如法律领域的语义模型)编码成向量;然后与“有利/不利/中性”三类原型向量计算余弦相似度,取最接近者作为分类结果。上下文也不可忽视——同样一句“甲方可单方解除合同”,出现在采购合同里与出现在劳动协议里,影响截然不同,所以分类特征常拼接条款位置、所在章节等上下文信息。

对小林而言,语义分类是给每处差异贴一张表情贴纸:绿色笑脸“这条对我有利”,红色哭脸“这条在坑我”,黄色面无表情“这条无感”。贴完贴纸,他才好决定哪些要据理力争。

cos⁡(a,b)=a⋅b∥a∥∥b∥=∑k=1nakbk∑k=1nak2⋅∑k=1nbk2\displaystyle \cos(\mathbf{a}, \mathbf{b}) = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \|\mathbf{b}\|}= \frac{\sum_{k=1}^{n} a_k b_k}{\sqrt{\sum_{k=1}^{n} a_k^2} \cdot \sqrt{\sum_{k=1}^{n} b_k^2}}
类比:把每个条款都看成一艘船的航向向量,余弦值就是两条航向的夹角余弦——夹角越小,说明两句话“开往同一个意思”。
  1. 内积把两个向量对应维度的数值逐项相乘再累加,度量“同方向分量”的多少。
    a⋅b=∑k=1nakbk\mathbf{a} \cdot \mathbf{b} = \sum_{k=1}^{n} a_k b_k
  2. 模长归一每个向量自身的长度,由各维度平方和开根号得到。
    ∥a∥=∑k=1nak2\|\mathbf{a}\| = \sqrt{\sum_{k=1}^{n} a_k^2}
  3. 余弦相似度内积除以两模长之积,消除向量长短影响,只看方向是否一致;越接近 1 越相似,越接近 -1 越相反。
    cos⁡(a,b)=a⋅b∥a∥∥b∥\cos(\mathbf{a}, \mathbf{b}) = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \|\mathbf{b}\|}

风险评级

贴完表情,小林还有个头疼问题:差异有十几处,不可能每处都找装修公司谈,得先知道哪些“最要命”。比如质保五年变两年,和拆除费多收三千块,明显前者更不能忍。把“要命程度”排出来,就是风险评级。

风险评级(Risk Rating)综合两股力量:法律维度的合规压力,和商业维度的利益影响。法律上,违约、赔偿、免责、管辖等条款权重高,因为一旦改动可能直接决定官司输赢;商业上,金额、周期、验收标准直接影响利润与现金流。

系统做法是给每类条款预设权重 w_k,给每处差异按改动幅度打严重度 s_k,加权求和得到风险分 R。按分数划档:5 分以上高风险,3-5 分中风险,3 分以下低风险;再按分数降序输出“优先处理清单”。这样法务的时间永远先花在最关键的差异上。

拿到风险评分,小林终于有了谈判顺序:先谈质保缩水,再谈漏掉的拆除费,最后谈付款节点。报价单还是那两张,但他心里已经有一张“风险地图”,轻重缓急一目了然。

R=∑k=1nwk×sk\displaystyle R = \sum_{k=1}^{n} w_k \times s_k
类比:每处差异好比一笔“风险账单”,权重是它的单价,严重度是买的件数,相乘相加就是总账单——账单最高的几笔,就是必须优先谈判的。
  1. 严重度第 k 处差异的“破坏力”,由改动幅度推导,比如违约金上调 3% 记 3 分。
    sks_k
  2. 条款权重按条款法律地位预设的权值,如违约责任 0.3、管辖 0.2、付款 0.1。
    wkw_k
  3. 加权求和每处差异的严重度乘以其条款权重,全部加总,得到合同整体风险评分。
    R=∑k=1nwk×skR = \sum_{k=1}^{n} w_k \times s_k

报告生成

小林把风险要点记了一笔记本,但晚上要给家人解释时,发现自己讲得乱七八糟:“东升第三条的附属说明里有个小字……”家人一脸茫然。他意识到,结论必须浓缩成一张“一眼看懂”的对比简报。这正是报告生成环节的价值。

报告生成(Report Generation)把结构化差异转化为人类可读的交付物,通常包含三块:差异摘要(最关键的 Top-K 处变化及一句话说明)、可视对比(双栏高亮、增删改标记)、修改建议(针对每处风险给出可落地的改法)。涉外合同还会额外输出双语对照版,方便跨国谈判。

摘要环节常用抽取式方法:对每条差异描述句子计算重要度分数,按分数取前 K 句。重要度的一种做法是对句内词项的 TF-IDF 求和——既照顾词在句内的高频出现,又突出只在少数条款中出现的“稀有信号词”(如“免责”“管辖”)。这类词一出现,往往就意味着关键差异。

最终小林递给家人的是一页纸:上方三条重点差异,中间双栏对比表,底部三句修改建议。家人三分钟就明白了“能不能签、要谈什么”。一份好的对比报告,就是把专业复杂度留给 AI,把清晰结论交给用户。

Score(s)=∑t∈stf(t)×idf(t),idf(t)=log⁡N1+df(t)\displaystyle \text{Score}(s) = \sum_{t \in s} \text{tf}(t) \times \text{idf}(t), \qquad \text{idf}(t) = \log \frac{N}{1 + \text{df}(t)}
类比:句子里的“的”“了”人人都有,不值钱;而“免责”“管辖”这类稀有词一出现就信息量爆炸。TF-IDF 就是给句子里的每个词称重,稀有且高频的词汇贡献最大。
  1. 词频词 t 在句子中出现的次数,体现它在句内的分量。
    tf(t)=ntNs\text{tf}(t) = \frac{n_t}{N_s}
  2. 逆文档频率整个合同库中含 t 的条款越少,idf 越大,说明该词越有区分度。
    idf(t)=log⁡N1+df(t)\text{idf}(t) = \log \frac{N}{1 + \text{df}(t)}
  3. 句子求和句内所有词的 tf × idf 累加,分数越高越值得进摘要。
    Score(s)=∑t∈stf(t)×idf(t)\text{Score}(s) = \sum_{t \in s} \text{tf}(t) \times \text{idf}(t)

优化策略

用了几天 AI 报价对比工具后,小林发现它偶尔会“抽风”:明明完全一样的项目,它有时也标成“变化”;某个藏在备注里的拆除附加费,它却漏报了。他问做 AI 的朋友:“这工具到底靠不靠谱?”朋友说:好问题,这就要谈精确率与召回率。

对比分析系统的性能衡量围绕两个错误展开:误报(False Positive,把没变的报成变了)与漏报(False Negative,真变了却没报出来)。精确率(Precision)回答“它报的差异里,多少是真差异”;召回率(Recall)回答“所有真差异里,它找回了多少”。

优化手段分四类:其一,阈值调优——提高修改判定阈值能降低误报,但可能推高漏报,需在验证集上找平衡点;其二,规则补丁——对数值、日期等高频误报模式加专门校验;其三,性能工程——批量合同用并行处理与缓存加速,支撑千份级审查;其四,人机协同闭环——律师复核结果回传模型作为标注数据,定期微调,让系统越用越准。

小林听完恍然大悟:难怪工具越用越顺——他每次“驳回”误报、手动补上漏报,这些动作都在悄悄变成 AI 的下一轮训练数据。装修过程中,他与 AI 助手配合得越来越默契;合同世界里,律师与 AI 的磨合也正是如此。

P=TPTP+FP,R=TPTP+FN,F1=2×P×RP+R\displaystyle P = \frac{TP}{TP + FP}, \qquad R = \frac{TP}{TP + FN}, \qquad F1 = \frac{2 \times P \times R}{P + R}
类比:AI 像个热心但粗心的验房师。P 是他敲的每家里真有问题的比例;R 是整栋楼真出问题被他发现的比例。F1 是两者的调和平均值,防止他靠“敲遍所有门”刷存在感。
  1. 精确率报出的差异数 TP+FP 中,真正的差异 TP 占多少;越高越少“扰民”。
    P=TPTP+FPP = \frac{TP}{TP + FP}
  2. 召回率真实差异总数 TP+FN 中,被找出的 TP 占多少;越高越少“漏网”。
    R=TPTP+FNR = \frac{TP}{TP + FN}
  3. F1 调和平均P 与 R 的调和平均,两者均衡才高;只看单项会被“全报成差异”这类作弊策略骗过。
    F1=2×P×RP+RF1 = \frac{2 \times P \times R}{P + R}

AI 应用场景

律所智能合同审阅

阶段:文本对齐 + 差异提取

解决的问题:传统律师逐字核对合同修订版,效率低且容易漏看隐藏在附录的小改动;AI 先自动对齐新旧版本并圈出全部差异,律师只需在差异列表上做专业判断,审阅人力成本大幅下降。

具体案例:某律所处理并购尽职调查,买卖双方来回修改股权购买协议多达七版。部署对比分析系统后,每次新版本到达,系统在 2 分钟内输出七处违约条款变化、三处数值变动和一份风险排序表,合伙人据此直接进入谈判策略讨论,不再需要通读全文。

企业法务采购合同风险管控

阶段:模板差距分析 + 风险评级

解决的问题:采购供应商合同经常偏离公司标准条款,法务逐份比对耗时费力;AI 将每份供应商合同与公司标准模板对齐,自动标出偏离点并评估风险,法务只复核高风险项。

具体案例:某制造企业每年签订 3000 余份采购合同,法务团队只有 5 人。引入对比分析工具后,供应商合同先由系统与标准模板比对,输出“高风险偏离清单”,法务只复核清单上的条款,综合审阅时间缩短约 70%。

合同全生命周期管理平台

阶段:报告生成 + 人机协同

解决的问题:大型企业合同量巨大、版本散落各处,人工追踪变更历史困难;平台自动沉淀每次修订的对比记录,让每一版变化都有迹可循。

具体案例:某 SaaS 合同管理平台把对比分析嵌入上传流程——法务每次上传新版本,平台自动生成与上一版本的差异摘要、可视化高亮和双语对照版,并将律师确认过的差异标签回传模型,形成持续优化的闭环。

Python 演示

python82 行
# -*- coding: utf-8 -*-"""合同版本对比分析:切分条款、对齐差异、风险评级、输出报告"""import reimport difflib RISK_WORDS = {    "赔偿": 3, "违约金": 2, "质保": 2, "解除": 3, "免责": 3,    "管辖": 2, "付款": 1, "验收": 1, "保密": 1, "中止": 2} def split_clauses(text):    parts = re.split(r"[。;;\n]+", text)    return [p.strip() for p in parts if len(p.strip()) > 4] def similarity(a, b):    return difflib.SequenceMatcher(None, a, b).ratio() def risk_score(clause):    score = 0    for word, weight in RISK_WORDS.items():        if word in clause:            score += weight    return score def risk_level(score):    if score >= 5:        return "高风险"    if score >= 3:        return "中风险"    return "低风险" def compare_contracts(old_text, new_text):    old_clauses = split_clauses(old_text)    new_clauses = split_clauses(new_text)    matcher = difflib.SequenceMatcher(None, old_clauses, new_clauses)    changes = []    for tag, i1, i2, j1, j2 in matcher.get_opcodes():        if tag == "equal":            continue        if tag == "insert":            for j in range(j1, j2):                changes.append(("新增", new_clauses[j], risk_score(new_clauses[j])))        elif tag == "delete":            for i in range(i1, i2):                changes.append(("删除", old_clauses[i], risk_score(old_clauses[i])))        elif tag == "replace":            if i2 - i1 == j2 - j1:                for i, j in zip(range(i1, i2), range(j1, j2)):                    old_c, new_c = old_clauses[i], new_clauses[j]                    if similarity(old_c, new_c) >= 0.6:                        changes.append(("修改", old_c + " -> " + new_c, risk_score(new_c)))                    else:                        changes.append(("删除", old_c, risk_score(old_c)))                        changes.append(("新增", new_c, risk_score(new_c)))            else:                for i in range(i1, i2):                    changes.append(("删除", old_clauses[i], risk_score(old_clauses[i])))                for j in range(j1, j2):                    changes.append(("新增", new_clauses[j], risk_score(new_clauses[j])))    return changes def build_report(title, old_text, new_text):    changes = compare_contracts(old_text, new_text)    print("=" * 40)    print("合同对比报告:%s" % title)    print("发现差异 %d 处" % len(changes))    for kind, detail, score in changes:        print("[%s/%s] %s" % (kind, risk_level(score), detail))    urgent = [c for c in changes if c[2] >= 5]    print("高风险提醒共 %d 条,建议优先人工复核" % len(urgent))    return changes if __name__ == "__main__":    old_contract = (        "甲方应在收到货物后30日内付款。质保期为2年。"        "违约金为合同总价的5%。争议由甲方所在地法院管辖。"    )    new_contract = (        "甲方应在收到货物后30日内付款。质保期为5年。"        "违约金为合同总价的8%。"    )    build_report("设备采购合同 V1 vs V2", old_contract, new_contract)
目的:用最精简的实现演示合同对比分析全流程——切分条款、序列对齐、差异分类、风险评级、报告输出。
  1. re.split(r"[。;;\n]+", text)按句号、分号、换行把合同切成条款列表,模拟“条款切分”。
  2. difflib.SequenceMatcher(None, old_clauses, new_clauses)内置序列比对器,一次得到两个列表的增删改操作。
  3. matcher.get_opcodes()返回形如 ("replace", i1, i2, j1, j2) 的操作块,是差异提取的核心。
  4. similarity(old_c, new_c) >= 0.6相似度门限,区分“改写”与“真删除+新增”,对应正文中的句式改写识别。
  5. risk_score(clause)用风险关键词词典给条款加权打分,模拟风险评级中的权重求和。
  6. risk_level(score)把分数映射为高/中/低三档,对应“风险等级划分”。
  7. [c for c in changes if c[2] >= 5]筛出高风险差异,建议优先人工复核,体现人机协同思路。

常见误区

误区我上学时用 Git 的 diff 命令就能看代码改动,合同对比不就是把两个文本文件 diff 一下吗?AI 是不是多此一举?

正解字符串 diff 只能发现文字层面的增删改,看不懂语义。比如“质保期自交付之日起二十四个月”改成“质保期两年”,diff 会当成删除整句再加新句;而真正的对比分析会识别两句说的是同一件事——都是质保,只是表达不同,进而只报“表述规范化、数值未变”。更关键的是,diff 无法判断改动是否有利、风险是高是低,这些必须靠语义理解与知识库。

为何常见:日常使用的版本管理工具给人“文本比对即一切”的直觉,忽略了合同审查要的是“意义层面的差异”。

误区两份合同几乎一模一样,重复率达到 98%,那肯定没什么可担心的,AI 怎么还提示高风险?

正解相似度衡量的是文字重合程度,与法律风险没有线性关系。一个数字的变化——比如违约金从 5% 变成 50%,或“验收后 30 日付款”变成“验收后 180 日付款”——文字占比极小,却足以改变合同的商业实质。风险评级看的是条款的法律权重和商业影响,而不是字面相似度。

为何常见:百分比直觉让人把“高相似”等同于“低风险”,忽略了关键条款的杠杆效应——就像装修报价单 98% 相同,但那 2% 可能正是最贵的隐蔽工程。

误区AI 把某一处差异标成高风险,那我肯定得让对方删掉或改回原来的说法才对。

正解风险高只代表这条差异影响重大,不代表它必然有害。对方把付款周期从 30 天改成 60 天,对己方现金流是风险,但如果对方因此提高单价,商业上可能划算;新增的管辖条款也许是为了集中诉讼地、降低整体成本。AI 的职责是把影响说清楚,最终改不改,要结合商业意图判断。

为何常见:把“风险”二字等同于“坏”,忽略了风险的本质是“不确定性带来的影响”,既可能向下也可能向上。

误区对齐的时候,两个条款只要有一个字不一样,AI 就不知道它们是一对了吧?

正解现代对比分析用语义向量做匹配:把条款投影到向量空间,“质保期 2 年”与“保修期限为两年”的向量距离很近,即使没有一个词相同也能配对成功。这也是“段落级对齐”能力的来源。逐字匹配只是最朴素的特例,遇到同义改写就无能为力。

为何常见:用过字符串匹配工具(如 Ctrl+F、Word 查找)后,容易把“相同”理解成“逐字一致”,忘了人类读合同也是按意思理解的。

面试题

Q1. 合同对比分析中,把两份合同里“描述同一件事”的条款配对起来的过程称为?

单选题 · easy

  • A.文本对齐← 正确答案
  • B.风险评级
  • C.语义分类
  • D.报告生成

答案:A。文本对齐是给条款挂“配对绳”,是整条流水线的基础;风险评级、语义分类、报告生成都发生在对齐之后,依赖对齐结果。

Q2. Jaccard 相似度衡量的是两个文本集合之间的什么关系?

单选题 · easy

  • A.交集与并集之比← 正确答案
  • B.文本的长度之差
  • C.词频的求和结果
  • D.编辑的总次数

答案:A。Jaccard 相似度 = 交集 ÷ 并集,衡量的是两句话共有词语占全部词语的比例。编辑次数属于编辑距离,与 Jaccard 是不同的度量。

Q3. 对比分析中,降低“误报”(把没变的条款报成变了)最直接的手段是?

单选题 · easy

  • A.提高修改判定的阈值← 正确答案
  • B.缩短合同文本的长度
  • C.增加报告输出的页数
  • D.删除低风险的条款

答案:A。阈值提高后,只有相似度足够低的句子才被判为“修改”,误报自然变少;但阈值过高会误伤召回率,需要在验证集上权衡。B、C、D 都不触及判定逻辑本身。

Q4. 编辑距离递推式 D(i,j) 中,替换操作对应的代价项是?

单选题 · mid

  • A.D(i-1,j)+1
  • B.D(i,j-1)+1
  • C.D(i-1,j-1)+[a_i≠b_j]← 正确答案
  • D.D(i-1,j-1)+0

答案:C。替换的代价是 D(i-1,j-1) 加上一个 0-1 指示项:字符相同记 0(相当于保留),不同记 1(真正替换)。A 是删除操作,B 是插入操作,D 漏掉了字符不同时的代价。

Q5. 语义分类环节要解决的核心问题是?

单选题 · mid

  • A.提升文本对齐速度
  • B.判断差异对己方是否有利← 正确答案
  • C.压缩合同存储空间
  • D.加密敏感条款内容

答案:B。语义分类回答“这条差异在说什么、对我方有利还是不利”,直接服务谈判策略。对齐提速是性能问题,存储与加密不是对比分析的职责。

Q6. 风险评分公式 R = Σ w_k s_k 中,w_k 表示的是?

单选题 · mid

  • A.条款的法律责任权重← 正确答案
  • B.单个条款的文本长度
  • C.合同的页数标注
  • D.相似度的余弦数值

答案:A。w_k 是按条款法律地位预设的权重,如违约责任 0.3、管辖 0.2;s_k 是该处差异的严重度。文本长度、页数与风险评分无关。

Q7. 一套对比系统把“同义改写后的条款”误判成了“删除+新增”,最可能的原因是?

单选题 · hard

  • A.相似度判定阈值定得过高← 正确答案
  • B.相似度判定阈值定得过低
  • C.风险词典中的词条太少
  • D.报告生成的模板出错

答案:A。阈值过高时,同义改写句与原文的相似度达不到“修改”门槛,系统只好拆成“删除旧句+新增新句”两笔。阈值过低则相反,会把真正不同的句子误判为修改。风险词典和报告模板不参与修改/新增的判定。

Q8. 合同文本对齐阶段可以使用的技术包括?

多选题 · mid

  • A.Jaccard 相似度← 正确答案
  • B.编辑距离比对← 正确答案
  • C.风险关键词词典
  • D.语义向量匹配← 正确答案

答案:ABD。Jaccard 相似度、编辑距离比对、语义向量匹配都能衡量两个条款是否在说同一件事,用于对齐。风险关键词词典用于后续的风险评级,与对齐无关。

Q9. 对合同差异进行风险评级时,合理的输入特征包括?

多选题 · hard

  • A.条款法律类别权重← 正确答案
  • B.商业利益影响程度← 正确答案
  • C.合同纸张厚度规格
  • D.装订顺序编号规则

答案:AB。风险评级综合法律维度(条款权重、合规压力)与商业维度(金额、周期、验收标准)。纸张厚度与装订编号是物理属性,不影响合同法律与商业实质。

Q10. 关于“人机协同闭环”的改进策略,下列说法正确的是?

多选题 · extreme

  • A.律师复核结果可回喂模型再训练← 正确答案
  • B.机器先初筛、人工聚焦复核← 正确答案
  • C.高风险差异必须人工最终确认← 正确答案
  • D.复核一次即可永久免检

答案:ABC。人机协同闭环强调“机器初筛 → 人工聚焦 → 复核结果回流再训练”,高风险差异因影响重大必须由律师最终确认。合同版本与法规都在变化,不存在“一次复核永久免检”的静态结论,D 错误。