当前位置: 首页 > news >正文

一键与图片对话!LLM实现图片关键信息提取与交互

本期文心开发者说邀请到飞桨开发者技术专家徐嘉祁,主要介绍了如何通过小模型与大模型的结合,解决数据分析中的问题。

图片

项目背景

在智能涌现的大模型时代,越来越多的企业和研究机构开始探索如何利用大模型来提升工作效率,助力业务智能化转型。但其实小模型与大模型结合后,能够更加高效、低成本地解决业务中出现的问题,带给用户不一样的体验。我想分享的内容是小模型与大模型结合后产生的理解记忆逻辑和生成能力。

在工作场景下,普遍存在效率问题。比如要想了解一张股东持股数据图的最大值与最小值,但面对密密麻麻的数据,人眼排序出错率高。比如你是一位数据工程师,领导让你对数据进行分析,如何能更快地将图片数据转为JSON格式。

在日常生活中,也常常出现难以解决或耗时过长的问题。例如,购买进口产品,国内消费者最大的困扰在于看不懂英文说明书。有些人可能会使用手机拍照翻译来理解或使用说明书,但这无法从根本上解决问题。

在这一背景下,我们的项目应运而生。

在2023年的WAVE SUMMIT+深度学习开发者大会上,文心一言通过飞桨星河社区提供一整套开发机制,社区用户可以通过API和SDK使用文心大模型的基础能力,并支持插件、多工具智能编排开发,创造AI原生应用。文心一言强大的能力也使得多个模态贯通成为可能,亦给我带来更多延伸思考:如果数据的呈现形式不是文档而是图片,我们是否依旧能对图片中的数据进行分析,甚至将其绘制成饼状图呢?

对此,我这次尝试给出的解决方案是使用小模型加大模型,也就是PP-OCR加上文心一言带来新的体验,也可以使得文心一言的应用范围更加广泛。

项目实现流程

该项目是如何实现的呢?

首先,用户上传图片,通过PP-OCR进行文本提取,将结果结合Prompt上传文心一言。文心一言同时对第一轮对话输入的Prompt和PP-OCR进行初步分析,再反馈结果给用户。

图片

项目前储备
PP-OCR

PP-OCR应用领域广泛,如自动化录入、数据统计、档案管理等。它可以将纸质文档快速准确地转化为数字化信息,极大地提升了办公效率与工作便利性。然而,PP-OCR还存在着一些挑战,例如对于手写字体、复杂排版或图像质量的识别准确性,仍存在局限。该项目使用的是PP-OCR v3的版本,在PP-OCR v2版本的基础上有所升级,能够优化后续开发流程。

图片

PP-OCR v3效果

飞桨星河社区 ERNIE SDK

ERNIE SDK提供便捷易用的接口,可以调用文心一言的能力,包含文本创作、通用对话、语义向量、Al作图等。

环境配置

环境配置包括星河社区的基础平台与环境,Python 3.7的版本,PaddlePaddle2.1.2,ERNIE SDK。

案例

接下来将以两个案例作为示意,说明应用的开发步骤。

股东持股
PP-OCR的配置

首先,安装PP-OCR,默认的是PP-OCR v3的版本。

!pip install paddleocr -i https://mirror.baidu.com/pypi/simple

通过以下这段代码检查是否有PP-OCR的数据集,中间需要选择股东持股的照片,因此需要先下载PP-OCR的数据集再进行解压。

import os
file_path = "ppocr_img.zip"
if os.path.isfile(file_path):print(file_path, "OK")
else:!wget https://paddleocr.bj.bcebos.com/dygraph_v2.1/ppocr_img.zip
file_path = "ppocr_img/imgs/00015504.jpg" #这里选择的是股东持股的图片,后面完成其他项目的时候需要改为说明书的图片
if os.path.isfile(file_path):print(file_path, "OK")
else:!unzip ppocr_img.zipprint("unzip OK!")

其次,将股东持股的图片路径传给变量,确认输入图片是否正确。

from IPython import display
display.Image(filename=file_path, width=640) #看看待处理图片

图片

随后,PP-OCR对图片的文本数据进行提取。

#图片OCR识别
from paddleocr import PaddleOCR, draw_ocr
# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
ocr = PaddleOCR(use_angle_cls=True, lang="ch")  
img_path = file_path
result = ocr.ocr(img_path, cls=True)
for idx in range(len(result)):res = result[idx]for line in res:print(line)

由于直接使用OCR输出结果进行文本分析和抽取的效果不佳,并且存在大量无关内容,影响大模型的处理速度,因此需要处理将识别出的内容,删除无关信息,留下关键数据。初步处理数据后,OCR输出的结果被存储在变量ocr_result1中,这是进行内容整理的基础。

ocr_result1 = ""
for idx in range(len(result)):res = result[idx]for line in res:
#         print(line[1][0])ocr_result1 = ocr_result1 + " " + str(line[1][0])
#         break
print(ocr_result1)
与文心一言进行交互

首先,需要对Prompt进行设计,这一步会影响到文心一言输出的结果。本项目的Prompt设置为“你现在的任务是从OCR文字识别的结果中提取我指定的关键信息。OCR的文字识别结果使用符号包围,包含所识别出来的文字,顺序在原始图片从左至右、从上至下。我指定的关键信息使用符号包围。请注意OCR文字识别结果可能会存在长句子换行被切断、不合理的分词、对应错位等问题,你需要结合上下文语义进行综合判断,以抽取准确的关键信息,输出为JSON格式。”

如果希望获得更详细的信息,需要与文心一言进行多轮对话。那么需要将设计好的Prompt传给文心一言。

#多轮对话
model = 'ernie-bot'
messages = [{'role': 'user', 'content': "你现在的任务是从OCR文字识别的结果中提取我指定的关键信息。OCR的文字识别结果使用```符号包围,包含所识别出来的文字,顺序在原始图片中从左至右、从上至下。我指定的关键信息使用[]符号包围。请注意OCR的文字识别结果可能存在长句子换行被切断、不合理的分词、对应错位等问题,你需要结合上下文语义进行综合判断,以抽取准确的关键信息。输出为JSON格式。"}]
first_response = erniebot.ChatCompletion.create(model=model,messages=messages,
)
print(first_response.result)

接着,将OCR的结果传给文心一言,进行第二轮对话。第二轮对话的结果是基于第一轮对话的Prompt和第二轮输入的OCR的result。

messages.append({'role': 'assistant', 'content': first_response.result})
messages.append({'role': 'user', 'content': ocr_result1})
second_response = erniebot.ChatCompletion.create(model=model,messages=messages,
)
print(second_response.result)

随后便可以开启第三轮对话,此处Prompt设计为“请你帮我分析前十名股东持股情况中,持股比例最多的是哪个?”

messages.append({'role': 'assistant', 'content': second_response.result})
messages.append({'role': 'user', 'content': "请你帮我分析前十名普通股东持股情况中,持股比例最多的是哪个?"})
third_response = erniebot.ChatCompletion.create(model=model,messages=messages,
)
print(third_response.result)

根据提供的信息,前十名普通股东持股情况中,持股比例最多的是“成都交子金融控股集团有限公司”,其持股比例为18.0613%。可以看到,文心一言不仅对数据做出了初步处理,还对数据进行了分析,找出了占比最大值。

英文说明书

流程和股东持股基本一致,都是采用小模型加大模型的流程进行开发,需要对Prompt进行修改。第一步,将图片路径改成“说明书的图片路径”。

file_path = "/home/aistudio/sms.jpg" #这里选择的是说明书的图片
from IPython import display
display.Image(filename=file_path, width=600) #看看待处理图片

图片第二步,对图片进行OCR识别。

#图片OCR识别
from paddleocr import PaddleOCR, draw_ocr
# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
ocr = PaddleOCR(use_angle_cls=True, lang="en")  
img_path = file_path
result = ocr.ocr(img_path, cls=True)
for idx in range(len(result)):res = result[idx]for line in res:print(line)

与第一个案例不同的是,该段内容由大段英文组成,需要再次对输出的结果进行处理,删除无关内容,将结果命名为OCR result 2。

第三步,对输出的result进行处理。

ocr_result2 = ""
for idx in range(len(result)):res = result[idx]for line in res:
#         print(line[1][0])ocr_result2 = ocr_result2 + " " + str(line[1][0])
#         break
print(ocr_result2)

第四步,设计Prompt,文心一言能够进行机器翻译,将result翻译成中文格式。接下来,可以进行多轮对话。

#多轮对话
model = 'ernie-bot'
messages = [{'role': 'user', 'content': "你现在的任务是从OCR文字识别的结果中提取我指定的关键信息。OCR的文字识别结果使用符号包围,包含所识别出来的文字,顺序在原始图片中从左至右、从上至下。我指定的关键信息使用[]符号包围。请注意OCR的文字识别结果可能存在长句子换行被切断、不合理的分词、对应错位等问题,你需要结合上下文语义进行综合判断,以抽取准确的关键信息。输出为JSON中文格式。"}]
first_response = erniebot.ChatCompletion.create(model=model,messages=messages,
)
print(first_response.result)
messages.append({'role': 'assistant', 'content': first_response.result})
messages.append({'role': 'user', 'content': ocr_result2})
second_response = erniebot.ChatCompletion.create(model=model,messages=messages,
)
print(second_response.result)
```json
{"重要安全说明": ["仅按本手册中的说明使用该产品,否则可能导致严重伤害。","使用电子设备时,应始终遵循基本预防措施以减少火灾、电击和人身伤害的风险,包括以下内容:","使用前:请勿在浴室等潮湿位置使用该设备。","警告:为减少火灾或电击的风险,请勿将本风扇与任何固态速度控制装置一起使用。","清洁说明:请勿使用腐蚀性化学品清洁电源插头或电源线,以免造成损坏、电击或火灾。","存储说明:请将设备存放在干燥的地方,并远离易燃和可燃物品。","使用提示:请勿将设备放在热源(如炉子或任何有可燃气体泄漏的地方)附近。","使用限制:如果电源线或任何机器部件损坏,必须由制造商、其服务代理或合格人员更换,以避免危险。","限制使用:本产品所提供的线缆含有化学品,如果设备在运行时产生特殊气味,请勿在有自由基、铅或镉化合物的地方使用。","加州法规提案65:在使用后,请立即洗手。"]
}```

此处,将Prompt设计为“上面这个产品是否可以放到潮湿的地方”,再提供给文心一言分析文本。

messages.append({'role': 'assistant', 'content': second_response.result})
messages.append({'role': 'user', 'content': "上面这个产品是否可以放到潮湿的地方?"})
third_response = erniebot.ChatCompletion.create(model=model,messages=messages,
)
print(third_response.result)

根据OCR文字识别结果,有一句话是“使用前:请勿在浴室等潮湿位置使用该设备。”因此,文心一言给出回答:“所以,这个产品不应该放在潮湿的地方,在使用电子设备时应该采取基本的预防措施。”文心一言不仅能基于文本提供答案,还会提供使用电子产品的建议。

总的来说,PP-OCR可以初步提取比较清晰的结果。

案例一:

案例一.png

案例二:

案例二.png

文心一言可以对数据进行预处理。例如案例一,将表格转化为图片中的格式。该技术能够极大地简化数据工程师的工作。

图片

对话二基于上一轮提取的数据输出的结果,可以帮助用户更快了解图片的信息。

图片

图片

总结

针对数据转换,该项目采用PP-OCR技术识别图片的文本信息,借此更加快速、准确地提取数据,规避手动输入造成的麻烦与错误。随后对获取的数据进行排序,找出最大值与最小值,并以JSON格式输出。该方法提高了数据处理和输出的效率。其次,文心一言能将英文说明书翻译为中文,并为用户解答具体问题、提供操作建议。因此,用户无需理解全篇说明书,只需询问特定问题,就能获得满意的答案。PP-OCR与文心一言的结合,使得大量数据处理更加高效,关键信息提取更加准确,同时解决了语言障碍所导致的产品使用问题,优化用户体验。这一项目展示了人工智能技术在解决生活和工作问题的巨大潜力,引领未来科技的发展方向。

其他解决方案

PaddleX中的PP-ChatOCRv2是一个融合了LLM大模型和OCR技术,用于进行通用文本图像智能分析的利器。该技术覆盖20+高频应用场景,支持5种文本图像智能分析能力和部署,包括通用场景关键信息抽取(快递单、营业执照和机动车行驶证等)、复杂文档场景关键信息抽取(解决生僻字、特殊标点、多页pdf、表格等难点问题)、通用OCR、文档场景专用OCR、通用表格识别。此外针对垂类业务场景,也支持模型训练、微调和Prompt优化。

欢迎在线体验:

https://aistudio.baidu.com/application/detail/10368

相关文章:

一键与图片对话!LLM实现图片关键信息提取与交互

本期文心开发者说邀请到飞桨开发者技术专家徐嘉祁,主要介绍了如何通过小模型与大模型的结合,解决数据分析中的问题。 项目背景 在智能涌现的大模型时代,越来越多的企业和研究机构开始探索如何利用大模型来提升工作效率,助力业务智…...

洛谷 P8833 [传智杯 #3 决赛] 课程 讲解

前言: 大家好! 我们又见面啦~~~ 对于我20多天没上号,深表歉意!! 希望大家给我的account点一个赞,加一个粉丝,谢谢! 也对CSDN的所有博主们送上衷心的祝福! 如有错误…...

中国IT产经新闻:新能源汽车发展前景与燃油车的利弊之争

随着科技的进步和环保意识的提高,新能源汽车在全球范围内逐渐受到重视。然而,在新能源汽车迅速发展的同时,燃油车仍然占据着主导地位。本文将从新能源与燃油车的利弊、新能源汽车的发展前景两个方面进行分析,以期为读者提供全面的…...

一、数据结构

一、 数组 1.1 数组 定义 遍历 // 遍历数组 传递指针 func traverse() {var b [...]int{1, 2, 3} //长度为3 元素为 1 2 3var ptr &b //ptr是指向数组的指针fmt.Println(b[0], b[1]) // 打印数组的前 2 个元素fmt.Println(ptr[0], ptr[1]) // 通…...

案例分享:各行业销售岗位的KPI指标制定分享

在当今竞争激烈的市场环境中,销售岗位的绩效考核至关重要。有效的绩效考核能帮助企业了解销售人员的业绩,激励他们提高效率,并确保销售战略的实现。关键绩效指标(KPI)作为绩效考核的核心,能精炼地反映销售人…...

【办公类-19-01】20240108图书统计登记表制作(23个班级)EXCEL复制表格并合并表格

背景需求: 制作一个EXCEL模板,每个班级的班主任统计 班级图书量(一个孩子10本,最多35个孩子350本) EXCEL模板 1.0版本: 将这个模板制作N份——每班一份 项目:班级图书统计表 核心:一个EXCEL模板批量生成…...

spring boot 2升级为spring boot 3中数据库连接池druid的问题

目录 ConfigurationClassPostProcessor ConfigurationClassBeanDefinitionReader MybatisPlusAutoConfiguration ConditionEvaluator OnBeanCondition 总结 近期给了一个任务,要求是对现有的 spring boot 2.x 项目进行升级,由于 spring boot 2.x 版…...

客服系统配置之Nginx处理静态资源和动态请求

Nginx直接处理静态资源,接口动态请求走反向代理到后端 这样可以减轻后端服务的压力 location / {try_files $uri kefu; }location kefu {# 这里是命名位置 kefu 的配置proxy_pass http://backend-server;# 其他反向代理的配置... }如果请求的是静态资源&#xff08…...

Golang 切片

前言 在Go语言中,切片是一个引用类型,它提供了对数组的动态窗口。切片并不存储任何数据,它只是描述了底层数组中的一个片段。切片的定义包括三个部分:指向数组的指针、切片的长度和切片的容量 基本使用 声明切片:声…...

防止公司办公终端文件数据 | 资料外泄,——自动智能透明加密防泄密软件系统

天锐绿盾公司电脑文件数据资料透明加密防泄密软件系统是一款专门用于保护企业电脑文件数据安全的软件系统。它采用透明加密技术,能够在不影响员工正常工作的情况下,对电脑上的文件数据进行自动加密,从而有效防止企业数据泄密。 PC端访问地址&…...

C#-枚举

枚举类型 (enum type) 是具有一组命名常量的独特的值类型。 下面的示例声明并使用一个名为 Color 的枚举类型,该枚举具有三个常量值 Red、Green 和 Blue: using System; using System;enum Color {Red,Green,Blue }class Test {static void PrintColor(…...

Java后端开发——SSM整合实验

文章目录 Java后端开发——SSM整合实验一、常用方式整合SSM框架二、纯注解方式整合SSM框架 Java后端开发——SSM整合实验 一、常用方式整合SSM框架 1.搭建数据库环境:MySQL数据库中创建一个名称为ssm的数据库,在该数据库中创建一个名称为tb_book的表 …...

VMware虚拟机安装Ubuntu

准备:Ubuntu的镜像文件,VMware,手. 1.新建虚拟机,选择自定义,下一步。 2.硬件兼容性,选择Workstation 16.x,下一步。 3.选择安装程序光盘映像文件,路径为映像文件所在文件夹,下一步。 4. 创建用户和设置密…...

用一个简单的例子说明单细胞分析中的dgCMatrix数据的结构

dgCMatrix用来存储矩阵的一种数据格式,这种数据格式很适合存储稀疏矩阵(即矩阵中大部分值为0)。dgCMatrix使用三个数组(分别是i,p,x)来存储矩阵。怎么存的呢? 先举一个普通矩阵的例…...

【小工具】pixi-live2d-display,直接可用的live2d的交互网页/桌面应用

效果&#xff1a; <script src"https://cubism.live2d.com/sdk-web/cubismcore/live2dcubismcore.min.js"></script> <script src"https://cdn.jsdelivr.net/gh/dylanNew/live2d/webgl/Live2D/lib/live2d.min.js"></script> <…...

vulhub中的Nginx漏洞的详细解析

Nginx漏洞 1.cd到nginx_parsing_vulnerability cd /opt/vulhub/nginx/nginx_parsing_vulnerability 2.执行docker-compose up -d 3.查看靶场是否开启成功 dooker ps 4.访问浏览器 因为这里是80端口所以直接使用ip就能访问成功 5.上传图片 注意这里的图片是含有一句话木马的图…...

如何实现公网访问GeoServe Web管理界面共享空间地理信息【内网穿透】

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除、插入…...

k8s-存储 11

一、configmapu存储 首先&#xff0c;确保集群正常&#xff0c;节点都处于就绪状态 Configmap用于保存配置数据&#xff0c;以键值对形式存储。configMap资源提供了向 Pod 注入配置数据的方法&#xff0c;旨在让镜像和配置文件解耦&#xff0c;以便实现镜像的可移植性和可复用…...

蓝牙信标定位原理

定位原理&#xff1a;蓝牙信标的定位原理是基于RSSI蓝牙信号强度来做定位的。 根据应用场景不同&#xff0c;通过RSSI定位原理可分为两种定位方式 一、存在性定位 这种方式通常要求所需定位的区域安装一个蓝牙信标即可&#xff0c;手持终端扫描蓝牙信标信号&#xff0c;扫描…...

单片机期末复习

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、单片机…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...