入门 11 分钟法律

律师:分析一份合同 fuite

直接回答

要在合同不离开您的电脑的情况下进行分析,请用 Ollama 提供模型服务(Qwen 3.5 9B 或 Mistral Small 24B),提取 PDF 中的文本,并规定:每个指出的问题都必须逐字引用对应段落。随后由脚本检查该引文是否确实存在于合同中。请调大 Ollama 的上下文窗口:显存不足 24 GB 时,默认窗口为 4,000 个 token。

合同中包含的信息,不能因为负有职业保密义务或签订了保密协议,就随意交给任何在线服务。本地处理流程读取 PDF,标出需要审查的条款并引用相关段落,整个过程中没有任何数据离开您的电脑。本指南介绍如何搭建这一流程、加入引用自动核验,并明确说明工具无法做到哪些事情。

作者: Mohamed Meguedmi·更新于 2026-09-30·已在 Windows、macOS 和 Linux 上测试

#为什么不应将合同提交给在线聊天工具

一份合同包含姓名、价格、协商条件,有时还包含个人数据。将合同提交至托管的AI服务,相当于将这些信息发送给第三方,其处理方式由该服务的使用条款规定,而非由您个人的保密承诺决定。对律师而言,这涉及职业道德问题:2026年3月由全国律师协会通过的《职业道德与人工智能指南》明确指出,律师职业要求必须保护职业秘密并遵守《通用数据保护条例》(RGPD)。指南的评论者指出,保密义务禁止在任何情况下泄露与案件或客户相关的机密信息,包括在使用人工智能工具时。

对企业法务而言,约束来自合同:与合作伙伴签署的保密协议几乎从未允许将其条款提交给 AI 服务提供商。软件厂商的专业服务方案提供不再利用数据的保证,但您应在自己签署的合同中核实这些保证,而不能依赖宣传口号。本地分析消除了这个问题:合同文本不会离开您的电脑,因此既没有需要申报的数据处理受托方,也没有需要说明正当理由的数据传输。

!
本地不等于可靠
本地运行解决的是隐私问题,并不保证准确性。斯坦福大学于 2024 年发表的一项针对美国商用法律检索工具的研究发现,即使是其中表现最好的工具,也有超过 17% 的回答存在错误。这些工具并非合同阅读工具,但这一错误率的量级提醒我们:模型即使写得信心十足,也可能出错。因此,本指南的规则是:模型的每一项陈述都必须有可核查的原文段落作为依据。

#在内部实现 PDF 对话,无需编写代码

本地 AI 套件

只需 1 小时,即可在您的电脑上拥有专属的免费 ChatGPT — LM Studio、Ollama、Open WebUI、您的文档,无需云端。

  • 在线空间,终身可用
  • PDF + 文件
  • 30 天内退款

部分读者只是希望对存放在文件夹中的合同进行问答,并确保任何内容都不会离开信息系统。有两种方式。第一种无需编程:在内部服务器上安装 Open WebUI 或 AnythingLLM 这样的界面,并连接到 Ollama;加载 PDF、提出问题,工具就会找出有用的段落。本站已有相关指南。第二种方式将在下文介绍:使用一个简短的脚本,完全控制提示词和引文核验。

该脚本适合每次分析一份合同,并针对具体问题进行提问。带文档检索功能的界面适合包含数十份合同的语料库,例如需要找出所有含有自动续约条款的合同。在后一种情况下,效果取决于文档切分和检索,而不仅仅取决于模型。

针对不同需求应采用何种方法
需求方法注意事项
阅读10至25页的合同直接使用脚本,将整份合同放入上下文需在 Ollama 中调大上下文窗口
查询 20 至 500 份合同RAG 界面(Open WebUI、AnythingLLM)分割质量和搜索质量
与合同模板对比在提示词中包含两段文本的脚本上下文加倍:检查内存
合同扫描件优先进行OCR含噪声的文本会导致引用失真

#最简技术栈:模型、PDF 阅读器、脚本

三个组件就够了。Ollama 负责提供模型服务。pdfplumber 或 PyMuPDF 等 PDF 读取工具负责提取文本。一个约四十行的 Python 脚本将这些组件连接起来。模型方面,可以参考 Ollama 模型库中的两个选择:90 亿参数的 Qwen 3.5 大小为 6.6 GB,标称上下文长度为 256,000 个 token;240 亿参数的 Mistral Small 大小为 14 GB,标称上下文长度为 32,000 个 token。前者能装入 8 至 12 GB 显存的显卡,后者需要 16 GB 或更多显存。请用您自己的三份合同测试这两个模型:它们对法律法语的理解能力会因合同而异。

上下文是关键所在。Ollama 默认根据显存大小设置上下文窗口:当显存少于 24 GB 时,窗口大小为 4000 个 token,远小于一份合同的长度。一份 20 页的合同包含数千个单词,按排版不同,相当于一万五千个 token 或更多,这是你需要在实际文档中衡量的量级。未进行调整时,合同开头会被静默截断,模型仅基于部分内容进行回答。关于上下文窗口的指南详细说明了其工作原理。

#安装工具

模型与库
ollama pull qwen3.5:9b   # ou mistral-small si vous avez 16 Go de VRAM
pip install pdfplumber requests

随后请确认 PDF 中是否包含可选择的文本:若 pdfplumber 返回空字符串,则该文件为扫描件,需要进行 OCR 识别。绝不可在未告知用户的情况下,基于低质量 OCR 结果生成文本,因为模型的引用将无法核实。

#用于初步识别的助手系统提示

提示词规定角色、禁止事项和格式。核心要求是必须引用:要求模型原样引用其依据的文本片段,可以减少编造内容,而且您能通过程序核查引用。下面的提示词要求结构化输出,以便进行这项核查。

system_prompt.txt
Tu assistes un juriste pour un premier repérage rapide dans un contrat
commercial de droit français.

RÈGLES
- Tu ne donnes jamais d'avis juridique. Tu signales des points à examiner.
- Pour chaque point, recopie MOT POUR MOT le passage du contrat concerné.
- Si le contrat ne traite pas un sujet demandé, écris explicitement : non traité.
- Ne suppose jamais l'intention des parties. Ne complète pas un passage manquant.

FORMAT : un JSON, liste d'objets {"point": ..., "citation": ..., "pourquoi": ...}

#完整脚本,含引用验证

脚本读取 PDF,以更大的上下文向模型提问,并通过 JSON Schema 强制规定 JSON 输出格式;Ollama API 的 format 字段支持这一功能。随后,脚本先规范化空格,再检查每条引文是否确实出现在合同文本中。找不到的引文会被单独标记:这表明它可能是编造或改述的内容,需要核查。

analyse_contrat.py
import json, re, sys, requests, pdfplumber

SYSTEM = open('system_prompt.txt', encoding='utf-8').read()
SCHEMA = {'type': 'array', 'items': {'type': 'object',
  'properties': {'point': {'type': 'string'}, 'citation': {'type': 'string'},
                 'pourquoi': {'type': 'string'}},
  'required': ['point', 'citation', 'pourquoi']}}

def lire_pdf(chemin):
    with pdfplumber.open(chemin) as pdf:
        return '\n'.join(p.extract_text() or '' for p in pdf.pages)

def norm(s):
    return re.sub(r'\s+', ' ', s).strip().lower()

def demander(question, contrat, modele='qwen3.5:9b'):
    r = requests.post('http://localhost:11434/api/chat', json={
      'model': modele, 'stream': False, 'format': SCHEMA,
      'messages': [{'role': 'system', 'content': SYSTEM},
                   {'role': 'user', 'content': 'CONTRAT :\n' + contrat + '\n\nQUESTION : ' + question}],
      'options': {'temperature': 0.1, 'num_ctx': 24576}})
    return json.loads(r.json()['message']['content'])

if __name__ == '__main__':
    texte = lire_pdf(sys.argv[1])
    if len(texte.strip()) < 500:
        sys.exit('PDF sans texte exploitable : passer par un OCR.')
    base = norm(texte)
    for p in demander('Liste les clauses à risque pour le signataire.', texte):
        ok = norm(p['citation']) in base
        print(('[OK]  ' if ok else '[CITATION INTROUVABLE]  ') + p['point'])
        print('      ' + p['citation'][:200])
→
为什么需要逐字核对
模型可能会稍微改写引文、改动数字,或将两句话合并。逐字核对并不能证明所提出的问题确实值得关注,但能排除最危险的一类错误:凭空出现的条款。在据此判断其后果之前,务必重新阅读 PDF 中的相关段落。

#揭示风险的提问

请提出具体问题,而不是笼统的请求,一次只讨论一个主题。每条回答都必须引用合同内容,或明确说明合同未涉及该主题。以下是一份起始清单,可根据您的实际工作加以调整。

Non-concurrence
“合同中是否包含竞业限制条款?请引用该条款,并注明其期限、适用的地理范围及经济补偿。”
责任
“责任限制是什么?是否对双方都适用?哪些损害不在赔偿范围内?”
合同终止
「解约条件是什么?双方是否具有相同的提前通知期?」
续订
“是否存在自动续约?要在什么期限内、以何种形式提出不续约?”
违约处罚
“列出逾期、解约或不履约的违约处罚。这些处罚是否对双方同样适用?”
适用法律
“适用哪部法律?指定由哪个法院管辖?”
知识产权
「交付物的产权如何处理:转让、许可、期限、地域?」
个人数据
“合同是否规定了个人数据处理?是否包含数据处理委托条款?”

#将合同与您常用的合同模板进行对比

如果您有经过验证的文档模板,例如事务所或企业的通用条款,那么对比比单独阅读更有用:它能显示哪些内容偏离了您的参考文本。语言模型会读取两份文本,因此上下文占用空间会翻倍:请确认向 Ollama 请求的上下文窗口足够大,否则就逐条比较。

对比提示词
Compare le CONTRAT proposé au MODÈLE de référence.
Liste les écarts en trois catégories :
1. Plus favorables au signataire que le modèle
2. Moins favorables au signataire que le modèle
3. Clauses présentes dans le modèle et absentes du contrat

Pour chaque écart, recopie mot pour mot les deux passages.

MODÈLE :
<<<
[texte du modèle]
>>>

CONTRAT :
<<<
[texte du contrat]
>>>

#在依赖该工具之前,先用您自己的合同进行测试

在将此助手纳入工作流程之前,请先衡量它会漏掉哪些内容。选取五份您已经亲自审阅过的合同,其中一份特意包含您熟悉的条款,例如不太显眼的自动续约条款。使用同一份问题清单提问,然后统计:找出的真实条款、被标记出的无用事项,以及找不到出处的引文。

  1. 01
    选择五份您熟悉的合同
    多样化合同类型:服务合同、供应合同、商业租赁合同、非典型劳动合同。单一类型的合同无法反映整体的稳健性。
  2. 02
    记录您自己整理的条款清单
    在启动工具之前,请逐一列出您预期在每份合同中找到的条款。这份记录就是您用于核对结果的基准。
  3. 03
    比较召回率与噪声水平
    统计工具找出了多少条预期应识别的条款,以及误报了多少个问题。每三条条款就漏掉一条的工具,只能作为备忘辅助,不能作为筛查工具。
  4. 04
    记录复核所需时间
    测量重新阅读标记内容及其引文所需的时间。如果重新阅读耗时几乎与完整阅读相当,则收益甚微。
  5. 05
    确定使用场景
    仅将该工具用于确实有帮助的任务:初步筛选、与合同模板对比、查找特定条款。对于重要性高、无论如何都需要全文阅读的合同,应排除使用该工具。

#限制与防护机制

并非律师
模型不了解最新判例,也不了解那些会改变条款含义的措辞细微差别。它只负责初步筛选;决定仍由法律专业人士作出。
捏造条款
小型模型可能描述合同中缺失的条款。强制引用和脚本验证可降低该风险,但不会完全消除。
篇幅较长的合同
如果内容超出上下文容量,请按章节拆分,并针对每一部分分别提问,或改用文档检索。关于分块策略的指南详细介绍了各个选项。
扫描
PDF 图像需要 OCR 处理。OCR 生成的文本存在错误,导致引用验证存在不确定性。
日志记录
不要将合同或回答保存在未受保护的文件中:仍需保障电脑安全并对磁盘进行加密。隐私检查清单列出了需要检查的项目。
FAQ
能否用 AI 分析合同而无需将文件上传到互联网?+
是的:Ollama 在您的机器上提供模型服务,PDF 阅读器提取文本,脚本向模型提问。没有任何数据离开这台机器。本地运行解决的是隐私问题,而非准确性问题:请坚持引用原文段落,并在得出结论之前,在合同中逐一核对每个要点。
如何在内部实现基于 PDF 的对话,同时不让合同离开信息系统?+
在内部服务器上安装 Open WebUI 或 AnythingLLM,将其连接到 Ollama,然后加载 PDF 文件。文档检索会找到有用的段落,模型会引用这些段落作答。通过身份验证保护访问,并限制网络访问:文档会保留在您的基础设施内。
哪个本地模型适合阅读法语合同?+
两个合理的候选模型:Qwen 3.5 9B(6.6 GB,标称上下文为 256,000 tokens),适用于显存为 8 至 12 GB 的显卡;Mistral Small 24B(14 GB,标称上下文为 32,000 tokens),适用于显存至少为 16 GB 的显卡。请用您自己的三份合同比较这两个模型,而不是依据综合排名。
一份 30 页的合同能放进模型的上下文窗口吗?+
对于 20 至 30 页的合同,通常可以,前提是调大 Ollama 的上下文窗口;显存不足 24 GB 时,该窗口默认设为 4,000 个 token。请测量文档实际包含的 token 数量。如果超出内存所能容纳的范围,就按章节拆分。
模型能否编造一条实际上并不存在的条款?+
是的,尤其是小模型。应对方法是要求逐字引用,然后通过脚本核实该引文是否出现在合同文本中。找不到引文就意味着内容可能是编造的。在据此得出结论之前,务必重新阅读 PDF 中的相关段落。
人工智能分析能否取代律师的审阅?+
不能。它仅用于初步筛选,以识别需要进一步审查的要点及其相关段落。它不了解最新的判例法或谈判背景。法律专业人士仍需对分析负责,尤其在涉及重大问题或非典型条款时。
这份指南对您有帮助吗?

有反馈、发现了错误,或想补充说明?请告诉我们,让这份指南对每个人都更有帮助。