MinIO 和 Apache Tika:文本提取模式

Tl;dr:

在这篇文章中,我们将使用 MinIO Bucket Notifications 和 Apache Tika 进行文档文本提取,这是大型语言模型训练和检索增强生成 LLM和RAG 等关键下游任务的核心。

前提

假设我想构建一个文本数据集,然后我可以用它来微调 LLM.为了做到这一点,我们首先需要组装各种文档(由于它们的来源,这些文档可能采用不同的形式)并从中提取文本。数据集安全性和可审计性至关重要,因此这些非结构化文档需要存储在对象存储中以进行匹配。MinIO 是针对这些情况以及更多情况构建的对象存储。另一方面,Apache Tika 是一个工具包,可以“从一千多种不同的文件类型(例如 PPT、XLS 和 PDF)中检测和提取元数据和文本”。它们共同形成一个可以实现我们目标的系统。

在之前的一篇文章中,我们将一个带有 MinIO 的对象检测推理服务器和大约 30 行代码放在一起。我们将再次利用这种高度可移植和可重复的架构,这次是文本提取任务。下面是我们将要构建的系统的粗略描述。

设置 Apache Tika

启动并运行 Apache Tika 的最简单方法是使用官方 Docker 映像。检查 Docker Hub 以获取所需的 Tika 映像版本/标记。

在此示例中,我允许它使用并公开默认端口 9998。

docker pull apache/tika:<version>
docker run -d -p 127.0.0.1:9998:9998 apache/tika:<version>

构建文本提取服务器

现在 Tika 正在运行,我们需要构建一个服务器,该服务器可以通过编程方式对新对象发出 Tika 提取请求。之后,我们需要在 MinIO 存储桶上配置 webhook,以提醒此服务器新对象的到来(换句话说,存储桶的 PUT 事件)。让我们一步一步地走一遍。

为了保持相对简单并突出这种方法的可移植性,文本提取服务器将使用流行的 Flask 框架在 Python 中构建。以下是服务器的代码(也可在 MinIO 博客资源存储库的 extraction_server.py 下找到),该服务器使用 Tika(通过 Tika-Python)对添加到存储桶的新文档执行文本提取

"""
This is a simple Flask text extraction server that functions as a webhook service endpoint 
for PUT events in a MinIO bucket. Apache Tika is used to extract the text from the new objects.
"""
from flask import Flask, request, abort, make_response
import io
import logging
from tika import parser
from minio import Minio# Make sure the following are populated with your MinIO details
# (Best practice is to use environment variables!)
MINIO_ENDPOINT = ''
MINIO_ACCESS_KEY = ''
MINIO_SECRET_KEY = ''# This depends on how you are deploying Tika (and this server):
TIKA_SERVER_URL = 'http://localhost:9998/tika'client = Minio(MINIO_ENDPOINT,access_key=MINIO_ACCESS_KEY,secret_key=MINIO_SECRET_KEY,
)logger = logging.getLogger(__name__)app = Flask(__name__)@app.route('/', methods=['POST'])
async def text_extraction_webhook():"""This endpoint will be called when a new object is placed in the bucket"""if request.method == 'POST':# Get the request event from the 'POST' callevent = request.jsonbucket = event['Records'][0]['s3']['bucket']['name']obj_name = event['Records'][0]['s3']['object']['key']obj_response = client.get_object(bucket, obj_name)obj_bytes = obj_response.read()file_like = io.BytesIO(obj_bytes)parsed_file = parser.from_buffer(file_like.read(), serverEndpoint=TIKA_SERVER_URL)text = parsed_file["content"]metadata = parsed_file["metadata"]logger.info(text)result = {"text": text, "metadata": metadata}resp = make_response(result, 200)return respelse:abort(400)if __name__ == '__main__':app.run()

让我们启动提取服务器:

设置存储桶通知

现在,剩下的就是在 MinIO 服务器上为存储桶配置 Webhook,以便存储桶中的任何 PUT 事件(也称为添加的新对象)都将触发对提取终端节点的调用。使用该 mc 工具,我们只需几个命令即可完成此操作。

首先,我们需要设置一些环境变量,以向 MinIO 服务器发出信号,表明您正在启用要调用的 Webhook 和相应的端点。替换为您选择的函数名称。为简单起见,我选择了“提取”。此外,请确保将终端节点环境变量设置为推理服务器的正确主机和端口。在本例中,http://localhost:5000 是运行 Flask 应用程序的位置。

export MINIO_NOTIFY_WEBHOOK_ENABLE_<YOURFUNCTIONNAME>=on 
export MINIO_NOTIFY_WEBHOOK_ENDPOINT_<YOURFUNCTIONNAME>=http://localhost:5000

设置这些环境变量后,启动 MinIO 服务器(或者,如果它已在运行,请重新启动它)。在以下步骤中,我们将需要一个“别名”用于 MinIO 服务器部署。要了解有关别名以及如何设置别名的更多信息,请查看文档。我们还将使用 mc MinIO 客户端命令行工具,因此请确保您已安装它。

接下来,让我们为存储桶配置事件通知以及我们想要收到通知的事件类型。出于这个项目的目的,我创建了一个全新的存储桶,也命名为“extraction”。您可以通过 MinIO 控制台或 mc 命令执行此操作 由于我们希望在将新对象添加到“提取”存储桶时触发 Webhook,因此 PUT 事件是我们的重点。将 ALIAS 替换为 MinIO 服务器部署的别名,将 BUCKET 替换为该服务器上所需的存储桶。和以前一样,请确保替换为在前面步骤中使用的相同值。

mc event add ALIAS/BUCKET arn:minio:sqs::<YOURFUNCTIONNAME>:webhook --event put

最后,您可以通过验证运行此命令时是否输出了存储桶通知来检查是否 s3:ObjectCreated:* 为存储桶通知配置了正确的事件类型:

mc event ls ALIAS/BUCKET arn:minio:sqs::<YOURFUNCTIONNAME>:webhook

如果您想了解有关将存储桶事件发布到 Webhook 的更多信息,请查看文档以及对事件通知的深入探讨。现在,我们准备试用我们的文本提取服务器。

尝试一下

这是我想从中提取文本的文档。这是 2000 年《商品未来现代化法案》的 PDF 文件,该法案是美国一项有影响力的金融立法。


我使用 MinIO 控制台将此 PDF 放入我的“提取”存储桶中。


此 PUT 事件会触发存储桶通知,然后将该通知发布到提取服务器终端节点。因此,文本由 Tika 提取并打印到控制台。

后续步骤

虽然我们现在只是打印出提取的文本,但正如 The Premise 中所暗示的那样,该文本可以用于许多下游任务。例如:

  1. 创建用于LLM微调的数据集:假设您想要对以各种文件格式(即 PDF、DOCX、PPTX、Markdown 等)存在的公司文档集合进行微调大型语言模型。要为此任务创建LLM友好的文本数据集,您可以将所有这些文档收集到配置了类似 Webhook 的 MinIO 存储桶中,并将每个文档提取的文本传递到微调/训练集的数据帧中。此外,通过将数据集的源文件放在 MinIO 上,可以更轻松地管理、审核和跟踪数据集的组成。

  2. 检索增强生成:RAG 是LLM应用程序可以利用精确上下文并避免幻觉的一种方式。这种方法的一个核心方面是确保可以提取文档的文本,然后将其嵌入到向量中,从而实现语义搜索。此外,通常最佳做法是将这些向量的实际源文档存储在对象存储中(如 MinIO!)。使用本文中概述的方法,您可以轻松实现两者。如果您想了解有关 RAG 及其优势的更多信息,请查看这篇之前的文章。

  3. LLM应用:通过编程方式从新存储的文档中即时提取文本,可能性是无穷无尽的,特别是如果您可以使用LLM.想想关键词检测(即提示:“提到了哪些股票代码?”),内容评估(即提示:“根据评分标准,这篇论文提交应该得到什么分数?),或者几乎任何类型的基于文本的分析(即提示:”根据这个日志输出,第一个错误是什么时候发生的?“)。

除了存储桶通知用于这些任务的实用性之外,MinIO 还旨在为任何类型和数量的对象(无论是 Powerpoint、图像还是代码片段)提供世界一流的容错和性能。

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

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

相关文章

爬虫之牛刀小试(十):爬取某宝手机商品的销量,价格和店铺

首先淘宝需要登录&#xff0c;这一点如果用selenium如何解决&#xff0c;只能手动登录&#xff1f;如果不用selenium&#xff0c;用cookies登录也可。但是验证码又是一个问题&#xff0c;现在的验证码五花八门&#xff0c;难以处理。 我们回到正题&#xff0c;假设你已经登录上…

计算机设计大赛 深度学习YOLO图像视频足球和人体检测 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov5算法5 数据集6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习YOLO图像视频足球和人体检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非…

一览大模型长文本能力

前言 如今的大模型被应用在各个场景&#xff0c;其中有些场景则需要模型能够支持处理较长文本的能力(比如8k甚至更长)&#xff0c;其中已经有很多开源或者闭源模型具备该能力比如GPT4、Baichuan2-192K等等。 那关于LLM的长文本能力&#xff0c;目前业界通常都是怎么做的&…

2024年腾讯云4核8G12M服务器性能测评,适合哪些使用场景?

腾讯云4核8G服务器适合做什么&#xff1f;搭建网站博客、企业官网、小程序、小游戏后端服务器、电商应用、云盘和图床等均可以&#xff0c;腾讯云4核8G服务器可以选择轻量应用服务器4核8G12M或云服务器CVM&#xff0c;轻量服务器和标准型CVM服务器性能是差不多的&#xff0c;轻…

阿里云BGP多线精品EIP香港CN2线路低时延,价格贵

阿里云香港等地域服务器的网络线路类型可以选择BGP&#xff08;多线&#xff09;和 BGP&#xff08;多线&#xff09;精品&#xff0c;普通的BGP多线和精品有什么区别&#xff1f;BGP&#xff08;多线&#xff09;适用于香港本地、香港和海外之间的互联网访问。使用BGP&#xf…

【实战】二、Jest难点进阶(一) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(五)

文章目录 一、Jest 前端自动化测试框架基础入门二、Jest难点进阶1.snapshot 快照测试 学习内容来源&#xff1a;Jest入门到TDD/BDD双实战_前端要学的测试课 相对原教程&#xff0c;我在学习开始时&#xff08;2023.08&#xff09;采用的是当前最新版本&#xff1a; 项版本babe…

jmeter遇到连接数据库的问题

jmeter连接mysql或者oracle简单&#xff0c;但是连接过inceptor吗&#xff1f; 上货 1、下载驱动inceptor 5.1.2.jar包 2、在添加驱动那里导入 3、在JBC request中的写法 PS:没什么可说的

【C++】类和对象(五)友元、内部类、匿名对象

前言&#xff1a;前面我们说到类和对象是一个十分漫长的荆棘地&#xff0c;今天我们将走到终点&#xff0c;也就是说我们对于&#xff23;算是正式的入门了。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质量&#xff23;学习 &…

嵌入式中全面解析 SPI 通信协议方法

SPI 的英文全称为 Serial Peripheral Interface&#xff0c;顾名思义为串行外设接口。SPI 是一种同步串行通信接口规范&#xff0c;主要应用于嵌入式系统中的短距离通信。该接口由摩托罗拉在20世纪80年代中期开发&#xff0c;后发展成了行业规范。 SPI 是一种高速的、全双工的…

算法沉淀——优先级队列(堆)(leetcode真题剖析)

算法沉淀——优先级队列 01.最后一块石头的重量02.数据流中的第 K 大元素03.前K个高频单词04.数据流的中位数 优先队列&#xff08;Priority Queue&#xff09;是一种抽象数据类型&#xff0c;它类似于队列&#xff08;Queue&#xff09;&#xff0c;但是每个元素都有一个关联的…

嵌入式Linux平台大文件生成以及处理方法

在日常工作中&#xff0c;为了验证某些场景下的功能&#xff0c;经常需要人为构造一些大文件进行测试&#xff0c;有时需要用大文件来测试下载速度&#xff0c;有时需要用大文件来覆盖磁盘空间&#xff1b;偶尔会看到一些网络博文会教大家如何构造大文件&#xff1b;但是当需要…

杨中科 ASP.NET DI综合案例

综合案例1 需求说明 1、目的:演示DI的能力; 2、有配置服务、日志服务&#xff0c;然后再开发一个邮件发送器服务。可以通过配置服务来从文件、环境变量、数据库等地方读取配置&#xff0c;可以通过日志服务来将程序运行过程中的日志信息写入文件、控制台、数据库等。 3、说明…

第三百四十九回

文章目录 1. 概念介绍2. 原理与方法2.1 知识对比2.2 使用方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"加密包crypto"相关的内容&#xff0c;本章回中将介绍characters包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 在项目中会遇到获取字…

Django实战:部署项目 【资产管理系统】,Django完整项目学习研究(项目全解析,部署教程,非常详细)

导言 关于Django&#xff0c;我已经和大家分享了一些知识&#xff0c;考虑到一些伙伴需要在实际的项目中去理解。所以我上传了一套Django的项目学习源码&#xff0c;已经和本文章进行了绑定。大家可以自行下载学习&#xff0c;考虑到一些伙伴是初学者&#xff0c;几年前&#…

OpenAI又出王炸,Sora是否要开启视频AI新时代?

OpenAI又出王炸&#xff0c;Sora是否要开启视频AI新时代&#xff1f; 关注微信公众号 DeepGoAI 前几天我们还在讨论 如何让ChatGPT3.5变得更聪明 今天OpenAI就带着新王炸出现了 如同ChatGPT一般 在计算机领域掀起轩然大波 开启真正视频AI新时代 那就是 Sora 很多同学可…

结构体对齐规则及为什么会有结构体对齐

前言&#xff1a; 大家在学习结构体中&#xff0c;在计算结构体大小时想必会很疑惑&#xff0c;为什么结构体的大小不是按照常理像数组一样一个字节一个字节的挨在一起放&#xff1f;今天带大家一起深入探讨一下背后的规则和原因。 结构体对齐规则&#xff1a; 结构体对齐其实…

离散数学截图2

为什么G中阶大于2的元素&#xff0c;一定有偶数个 在有限群G中&#xff0c;阶大于2的元素个数一定是偶数的原因如下&#xff1a; 设 aaa 是群G中一个阶大于2的元素&#xff0c;那么根据群的定义和阶的概念&#xff08;即某个元素的幂次使得其等于单位元的最小正整数&#xff…

【Linux】 Linux 小项目—— 进度条

进度条 基础知识1 \r && \n2 行缓冲区3 函数介绍 进度条实现版本 1代码实现运行效果 版本2 Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇文章见&#xff01;&#xff01;&#xff01; 基础知识 1 \r &&a…

linux 安装docker

目录 环境 操作步骤 1 下载脚本 2 执行脚本 3 检查docker版本&#xff0c;证明安装成功 环境 阿里云 ubuntu 22.04 64位 操作步骤 参考linux系统安装docker-腾讯云开发者社区-腾讯云 (tencent.com) 1 下载脚本 curl -fsSL https://get.docker.com -o get-docker.sh …

牛客小白月赛87

说明 年后第一次写题&#xff0c;已经麻了&#xff0c;这次的题很简单但居然只写了两道题。有种本该发挥80分的水平&#xff0c;但是只做出了20分的水平的感觉。不过剩下几个题&#xff08;除了G题&#xff09;&#xff0c;比完赛一小时内就AC了。欢迎大家交流学习。&#xff0…