一份普通的消费者服务条款,平均长度是9000词。逐字读完要花大约35分钟,还得全程绷着神经,穿过密密麻麻的法律黑话、嵌套定义和交叉引用的赔偿条款。一个活跃的软件工程师或网络用户,每年要签下大约30到40份这样的协议——光是读完它们、避免拱手让出法律权利,就得耗掉20多个小时。
所以没人读。大家直接滚到底部,点下那个友好的蓝色"我同意服务条款"按钮,然后继续过日子。而就在这一下点击里,人们悄悄放弃了接受法院审判的宪法权利,同意在几千英里之外的司法辖区接受有约束力的私人仲裁,授予公司无追索删除内容的 blanket 权限,甚至在关键云数据丢失时也放弃追责。
有人把这件事做成了一个工具:Didn't Read。它不生成又一份拉取请求描述,也不总结一封200词的邮件,而是拒绝去读35页合同样板,改用一个专门为此微调的开源权重4B模型,在30秒内标出每一条掠夺性条款。
它长什么样
Didn't Read 的形态像一张律师的实体校对单。你给它任意一个服务条款网址,或者直接粘贴合同原文,系统会抽取法律文本,用基于规则的句子边界消歧器(pysbd)把文档切成一句句法律句子,再按欧洲及国际消费者保护标准定义的8类法定不公平消费者条款逐句分类。
它不给AI幻觉,也不给含糊的摘要,而是把整份文档原地渲染出来,用不同的柔和马克笔色调加2px实线下划线标出问题条款。鼠标悬停或点按任何被标记的条款,侧边会弹出浮层,显示所放弃权利的官方法律定义,以及模型的分类标签。
- 左侧裁决栏:被标记数量与分类跳转链接
- 中央纸面:Source Serif 4 排版的原文与高亮
- 边注:法定定义,零幻觉
- 键盘导航:按 J / K 快速在条款间跳转
为什么非要微调
通用大模型在合同条款分类上出了名地不靠谱。零样本提示时,基座模型会对"软件按现状提供"这类通用保修措辞产生大量误报,同时又经常漏掉深埋在赔偿标题里的强制仲裁弃权条款。
解决办法是用 Tinker 对Qwen/Qwen3.5-4B做 rank-16 LoRA 微调,训练数据来自学术基准 LexGLUE 的 UNFAIR-ToS(CLAUDETTE 项目:50份消费者服务条款,由法律学者逐句标注)。
评估在一个冻结的测试切片上进行,只评分一次:全部172句不公平句子加250句公平句子,共422句,使用标准多标签精确率、召回率和F1。
- 仲裁类突破(F1 +190%):零样本基座模型在仲裁上的精确率只有,几乎把任何提到"争议"或"索赔"的句子都标成强制仲裁;微调后精确率达到,F1为
- 超过已发表的BERT基线:微调后的4B模型宏F1达到,高于已公布的 Legal-BERT(0.810)和 RoBERTa-base(0.790)。
- 稳定收敛:训练在 Thinking Machines 的GPU基础设施上跑了196步优化,交叉熵损失从第1步的平滑降到第185步的
检查点元数据记录:基座模型 Qwen/Qwen3.5-4B,rank 16,总步数196,宏F1提升+0.1673(+23.7%),微F1提升+0.1528(+22.0%)。
训练与运行架构
数据准备阶段,从 Hugging Face datasets 抽取官方 coastalcph/lex_glue 的 unfair_tos 划分:训练集5532句(630句不公平、4902句公平),验证集2275句,测试集1607句(冻结,训练中从未见过)。
真实世界的服务条款严重不平衡,约九成是公平条款,直接训练会让模型对什么都猜"公平"。因此在预处理脚本里构造了一个1575句的平衡训练集:全部630句不公平句子加945句公平句子,格式化为结构化的对话轮次。
微调通过 Tinker SDK 完成,训练操作直接跑在 Thinking Machines 的云上,不需要昂贵的本地GPU机器。训练循环采用流水线式的前向-反向传播与Adam优化器步进,学习率2e-4,最后直接把适配器检查点保存下来用于采样。
实时推理与抽取部分用 FastAPI、Jinja2 和原生CSS搭建:trafilatura 从在线网址抽取干净的法律文本,剥掉页眉、页脚和cookie横幅;pysbd 干净地切分法律条款,不会在"e.g.""i.e."或"Section 4(a)"这类缩写处断句;一个异步信号量(asyncio.Semaphore(15))把条款请求批量发给 TinkerSamplingClient,让300多句在约25秒内完成评估。每条被标记的条款都映射到 CLAUDETTE 语料库中一条精选的静态法律定义,保证解释零幻觉。
为什么它不像AI驾驶舱
大多数AI黑客松项目长得像科幻飞船仪表盘:深色背景、霓虹青色按钮、弹跳的粒子动画,还有显示无意义数字的假遥测组件。但合同是在纸上读的,律师用实体荧光笔在合同上做标记。
所以 Didn't Read 看起来就是一张编辑式的法律纸面:背景是温暖的档案纸色(#FBFAF7),文档纸面是纯白(#FFFFFF),墨色是炭黑(#1C1B19)。正文用 Source Serif 4、18px字号、1.75行高,行宽限制在舒适的68字符;界面元素用 Inter,基准数字用 JetBrains Mono。每个条款类别配一种低饱和柔和马克笔色调,加一条深色2px实线下划线,再配高对比度徽章,满足 WCAG AA 无障碍标准。按 J 或 K,视口会平滑滚动并居中到上一条或下一条被标记的条款。
真实合同上的战果
- Spotify 使用条款23.9秒抽取276句,立刻标出第24.1节(纽约的强制个人仲裁与集体诉讼弃权)和第14节(流媒体中断的责任限制)。
- GitHub 服务条款28秒扫完,标出E节(用户生成内容的责任与内容删除权)和L节(提前30天通知即可无理由终止)。
- Discord 条款19秒扫完,识别出第16节(强制仲裁前的争议解决与非正式解决流程)。
不用再花35分钟眯着眼看手机屏幕上微小的字体,你在签字前拿到的是真正决定法律救济途径的那五句话。
为什么开源很重要
消费者合同是现代互联网上最不对称的关系之一。市值数十亿的平台雇一队公司律师起草协议,最大化公司保护,同时系统性地消灭消费者权利。
闭源API背后的专有模型无法长期解决这个问题:它们可能随时变更,可能以含糊的安全准则审查法律分析,也可能把私密的企业合同记录下来用于再训练。像 Qwen 4B 这样的开源权重模型,加上 Tinker 这类民主化的训练基础设施,能把场地拉平——让开发者、非营利组织和消费者保护倡导者微调出紧凑、高精度、可以跑在任何地方的模型,透明地审计公司协议,并公布可复核的基准结果。
这个项目也证明了一件事:在高质量领域数据集上微调小型专用模型,效果显著优于提示一个巨大的通用模型。在合同分类这件事上,领域专精每次都赢过参数规模。
