paint-brush
Tận dụng MinIO và Apache Tika để trích xuất và phân tích văn bản tự độngtừ tác giả@minio
8,089 lượt đọc
8,089 lượt đọc

Tận dụng MinIO và Apache Tika để trích xuất và phân tích văn bản tự động

từ tác giả MinIO7m2024/04/11
Read on Terminal Reader

dài quá đọc không nổi

Trong bài đăng này, chúng tôi sẽ sử dụng Thông báo nhóm MinIO và Apache Tika để trích xuất văn bản tài liệu, vốn là trọng tâm của các nhiệm vụ quan trọng ở cấp dưới như đào tạo Mô hình ngôn ngữ lớn (LLM) và Tạo tăng cường truy xuất (RAG).
featured image - Tận dụng MinIO và Apache Tika để trích xuất và phân tích văn bản tự động
MinIO HackerNoon profile picture
0-item
1-item


Trong bài đăng này, chúng tôi sẽ sử dụng Thông báo nhóm MinIO và Apache Tika để trích xuất văn bản tài liệu, vốn là trọng tâm của các nhiệm vụ quan trọng ở cấp dưới như đào tạo Mô hình ngôn ngữ lớn ( LLM ) và Tạo tăng cường truy xuất ( RAG ).


Tiền đề

Giả sử tôi muốn xây dựng một tập dữ liệu văn bản mà sau đó tôi có thể sử dụng để tinh chỉnh một LLM. Để làm điều này, trước tiên chúng ta cần tập hợp nhiều tài liệu khác nhau (có thể ở các dạng khác nhau do nguồn của chúng) và trích xuất văn bản từ chúng. Tính bảo mật và khả năng kiểm tra của tập dữ liệu là điều tối quan trọng, vì vậy những tài liệu phi cấu trúc này cần được lưu trữ trong kho đối tượng để khớp. MinIO là kho đối tượng được xây dựng cho những tình huống này và hơn thế nữa . Mặt khác, Apache Tika là bộ công cụ “phát hiện và trích xuất siêu dữ liệu cũng như văn bản từ hơn một nghìn loại tệp khác nhau (chẳng hạn như PPT, XLS và PDF)”. Cùng nhau, họ kết hợp với nhau để tạo thành một hệ thống có thể đạt được mục tiêu của chúng tôi.


Trong một bài viết trước đó , chúng tôi đã kết hợp một máy chủ suy luận phát hiện đối tượng với MinIO ngay lập tức và khoảng 30 dòng mã. Chúng tôi sẽ tận dụng kiến trúc có tính di động cao và có thể lặp lại đó một lần nữa, lần này cho nhiệm vụ trích xuất văn bản. Dưới đây là mô tả sơ bộ về hệ thống mà chúng tôi sẽ xây dựng.




Thiết lập Apache Tika

Cách đơn giản nhất để thiết lập và chạy Apache Tika là sử dụng hình ảnh Docker chính thức . Kiểm tra Docker Hub để biết phiên bản/thẻ hình ảnh Tika mà bạn mong muốn.



Trong ví dụ này, tôi cho phép nó sử dụng và hiển thị cổng mặc định, 9998.


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


Sử dụng docker ps hoặc Docker Desktop để xác minh rằng vùng chứa Tika đang chạy và có cổng 9998.


Xây dựng máy chủ trích xuất văn bản

Bây giờ Tika đang chạy, chúng ta cần xây dựng một máy chủ có thể lập trình thực hiện các yêu cầu trích xuất Tika cho các đối tượng mới. Sau đó, chúng ta cần định cấu hình webhooks trên nhóm MinIO để cảnh báo máy chủ này về sự xuất hiện của các đối tượng mới (nói cách khác là các sự kiện PUT cho một nhóm). Chúng ta hãy đi qua nó từng bước một.


Để giữ mọi thứ tương đối đơn giản và làm nổi bật tính di động của phương pháp này, máy chủ trích xuất văn bản sẽ được xây dựng bằng Python, sử dụng khung Flask phổ biến. Đây là mã dành cho máy chủ (cũng có sẵn trong kho Tài nguyên Blog MinIO bên dưới extract_server.py ) thực hiện trích xuất văn bản trên các tài liệu mới được thêm vào nhóm bằng cách sử dụng Tika (thông qua 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' call event = request.json bucket = 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 resp else: abort(400) if __name__ == '__main__': app.run()


Hãy khởi động máy chủ giải nén:



Ghi lại tên máy chủ và cổng mà ứng dụng Flask đang chạy.


Thiết lập thông báo nhóm

Bây giờ, tất cả những gì còn lại là định cấu hình webhook cho nhóm trên máy chủ MinIO để mọi sự kiện PUT (hay còn gọi là đối tượng mới được thêm) trong nhóm sẽ kích hoạt lệnh gọi đến điểm cuối trích xuất. Với công cụ mc , chúng ta có thể thực hiện việc này chỉ bằng một vài lệnh.


Trước tiên, chúng ta cần đặt một vài biến môi trường để báo hiệu cho máy chủ MinIO rằng bạn đang bật webhook và điểm cuối tương ứng sẽ được gọi. Thay thế <YOURFUNCTIONNAME> bằng tên chức năng bạn chọn. Để đơn giản, tôi sử dụng 'trích xuất'. Ngoài ra, hãy đảm bảo rằng biến môi trường điểm cuối được đặt thành máy chủ và cổng chính xác cho máy chủ suy luận của bạn. Trong trường hợp này, http://localhost:5000 là nơi ứng dụng Flask của chúng tôi đang chạy.


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


Khi bạn đã đặt các biến môi trường này, hãy bắt đầu máy chủ MinIO (hoặc nếu nó đã chạy rồi, khởi động lại nó ). Trong các bước sau, chúng tôi sẽ cần 'bí danh' để triển khai máy chủ MinIO của bạn. Để tìm hiểu thêm về bí danh và cách đặt bí danh, hãy xem tài liệu . Chúng tôi cũng sẽ sử dụng mc , công cụ dòng lệnh MinIO Client, vì vậy hãy đảm bảo bạn có nó Cài đặt .


Tiếp theo, hãy định cấu hình thông báo sự kiện cho nhóm của chúng tôi và loại sự kiện mà chúng tôi muốn được thông báo. Với mục đích của dự án này, tôi đã tạo một nhóm hoàn toàn mới cũng có tên là ' extract '. Bạn có thể làm điều này thông qua Bảng điều khiển MinIO hoặc mc lệnh Vì chúng tôi muốn kích hoạt webhook khi thêm các đối tượng mới vào nhóm ' trích xuất' nên các sự kiện PUT là trọng tâm của chúng tôi. Thay thế ALIAS bằng bí danh triển khai máy chủ MinIO của bạn và BUCKET bằng nhóm mong muốn trên máy chủ đó. Cũng như trước đây, hãy đảm bảo thay thế <YOURFUNCTIONNAME> bằng cùng giá trị mà bạn đã sử dụng ở bước trước đó.


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


Cuối cùng, bạn có thể kiểm tra xem bạn đã định cấu hình đúng loại sự kiện cho thông báo nhóm hay chưa bằng cách xác minh xem s3:ObjectCreated:* có được xuất ra khi bạn chạy lệnh này hay không:


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


Nếu bạn muốn tìm hiểu thêm về cách xuất bản các sự kiện nhóm lên webhook, hãy xem bác sĩ suy luận cũng như thế này đi sâu vào thông báo sự kiện . Bây giờ, chúng tôi đã sẵn sàng dùng thử máy chủ trích xuất văn bản của mình.


Hãy thử nó

Đây là tài liệu mà tôi muốn trích xuất văn bản từ đó. nó là một PDF của Đạo luật Hiện đại hóa Tương lai Hàng hóa năm 2000 , một bộ luật tài chính có ảnh hưởng ở Hoa Kỳ.



Tôi đặt bản PDF này vào nhóm ' trích xuất ' của mình bằng Bảng điều khiển MinIO.



Sự kiện PUT này kích hoạt thông báo nhóm, sau đó được xuất bản tới điểm cuối của máy chủ trích xuất. Theo đó, văn bản được Tika trích xuất và in ra console.



Bước tiếp theo


Mặc dù hiện tại chúng tôi chỉ in ra văn bản được trích xuất nhưng văn bản này có thể đã được sử dụng cho nhiều tác vụ tiếp theo, như được gợi ý trong Tiền đề. Ví dụ:


  1. Tạo tập dữ liệu để tinh chỉnh LLM : Hãy tưởng tượng bạn muốn tinh chỉnh một mô hình ngôn ngữ lớn trên một bộ sưu tập tài liệu của công ty tồn tại ở nhiều định dạng tệp khác nhau (ví dụ: PDF, DOCX, PPTX, Markdown, v.v.). Để tạo tập dữ liệu văn bản, thân thiện với LLM cho tác vụ này, bạn có thể thu thập tất cả các tài liệu này vào nhóm MinIO được định cấu hình bằng một webhook tương tự và chuyển văn bản được trích xuất cho từng tài liệu vào khung dữ liệu của tập huấn luyện/tinh chỉnh. Hơn nữa, bằng cách có các tệp nguồn của tập dữ liệu của bạn trên MinIO, việc quản lý, kiểm tra và theo dõi thành phần tập dữ liệu của bạn trở nên dễ dàng hơn nhiều.


  2. Thế hệ tăng cường truy xuất : RAG là cách mà các ứng dụng LLM có thể sử dụng ngữ cảnh chính xác và tránh ảo giác. Khía cạnh trọng tâm của phương pháp này là đảm bảo văn bản trong tài liệu của bạn có thể được trích xuất và sau đó được nhúng vào các vectơ, từ đó cho phép tìm kiếm ngữ nghĩa. Ngoài ra, cách tốt nhất thường là lưu trữ tài liệu nguồn thực tế của các vectơ này trong kho lưu trữ đối tượng (như MinIO!). Với cách tiếp cận được nêu trong bài đăng này, bạn có thể dễ dàng đạt được cả hai. Nếu bạn muốn tìm hiểu thêm về RAG và lợi ích của nó, hãy xem phần này bài đăng trước đó .


  3. Ứng dụng LLM : Với cách lập trình để trích xuất ngay văn bản từ tài liệu mới được lưu trữ, khả năng là vô tận, đặc biệt nếu bạn có thể sử dụng LLM. Hãy nghĩ đến việc phát hiện từ khóa (ví dụ: Lời nhắc: “Những mã cổ phiếu nào được đề cập?”), đánh giá nội dung (ví dụ: Lời nhắc: “Theo tiêu chí đánh giá, bài luận này sẽ đạt được điểm bao nhiêu?) hoặc gần như bất kỳ loại phân tích dựa trên văn bản nào (tức là Lời nhắc: “Dựa trên kết quả nhật ký này, lỗi đầu tiên xảy ra khi nào?”).


Ngoài tiện ích của Thông báo nhóm cho các tác vụ này, MinIO còn được xây dựng để cung cấp khả năng chịu lỗi và hiệu suất đẳng cấp thế giới cho bất kỳ loại và số lượng đối tượng nào – cho dù chúng là Powerpoint, hình ảnh hay đoạn mã.


Nếu bạn có bất kỳ câu hỏi nào hãy tham gia cùng chúng tôi Kênh Slack hoặc gửi cho chúng tôi một ghi chú tại xin chà[email protected] . Chúng tôi đang ở đây để giúp bạn.