概览
传统的文本提取方法常常无法理解非结构化内容,因此提取数据的数据往往是错误的。本文将探讨使用 Indexify,一个用于实时多模态数据提取的开源框架,来更好地分析pdf等非结构化文件。我将介绍如何设置 Indexify,包括服务器设置、提取graph创建、文档导入和数据查询,以及如何创建自定义提取器。通过 Indexify 可以增强文档分析,从而获得更准确的见解、做出更好的决策并简化管理流程。
Indexify 介绍
Indexify 是一个开源的导入和提取引擎,旨在为实时 LLM 应用提供支持。它能够以极低的延迟从非结构化来源进行实时数据提取。它还支持可应用于各种用例的多模态提取工作流程,包括从文档中提取实体和嵌入、音频转录、摘要以及从图像甚至视频中检测对象。
它还支持高效地索引、存储和检索数据,使其成为可扩展实时 RAG 系统的工具。
任何工作流程都可以通过 4 个基本步骤轻松实现:
- 启动 Indexify 服务器和提取器。
- 创建提取graph。
- 导入需要处理的数据(视频、图像、音频、PDF 等)。
- 检索提取的数据。
提取器
提取器模块是 Indexify 的核心功能。提取器可以从任何模态的非结构化数据中提取和返回结构化信息。例如,从 PDF 中以 JSON 格式获取特定信息,将数据转换为嵌入,以及识别视频中的面部或物体。
提取器通常接收非结构化数据作为输入,并生成内容对象列表和特征作为输出。来自非结构化数据的原始字节存储在 Blob 存储中,而提取的特征存储在向量数据库和结构化存储中以供检索。任何用于处理非结构化数据的模型或算法都可以通过扩展提取器 SDK 中提供的抽象类来实现为提取器。
协调器
Indexify中有一个高性能任务调度器。当数据开始被导入时,它们将任务分配给提取器,从而帮助实现卓越的速度和性能。
开始教程
对于本教程,需要有 Python 3.11 或更高版本以获得最佳性能。其他安装说明将在后面给出。
我将使用 Groq 作为 LLM 引擎。要开始,请访问此页面并创建一个 API 密钥。
然后安装sdk
pip install groq
对于数据,我已经准备了一些经典论文作为 PDF 文件。当然你也可以使用自己的文档集。
安装和配置 Indexify
在 Linux 系统上设置 Indexify 很容易。只需要 3 个运行的终端窗口。
- 终端 1:用于下载和运行 Indexify 服务。
- 终端 2:用于运行 Indexify 提取器,这些提取器处理结构化提取、分块和嵌入。
- 终端 3:用于运行 Python 脚本以从 Indexify 服务加载和查询数据。
这里可以使用以下命令启动和运行 Indexify 服务。
终端 1
curl https://getindexify.ai | sh
./indexify server -d
服务将在 http://localhost:8900 上运行。接下来,创建一个 Python 环境并安装所有必要的库和提取器。
终端 2
pip3 install indexify-extractor-sdk indexify wikipedia
indexify-extractor download tensorlake/paddleocr_extractor
indexify-extractor download tensorlake/minilm-l6
indexify-extractor download tensorlake/chunk-extractor
下载完成后,使用以下命令运行提取器服务:
终端 2
indexify-extractor join-server
经过以上两个步骤环境就准备好了。在本教程中,我将保持这两个终端运行。
准备文档集
第一步是整理文档集。在本工作流程中,我将使用 PDF 文档。对于多个文档,你可以像这样构建目录:将所有文档作为 PDF 添加到 data 目录。对于其他文件类型,你必须使用其他提取器或定义自定义提取器,我将在本文中稍后讨论。
└── data
├── doc1
├── doc2
├── doc3
├── doc4
├── venv
├── indexify file
├── ingest_document.py
├── query_doc.py
└── setup_extraction_graph.py
使用 Indexify 导入和处理文档
设置提取graph
Indexify 可以使用其核心功能(提取器)处理和存储来自任何模态的数据。这些提取器旨在从大量非结构化数据中提取内容。通过将不同的提取器链接在一起,我们可以创建一个pipeline,简化整个数据提取和存储过程。此过程通过创建提取graph来管理。
在本教程中,我将构建以下提取graph:
- paddle_ocr:用于识别和提取论文中的文本。
- chunk_extract:用于将数据划分为块以进行 RAG。
- minilm-l6:用于将数据转换为嵌入。
配置 Indexify 客户端并以 YAML 格式定义流程,如下所示。
# setup_extraction_graph.py
from indexify import ExtractionGraph, IndexifyClient
client = IndexifyClient()
extraction_graph_spec = """
name: 'propertyQA'
extraction_policies:
- extractor: 'tensorlake/paddleocr_extractor'
name: 'textextract'
- extractor: 'tensorlake/chunk-extractor'
name: 'chunker'
input_params:
chunk_size: 1000
overlap: 100
content_source: 'textextract'
- extractor: 'tensorlake/minilm-l6'
name: 'pdfembedding'
content_source: 'chunker'
"""
extraction_graph = ExtractionGraph.from_yaml(extraction_graph_spec)
client.create_extraction_graph(extraction_graph)
终端 3
运行命令以创建提取graph。
python3 ./setup_extraction_graph.py
自定义提取器
为了捕获复杂数据,我可以创建自定义提取器并将其添加到我们的提取graph中。你可以使用以下模板定义它们。
from pydantic import BaseModel
from typing import List
from indexify_extractor_sdk import Extractor, Content, Feature
from indexify_extractor_sdk.base_extractor import Content
import json
class InputParams(BaseModel):
a: int = 0
b: str = ""
class MyExtractor(Extractor):
name = "your-docker-hub-username/MyExtractor"
description = "Description of the extractor goes here."
# Any python dependencies included in the extractor must be listed here.
python_dependencies = ["torch", "transformers"]
# Any system dependencies that the python code here depends on needs to be listed here. We use Ubuntu base images, so any ubuntu package can be installed here.
system_dependencies = []
input_mime_types = ["text/plain"]
def __init__(self):
super().__init__()
def extract(self, content