基于LLM大模型的信息提取指南

信息提取(information Extraction)是从文本或文档集合中自动检索与特定主题相关的特定信息的过程。 这通常涉及自然语言处理技术的使用。 使用自然语言处理来提取信息通常会导致构建复杂的逻辑,这些逻辑有时非常具体并且不能很好地概括。

好吧……但是我们在谈论什么复杂的逻辑呢?

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包

复杂的逻辑可能涉及技术,例如尝试设计可以解析某些类型文档的模块。 人们必须浏览大量文档才能对布局有一个大致的了解,然后尝试提出依赖于 AWS Textract 等 OCR 服务中的键值对提取的模块,或者使用基于自然语言的提取逻辑来设计 复杂的正则表达式或只是简单地在某些关键字的空间局部性中搜索其相应的值。 这些方法虽然成功,但不能完全不受文档结构变化的影响。

随着在数百万文档和文本的语料库上训练的大型语言模型 (LLM) 的出现,解决这个问题变得相当容易。 大型语言模型可以轻松提取有关给定上下文和模式的属性的信息。 在大多数简单的情况下,它们不需要对任务进行额外的微调,并且可以很好地泛化。 LLM可以更好地分析的文档类型包括简历、法律合同、租赁、报纸文章和其他非结构化文本文档。

此外,为了实现 LLM 功能的民主化,OpenAI 提供了 API,可用于从 GPT 3.5 和 GPT 4 等 LLM 产品生成结果。

在本文中,我将讨论一个非常基本的信息提取管道可能是什么样子,以及如何使用 LangChain 和 Streamlit 等现代 Python 框架,轻松地围绕 LLM 构建 Web 应用程序。

实现方案如下图所示:

信息提取系统示意图

1、光学字符识别

从图像中提取机器可读格式的文本称为光学字符识别 (OCR)。 任何信息提取产品或服务的第一步都是从文档中提取文本。 该文档可以是 PDF 文件或扫描/捕获的图像。 最终,PDF 被转换为图像集合,其中每个页面都被转换为单个图像。 因此,OCR 模型本身仅适用于图像。

有许多付费和开源 OCR 服务可用。 在本文中,我使用一个名为 Tesseract 的开源项目来执行 OCR 并检索文本。

项目中的 OCR 类是一个 Python Protocol,可以扩展以实现不同的付费 OCR 服务,如 Tesseract、AWS Textract、Azure Vision API 等。

from typing import Protocol


class OCR(Protocol):
    """
    OCR Protocol Class
    """

    def get_text_response(self, images: list) -> list:
        pass

使用 Tesseract 扩展 OCR类:

import pytesseract

from ocr import OCR

class TesseractOCR(OCR):
    def get_text_response(self, images: list) -> list:
        """Generates ocr response from list of images
        Args:
            images (list): list of images to be processed.
        Returns:
            list: list of ocr responses for each image.
        """
        pdf_texts = []
        for image in images:
            text = pytesseract.image_to_string(image)
            pdf_texts.append(text)
        return pdf_texts

同样,可以扩展相同的 OCR 协议来实现 OCR 产品的其他类,例如 AWS Textract 和 Azure Vision。

2、LangChain 提取和模式生成器

Schema Builder(模式生成器)从LLM获得结构化的输出。 模式是属性的集合。 该模式将以提供的格式输出结果。 模式中的每个属性都需要定义三个属性:属性名称、属性类型以及属性是否必需。

一旦构建了模式,它就可以用于生成LLM的结构化输出:

来源:https://python.langchain.com/docs/use_cases/extraction

在上图中,输入充当 LLM 的上下文。 模式提供了输出的格式,还指定了需要提取的字段及其相应的数据类型。 LangChain支持的可能的数据类型是“字符串”和“整数”。 一旦我们有了上下文和模式,就可以将它们提供给 LLM 以生成响应。

3、LangChain

LangChain 是一个用于开发利用语言模型力量的应用程序的框架。 它使应用程序能够:

  • 具有上下文感知能力
  • 进行推理

本文使用了LangChain中与Extraction相关的功能。 一些 LLM(例如 OpenAI)可以调用函数从 LLM 响应中提取任意实体。 这些函数可用于获取具有指定模式的结构化模型输出。

"""
LLM Handler Code
"""

from langchain.chat_models import ChatOpenAI
from langchain.chains import create_extraction_chain


class LLM:
    """Handles communication with OpenAI LLMs"""

    def __init__(self, temperature: float, openai_api_key: str) -> None:
        self.llm = ChatOpenAI(temperature=temperature, openai_api_key=openai_api_key)

    def analyze_text(self, text: str, schema: dict) -> dict:
        """Analyze text according to schema
        Args:
            text (str): OCR Output to be analyzed
            schema (dict): Schema to be processed
        Returns:
            dict: LLM Response
        """
        chain = create_extraction_chain(schema, self.llm)
        return chain.run(text)

所以,管道是这样的,我们从 OCR 模块获取机器可读格式的文本,并且我们还构建架构来指定输出的结构。

OCR 输出的文本是上下文,架构生成器帮助准备所需格式的架构。 一旦我们有了这两个,那么我们就使用 LangChain 的 create_extraction_chain 函数来生成输出。

可以从这里 了解有关 LangChain 提取技术的更多信息。

4、Streamlit前端

所有机器学习应用程序都需要交互式 Web 应用程序,以便更轻松地呈现其结果和性能。 Streamlit 是一个免费、开源、全 Python 框架,使数据科学家能够快速构建交互式仪表板和机器学习 Web 应用程序,而无需前端 Web 开发经验。

为了展示使用 Streamlit 和 Langchain 构建交互式应用程序是多么容易,这里有一个代码片段和生成的 Web 应用程序。

import streamlit as st
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate

# Streamlit App Title
st.title("🦜🔗 Langchain - Blog Outline Generator App")

# OpenAI API key required to access their APIs
openai_api_key = st.sidebar.text_input("OpenAI API Key", type="password")


def blog_outline(topic:str):
    # Instantiate LLM model
    llm = OpenAI(model_name="gpt-3.5-turbo-instruct", openai_api_key=openai_api_key)
    
    # Prompt
    template = "As an experienced data scientist and technical writer, generate an outline for a blog about {topic}."
    
    prompt = PromptTemplate(input_variables=["topic"], template=template)
    prompt_query = prompt.format(topic=topic)
    
    # Run LLM model
    response = llm(prompt_query)
    
    # Print results
    return st.info(response)


with st.form("myform"):
    topic_text = st.text_input("Enter prompt:", "")
    submitted = st.form_submit_button("Submit")
    
    if not openai_api_key:
        st.info("Please add your OpenAI API key to continue.")
        
    elif submitted:
        blog_outline(topic_text)

请在你的数据上尝试更多 Streamlit 应用程序示例,并阅读其文档和教程以了解更多信息。 整个信息提取应用程序是使用 Streamlit 设计的!

5、状态机

因此,关于 Streamlit 需要注意的一件事是,每当有人与应用程序“交互”时,脚本就会从上到下重新执行。 所以在这里,交互意味着单击按钮或移动滑块。 因此,要构建具有多个阶段的 Streamlit 应用程序,在编写代码时使用状态设计模式是有益的。

上面是该信息提取应用程序的整个代码中使用的状态图和转换。 为了遵守状态设计模式的规则,使用了名为 Transitions 的 Python 包,它提供了轻量级状态机实现。 但人们也可以实现自己的状态机。

6、应用程序

欢迎页提示你输入 OpenAPI 密钥以继续操作。 我还提供了免费试用最多五次的功能。

文件上传页等待上传要上传的文件(图像或 PDF)。 也可以上传多个文件。 该应用程序支持 JPG、PNG 和 PDF 文件格式。

架构生成器页用来构建模式来接收来自 OpenAI 提取 API 的结构化输出。

LLM输出页将提取 API 的输出显示为数据框。 每个上传的文件都会被分析,其输出显示为单独的选项卡。 侧边栏还显示原始架构,可以更改它以重新分析所有文档。

因此,正如你在 LLM 输出屏幕中看到的那样,数据框的列是我指定的字段,值是 OpenAI LLM 输出的值。

7、GitHub 存储库

在这里,我提供了包含此应用程序代码的两个存储库的链接。 我使用 Flask 和单独的 Streamlit App 存储库创建了一个 OCR API。

  • OCR 存储库 — https://github.com/mohan-aditya05/text_analysis_ocr_service
  • 应用程序存储库 — https://github.com/mohanbing/st_doc_ext

8、结束语

该应用程序有效地展示了大型语言模型的强大功能以及它们如何在不同文档上很好地泛化。 在LLM的帮助下,信息提取任务变得非常容易。 此外,使用 Streamlit,只需具备 Python 知识,无需任何前端经验,就可以轻松开发出外观非常现代的前端。 它是围绕机器学习模型构建概念验证和小型应用程序的完美框架。

警告!!!
认为仅使用 LLM 就能帮助你解决所有信息提取问题的想法并不谨慎。 像 ChatGPT 这样的LLM旨在理解自然语言。 它们可能不适用于仅包含键值对或表格信息且不同标记之间没有真正语言关系的文档。 为了处理这些类型的文档,使用其他传统的信息提取技术可能仍然更好。 不过,随着支持视觉的 GPT 4 的到来,这个问题也可能得到解决。

原文链接:LLM信息提取指南 - BimAnt

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux例行性工作 at和crontab命令

1,例行性工作 例行性工作 —— 在某一时刻,必须要做的事情 —— 定时任务 (比如:闹钟) 例行性工作分为两种:“单一的例行性工作 at”和“循环的例行性工作 crontab” 2,单一执行的例行性工作 …

C 程序运行机制

1.编辑 编写C语言源程序代码,源程序文件以“.c”作为扩展名。 2.编译 将C语言源程序转换为目标程序(或目标文件)。如果程序没有错误,没有任何提示,就会生成一个扩展名为“.obj”的二进制文件。C语言中的每条可执行语句经过编译后最终都将被…

Go语言中的HTTP请求发送

在Go语言中,发送HTTP请求是一种常见的网络操作。Go语言的net/http包提供了强大的API,使开发者能够轻松地构建HTTP请求并处理响应。 下面我们将详细介绍如何使用Go语言发送HTTP请求,包括设置请求参数、处理响应状态码和头部信息、发送JSON数据…

中湖盐——健康盐,盐中贵族

祁连山古老的盐湖,有一个水晶女和玉莹郎的传说,他们来到凡间做盐为生,做出的盐像水晶玉莹一样纯净。直到有一天,始皇帝传旨修长城,玉莹和水晶不忍百姓疾苦,用相思之泪化为了水晶般的白盐;血肉精华冶炼成萤石般的盐根,造福一方。 雪水溶积汇入的盐湖,水天倒映,美不胜收,中湖盐坚…

Zero-Shot Learning—A Comprehensive Evaluation of the Good, the Bad and the Ugly

目录 背景知识why zero-shot learning?广义零样本学习设置 1 INTRODUCTION1.1 zero-shot learning——methods1.2 zero-shot learning——datasets1.3 zero-shot learning——evaluation protocol 2 RELATED WORK2.1 早期工作2.1.1 Attribute-based classification for zero-s…

STC8H8K蓝牙智能巡线小车——3.按键开关状态获取

电路分析 引脚为P37开关未按下时,P37是高电平开关按下时,GND导通,P37是低电平 编程思路 Driver目录中添加KEY.h文件,应包含引脚定义、开关GPIO实例化函数、开关状态获取函数以及当按下和未按下时执行不同的函数(函数…

多级缓存架构(三)OpenResty Lua缓存

文章目录 一、nginx服务二、OpenResty服务1. 服务块定义2. 配置修改3. Lua程序编写4. 总结 三、运行四、测试五、高可用集群1. openresty2. tomcat 通过本文章,可以完成多级缓存架构中的Lua缓存。 一、nginx服务 在docker/docker-compose.yml中添加nginx服务块。…

全光谱护眼灯有哪些?寒假护眼台灯推荐

全光谱指的是包含了整个可见光谱范围以及部分红外和紫外光的光线。通常的白炽灯或荧光灯只能发出有限范围内的光波,而全光谱台灯通过使用多种类型的LED灯或荧光灯管来产生更广泛的光谱。这样的光谱更接近自然光,能够提供更真实的颜色还原和更好的照明效果…

Spring Cloud微服务基础入门

文章目录 发现宝藏前言环境准备创建第一个微服务1. 创建Spring Boot项目2. 创建微服务模块3. 编写微服务代码4. 创建一个简单的REST控制器 运行微服务 总结好书推荐 发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不…

懒得玩游戏--帮我做数独

目录 简介自动解数独思路核心思路输入解析打印 完整代码 简介 最近玩上了一款类似于数独的微信小程序游戏,名字叫数独趣味闯关,过了数独的关卡之后会给拼图,玩了几关之后摸清套路了就有点累了,但是还想集齐拼图,所以就…

为什么使用 atan2(sin(z), cos(z)) 进行角度归一化?

文章目录 为什么使用 atan2(sin(z), cos(z)) 进行归一化?为什么归一化后的角度等于原始角度? atan2 方法返回 -π 到 π 之间的值,代表点 (x, y) 相对于正X轴的偏移角度。这个角度是逆时针测量的,以弧度为单位。关于 atan2 函数为…

【第十四课】并查集(acwing-836合并集合 / 做题思路 /c++代码)

目录 错误思路(但能骗分emm)--邻接矩阵(可以跳过) 思路 存在的问题 代码如下 并查集 思路 代码如下 一些解释 错误思路(但能骗分emm)--邻接矩阵(可以跳过) 思路 刚看到这道题我自己做的时候,因为之前学的trie树的时候意识到使用二维数组的含义,…

群发邮件的免费软件?做外贸用什么邮箱好?

群发邮件的免费软件有哪些?好用的邮件群发软件? 在数字时代,邮件已成为人们沟通的主要方式之一。有时候,我们需要给大量的联系人发送信息,这时候,群发邮件就显得格外重要。接下来蜂邮就来探讨一下那些值得…

初学者必知的微软.NET6开发环境相关技术介绍

我是荔园微风,作为一名在IT界整整25年的老兵,看到不少初学者在学习编程语言的过程中如此的痛苦,我决定做点什么,我小时候喜欢看小人书(连环画),在那个没有电视、没有手机的年代,这是…

[我的rust付费栏目]rust跟我学(一)已上线

大家好,我是开源库get_local_info的作者带剑书生,get_local_info诞生半个月,现在已经获得500的下载量,并获社区日更前五名,后被西安城市开发者社区收录(【我的Rust库】get_local_info 0.1.5发布_rust_科比布…

ChatGPT:人工智能划时代的标志(文末送书)

🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、数据结构 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 一. 什么是ChatGPT?二. ChatGPT是如何工作的?三. ChatGPT的应用领域四. ChatGPT的优缺点…

自创C++题目——风扇

预估难度 简单 题目描述 有一个风扇,它有个旋转叶片,每个旋转叶片的编号是,请输出它旋转后,中心点与地面的直线距离哪个叶片最近,输出此旋转叶片的编号。默认以“”的形式。 当时: 当或时,…

运筹说 第46期 | 目标规划-数学模型

经过前几期的学习,想必大家已经对线性规划问题有了详细的了解,但线性规划作为一种决策工具,在解决实际问题时,存在着一定的局限性:(1)线性规划只能处理一个目标,而现实问题往往存在多个目标;(2)…

vtk9.3 配置 visual studio 2019 运行环境 和运行实例详解

(1)包含文件配置: 项目--属性--VC目录,在包含目录中把include文件夹的地址加进去,一直要到下一级 vtk-9.3目录下, 小知识: 在Visual Studio 2019中运行项目时,如果项目中使用了第三…

CTF CRYPTO 密码学-2

题目名称:enc 题目描述: 字符 ZZZZ X XXZ ZZ ZXZ Z ZXZ ZX ZZX XXX XZXX XXZ ZX ZXZZ ZZXZ XX ZX ZZ 分析 此字段是由Z和X组成的字符,联想到莫斯密码是由.和-组成的所以接下来可以尝试莫斯密码解题 解题过程: Step1:…