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

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、图像还是代码片段)提供世界一流的容错和性能。

相关文章:

MinIO 和 Apache Tika:文本提取模式

Tl;dr: 在这篇文章中&#xff0c;我们将使用 MinIO Bucket Notifications 和 Apache Tika 进行文档文本提取&#xff0c;这是大型语言模型训练和检索增强生成 LLM和RAG 等关键下游任务的核心。 前提 假设我想构建一个文本数据集&#xff0c;然后我可以用它来微调 LLM.为了做…...

c编译器学习05:与chibicc类似的minilisp编译器(待续)

minilisp项目介绍 项目地址&#xff1a;https://github.com/rui314/minilisp 作者也是rui314&#xff0c;commits也是按照模块开发提交的。 minilisp只有一个代码文件&#xff1a;https://github.com/rui314/minilisp/blob/master/minilisp.c 加注释也只有996行。 代码结构&a…...

手撕qsort函数

前言 本篇主要讲解的是qsort函数细节以及运用实例。 紧跟我的脚步一起手撕qsort函数吧~ 欢迎关注​​个人主页&#xff1a;逸狼 更多优质内容&#xff1a; 拿捏c语言指针&#xff08;上&#xff09; 拿捏c语言指针&#xff08;中&#xff09; 拿捏c语言指针&#xff08;下&…...

项目在linux上的简单部署

本文章只介绍项目的简单部署&#xff0c;暂时没有Docker部署。 项目部署有两种方式&#xff0c;一种是直接命令部署&#xff0c;第二种是用脚本&#xff0c;脚本本身也是将命令进行封装来执行。 命令 项目通过maven打包&#xff0c;启动命令&#xff1a; # 启动命令 nohup …...

MySQL安装教程(详细版)

今天分享的是Win10系统下MySQL的安装教程&#xff0c;打开MySQL官网&#xff0c;按步骤走呀~ 宝们安装MySQL后&#xff0c;需要简单回顾一下关系型数据库的介绍与历史&#xff08;History of DataBase&#xff09; 和 常见关系型数据库产品介绍 呀&#xff0c;后面就会进入正式…...

Linux platform tree下的单总线驱动程序设计(DHT11)

目录 概述 1 认识DHT11 1.1 DHT11特性 1.2 DHT11数据格式 1.3 DHT11与MCU通信 1.4 DHT11信号解析 1.4.1 起始信号 1.4.2 解析信号0 1.4.3 解析信号1 2 驱动开发 2.1 硬件接口 2.2 更新设备树 2.2.1 添加驱动节点 2.2.2 编译.dts 2.2.3 更新板卡中的.dtb 2.3 驱…...

自研爬虫框架的经验总结(理论及方法)

背景&#xff1a; 由于业务需要&#xff0c;承接一部分的数据采集工作。目前市场内的一些通用框架不太适合。故而进行了自研。 对比自研和目前成熟的框架&#xff0c;自研更灵活适配&#xff0c;可以自己组装核心方法&#xff1b;后者对于新场景的适配需要对框架本身有较高的理…...

配置基于 AWS CRT 的 HTTP 客户端

基于 AWS CRT 的 HTTP 客户端包括同步 AwsCrtHttpClient 和异步 AwsCrtAsyncHttpClient。基于 AWS CRT 的 HTTP 客户端具有以下 HTTP 客户端优势&#xff1a; 更快的 SDK 启动时间 更小的内存占用空间 降低的延迟时间 连接运行状况管理 DNS 负载均衡 SDK 中基于 AWS CRT …...

挑战杯 基于LSTM的天气预测 - 时间序列预测

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 机器学习大数据分析项目 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/po…...

我为什么不喜欢关电脑?

程序员为什么不喜欢关电脑&#xff1f; 你是否注意到&#xff0c;程序员们似乎从不关电脑&#xff1f;别以为他们是电脑上瘾&#xff0c;实则是有他们自己的原因&#xff01;让我们一起揭秘背后的原因&#xff0c;看看程序员们真正的“英雄”本色&#xff01; 一、上大学时。 …...

Unity【角色/摄像机移动控制】【1.角色移动】

本文主要总结实现角色移动的解决方案。 1. 创建脚本&#xff1a;PlayerController 2. 创建游戏角色Player&#xff0c;在Player下挂载PlayerController脚本 3. 把Camera挂载到Player的子物体中&#xff0c;调整视角&#xff0c;以实现相机跟随效果 3. PlayerController脚本代码…...

Oracle12cR2之Job定时作业调度器详解

Oracle12cR2之Job定时作业调度器详解 文章目录 Oracle12cR2之Job定时作业调度器详解1.Oracle Job1. 关于Job2. 使用方法 2. Job详细说明1. 查看Job的相关视图2.SYS.DBA_JOBS视图字段详细说明 3. 创建及查看Job1. 创建Job2. 查看运行中的Job 1.Oracle Job 1. 关于Job 在 Oracle…...

python自学...

一、稍微高级一点的。。。 1. 闭包&#xff08;跟js差不多&#xff09; 2. 装饰器 就是spring的aop 3. 多线程...

Message Pack 协议详解及应用

文章目录 一、Message Pack是什么二、Message Pack的语法规则三、Message Pack相关链接四、Message Pack应用场景五、MessagePack 兼容性与特点 一、Message Pack是什么 Message Pack是一种高效的二进制序列化格式&#xff0c;用于在不同的应用程序之间进行数据交换。它类似于J…...

智慧社区管理系统:构建未来的生活模式

在这个信息化、智能化的时代&#xff0c;我们期待的不再是简单的居住空间&#xff0c;而是一个集安全、便捷、舒适、环保于一体的智能化社区。为此&#xff0c;我们推出了全新的智慧社区管理系统&#xff0c;旨在将先进的科技力量引入社区管理&#xff0c;为居民提供更优质的生…...

Rocky 8.9 Kubespray v2.24.0 在线部署 kubernetes v1.28.6 集群

文章目录 1. 简介2. 预备条件3. 基础配置3.1 配置hostname3.2 配置互信 4. 配置部署环境4.1 在线安装docker4.2 启动容器 kubespray4.3 编写 inventory.ini4.4 关闭防火墙、swap、selinux4.5 配置内核模块 5. 部署6. 集群检查 1. 简介 kubespray​ 是一个用于部署和管理 Kuber…...

新版AI系统ChatGPT源码支持GPT-4/支持AI绘画去授权

源码获取方式 搜一搜&#xff1a;万能工具箱合集 点击资源库直接进去获取源码即可 如果没看到就是待更新&#xff0c;会陆续更新上 新版AI系统ChatGPT网站源码支持GPT-4/支持AI绘画/Prompt应用/MJ绘画源码/PCH5端/免授权&#xff0c;支持关联上下文&#xff0c;意间绘画模型…...

学习鸿蒙基础(5)

一、honmonyos的page路由界面的路径 新建了一个page,然后删除了。运行模拟器的时候报错了。提示找不到这个界面。原来是在路由界面没有删除这个page。新手刚接触找了半天才找到这个路由。在resources/base/profile/main_pages.json 这个和微信小程序好类似呀。 吐槽&#xf…...

Tuxera NTFS2024最新中文版支持M1/M2/M3苹果全系机型

Tuxera NTFS的传输速度会受到多种因素的影响&#xff0c;包括硬件配置、文件大小、存储设备的性能等。因此&#xff0c;无法给出具体的传输速度数值。 不过&#xff0c;根据一些用户的使用经验和测试数据&#xff0c;Tuxera NTFS的传输速度通常都非常快&#xff0c;能够满足大…...

【Python】OpenCV-图片添加水印处理

图片添加水印处理 1. 引言 图像处理中的水印添加是一种常见的操作&#xff0c;用于在图片上叠加一些信息或标识。本文将介绍如何使用OpenCV库在图片上添加水印&#xff0c;并通过详细的代码注释来解释每一步的操作。 2. 代码示例 以下是一个使用OpenCV库的简单代码示例&…...

使用 Taotoken CLI 工具一键配置团队开发环境中的大模型端点

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用 Taotoken CLI 工具一键配置团队开发环境中的大模型端点 在团队协作开发中&#xff0c;统一管理大模型 API 的接入配置是一个常…...

Veo 2K/4K生成失败率下降92%的核心设置(2024实测版Veo 2.3.1隐藏参数曝光)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Veo 2K/4K生成失败率下降92%的底层归因分析 Veo 视频生成模型在 2K/4K 高分辨率输出场景中&#xff0c;近期实测失败率由历史均值 18.7% 降至 1.5%&#xff0c;降幅达 92%。这一跃迁并非单一模块优化结果&…...

软件测试的隐藏晋升通道:从QA到QE再到QP

在软件测试领域&#xff0c;大多数人熟悉的职业路径是纵向的&#xff1a;初级、高级、测试架构师或测试经理。然而&#xff0c;在喧闹的晋升阶梯背后&#xff0c;还隐藏着一条认知门槛更高、价值密度更大的水平进化通道——从QA到QE&#xff0c;最终抵达QP。这不是岗位名称的更…...

微服务架构设计:构建可扩展的分布式系统

微服务架构设计&#xff1a;构建可扩展的分布式系统 什么是微服务&#xff1f; 微服务是一种架构风格&#xff0c;将应用程序拆分为一组小型、自治的服务&#xff0c;每个服务运行在独立的进程中&#xff0c;通过轻量级的通信机制相互协作。 微服务 vs 单体应用 特性单体应用微…...

AI大神Karpathy的学习心法,普通人也能直接抄作业

美国时间2026年5月19日&#xff0c;AI 圈被一条重磅消息刷屏&#xff1a;大牛 Andrej Karpathy 在社交媒体上正式宣布加入 Anthropic。对于整个科技圈而言&#xff0c;他的动向影响力堪比当年乔丹宣布重返 NBA 大联盟 。这一次&#xff0c;他加入了 Anthropic 的预训练团队&…...

5分钟快速获取微信数据库密钥:Sharp-dumpkey完整使用指南

5分钟快速获取微信数据库密钥&#xff1a;Sharp-dumpkey完整使用指南 【免费下载链接】Sharp-dumpkey 基于C#实现的获取微信数据库密钥的小工具 项目地址: https://gitcode.com/gh_mirrors/sh/Sharp-dumpkey 你是否曾因为无法访问自己的微信聊天记录而感到困扰&#xff…...

测试工程师转型AI训练师,我的薪资直接翻了2倍

从“保证软件质量”到“教会模型思考”&#xff0c;这条路我走了三年&#xff0c;薪资从18K涨到了38K。如果你现在还在点点点、写用例、跑自动化的循环里打转&#xff0c;并且隐约感到天花板正在压下来&#xff0c;那么我的经历或许能给你提供一份可复制的地图。一、为什么测试…...

Frida检测绕过本质:四大系统级锚点与工程化规避策略

1. 这不是“反检测”&#xff0c;而是对 Frida 运行机制的诚实理解很多人一看到“Frida 检测绕过”就本能地往“对抗”“隐藏”“伪装”上想&#xff0c;甚至直接去搜“frida hide”“frida stealth bypass”&#xff0c;结果踩进一堆过时、失效、逻辑错乱的 patch 坑里。我做过…...

就业指导|中九非科班毕业,华为 OD 做 Java 后端想转 C++,能找到深度学习挂钩的岗工作吗?

这类题最容易让人一下把难度叠得太高。 因为你实际上不是只在做一次转向。 你想做的是三件事同时发生&#xff1a; 从 Java 后端转 C 还想和深度学习挂钩 最好岗位还能成立 问题就在这里。 这三个目标不是完全冲突。 但如果你把它理解成&#xff1a; “我直接转去做纯 …...

车联网TBOX开发实战六,CAN特性

接上篇芯片及系统方案基础&#xff0c;本篇想写个远程控制&#xff0c;但想想整个交互链路较长&#xff0c;涉及到的基础很多&#xff0c;决定先从最基础的介绍一下&#xff0c;CAN&#xff0c;就是与车辆交互的核心总线本篇不做CAN基础的全面讲解&#xff0c;网络上有大篇幅的…...