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 ).
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 để
Cách đơn giản nhất để thiết lập và chạy Apache Tika là sử dụng
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.
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
""" 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.
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 đầumc
, công cụ dòng lệnh MinIO Client, vì vậy hãy đảm bảo bạn có nó
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àymc
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
Đây là tài liệu mà tôi muốn trích xuất văn bản từ đó. nó là một
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.
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ụ:
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.
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
Ứ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