इस पोस्ट में, हम दस्तावेज़ पाठ निष्कर्षण के लिए मिनियो बकेट नोटिफिकेशन और अपाचे टिका का उपयोग करेंगे, जो कि लार्ज लैंग्वेज मॉडल ( एलएलएम ) प्रशिक्षण और रिट्रीवल ऑग्मेंटेड जेनरेशन ( आरएजी ) जैसे महत्वपूर्ण डाउनस्ट्रीम कार्यों के केंद्र में है।
मान लीजिए कि मैं पाठ का एक डेटासेट बनाना चाहता हूं जिसका उपयोग मैं बाद में कर सकता हूं
अपाचे टिका को चालू करने का सबसे सरल तरीका है
इस उदाहरण में, मैं इसे डिफ़ॉल्ट पोर्ट, 9998 का उपयोग करने और उसे प्रदर्शित करने की अनुमति देता हूँ।
docker pull apache/tika:<version> docker run -d -p 127.0.0.1:9998:9998 apache/tika:<version>
यह सत्यापित करने के लिए कि टिका कंटेनर चल रहा है और पोर्ट 9998 प्रदर्शित है, docker ps
या Docker Desktop का उपयोग करें।
अब जब टिका चल रहा है, तो हमें एक ऐसा सर्वर बनाने की ज़रूरत है जो नए ऑब्जेक्ट के लिए प्रोग्रामेटिक रूप से टिका निष्कर्षण अनुरोध कर सके। इसके बाद, हमें नए ऑब्जेक्ट (दूसरे शब्दों में, बकेट के लिए PUT इवेंट) के आगमन के बारे में इस सर्वर को सचेत करने के लिए एक मिनियो बकेट पर वेबहुक कॉन्फ़िगर करने की ज़रूरत है। आइए इसे चरण-दर-चरण देखें।
चीजों को अपेक्षाकृत सरल रखने और इस दृष्टिकोण की पोर्टेबिलिटी को उजागर करने के लिए, टेक्स्ट एक्सट्रैक्शन सर्वर को लोकप्रिय फ्लास्क फ्रेमवर्क का उपयोग करके पायथन में बनाया जाएगा। सर्वर के लिए कोड यहाँ दिया गया है (मिनियो ब्लॉग रिसोर्स रिपॉजिटरी में भी उपलब्ध है)
""" 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()
आइये निष्कर्षण सर्वर शुरू करें:
उस होस्टनाम और पोर्ट को नोट कर लें जिस पर फ्लास्क एप्लिकेशन चल रहा है।
अब, बस इतना ही बाकी है कि मिनियो सर्वर पर बकेट के लिए वेबहुक को कॉन्फ़िगर किया जाए ताकि बकेट में कोई भी PUT इवेंट (उर्फ, जोड़े गए नए ऑब्जेक्ट) एक्सट्रैक्शन एंडपॉइंट पर कॉल को ट्रिगर कर सके। mc
टूल के साथ, हम इसे बस कुछ कमांड में कर सकते हैं।
सबसे पहले, हमें आपके MinIO सर्वर को यह संकेत देने के लिए कुछ पर्यावरण चर सेट करने की आवश्यकता है कि आप एक वेबहुक और संबंधित एंडपॉइंट को सक्षम कर रहे हैं जिसे कॉल किया जाना है। <YOURFUNCTIONNAME> को अपनी पसंद के फ़ंक्शन नाम से बदलें। सरलता के लिए, मैंने 'एक्सट्रैक्शन' का विकल्प चुना। साथ ही, सुनिश्चित करें कि एंडपॉइंट पर्यावरण चर आपके इंफ़रेंस सर्वर के लिए सही होस्ट और पोर्ट पर सेट है। इस मामले में, http://localhost:5000 वह जगह है जहाँ हमारा फ़्लैस्क एप्लिकेशन चल रहा है।
export MINIO_NOTIFY_WEBHOOK_ENABLE_<YOURFUNCTIONNAME>=on export MINIO_NOTIFY_WEBHOOK_ENDPOINT_<YOURFUNCTIONNAME>=http://localhost:5000
एक बार जब आप इन पर्यावरण चर को सेट कर लेते हैं, तो प्रारंभ करेंmc
, मिनियो क्लाइंट कमांड लाइन टूल का भी उपयोग करेंगे, इसलिए सुनिश्चित करें कि आपके पास यह है
इसके बाद, आइए अपनी बकेट के लिए इवेंट नोटिफिकेशन और उस इवेंट के प्रकार को कॉन्फ़िगर करें जिसके बारे में हमें सूचना चाहिए। इस प्रोजेक्ट के उद्देश्यों के लिए, मैंने एक बिलकुल नई बकेट बनाई है जिसका नाम ' एक्सट्रैक्शन ' भी है। आप ऐसा या तो कर सकते हैंmc
mc event add ALIAS/BUCKET arn:minio:sqs::<YOURFUNCTIONNAME>:webhook --event put
अंत में, आप यह जाँच कर सकते हैं कि आपने बकेट नोटिफिकेशन के लिए सही इवेंट प्रकार कॉन्फ़िगर किया है या नहीं, इसके लिए आपको यह सत्यापित करना होगा कि जब आप यह कमांड चलाते हैं s3:ObjectCreated:*
आउटपुट होता है या नहीं:
mc event ls ALIAS/BUCKET arn:minio:sqs::<YOURFUNCTIONNAME>:webhook
यदि आप वेबहुक पर बकेट इवेंट प्रकाशित करने के बारे में अधिक जानना चाहते हैं, तो देखें
यहाँ एक दस्तावेज़ है जिससे मैं पाठ निकालना चाहता हूँ। यह एक है
मैंने मिनियो कंसोल का उपयोग करके इस पीडीएफ को अपने ' एक्सट्रैक्शन ' बकेट में डाल दिया।
यह PUT इवेंट एक बकेट नोटिफिकेशन को ट्रिगर करता है जो फिर एक्सट्रैक्शन सर्वर एंडपॉइंट पर प्रकाशित हो जाता है। तदनुसार, टेक्स्ट को टिका द्वारा एक्सट्रैक्ट किया जाता है और कंसोल पर प्रिंट किया जाता है।
हालाँकि हम अभी निकाले गए पाठ को ही प्रिंट कर रहे हैं, लेकिन इस पाठ का उपयोग कई डाउनस्ट्रीम कार्यों के लिए किया जा सकता था, जैसा कि प्रीमाइस में संकेत दिया गया है। उदाहरण के लिए:
LLM फ़ाइन-ट्यूनिंग के लिए डेटासेट निर्माण : कल्पना करें कि आप कॉर्पोरेट दस्तावेज़ों के संग्रह पर एक बड़े भाषा मॉडल को फ़ाइन-ट्यून करना चाहते हैं जो विभिन्न फ़ाइल स्वरूपों (जैसे, PDF, DOCX, PPTX, Markdown, आदि) में मौजूद हैं। इस कार्य के लिए LLM-अनुकूल, टेक्स्ट डेटासेट बनाने के लिए, आप इन सभी दस्तावेज़ों को एक समान वेबहुक के साथ कॉन्फ़िगर किए गए MinIO बकेट में एकत्र कर सकते हैं और प्रत्येक दस्तावेज़ के लिए निकाले गए टेक्स्ट को फ़ाइन-ट्यूनिंग/ट्रेनिंग सेट के डेटाफ़्रेम में पास कर सकते हैं। इसके अलावा, अपने डेटासेट की स्रोत फ़ाइलों को MinIO पर रखने से, आपके डेटासेट की संरचना को प्रबंधित करना, ऑडिट करना और ट्रैक करना बहुत आसान हो जाता है।
रिट्रीवल ऑगमेंटेड जेनरेशन : RAG एक ऐसा तरीका है जिससे LLM एप्लिकेशन सटीक संदर्भ का उपयोग कर सकते हैं और भ्रम से बच सकते हैं। इस दृष्टिकोण का एक केंद्रीय पहलू यह सुनिश्चित करना है कि आपके दस्तावेज़ों का टेक्स्ट निकाला जा सकता है और फिर वेक्टर में एम्बेड किया जा सकता है, जिससे सिमेंटिक खोज सक्षम हो सके। इसके अलावा, इन वेक्टरों के वास्तविक स्रोत दस्तावेज़ों को ऑब्जेक्ट स्टोर (जैसे मिनियो!) में संग्रहीत करना आम तौर पर एक सर्वोत्तम अभ्यास है। इस पोस्ट में उल्लिखित दृष्टिकोण के साथ, आप दोनों को आसानी से प्राप्त कर सकते हैं। यदि आप RAG और इसके लाभों के बारे में अधिक जानना चाहते हैं, तो इसे देखें
एलएलएम एप्लीकेशन : नए स्टोर किए गए दस्तावेज़ से टेक्स्ट को तुरंत निकालने के लिए प्रोग्रामेटिक तरीके से, संभावनाएं अनंत हैं, खासकर यदि आप एलएलएम का उपयोग कर सकते हैं। कीवर्ड डिटेक्शन (यानी, प्रॉम्प्ट: “कौन से स्टॉक टिकर का उल्लेख किया गया है?”), कंटेंट असेसमेंट (यानी, प्रॉम्प्ट: “रूब्रिक के अनुसार, इस निबंध सबमिशन को क्या स्कोर मिलना चाहिए?), या लगभग किसी भी तरह का टेक्स्ट-आधारित विश्लेषण (यानी, प्रॉम्प्ट: “इस लॉग आउटपुट के आधार पर, पहली त्रुटि कब हुई?”) के बारे में सोचें।
इन कार्यों के लिए बकेट नोटिफिकेशन की उपयोगिता के अलावा, मिनियो को किसी भी प्रकार और संख्या में ऑब्जेक्ट्स के लिए विश्व स्तरीय दोष सहिष्णुता और प्रदर्शन प्रदान करने के लिए बनाया गया है - चाहे वे पावरपॉइंट, छवियां या कोड स्निपेट हों।
यदि आपके कोई प्रश्न हों तो हमसे जुड़ें