实验 | 使用本地大模型从论文PDF中提取结构化信息

news2025/3/12 20:08:47

非结构文本、图片、视频等数据是待挖掘的数据矿藏, 在经管、社科等研究领域中谁拥有了_从非结构提取结构化信息的能力_,谁就拥有科研上的数据优势。正则表达式是一种强大的文档解析工具,但它们常常难以应对现实世界文档的复杂性和多变性。而随着chatGPT这类LLM的出现,为我们提供了更强大、更灵活的方法来处理多种类型的文档结构和内容类型。

为方便理解和实验,今天再新增一个案例,即论文处理的场景为例

一、任务

从海量的论文pdf文件中批量提取出

1.1 为何选择LLM,而不是正则表达式

在灵活性、上下文理解能力、维护和可扩展性三方面, 我们对比一下LLM和正则表达式

方面LLM正则表达式
灵活性能够自动理解和适应各种文档结构,并且无论位于文档的什么位置,都能够识别相关信息。需要每个文档结构都有特定的模式,当给定的文档偏离预期的格式时就会失败。
上下文理解对每个文档的含义有细致的理解,从而可以更准确地提取相关信息。无需理解上下文或含义即可匹配模式。
维护和可扩展性可以轻松适应新的文档类型,只需在初始提示中进行最少的更改,从而使其更具可扩展性。需要随着文档格式的变化而不断更新。添加对新类型信息的支持需要编写一个全新的正则表达式。

综上, 选择LLM更适合做「从论文PDF中提取信息」这一任务。

1.2 工作流程

为了方便实验,让我们以论文处理的场景为例,下图是使用LLM批量提取论文中元信息的工作流程。

工作流程总体上有三个主要组成部分:输入、处理和输出。

  • 首先,提交文件(在本例中为PDF格式的科研论文)进行处理。

  • 处理组件的第一个模块从每个 PDF 中提取原始数据,并将其与包含大型语言模型指令的提示相结合,以有效地提取数据。

  • 然后,大型语言模型使用提示来提取所有元数据。

  • 对于每个PDF,最终结果以JSON格式保存,可用于进一步分析。

二、准备工作

2.1 安装ollama

点击前往网站 https://ollama.com/ ,下载ollama软件,支持win、Mac、linux

2.2 下载LLM

ollama软件目前支持多种大模型, 如阿里的(qwen、qwen2)、meta的(llama3、llama3.1), 本文选择最近新出的模型 llama3.1

以llama3.1为例,根据自己电脑显存性能, 选择适宜的版本。如果不知道选什么,那就试着安装,不合适不能用再删除即可。

打开电脑命令行cmd(mac是terminal), 网络是连网状态,执行模型下载(安装)命令

ollama pull llama3.1  

等待 llama3.1:8b 下载完成。

2.3 安装python包

在python中调用ollama服务,需要ollama包。

打开电脑命令行cmd(mac是terminal), 网络是连网状态,执行安装命令

pip3 install ollama  

2.4 启动ollama服务

在Python中调用本地ollama服务,需要先启动本地ollama服务, 打开电脑命令行cmd(mac是terminal), 执行

ollama serve  

Run

2024/08/03 14:52:24 routes.go:1011: INFO server config env="map[OLLAMA_DEBUG:false OLLAMA_FLASH_ATTENTION:false OLLAMA_HOST:http://127.0.0.1:11434 OLLAMA_KEEP_ALIVE: OLLAMA_LLM_LIBRARY: OLLAMA_MAX_LOADED_MODELS:1 OLLAMA_MAX_QUEUE:512 OLLAMA_MAX_VRAM:0 OLLAMA_MODELS:/Users/deng/.ollama/models OLLAMA_NOHISTORY:false OLLAMA_NOPRUNE:false OLLAMA_NUM_PARALLEL:1 OLLAMA_ORIGINS:[http://localhost https://localhost http://localhost:* https://localhost:* http://127.0.0.1 https://127.0.0.1 http://127.0.0.1:* https://127.0.0.1:* http://0.0.0.0 https://0.0.0.0 http://0.0.0.0:* https://0.0.0.0:* app://* file://* tauri://*] OLLAMA_RUNNERS_DIR: OLLAMA_TMPDIR:]"  
time=2024-08-03T14:52:24.742+08:00 level=INFO source=images.go:725 msg="total blobs: 18"  
time=2024-08-03T14:52:24.742+08:00 level=INFO source=images.go:732 msg="total unused blobs removed: 0"  
time=2024-08-03T14:52:24.743+08:00 level=INFO source=routes.go:1057 msg="Listening on 127.0.0.1:11434 (version 0.1.44)"  
time=2024-08-03T14:52:24.744+08:00 level=INFO source=payload.go:30 msg="extracting embedded files" dir=/var/folders/y0/4gqxky0s2t94x1c1qhlwr6100000gn/T/ollama4239159529/runners  
time=2024-08-03T14:52:24.772+08:00 level=INFO source=payload.go:44 msg="Dynamic LLM libraries [metal]"  
time=2024-08-03T14:52:24.796+08:00 level=INFO source=types.go:71 msg="inference compute" id=0 library=metal compute="" driver=0.0 name="" total="72.0 GiB" available="72.0 GiB"  

cmd(mac是terminal)看到如上的信息,说明本地ollama服务已开启。

三、实验

3.1 代码结构

project  
   |  
  - Extract_Metadata_With_Large_Language_Models.ipynb  
  - prompts  
       |--- scientific_papers_prompt.txt  
  - data  
      |--- 1706.03762v7.pdf  
      |--- 2301.09056v1.pdf  
  - extracted_metadata/  

  • project文件夹 是根文件夹,包含 ipynb代码文件prompts文件夹data文件夹extracted_metadata文件夹

  • prompts文件夹 有txt文件格式的提示信息

  • data文件夹 存储着实验论文pdf数据

  • extracted_metadata文件夹 目前为空,将存储从论文pdf中提取的元信息,以 json 文件格式存储

3.2 提示工程

我们需要从论文pdf中提取

这是我设计的提示, 该提示存储在 prompts/scientific_papers_prompt.txt 中。

科学研究论文:  
---   
{document}   
---  
  
您是分析科学研究论文的专家。 请仔细阅读上面提供的研究论文,并提取以下关键信息:  
  
从研究论文中提取以下六 (6) 个属性:  
- 论文标题:研究论文的全名  
- 出版年份:论文发表的年份  
- 作者:论文所有作者的全名  
- 作者联系方式:字典列表,其中每个字典包含每个作者的以下键:  
  - 姓名:作者的全名  
  - 机构:作者的机构隶属关系  
  - 电子邮件:作者的电子邮件地址(如果提供)  
- 摘要:论文摘要的全文  
- 摘要总结:用 2-3 句话简洁地总结摘要,突出重点  
  
指南:  
- 提取的信息应属实,并准确无误。  
- 除摘要外,应极其简洁,摘要应完整复制。  
- 提取的实体应该是独立的,并且不需要论文的其余部分就能轻松理解。  
- 如果论文中缺少任何属性,请将该字段留空,而不是猜测。  
- 对于摘要总结,重点介绍研究的主要目标、方法和主要发现。  
- 对于作者联系方式,请为每个作者创建一个条目,即使缺少一些信息。如果没有提供作者的电子邮件或机构,请在字典中将该字段留空。  
  
以 JSON 格式回答。JSON 应包含 6 个键:"PaperTitle", "PublicationYear", "Authors", "AuthorContact", "Abstract", "SummaryAbstract"。 "AuthorContact"字段应该是字典列表格式。  

3.2 提取信息

读取 data/1706.03762v7.pdf, 提取该论文首页中感兴趣的6个信息,如

%%time  
  
import ollama  
import cntext as ct    
#cntext版本为2.1.2,非开源, #需联系大邓372335839获取  
  
#我们感兴趣的信息在论文的第一页,所以这里粗糙的选择前4000个字符。  
paper_content = ct.read_pdf('data/1706.03762v7.pdf')[:4000]  
prompt_content = open('prompts/scientific_papers_prompt.txt', encoding='utf-8').read()  
  
response = ollama.chat(model='llama3.1:8b',   
                       messages = [  
                           {'role': 'system', 'content': prompt_content},  
                           {'role': 'user', 'content': paper_content}  
                       ])  
  
result = response['message']['content']  
result = eval(result.split('```\n')[1].split('\n```')[0])  
result  

Run

CPU times: user 3.5 ms, sys: 2.13 ms, total: 5.63 ms  
Wall time: 11.8 s  
  
  
{'PaperTitle': 'Attention Is All You Need',  
 'PublicationYear': 2017,  
 'Authors': ['Ashish Vaswani',  
  'Noam Shazeer',  
  'Niki Parmar',  
  'Jakob Uszkoreit',  
  'Llion Jones',  
  'Aidan N. Gomez',  
  'Łukasz Kaiser',  
  'Illia Polosukhin'],  
 'AuthorContact': [{'Name': 'Ashish Vaswani',  
   'Institution': 'Google Brain',  
   'Email': 'avaswani@google.com'},  
  {'Name': 'Noam Shazeer',  
   'Institution': 'Google Brain',  
   'Email': 'noam@google.com'},  
  {'Name': 'Niki Parmar',  
   'Institution': 'Google Research',  
   'Email': 'nikip@google.com'},  
  {'Name': 'Jakob Uszkoreit',  
   'Institution': 'Google Research',  
   'Email': 'usz@google.com'},  
  {'Name': 'Llion Jones',  
   'Institution': 'Google Research',  
   'Email': 'llion@google.com'},  
  {'Name': 'Aidan N. Gomez',  
   'Institution': 'University of Toronto',  
   'Email': 'aidan@cs.toronto.edu'},  
  {'Name': 'Łukasz Kaiser',  
   'Institution': 'Google Brain',  
   'Email': 'lukaszkaiser@google.com'},  
  {'Name': 'Illia Polosukhin',  
   'Institution': '',  
   'Email': 'illia.polosukhin@gmail.com'}],  
 'Abstract': 'The dominant sequence transduction models are based on complex recurrent or convolutional neural networks that include an encoder and a decoder. The best performing models also connect the encoder and decoder through an attention mechanism. We propose a new simple network architecture, the Transformer, based solely on attention mechanisms, dispensing with recurrence and convolutions entirely.',  
 'SummaryAbstract': '本文提出了一种新的Transformer模型,基于注意力机制,抛弃了递归和卷积等复杂方法。该模型在机器翻译任务上表现出优异的效果,并且可以更好地并行化和训练。'}  

从运行结果看, 摘要_Abstract_ 的提取不够准确,有一定的遗漏。

3.3 封装成函数extract_info

实验成功,我们将其封装为函数_extract_info_ ,因为LLM返回的内容的格式存在不确定性, 所以为了保证函数尽可能的成功的运行出结果,这里我设置了异常处理机制。

import ollama  
import cntext as ct    
#cntext版本为2.1.2,非开源, #需联系大邓372335839获取  
  
  
def extract_info(paper_content, prompt_content, max_retries=3):  
    for attempt in range(max_retries + 1):  
        try:  
            response = ollama.chat(  
                model='llama3.1:8b',  
                messages=[  
                    {'role': 'system', 'content': prompt_content},  
                    {'role': 'user', 'content': paper_content}  
                ]  
            )  
  
            result = response['message']['content']  
            result = eval(result.split('```\n')[1].split('\n```')[0])  
            return result  
          
        except Exception as e:  
            if attempt < max_retries:  
                print(f"An error occurred: {e}. Retrying ({attempt + 1}/{max_retries + 1})...")  
            else:  
                raise e  
  
  
#我们感兴趣的信息在论文的第一页,所以这里粗糙的选择前4000个字符。  
paper_content = ct.read_pdf('data/1706.03762v7.pdf')[:4000]  
prompt_content = open('prompts/scientific_papers_prompt.txt', encoding='utf-8').read()  
  
result = extract_info(paper_content, prompt_content)  
result  

运行结果与之前无异,为节约板面空间,这里就不展示result了。

3.4 批量提取

假设data文件夹内有成百上千的发票(实际上只有一张发票), 对data文件夹进行批量信息提取,结果存储为csv。

%%time  
  
import os  
#cntext版本为2.1.3,非开源,需联系大邓372335839获取  
import cntext as ct  
import pandas as pd  
import jsonlines  
  
#当前代码所在的代码文件与data文件夹处于同一个文件夹内  
#获取data内所有pdf的路径  
pdf_files = [f'data/{file}' for file in os.listdir('data') if '.pdf' in file]  
prompt_content = open('prompts/scientific_papers_prompt.txt', encoding='utf-8').read()  
  
for pdf_file in pdf_files:  
    paper_content = ct.read_pdf(pdf_file)[:4000]  
    dict_data = extract_info(paper_content, prompt_content)  
    jsonf = pdf_file.replace('data', 'extracted_metadata').replace('pdf', 'jsonl')  
    with jsonlines.open(jsonf, 'w') as jf:  
        jf.write(dict_data)  

Run

CPU times: user 919 ms, sys: 14.8 ms, total: 933 ms  
Wall time: 24.6 s  

四、讨论

本文简要概述了 LLM 在从复杂文档中提取元数据方面的应用,提取的 json 数据可以存储在非关系数据库中以供进一步分析。

LLM 和 Regex 在内容提取方面各有优缺点,应根据用例明智地应用每种方法。希望本简短教程能帮助您获得新技能。

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2191135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Codeforces】CF 2007 E

E. Iris and the Tree #树形结构 #贪心 #数学 题目描述 Given a rooted tree with the root at vertex 1 1 1. For any vertex i i i ( 1 ≤ i ≤ n 1 \leq i \leq n 1≤i≤n) in the tree, there is an edge connecting vertices i i i and p i p_i pi​ ( 1 ≤ p i ≤…

Python使用matplotlib绘制图形大全(曲线图、条形图、饼图等)

matplotlib 的主要组成部分是 pyplot&#xff0c;它是一个类似于 MATLAB 的绘图框架。pyplot 提供了一个 MATLAB 式的接口&#xff0c;可以隐式地创建图形和轴&#xff0c;使得绘图变得简单。 以下是一个简单的 matplotlib 使用示例&#xff0c;用于绘制一条简单的折线图&…

Linux:进程间通信之信号量

system V的进程间通信除了共享内存&#xff0c;还有消息队列和信号量 IPC&#xff08;进程间通信的简称&#xff09; 消息队列 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 每个数据块都被认为是有一个类型&#xff0c;接收者进程接收的数据块可以有不同…

Electron 使⽤ electron-builder 打包应用

electron有几种打包方式&#xff0c;我使用的是electron-builder。虽然下载依赖的时候让我暴躁&#xff0c;使用起来也很繁琐&#xff0c;但是它能进行很多自定义&#xff0c;打包完成后的体积也要小一些。 安装electron-builder&#xff1a; npm install electron-builder -…

cherry-markdown开源markdown组件详细使用教程

文章目录 前言开发定位目标调研技术方案前提工作量安排数据库表设计实现步骤1、引入依赖2、实现cherry-markdown的vue组件&#xff08;修改上传接口路径&#xff09;3、支持draw.io组件4、支持展示悬浮目录toc前端使用&#xff1a;编辑状态使用cherry-markdown的vue组件前端使用…

图像转3D视差视频:DepthFlow

参看: https://github.com/BrokenSource/DepthFlow 通过深度图实现图像3d效果 安装 https://brokensrc.dev/get/pypi/#installing pip insatll depthflow shaderflow broken-source pianola spectronote turbopipe 使用 1、下载项目 git clone https://github.com/BrokenS…

巧用armbian定时任务控制开发板LED的亮灭

新买了个瑞莎 3E 开发板,号称最小SBC,到了之后简直玩开了花,各种折腾后 安装好armbian系统,各种调优。 不太满意的地方:由于太小的原因,导致两个USBTYPEC的接口距离很近,所以买的OTG转接口如果有点宽的话 会显得特别拥挤。 还有就是每天晚上天黑了之后,卧室里的…

大数据处理从零开始————4.认识HDFS分布式文件系统

1.分布式文件系统HDFS 1.1 认识HDFS 当单台服务器的存储容量和计算性能已经无法处理大文件时&#xff0c;分布式文件系统应运而生。什么是分布式系统&#xff0c;分布式系统是由多个独立的计算机或节点组成的系统&#xff0c;这些计算机通过网络连接&#xff…

Map: 地图

对全国2023年各省市的人口分布情况&#xff0c;做出地图展示效果 参考&#xff1a;Map - Map_base - Document (pyecharts.org) 1、模板 # -*- coding: gbk -*- from pyecharts import options as opts from pyecharts.charts import Map from pyecharts.faker import Faker…

如何安全地大规模部署 GenAI 应用程序

大型语言模型和其他形式的生成式人工智能(GenAI) 的广泛使用带来了许多组织可能没有意识到的安全风险。幸运的是&#xff0c;网络和安全提供商正在寻找方法来应对这些前所未有的威胁。 随着人工智能越来越深入地融入日常业务流程&#xff0c;它面临着泄露专有信息、提供错误答…

交换排序:冒泡排序、递归实现快速排序

目录 冒泡排序 1.冒泡排序的核心思想 2.冒泡排序的思路步骤 3.冒泡排序代码 4.代码分析 5.对冒泡排序的时间复杂度是O(N^2)进行解析 6.冒泡排序的特性总结 递归实现快速排序(二路划分版本) 1.快速排序基本思路 2.代码思路步骤 3.代码实现 4.代码分析 (1)递归终止条…

队列的实现与讲解

一.概念与结构 1.概念 只允许在⼀端进行插⼊数据操作&#xff0c;在另⼀端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) ​ 入队列&#xff1a;进⾏插⼊操作的⼀端称为队尾 ​ 出队列&#xff1a;进⾏删除操作的⼀端称为队头 注意&…

美联储巨亏背后的秘密

听说美联储报告称亏损已破2000亿美元&#xff0c;这一数字无疑触动了市场的敏感神经。 亏损的直接原因是美联储在加息周期期间&#xff0c;为了维持短期利率在目标水平&#xff0c;向金融机构支付的利息超过了其持有债券的利息收入。 然而&#xff0c;美联储官员强调&#xff…

学习C语言(23)

整理今天的学习内容 1.文件的概念 使用文件是为了将数据永久化地保存 按照文件功能&#xff0c;在程序设计中一般把文件分成两类&#xff1a; 每个文件都有一个唯一的文字标识&#xff0c;文字标识常被称为文件名&#xff0c;文件名包含文件路径&#xff0c;文件名主干和文件…

如何快速切换电脑的ip地址

在当今的数字化时代&#xff0c;IP地址作为网络身份的重要标识&#xff0c;其重要性日益凸显。无论是出于保护个人隐私的需要&#xff0c;还是为了访问特定的网络服务等&#xff0c;快速切换电脑的IP地址已成为许多用户的迫切需求。本文将为你介绍几种实用的方法&#xff0c;帮…

【Hadoop】改一下core-site.xml和hdfs-site.xml配置就可以访问Web UI

core-site.xml&#xff1a; hdfs-site.xml&#xff1a; 所有的都改为0.0.0.0 就可以访问Web UI 原因&#xff1a; 使用 0.0.0.0 作为绑定地址时&#xff0c;实际会将服务监听在所有可用的网络接口上。这意味着&#xff0c;任何从外部访问的请求都可以通过任何网络适配器连接到…

黑神话:仙童,数据库自动反射魔法棒

黑神话&#xff1a;仙童&#xff0c;数据库自动反射魔法棒 Golang 通用代码生成器仙童发布了最新版本电音仙女尝鲜版十一及其介绍视频&#xff0c;视频请见&#xff1a;https://www.bilibili.com/video/BV1ET4wecEBk/ 此视频介绍了使用最新版的仙童代码生成器&#xff0c;将 …

算法笔记(六)——链表

文章目录 两数相加两两交换链表中的节点重排链表合并 K 个升序链表K个一组翻转链表 技巧: 画图观察指针指向&#xff1b;添加虚拟头节点&#xff1b;可以多定义几个节点&#xff1b;快慢双指针&#xff1b; 常见操作&#xff1a; 定义new head逆序时&#xff0c;头插 ListNode*…

带你深入浅出设计模式:八、适配器模式:代码世界中的万能转换器

此为设计模式第八谈&#xff01; 用总-分-总的结构和生活化的例子给你讲解设计模式&#xff01; 码农不易&#xff0c;各位学者学到东西请点赞收藏支持支持&#xff01; 开始部分&#xff1a; 总&#xff1a;适配器模式主要解决的问题是已有类的接口与所需的接口不匹配的问题…

[Python学习日记-38] Python 中的函数的名称空间

[Python学习日记-38] Python 中的函数的名称空间 简介 名称空间 作用域查找顺序 简介 在前面学习函数的时候我们发现&#xff0c;函数内部也有一个内存空间是用于存储函数自己的一些变量的&#xff0c;及时这个变量名与外部的变量名一样是也没关系&#xff0c;Python 会优先…