Last chance! 50% off DataCamp Premium
Sale ends in
Structured Query Language, या संक्षेप में SQL (अक्सर “सीक्वल” बोला जाता है), एक घोषणात्मक प्रोग्रामिंग भाषा है जिसका उपयोग डेटाबेस प्रबंधन प्रणाली में डेटा को संग्रहीत करने, पुनःप्राप्त करने, प्रबंधित करने और संसाधित करने के लिए किया जाता है।
इसे 1970 के दशक की शुरुआत में IBM के शोधकर्ताओं Raymond Boyce और Donald Chamberlain ने विकसित किया था, लेकिन यह वाणिज्यिक रूप से 1979 में उपलब्ध हुई जब Relational Software, Inc., जो अब Oracle के रूप में रीब्रांड हो चुका है, ने इसका इम्प्लीमेंटेशन पेश किया।
आजकल, SQL अपनी सादगी और बड़े डेटा सेट को कुशलतापूर्वक प्रबंधित और विश्लेषित करने की क्षमता के चलते व्यापक रूप से मानक रिलेशनल डेटाबेस मैनेजमेंट सिस्टम (RDBMS) के रूप में स्वीकार किया जाता है, जो हमारी तेजी से डेटा-चालित होती दुनिया में अपरिहार्य है।
लेकिन डेटा-चालित दुनिया बदल रही है।
कृत्रिम बुद्धिमत्ता तेजी से लोकप्रिय हो रही है, और बड़े भाषा मॉडल विभिन्न कार्यों के लिए अत्यंत शक्तिशाली उपकरण बनकर उभरे हैं। समस्या यह है कि इन भाषा मॉडलों के साथ बातचीत कभी-कभी किसी अजनबी भाषा में संवाद करने जैसी लगती है। यहीं पर LMQL सामने आता है।
LMQL को ETH Zürich की SRI Lab ने विकसित किया है और यह डेवलपर्स और उनके भाषा मॉडलों के बीच एक निजी अनुवादक की तरह काम करता है। विशेष रूप से, LMQL SQL की शक्ति को भाषा मॉडलों के क्षेत्र में लाता है, जिससे इनके साथ इंटरेक्शन अधिक सुगम, प्रभावी और आनंददायक हो जाते हैं।
इस ट्यूटोरियल के शेष भाग में, हम चर्चा करेंगे:
LMQL, जिसका पूर्ण रूप Language Models Query Language है, बड़े भाषा मॉडलों (LLMs) के लिए एक अभिनव प्रोग्रामिंग भाषा है। यह घोषणात्मक SQL-जैसे तत्वों को अनिवार्य (imperative) स्क्रिप्टिंग सिंटैक्स के साथ मिलाती है, ताकि LLMs से जानकारी निकालने या उत्तर जनरेट करने का अधिक संरचित और सहज तरीका प्रदान किया जा सके।
आगे जोड़ें तो, LMQL Python का एक सुपरसैट है, यानी यह एक एक्सटेंशन की तरह काम करता है जो नए फीचर्स जोड़ता है और Python की क्षमताओं का विस्तार करता है। इससे डेवलपर्स टेक्स्ट और कोड, दोनों को शामिल करने वाले नैचुरल लैंग्वेज प्रॉम्प्ट बना सकते हैं, जिससे क्वेरी की लचीलेपन और अभिव्यक्तिकता में वृद्धि होती है।
डॉक्यूमेंटेशन के अनुसार, “LMQL आपके कोड में LLMs को कॉल करने की क्षमता के साथ पारंपरिक प्रोग्रामिंग को एक नए तरीके से जोड़ता है। यह आपके प्रोग्राम कोड के स्तर पर LLM इंटरेक्शन को नैटिव रूप से एकीकृत करके पारंपरिक टेम्प्लेटिंग भाषाओं से आगे जाता है।”
इस प्रोग्रामिंग भाषा को इसके निर्माताओं ने Prompting is Programming: A Query Lnague for Large Language Models शीर्षक वाले एक शोधपत्र में प्रस्तुत किया, जो “LMP” (Language Model Prompting) कहलाने वाली घटना को सक्षम करने का समाधान है।
परिप्रेक्ष्य के लिए, बड़े भाषा मॉडलों ने प्रश्नोत्तर और कोड जनरेशन जैसे कई कार्यों में असाधारण प्रदर्शन दिखाया है। बुनियादी रूप से, LLMs दिए गए इनपुट के आधार पर सांख्यिकीय संभावनाओं का उपयोग करके स्वतःस्फूर्त रूप से तार्किक क्रम उत्पन्न करने में दक्ष होते हैं।
इस क्षमता का उपयोग करते हुए, उपयोगकर्ता भाषा निर्देशों या उदाहरणों के साथ LLMs को प्रॉम्प्ट कर सकते हैं ताकि विभिन्न डाउनस्ट्रीम कार्यों का निष्पादन ट्रिगर किया जा सके। उन्नत प्रॉम्प्टिंग तकनीकें उपयोगकर्ताओं, भाषा मॉडल और कैलकुलेटर जैसे बाहरी टूल्स के बीच इंटरेक्शन तक संभव बनाती हैं।
चुनौती तब आती है जब अत्याधुनिक प्रदर्शन हासिल करना हो या LLMs को विशेष कार्यों के लिए अनुकूलित करना हो—आमतौर पर इसके लिए जटिल, टास्क-विशिष्ट प्रोग्रामों का इम्प्लीमेंटेशन करना पड़ता है, जो फिर भी एड-हॉक इंटरेक्शन पर निर्भर हो सकते हैं।
लैंग्वेज मॉडल प्रॉम्प्टिंग एक उभरता हुआ अनुशासन है जो इन समस्याओं को सुलझाने के लिए गति पकड़ रहा है। LMQL LMP के सिद्धांतों का पालन करता है—जैसे LLMs को टेक्स्ट प्रॉम्प्टिंग और स्क्रिप्टिंग का सहज संयोजन प्रदान करना और उपयोगकर्ताओं को भाषा मॉडल के आउटपुट पर बाधाएँ निर्दिष्ट करने में सक्षम बनाना।
नए दौर के भाषा मॉडलों को अवधारणात्मक रूप से उदाहरणों या निर्देशों के साथ आसानी से प्रॉम्प्ट किया जा सकता है। हालांकि, उनका पूर्ण क्षमता तक उपयोग करना और नए मॉडल जारी होने पर अद्यतन बने रहना उनकी आंतरिक कार्यप्रणाली तथा विक्रेता-विशिष्ट लाइब्रेरी और इम्प्लीमेंटेशन की गहन समझ मांगता है।
उदाहरण के लिए, डिकोडिंग प्रक्रिया को केवल वैध शब्दों या वाक्यांशों की सूची तक सीमित करना चुनौतीपूर्ण हो सकता है क्योंकि भाषा मॉडल टोकन के साथ काम करते हैं। चाहे आप LLMs को लोकली उपयोग करें या API के जरिए, वे काफी महंगे होते हैं क्योंकि वे विशाल नेटवर्क होते हैं।
LMQL पूर्वनिर्धारित व्यवहार और बाधाओं द्वारा प्रस्तुत सर्च प्रतिबंध का लाभ उठाकर भाषा मॉडल (LM) के इनवोक कॉल्स की संख्या कम कर सकता है।
LMQL का एक और कारण यह है कि कई प्रॉम्प्टिंग तकनीकों में भाषा मॉडल और उपयोगकर्ता के बीच आगे-पीछे संवाद की जरूरत पड़ती है (जैसा कि ChatGPT जैसे चैटबॉट्स में दिखता है) या अत्यधिक विशिष्ट इंटरफेसों की, जैसे बाहरी कंट्रोल लॉजिक के साथ अंकगणितीय गणनाएँ करने के लिए उपयोग किए जाने वाले।
इन प्रॉम्प्ट्स को इम्प्लीमेंट करना काफी मैनुअल काम और मॉडल की डिकोडिंग प्रक्रियाओं के साथ इंटरेक्शन मांगता है, जो परिणामी इम्प्लीमेंटेशनों की सार्वभौमिकता को सीमित करता है। अंततः, क्योंकि एक LM एक समय में केवल एक (उप-शब्द) टोकन जनरेट कर सकता है, फिनिशिंग के लिए कई कॉल्स की जरूरत पड़ सकती है।
मौजूदा LMs आउटपुट पर बाधाएँ लागू करने की सुविधा नहीं देते, जो प्रोडक्शन में LMs के उपयोग के लिए बेहद महत्वपूर्ण है। उदाहरण के लिए, मान लीजिए आप नकारात्मक समीक्षाओं को चिह्नित करने के लिए एक सेंटिमेंट एनालिसिस एप्लिकेशन बना रहे हैं। प्रोग्राम उम्मीद करेगा कि LLM “positive,” “negative,” या “neutral” जैसे कुछ लौटाए।
लेकिन अक्सर LLM कुछ ऐसा कह सकता है, “दिए गए ग्राहक समीक्षा के लिए भावना सकारात्मक है,” जिसे आपकी API के लिए प्रोसेस करना कठिन हो जाता है। इसलिए, बाधाएँ बेहद लाभकारी हैं।
LMQL के साथ, आप आउटपुट को उन शब्दों से नियंत्रित कर सकते हैं जो मनुष्यों के लिए बोधगम्य हों, न कि उन टोकनों से जिनका उपयोग LMs करते हैं।
LMQL को लोकली इंस्टॉल किया जा सकता है या वेब-आधारित Playground IDE के माध्यम से ऑनलाइन उपयोग किया जा सकता है। ध्यान दें, यदि आप Transformers या llama.cpp के जरिए स्वयं-होस्टेड मॉडल उपयोग करना चाहते हैं, तो आपको LMQL को लोकली इंस्टॉल करना होगा। ऐसे करें:
LMQL को लोकली इंस्टॉल करना काफी सरल है।
आपको बस Python >= 3.10 एनवायरनमेंट में निम्न कमांड चलानी है:
pip install lmql
यदि आप लोकल GPU पर मॉडल चलाने का इरादा रखते हैं, तो आपको LMQL ऐसे एनवायरनमेंट में इंस्टॉल करना होगा जहाँ PyTorch >= 1.11 का GPU-सक्षम इंस्टॉलेशन हो।
pip के जरिए GPU निर्भरताओं के साथ LMQL इंस्टॉल करना चाहते हैं तो यह कमांड चलाएँ:
pip install lmql[hf]
नोट: निर्भरताओं को वर्चुअल एनवायरनमेंट में इंस्टॉल करना अच्छा अभ्यास है।
इंस्टॉलेशन के बाद, LMQL प्रोग्राम चलाने के आपके पास तीन विकल्प हैं:
1. Playground
आप Playground IDE का एक लोकल इंस्टेंस लॉन्च कर सकते हैं
lmql playground
यह कमांड ब्राउज़र-आधारित Playground IDE लॉन्च करेगी, लेकिन यदि यह स्वतः लॉन्च नहीं होती, तो http://localhost:3000 पर जाएँ।
ध्यान दें, इस विधि के लिए Node.js का इंस्टॉलेशन आवश्यक है।
2. कमांड-लाइन इंटरफेस
Playground का एक विकल्प कमांड-लाइन टूल है। इसका उपयोग लोकल .lmql फाइलें चलाने के लिए किया जा सकता है। उपयोग करने के लिए बस यह कमांड चलाएँ:
lmql run
3. Python इंटीग्रेशन
चूंकि यह एक सुपरसैट है, LMQL को सीधे एक Python प्रोग्राम के भीतर से चलाया जा सकता है। आपको बस lmql पैकेज इम्पोर्ट करना है। सारी क्वेरी कोड lmql.run के जरिए या @lmql.query डेकोरेटर के साथ चलनी चाहिए।
जब आप Playground IDE या कमांड-लाइन टूल में लोकल Transformer मॉडल्स का उपयोग करते हैं, तो आपको संबंधित मॉडल के लिए lmql serve-model कमांड निष्पादित करके पहले LMQL Inference API का एक इंस्टेंस लॉन्च करना होगा।
एक LMQL प्रोग्राम पाँच बुनियादी हिस्सों से बना होता है, जिनमें से प्रत्येक क्वेरी के व्यवहार को निर्धारित करने में महत्वपूर्ण भूमिका निभाता है। ये घटक हैं:
आइए प्रत्येक को थोड़ा विस्तार से समझें।
भाषा मॉडल और उपयोगकर्ता के बीच संचार का प्राथमिक माध्यम क्वेरी ब्लॉक है।
यहाँ एक बुनियादी LMQL क्वेरी है:
# Source: https://lmql.ai/docs/
"Say 'this is a test':[RESPONSE]" where len(TOKENS(RESPONSE)) < 25
—-- Model Output—--
"""
Say 'this is a test': RESPONSE This is a test
"""
क्वेरी ब्लॉक प्रत्येक टॉप-लेवल स्ट्रिंग को भाषा मॉडल के लिए एक डायरेक्ट क्वेरी की तरह ट्रीट करता है। Python f-strings की तरह, ये क्वेरी स्ट्रिंग्स दो विशेष एस्केप्ड सबफ़ील्ड्स को सपोर्ट करती हैं।
ध्यान दें, भाषा मॉडल जो वाक्यांश जनरेट करेगा उसे [varname] से दर्शाया गया है। इसे होल (hole) भी कहा जाता है—हम जल्द ही where क्लॉज़ पर आएँगे।
वर्तमान स्कोप से किसी वेरिएबल का मान प्राप्त करना {varname} का उपयोग करके भी किया जा सकता है।
उदाहरण के लिए:
# Source: https://lmql.ai/docs/language/overview.html
# review to be analyzed
review = """We had a great stay. Hiking in the mountains was fabulous and the food is really good."""
# use prompt statements to pass information to the model
"Review: {review}"
भाषा मॉडल के टोकन वितरण से टेक्स्ट जनरेट करने के लिए प्रयुक्त विभिन्न डिकोडिंग एल्गोरिद्म LMQL द्वारा सपोर्ट किए जाते हैं। इससे क्वेरी की शुरुआत में ही डिकोडिंग एल्गोरिद्म निर्दिष्ट करना संभव हो जाता है।
डिकोडिंग एल्गोरिद्म निर्दिष्ट करने के दो तरीके हैं:
1. क्वेरी के हिस्से के रूप में — इसमें आप एल्गोरिद्म और उसके पैरामीटर्स को क्वेरी का हिस्सा बनाकर निर्दिष्ट करते हैं। LMQL के डॉक्यूमेंटेशन के अनुसार, “यदि आपके द्वारा लिखे जा रहे ठोस प्रोग्राम के लिए आपका डिकोडर चयन प्रासंगिक है, तो यह विशेष रूप से उपयोगी हो सकता है।” कोड में यह कुछ यूँ दिखता है:
# Source: https://lmql.ai/docs/language/decoding.html
# use beam search with beam width 2 for
# the entire program
beam(n=2)
# uses beam search to generate RESPONSE
"This is a query with a specified decoder: [RESPONSE]"
2. बाहरी रूप से — इसमें डिकोडिंग एल्गोरिद्म और पैरामीटर्स को वास्तविक प्रोग्राम से अलग, बाहरी रूप से निर्दिष्ट किया जाता है। ध्यान दें, यह केवल तब संभव है जब LMQL को Python संदर्भ से उपयोग किया जा रहा हो
# Source: https://lmql.ai/docs/language/decoding.htmlimport lmql
@lmql.query(model="openai/text-davinci-003", decoder="sample", temperature=1.8)
def tell_a_joke():
'''lmql
"""A list good dad joke. A indicates the punchline:
Q:[JOKE]
A:[PUNCHLINE]""" where STOPS_AT(JOKE, "?") and STOPS_AT(PUNCHLINE, "\n")
'''
tell_a_joke() # uses the decoder specified in @lmql.query(...)
tell_a_joke(decoder="beam", n=2) # uses a beam search decoder with n=2
डेवलपर्स के अनुसार, LMQL को “टेक्स्ट जनरेशन के लिए एक उच्च-स्तरीय, फ्रंट-एंड भाषा” के रूप में परिभाषित किया गया है। इसका मतलब है कि यह किसी एक टेक्स्ट जनरेशन मॉडल के लिए विशिष्ट नहीं है। इसके बजाय, बैकएंड पर विभिन्न टेक्स्ट जनरेशन मॉडल सपोर्ट किए जाते हैं, जैसे OpenAI model, llama.cpp और HuggingFace Transformers।
मॉडल्स को लोड करना काफी सीधा है। आप lmql.model(...) फ़ंक्शन का उपयोग कर सकते हैं, जो एक lmql.LMM ऑब्जेक्ट उत्पन्न करता है।
यह कुछ यूँ दिखता है:
# Source: https://lmql.ai/docs/models/
lmql.model("openai/gpt-3.5-turbo-instruct") # OpenAI API model
lmql.model("random", seed=123) # randomly sampling model
lmql.model("llama.cpp:<YOUR_WEIGHTS>.gguf") # llama.cpp model
lmql.model("local:gpt2") # load a `transformers` model in-process
lmql.model("local:gpt2", cuda=True, load_in_4bit=True) # load a `transformers` model in process with additional arguments
lmql.model("gpt2") # access a `transformers` model hosted via `lmql serve-model`
lmql.LLM ऑब्जेक्ट बन जाने के बाद, आप मॉडल को क्वेरी प्रोग्राम में दो तरीकों में से किसी एक से पास कर सकते हैं:
1. मॉडल को बाहरी रूप से निर्दिष्ट करना
# Source: https://lmql.ai/docs/models/
import lmql
# uses 'chatgpt' by default
@lmql.query(model="chatgpt")
def tell_a_joke():
'''lmql
"""A great good dad joke. A indicates the punchline
Q:[JOKE]
A:[PUNCHLINE]""" where STOPS_AT(JOKE, "?") and \
STOPS_AT(PUNCHLINE, "\n")
'''
tell_a_joke() # uses chatgpt
tell_a_joke(model=lmql.model("openai/text-davinci-003")) # uses text-davinci-003
2. from क्लॉज़ वाली क्वेरी का उपयोग
# Source: https://lmql.ai/docs/models/
argmax
"This is a query with a specified 'from'-clause: [RESPONSE]"
from
"openai/text-ada-001"
LMQL का एक मुख्य आकर्षण इसका constraints घटक है। उल्लेखनीय रूप से, LMQL उपयोगकर्ताओं को भाषा मॉडल के आउटपुट पर बाधाएँ निर्दिष्ट करने में सक्षम बनाता है। यह स्क्रिप्टेड प्रॉम्प्टिंग में मदद करता है—मॉडल आउटपुट को इच्छित बिंदु पर समाप्त कराने की गारंटी देकर—और डिकोडिंग के दौरान उपयोगकर्ताओं को मॉडल पर नियंत्रण भी देता है।
समर्थित constraints में शामिल हैं:
इनके बारे में अधिक जानने के लिए LMQL के डॉक्यूमेंटेशन में Constraints पेज देखें।
डिस्ट्रिब्यूशन निर्देश LMQL में एक प्रमुख घटक है। यह आउटपुट के फ़ॉर्मेट और संरचना पर नियंत्रण प्रदान करता है—यह परिभाषित करके कि जनरेट हुए परिणाम कैसे वितरित और प्रस्तुत किए जाएँ।
यहाँ इसका एक उदाहरण क्रिया में देखें:
# Source: https://lmql.ai/docs/language/overview.html
argmax
# review to be analyzed
review = """We had a great stay. Hiking in the mountains was fabulous and the food is really good."""
# use prompt statements to pass information to the model
"Review: {review}"
"Q: What is the underlying sentiment of this review and why?"
# template variables like [ANALYSIS] are used to generate text
"A:[ANALYSIS]" where not "\n" in ANALYSIS
# use constrained variable to produce a classification
"Based on this, the overall sentiment of the message can be considered to be[CLS]"
distribution
CLS in [" positive", " neutral", " negative"]
----- Model Output ------
Review: We had a great stay. Hiking in the mountains was fabulous and the food is really good.
Q: What is the underlying sentiment of this review and why?
A: ANALYSIS The underlying sentiment of this review is positive because the reviewer had a great stay, enjoyed the hiking and found the food to be good.
Based on this, the overall sentiment of the message can be considered to be CLS
हर तकनीक की तरह, LMQL की भी कुछ सीमाएँ हैं। उदाहरण के लिए:
यद्यपि ये बातें LMQL अपनाने पर विचार कर रहे उपयोगकर्ताओं के लिए बाधक हो सकती हैं, यह ध्यान देना महत्वपूर्ण है कि लाइब्रेरी अभी काफी नई है और विकासाधीन है—आने वाले संस्करणों में ये सीमाएँ दूर हो सकती हैं।
LMQL एक SQL-जैसी प्रोग्रामिंग भाषा है जो Python का भी सुपरसैट है। यह अपनी घोषणात्मक विशेषताओं को अनिवार्य स्क्रिप्टिंग सिंटैक्स के साथ मिलाकर LLMs से जानकारी निकालने या उत्तर जनरेट करने की प्रक्रिया को सरल बनाती है। डेवलपर्स LMQL का उपयोग करके टेक्स्ट जनरेशन को प्रभावी ढंग से नियंत्रित कर सकते हैं, जिससे यह टेक इंडस्ट्री के विभिन्न अनुप्रयोगों के लिए अत्यंत उपयोगी उपकरण बन जाता है।
अपनी सीख जारी रखने के लिए देखें:
आज ही अपनी एआई यात्रा शुरू करें!
कोर्स
कोर्स
लर्निंग पाथ