प्रेरक उद्धरण उन दिनों काफी लोकप्रिय थे जब एमएमएस और ईमेल अग्रेषण लोकप्रिय थे। मुझे याद है कि मेरे माता-पिता हर सुबह की शुरुआत में मुझे फॉरवर्ड करते थे। आज के लिए तेजी से आगे बढ़ें, यदि आप भाग्यशाली हैं, तो आप अपनी पसंद के मैसेजिंग ऐप (व्हाट्सएप, टेलीग्राम, आदि) पर कुछ फॉरवर्ड ग्रुप का हिस्सा हैं।
उसी विचार से प्रेरित होकर, आज हम एक ऐसी सेवा का निर्माण करने जा रहे हैं जो हमारे मित्रों और परिवार को दिन का एआई-जनित प्रेरक उद्धरण भेजती है। प्रेरक उद्धरणों की एक सूची को हार्डकोड करने के बजाय, हम मांग पर एक उद्धरण उत्पन्न करने के लिए एक मशीन लर्निंग मॉडल का उपयोग करने जा रहे हैं ताकि हम साझा करने के लिए कभी भी उद्धरणों से बाहर न हों!
OpenAI GPT-2 मॉडल को एलेक रेडफोर्ड, जेफरी वू, रेवॉन चाइल्ड, डेविड लुआन, डारियो अमोडी और इल्या सुतस्केवर द्वारा लैंग्वेज मॉडल्स अनसुपरवाइज्ड मल्टीटास्क लर्नर्स में प्रस्तावित किया गया था। यह ~ 40 जीबी टेक्स्ट डेटा के एक बहुत बड़े कोष पर भाषा मॉडलिंग का उपयोग करके पूर्व-प्रशिक्षित एक कारण ट्रांसफार्मर है।
इसे सरल बनाने के लिए, उच्च-स्तरीय OpenAI GPT2 एक बड़ा भाषा मॉडल है जिसे भारी मात्रा में डेटा पर प्रशिक्षित किया गया है। इस मॉडल का उपयोग दिए गए क्रम में अगले टोकन की भविष्यवाणी करने के लिए किया जा सकता है।
यदि यह बहुत जटिल लगता है, तो चिंता न करें, इस परियोजना के साथ पालन करने के लिए आपको किसी मशीन लर्निंग या एआई को जानने की आवश्यकता नहीं है। पुस्तकालय जैसे
हम उपयोग करेंगे
सौभाग्य से, हमारे मामले में एक ठीक-ठाक मॉडल है जिसे 500k कोट्स डेटासेट पर प्रशिक्षित किया गया है -
हगिंग फेस के साथ, इस मॉडल का उपयोग करना उतना ही आसान है जितना कि एक टोकन बनाना
from transformers import AutoTokenizer, AutoModelWithLMHead, pipeline tokenizer = AutoTokenizer.from_pretrained("nandinib1999/quote-generator")
फिर पूर्व प्रशिक्षित मॉडल से एक मॉडल का निर्माण करना
model = AutoModelWithLMHead.from_pretrained("nandinib1999/quote-generator")
और अंत में, जनरेटर का निर्माण करना जिसका उपयोग हम उद्धरण उत्पन्न करने के लिए कर सकते हैं
generator = pipeline("text-generation", model=model, tokenizer=tokenizer) # use a starting prompt generator("Keep an open mind and") [{'generated_text': 'Keep an open mind and a deep love for others'}]
अब जब हमारे पास हमारे लिए उद्धरण उत्पन्न करने का एक तरीका है, तो हमें यह सोचना होगा कि हम इसे अपने ऐप में कैसे उपयोग कर सकते हैं। इसे बनाने के कई तरीके हैं।
दूसरे विकल्प का एक महत्वपूर्ण प्लस पॉइंट यह है कि एक बार मॉडल लोड हो जाने के बाद एपीआई हमें जल्दी से प्रतिक्रिया दे सकता है और अन्य अनुप्रयोगों में भी इसका उपयोग किया जा सकता है। एफडब्ल्यूआईडब्ल्यू, पहला विकल्प भी पूरी तरह से वैध दृष्टिकोण है।
हम एक त्वरित सेवारत एपीआई बनाने के लिए __ फास्ट एपीआई __ का उपयोग कर सकते हैं। यहाँ ऐसा दिखता है
# in file api.py from pydantic import BaseModel from fastapi import FastAPI, HTTPException from transformers import AutoTokenizer, AutoModelWithLMHead, pipeline ## create the pipeline tokenizer = AutoTokenizer.from_pretrained("nandinib1999/quote-generator") model = AutoModelWithLMHead.from_pretrained("nandinib1999/quote-generator") generator = pipeline("text-generation", model=model, tokenizer=tokenizer) app = FastAPI() class QuoteRequest(BaseModel): text: str class QuoteResponse(BaseModel): text: str ### Serves the Model API to generate quote @app.post("/generate", response_model=QuoteResponse) async def generate(request: QuoteRequest): resp = generator(request.text) if not resp[0] and not resp[0]["generated_text"]: raise HTTPException(status_code=500, detail='Error in generation') return QuoteResponse(text=resp[0]["generated_text"])
आइए इसका परीक्षण करें
$ uvicorn api:app INFO: Started server process [40767] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
अब हम /generate
एंडपॉइंट के लिए अनुरोध भेजना शुरू कर सकते हैं जो हमारे लिए एक उद्धरण उत्पन्न करेगा।
अब जब हमारे पास मांग पर भाव उत्पन्न करने का एक तरीका है, तो हम यहां रुक सकते हैं और इसके माध्यम से इसे भेजने पर काम करना शुरू कर सकते हैं
हमारे एपीआई को देखते हुए, अब हम एक उद्धरण उत्पन्न करने के लिए निम्न कार्य कर सकते हैं
from random import choice # feel free to add more starting prompts for more variety canned_seeds = ["Always remember to", "Start today with", "It is okay to"] seed = choice(canned_seeds) resp = requests.post('http://127.0.0.1:8000/generate', data=json.dumps({"text": seed})) return resp.json()["text"]
पहली चुनौती हमारे उद्धरण के लिए एक सुंदर पृष्ठभूमि छवि प्राप्त करना है। उसके लिए, हम Unsplash API का उपयोग करेंगे जो एक क्वेरी से मेल खाती एक यादृच्छिक छवि को वापस करने के लिए एक अच्छा समापन बिंदु प्रदान करता है। प्रारंभिक
चीजों को रोचक बनाए रखने के लिए, हम अलग-अलग क्वेरी टर्म्स जैसे स्टार्स आदि का उपयोग कर सकते हैं। यहां बताया गया है कि हमारी बैकग्राउंड इमेज को डाउनलोड करने के लिए कोड कैसा दिखता है -
from random import choice image_backgdrops = ['nature', 'stars', 'mountains', 'landscape'] backdrop = choice(image_backdrops) response = requests.get("https://source.unsplash.com/random/800×800/?"+ backdrop, stream=True) # write the output the img.png on our filesystem with open('img.png', 'wb') as out_file: shutil.copyfileobj(response.raw, out_file) del response
ठीक है, अब हमारे पास हमारी पृष्ठभूमि छवि और एक उद्धरण है जिसका अर्थ है कि हम प्राप्तकर्ताओं को भेजी जाने वाली अंतिम छवि को जोड़ने पर काम कर सकते हैं। उच्च स्तर पर हम छवि पर कुछ पाठ रखना चाहते हैं लेकिन यह सरल कार्य भी चुनौतीपूर्ण हो सकता है। शुरुआत के लिए, हमारे पास उत्तर देने के लिए कई प्रश्न हैं
इनमें से कुछ सवालों के जवाब दूसरों की तुलना में अधिक जटिल हैं। इसे सरल रखने के लिए, हम टेक्स्ट को बीच में रखेंगे, और कुछ रैपिंग करेंगे ताकि यह अच्छा लगे। अंत में, अभी के लिए हम हल्के रंग के टेक्स्ट का उपयोग करेंगे। सभी छवि हेरफेर के लिए, हम इसे आसान बनाने के लिए पायथन इमेज लाइब्रेरी (PIL) का उपयोग करेंगे।
# use the image we downloaded in the above step img = Image.open("img.png") width, height = img.size image_editable = ImageDraw.Draw(img) # wrap text lines = textwrap.wrap(text, width=40) # get the line count and generate a starting offset on y-axis line_count = len(lines) y_offset = height/2 - (line_count/2 * title_font.getbbox(lines[0])[3]) # for each line of text, we generate a (x,y) to calculate the positioning for line in lines: (_, _, line_w, line_h) = title_font.getbbox(line) x = (width - line_w)/2 image_editable.text((x,y_offset), line, (237, 230, 211), font=title_font) y_offset += line_h img.save("result.jpg") print("generated " + filename) return filename
यह result.jpg
नामक अंतिम छवि उत्पन्न करता है
अंतिम चरण के लिए, हमें छवि अपलोड करने की आवश्यकता है ताकि हम कूरियर के साथ उसका उपयोग कर सकें। इस मामले में, मैं फायरबेस स्टोरेज का उपयोग कर रहा हूं, लेकिन आप जो चाहें उपयोग करने के लिए स्वतंत्र महसूस कर सकते हैं।
import firebase_admin from firebase_admin import credentials from firebase_admin import storage cred = credentials.Certificate('serviceaccount.json') firebase_admin.initialize_app(cred, {...}) bucket = storage.bucket() blob = bucket.blob(filename) blob.upload_from_filename(filename) blob.make_public() return blob.public_url
अंत में, हमारे पास वह सब कुछ है जो हमें अपने मित्रों और परिवार को अपने भयानक उद्धरण भेजने के लिए चाहिए। एक अच्छा दिखने वाला ईमेल टेम्प्लेट बनाने के लिए हम कूरियर का उपयोग कर सकते हैं।
कूरियर से संदेश भेजना जितना आसान है उतना ही आसान है। जबकि कूरियर के अपने एसडीके हैं जो एकीकरण को आसान बना सकते हैं, मैं चीजों को सरल रखने के लिए इसके एपीआई एंडपॉइंट का उपयोग करना पसंद करता हूं। मेरे AUTH_TOKEN
और TEMPLATE_ID
के साथ, हम अपनी छवि भेजने के लिए निम्नलिखित कोड का उपयोग कर सकते हैं
import requests headers = { "Accept": "application/json", "Content-Type": "application/json", "Authorization": "Bearer {}".format(os.environ['COURIER_AUTH_TOKEN']) } message={ "to": { "email": os.environ["COURIER_RECIPIENT"] }, "data": { "date": datetime.today().strftime("%B %d, %Y"), "img": image_url ## this is image url we generated earlier }, "routing": { "method": "single", "channels": [ "email" ] }, "template": os.environ["COURIER_TEMPLATE"] } requests.post("https://api.courier.com/send", json={"message": message}, headers=headers)
एपीआई कुंजी में पाया जा सकता है
इस ट्यूटोरियल ने दिखाया कि मशीन लर्निंग और कूरियर के साथ शुरुआत करना कितना आसान है।
यदि आप आगे बढ़ना चाहते हैं और इस परियोजना में सुधार करना चाहते हैं, तो यहां कुछ दिलचस्प विचार आजमाए जा सकते हैं