基于AI大模型的复杂扫描件PDF信息提取与规整

前言

场景大致是会上传一个几十页的扫描件PDF,让AI在当中找出我需要的字段,本文会隐去具体行业信息和具体的AI提示词内容,只分享技术相关内容,请见谅。

AI模型选择

针对我们行业的使用场景,我主要测试了GPT、Claude以及国内知名的AI公司产品。

下标中"PDF可"的代表能够识别扫描件PDF。

相似字符有3组测试用例,1组为6与8相似,2组为0与O相似,3组为0与Q相似。

信息匹配应该是有2个组。

文件歧义号码查找,是指一个页面上有两个编号,通过我的提示语去查找正确的那个号码。

|--------|----|--------------------|--------|-----------------------------------|-----------------------------------|--------------|-----------------------------|---------------------------------------------------------------------|
| 平台 | 翻墙 | 能够读取的文件类型 | 横向文件识别 | 特例对比(相似字符识别) | 特例对比(信息匹配) | 特例对比(歧义号码查找) | 速度 | 备注 |
| KIMI🐅 | 否 | PDF可 | 👌 | 3对,第一个6和8都错了,第二个O和0没识别出来。 | 只分了1个组,每组里面2个字段不对,1个字段没找到。 | 找错 | OK | |
| 豆包 | 否 | PDF可 | 👌 | 1对,第二个O和0没识别出来,第三个压根没识别 | 只分了1个组,每组里面1个字段不对,5个字段没找到。 | 👌 | OK | |
| GPT | 是 | 扫描版pdf不支持 文件单次最多10 | / | / | / | / | / | |
| Claude | 是 | 扫描版pdf不支持 文件单次支持5 | / | / | / | / | / | |
| 通义 | 否 | 扫描版pdf不支持 | / | / | / | / | / | |
| 百川智能🐅 | 否 | PDF可 | 👌 | 1、3对,第二个O和0没识别出来。 | 分了2组。2个字段没有按要求提供,多个字段没找到。 | 👌 | OK | |
| 讯飞星火 | 否 | PDF可 | 找不到 | 找不到 | 找不到 | 找不到 | 非常慢 | 少有的交白卷选手 |
| 智谱清言🐅 | 否 | PDF可 | 👌 | 1、3对,第二个O和0没识别出来。 | 分了2个组,2个字段没有按要求提供,2个字段不对,1个字段没找到。 | 找错 | 很慢 | 当我给AI的提示词有任何错误,如输入文字打错、json的某几个引号打成中文引号了,都会影响他的输出,唯一一个对输入语言没有纠错的模型。 |
| 文心一言 | 否 | PDF可 | 👌 | 1、3对,第二个O识别成一个小圆圈,但是至少把0和O区别是看出来了 | 🚫一塌糊涂,直接把我输入的Json字段瞎替换了 | 👌 | 超级无敌慢,上传之后文件要先阅读很久,然后才能提交问题 | |
| 海螺ai🐅 | 否 | PDF可 | 👌 | 1、3对,第二个O和0没识别出来。 | 分了两个组,匹配的字段全对,除了2个字段没有按要求翻译成中文。 | 👌 | OK | |
| 360智脑 | 否 | PDF可 | / | 数据全部都是瞎填的 | 🚫一塌糊涂,直接把我输入的Json字段瞎替换了 | 找错 | 超级无敌慢 | |
| 天工ai | 否 | 不能上传文件 | / | / | / | / | / | |
| 万知🐅 | 否 | PDF可 | 👌 | 1、3对,第二个O和0没识别出来。 | 分了2个组,2个字段没有按要求提供,3个字段不对,3个字段没找到。 | 👌 | 慢,解析要时间,被迫阅读全文要时间,然后才能提问 | 上传文档不能同时提问,每次都要等他月度总结完才能提问 |

实验下来,发现提示词非常重要,调整了好多天的提示词后,AI返回的结果已经尽可能符合我们希望得到的结果了。

我们最满意海螺ai的效果,但是当我们想接到系统,发现海螺的Minimax公司下提供的接口,上传文件后返回的是文件id,无法喂给ChatCompletion接口使用。

发现Kimi的Moonshoot接口有上传文件功能,样例是会先把pdf转换成文字内容,再做逻辑判断。

提示词

先总结一下我最后使用的提示词吧。

需要明确AI的定位、为我们做些什么。如果有整理好需要AI提取的内容,直接整理成Json形式让它填写更好,也便于我们对接其他系统。给AI可执行的步骤,有特别的定义可以写定义,如果没有也可以去掉。特殊要求中的1我觉得十分重要,避免AI胡乱填写,其他则填写一些具体的逻辑相关需求,如哪个字段要怎么查找,需要做什么处理。

职位:你是一个勤劳的具备图像信息提取、信息规整的智能助手,不要进行任何形式的偷懒。

职能:我有一个文件,其中包含了大量信息。我已经准备了一个JSON模板,其中列出了我需要从PDF中提取的所有字段和结构。请根据PDF内容填写这个JSON模板。以下是JSON模板的示例结构:

{

"字段1":"",

"字段2":"",

"字段3":[

{

"字段3-1":"",

"字段3-2":"",

"字段3-3":""

}

],

}

请按照以下步骤操作:

  1. 阅读PDF文件:仔细阅读PDF文件,确保理解所有内容
  2. 填写JSON模板:根据PDF文件中的信息,填写上述JSON模板中的相应字段。
  3. 定义 :
    • XXXX内容为XX
  4. 特殊要求:
    • 对于没有在文件中找到的信息,请保留空白,不要胡编乱造。
    • 字段1需要在中文内容中查找
  5. 验证信息:在完成填写后,请仔细检查所有信息,确保没有遗漏或错误。尤其要再次核对是否都满足我的特殊要求了。
  6. 输出结果:将填好的JSON模板作为最终结果提供给我。

请确认你理解了我的要求,并开始处理文件。如果有任何不清楚的地方,请随时询问。

虽然复制是复杂了一些,但是目前测试下来效果还是蛮不错的。

Python API使用代码

其实我开始是试过使用Dify的,Dify现在支持上传PDF了,但是支持使用PDF内容的模型非常少。加上后来希望直接对接到我们现有系统里,于是还是直接上手试了一下API。

纯使用Moonshot的我这边就不贴出来了,文档里面写的很清晰。

https://platform.moonshot.cn/docs/api/files#%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6

借这个思路,我尝试了使用Moonshot提供的读取PDF接口,(虽然他的OCR效果不能说最佳,但是使用确实方便...),拿到信息后丢给Minimax来分析。我需要的场景下,确实这么做出来的结果要比纯Moonshot的更好一些。

如果涉及到返回结果里面有,易涉及隐私问题的文本信息,包括但不限于邮箱、域名、链接、证件号、家庭住址等,Minimax是默认会返回时候打星号。一定要记得加上"mask_sensitive_info":False。

python 复制代码
# -*- coding: utf-8 -*-
import requests
from pathlib import Path
from openai import OpenAI
import re
import json

group_id=""
api_key="" # <--在这里使用MiniMax账户管理-接口密钥中API KEY进行接入

client = OpenAI(
    api_key="MOONSHOT_API_KEY", # 在这里将 MOONSHOT_API_KEY 替换为你从 Kimi 开放平台申请的 API Key
    base_url="https://api.moonshot.cn/v1",
)
 
# moonshot.pdf 是一个示例文件, 我们支持文本文件和图片文件,对于图片文件,我们提供了 OCR 的能力
# 上传文件时,我们可以直接使用 openai 库的文件上传 API,使用标准库 pathlib 中的 Path 构造文件
# 对象,并将其传入 file 参数即可,同时将 purpose 参数设置为 file-extract;注意,目前文件上传
# 接口仅支持 file-extract 一种 purpose 值。
file_object = client.files.create(file=Path("720380146.pdf"), purpose="file-extract")

# 获取结果
# file_content = client.files.retrieve_content(file_id=file_object.id)
# 注意,某些旧版本示例中的 retrieve_content API 在最新版本标记了 warning, 可以用下面这行代替
# (如果使用旧版本的 SDK,可以继续延用 retrieve_content API)
file_content = client.files.content(file_id=file_object.id).text
#print(file_content)




url = "https://api.minimax.chat/v1/text/chatcompletion_pro?GroupId=" + group_id
headers = {"Content-Type":"application/json", "Authorization":"Bearer " + api_key}

payload = {
    "bot_setting":[
        {
            "bot_name":"MM智能助理",
            "content":"MM智能助理是一款由MiniMax自研的,没有调用其他产品的接口的大型语言模型。MiniMax是一家中国科技公司,一直致力于进行大模型相关的研究。",
        }
    ],
    "messages":[{"sender_type":"USER", "sender_name":"username", "text":file_content},{"sender_type":"USER", "sender_name":"username",  "text":"提示词"}],
    "reply_constraints":{"sender_type":"BOT", "sender_name":"MM智能助理"},
    "model":"abab6.5s-chat",
    "tokens_to_generate":2048,
    "temperature":0.01,
    "top_p":0.95,
    "mask_sensitive_info":False
}

response = requests.request("POST", url, headers=headers, json=payload)
response_msg = json.loads(response.text)


# 提取 choices[0].messages[0].text 的内容
result = response_msg['choices'][0]['messages'][0]['text']

#提取当中JSON返回的内容,其他部分为描述文字,这个场景下系统不需要
# 尝试找到JSON的开始和结束位置
try:
    # 找到第一个{的位置
    start = result.index('{')
    # 找到最后一个}的位置
    end = result.rindex('}')
    # 提取JSON字符串
    json_str = result[start:end+1]
    # 解析JSON字符串
    data = json.loads(json_str)
    print(data)
except (ValueError, json.JSONDecodeError) as e:#没有找到json内容
    print("系统错误")
相关推荐
博图光电11 小时前
Libra 27105相关技术参数
人工智能·数码相机
IT_陈寒11 小时前
SpringBoot自动配置差点让我加班到凌晨
前端·人工智能·后端
yumgpkpm11 小时前
Acceldata ODP(Open Data Platform)3.3.6.4(RHEL9)保姆级完整安装手册
大数据·人工智能·hive·hadoop·kafka·hbase·cloudera
程序员cxuan11 小时前
腾讯又来一王炸,开源版 WorkBuddy 太夯了!
人工智能·后端·程序员
邓工说电11 小时前
智慧断路器安全吗?数据加密、离线保护与合规认证全解读
大数据·数据库·人工智能·智能断路器·炜晔科技
阿里云大数据AI技术11 小时前
Lance 数据检索怎么选,当然阿里云 Milvus 向量湖
人工智能
出海客12 小时前
跨境电商多语言客服知识库怎么建:资料结构、检索边界与人工升级
大数据·人工智能
xsd2024111812 小时前
从自主导航到视觉读表:一台工业巡检机器人的全栈技术链路拆解
人工智能
袁哥大话安全12 小时前
巡隐WEBSHELL扫描软件
人工智能·安全·web
论文复现现场12 小时前
8卡4090能跑70B吗?Llama-2显存预算、QLoRA与通信瓶颈
人工智能·深度学习·分布式训练·llama·显存·qlora·算家云