基于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("系统错误")
相关推荐
脆皮泡泡6 分钟前
Ultiverse 和web3新玩法?AI和GameFi的结合是怎样
人工智能·web3
机器人虎哥10 分钟前
【8210A-TX2】Ubuntu18.04 + ROS_ Melodic + TM-16多线激光 雷达评测
人工智能·机器学习
码银17 分钟前
冲破AI 浪潮冲击下的 迷茫与焦虑
人工智能
何大春21 分钟前
【弱监督语义分割】Self-supervised Image-specific Prototype Exploration for WSSS 论文阅读
论文阅读·人工智能·python·深度学习·论文笔记·原型模式
uncle_ll29 分钟前
PyTorch图像预处理:计算均值和方差以实现标准化
图像处理·人工智能·pytorch·均值算法·标准化
宋1381027972029 分钟前
Manus Xsens Metagloves虚拟现实手套
人工智能·机器人·vr·动作捕捉
SEVEN-YEARS33 分钟前
深入理解TensorFlow中的形状处理函数
人工智能·python·tensorflow
世优科技虚拟人36 分钟前
AI、VR与空间计算:教育和文旅领域的数字转型力量
人工智能·vr·空间计算
cloud studio AI应用42 分钟前
腾讯云 AI 代码助手:产品研发过程的思考和方法论
人工智能·云计算·腾讯云
禁默1 小时前
第六届机器人、智能控制与人工智能国际学术会议(RICAI 2024)
人工智能·机器人·智能控制