AI 提取合同关键信息

文摘   2024-12-27 22:44   河南  

之前写过好几篇合同关键信息提取的方法,今天给大家介绍一个实现最简单,效率也不错的方法。

财审同事需要对被审计单位销售合同、采购合同、工程承包合同、工程分包合同的关键信息进行提取。

一般来说,他们会把这项工作交给效率工具-“实习生”来完成。

但是架不住量大,实习生用起来也不划算。

之前我们介绍过使用 paddlepaddle 和 knowledge-table 来实现。

其中 paddlepaddle 对于有 N 卡的效率高。

但我现在使用的 Mac 电脑,我发现使用 ollama 来实现是效率和部署最方便的。

前不久, ollama 提供了结构化输出的示例,要实现这个需求就更简单了。

对于扫描件的 PDF ,有两个方式可以实现:

  1. 直接使用 ollama 支持的视觉模型识别,并输出为结构化数据。
  2. 先将 PDF OCR 识别为 txt 文本文件,再使用 ollama 大模型识别出关键信息输出为结构化数据。

对于方式1来说,比较适用单据类,如发票、车票、报关单、凭证等。优势是效果好,缺点是速度慢。

对于方式2来说,比较适用几乎全是文本类的文书,如合同等。优势是速度快。

因此,本篇我们介绍方式2.

从 PDF OCR 识别为文本文件,有很多软件可以实现。不过,在 Mac 电脑上我直到今天才找到最好用的。

这里暂且不赘述。

假设我们已经将 PDF 转成了 txt 文件,我们只需要从文本中利用 AI 大模型提取出关键信息。

我们根据 ollama 官网给的示例,找 chatgpt 给我们写代码:

它直接给我可用代码:

from ollama import chatfrom pydantic import BaseModelfrom typing import Optional
# 定义一个模型来存储合同信息class Contract(BaseModel): contract_number: str # 销售合同或销售订单编号 sign_date: str # 合同签订日期 contract_term: str # 合同期限 contract_type: str # 合同类型 contract_subject: str # 合同标的 payment_method: str # 付款方式 settlement_basis: str # 结算依据 quantity_tons: float # 数量(吨) unit_price_inclusive_tax: float # 单价(含税) amount: float # 金额 transportation_party: str # 承担运输方
# 准备合同文本contract_text = '''销售合同编号: 12345合同签订日期: 2024年10月15日合同期限: 1年合同类型: 销售合同合同标的: 商品A付款方式: 一次性支付结算依据: 按照发票结算数量(吨): 500单价(含税): 1000金额: 500000承担运输方: 卖方承担运输'''
# 调用 Ollama 模型进行处理,提取合同信息response = chat( messages=[ { 'role': 'user', 'content': f"请提取以下合同的关键信息:\n{contract_text}", } ], model='qwen2.5:7b-instruct', format=Contract.model_json_schema(),)
# 解析返回的 JSON 数据为 Contract 对象contract_info = Contract.model_validate_json(response.message.content)
# 打印提取的合同信息print(contract_info)

其中 contract_text 是模拟的合同文本。

执行代码结果:

contract_number='12345' sign_date='2024年10月15日' contract_term='1年' contract_type='销售合同' contract_subject='商品A' payment_method='一次性支付' settlement_basis='按照发票结算' quantity_tons=500.0 unit_price_inclusive_tax=1000.0 amount=500000.0 transportation_party='卖方承担运输'

当然,要将上面代码转变成可用的,只需要写个循环读取指定文件夹所有 txt 文件,批量调用函数,

同时,最后将信息输出为 excel 就可以了。

上面我使用的大模型是 qwen2.5:7b-instruct ,只需要占用 4.7 GB 的显存,对于显存稍微够一点的都可以跑起来。

当然,对于方式2 直接使用视觉模型对 PDF 的图片进行识别的话,可以使用 llama3.2-vision ,=minicpm-v= ,

其中 minicpm-v 专门针对中文的。

假如,梳理合同以前需要 4-5 个实习生,那么通过上述方法只需要 1 个了,仅仅是对生成的结果进行人工复核修正。

逆行的狗
不会编程的军人不是好的审计员
 最新文章