BAML बनाम Instructor: संरचित LLM आउटपुट्स
टाइप-सेफ एलएलएम आउटपुट्स के साथ BAML और इंस्ट्रक्टर
प्रोडक्शन में लार्ज लैंग्वेज मॉडल्स के साथ काम करते समय, संरचित, टाइप-सेफ आउटपुट्स प्राप्त करना महत्वपूर्ण है। दो लोकप्रिय फ्रेमवर्क - BAML और Instructor - इस समस्या को हल करने के लिए अलग-अलग दृष्टिकोण अपनाते हैं।
यह तुलना आपको अपने Python LLM एप्लिकेशन्स के लिए सही उपकरण चुनने में मदद करती है।

संरचित आउटपुट चुनौतियों को समझना
एलएलएम्स स्वाभाविक रूप से असंरचित टेक्स्ट उत्पन्न करते हैं, लेकिन आधुनिक एप्लिकेशन्स को भविष्यवाणी योग्य, पार्स करने योग्य डेटा की आवश्यकता होती है। चाहे आप चैटबॉट्स, डेटा एक्सट्रैक्शन पाइपलाइन्स, या AI एजेंट्स बना रहे हों, आपको JSON ऑब्जेक्ट्स, वैलिडेटेड डेटा टाइप्स, और एरर हैंडलिंग की आवश्यकता होती है - न कि फ्री-फॉर्म रिस्पॉन्स।
BAML और Instructor दोनों इस चुनौती का समाधान करते हैं लेकिन मूलभूत रूप से अलग दर्शन के साथ: BAML कोड जनरेशन के साथ एक कॉन्ट्रैक्ट-फर्स्ट दृष्टिकोण का उपयोग करता है, जबकि Instructor रनटाइम वैलिडेशन के साथ Python की टाइप सिस्टम का उपयोग करता है। अगर आप विभिन्न LLM प्रोवाइडर्स के बीच संरचित आउटपुट दृष्टिकोणों के बारे में व्यापक संदर्भ में रुचि रखते हैं, तो इन फ्रेमवर्क्स को समझना और भी अधिक मूल्यवान हो जाता है।
BAML: LLMs के लिए डोमेन-स्पेसिफिक लैंग्वेज
BAML (BoundaryML की भाषा) एलएलएम इंटरैक्शन्स को परिभाषित करने के लिए एक समर्पित DSL पेश करता है। आप .baml फाइलों लिखते हैं जो आपके प्रॉम्प्ट्स, टाइप्स, और फंक्शन्स को घोषित करते हैं, फिर BAML कई भाषाओं के लिए टाइप-सेफ क्लाइंट कोड जनरेट करता है जिसमें Python शामिल है।
BAML के प्रमुख विशेषताएं
भाषाओं के बीच टाइप सुरक्षा: BAML Python, TypeScript, और Ruby के लिए क्लाइंट्स जनरेट करता है, जो एक ही .baml परिभाषाओं से, आपके स्टैक में संरक्षण सुनिश्चित करता है।
प्रॉम्प्ट्स के लिए वर्जन नियंत्रण: आपके प्रॉम्प्ट्स .baml फाइलों में रहते हैं, जिससे उन्हें ट्रैक, समीक्षा, और एप्लिकेशन कोड से स्वतंत्र रूप से परीक्षण करना आसान हो जाता है।
बिल्ट-इन टेस्टिंग फ्रेमवर्क: BAML में टेस्टिंग टूल्स शामिल हैं जो डिप्लॉयमेंट से पहले प्रॉम्प्ट व्यवहार को वैलिडेट करने के लिए, विकास के शुरुआती चरण में मुद्दों को पकड़ने के लिए।
प्लेग्राउंड इंटरफेस: BAML प्लेग्राउंड आपको तत्काल फीडबैक के साथ प्रॉम्प्ट्स पर दृश्य रूप से इटरेट करने की अनुमति देता है, जिससे विकास चक्र तेज़ हो जाते हैं।
BAML का उदाहरण कार्यान्वयन
# पहले, एक .baml फाइल में अपना स्कीमा परिभाषित करें:
# persona.baml
class Person {
name string
age int
occupation string
skills string[]
}
function ExtractPerson(text: string) -> Person {
client GPT4
prompt #"
Extract person information from: {{ text }}
Return structured data.
"#
}
जनरेटेड Python क्लाइंट टाइप-सेफ एक्सेस प्रदान करता है:
from baml_client import b
from baml_client.types import Person
# जनरेटेड क्लाइंट का उपयोग करें
text = "John Smith, 34, software engineer skilled in Python and Go"
result: Person = b.ExtractPerson(text)
print(f"{result.name} is {result.age} years old")
print(f"Skills: {', '.join(result.skills)}")
BAML का दृष्टिकोण तब चमकता है जब आपके पास एक ही LLM कॉन्ट्रैक्ट्स का उपयोग करने वाले कई सेविसेस होते हैं या जब आपको भाषा सीमाओं के पार डेटा शेप्स के बारे में मजबूत गारंटी की आवश्यकता होती है।
Instructor: Pydantic-Native Python Framework
Instructor एक Python-फर्स्ट दृष्टिकोण लेता है, Pydantic मॉडल्स को LLM क्षमताओं के साथ बढ़ाता है। यह Pydantic का उपयोग करने वाले Python डेवलपर्स के लिए स्वाभाविक महसूस होता है जो वैलिडेशन और टाइप हिंट्स के लिए उपयोग करते हैं।
Instructor के प्रमुख विशेषताएं
शून्य बॉयलरप्लेट: Instructor आपकी मौजूदा Pydantic मॉडल्स के साथ सरल डिकोरेटर्स का उपयोग करके सीधे काम करता है। कोड जनरेशन या बिल्ड स्टेप की आवश्यकता नहीं है।
संपूर्ण वैलिडेशन: Pydantic के पूरे वैलिडेशन पारिस्थितिकी का लाभ उठाएं - कस्टम वैलिडेटर्स, फील्ड कंस्ट्रेंट्स, कंप्यूटेड फील्ड्स, और जटिल नेटेड स्ट्रक्चर्स।
मल्टीपल प्रोवाइडर समर्थन: OpenAI, Anthropic, Google, और Ollama के साथ एकीकृत इंटरफेस के माध्यम से बिना किसी समस्या के काम करता है।
स्ट्रीमिंग समर्थन: Pydantic मॉडल अपडेट्स के साथ बढ़ती हुई रिस्पॉन्स स्ट्रीमिंग के लिए प्रथम श्रेणी का समर्थन।
रीट्राई लॉजिक: एक्सपोनेंशियल बैकऑफ और वैलिडेटर-आधारित एरर रिकवरी के साथ बिल्ट-इन रीट्राई मेकेनिज्म।
Instructor का उदाहरण कार्यान्वयन
from pydantic import BaseModel, Field
from instructor import from_openai
from openai import OpenAI
# अपनी Pydantic मॉडल परिभाषित करें
class Person(BaseModel):
name: str = Field(description="व्यक्ति का पूरा नाम")
age: int = Field(ge=0, le=120, description="वर्षों में उम्र")
occupation: str
skills: list[str] = Field(description="प्रोफेशनल स्किल्स की सूची")
# OpenAI क्लाइंट को पैच करें
client = from_openai(OpenAI())
# संरचित डेटा निकालें
text = "John Smith, 34, software engineer skilled in Python and Go"
result = client.chat.completions.create(
model="gpt-4",
response_model=Person,
messages=[
{"role": "user", "content": f"Extract person info: {text}"}
]
)
print(f"{result.name} is {result.age} years old")
print(f"Skills: {', '.join(result.skills)}")
Instructor की ताकत उसके सरलता और Python पारिस्थितिकी के साथ एकीकरण में है। अगर आप पहले से ही Pydantic का उपयोग कर रहे हैं, तो सीखने की कड़ी कम है। Python के लिए स्पेशल पैटर्न्स के लिए त्वरित संदर्भ की आवश्यकता वाले डेवलपर्स के लिए, हमारा Python चिटशीट इन फ्रेमवर्क्स के साथ उपयोगी सिंटैक्स याद दिलाता है।
विस्तृत तुलना: BAML vs Instructor
विकास अनुभव
BAML एक अतिरिक्त बिल्ड स्टेप और टूलिंग सेटअप की आवश्यकता होती है। आप .baml फाइलों लिखते हैं, जनरेटर चलाते हैं, फिर जनरेटेड कोड को इंपोर्ट करते हैं। यह प्रॉम्प्ट इंजीनियरिंग और एप्लिकेशन लॉजिक के बीच एक स्पष्ट विभाजन बनाता है, जो बड़े टीम्स के लिए लाभकारी हो सकता है।
Instructor में सेटअप फ्रिक्शन शून्य है - pip install करें और आप तैयार हैं। आपके प्रॉम्प्ट्स कोड के साथ रहते हैं, जिससे छोटे प्रोजेक्ट्स या प्रोटोटाइप्स के लिए तेज़ इटरेशन आसान हो जाता है।
टाइप सुरक्षा और वैलिडेशन
BAML जनरेटेड कोड में कंपाइल-टाइम टाइप चेकिंग प्रदान करता है। आपके IDE को पता चलता है कि किस फील्ड्स उपलब्ध हैं इससे पहले कि आप कुछ भी चलाएं। क्रॉस-लैंग्वेज संरक्षण सुनिश्चित होता है क्योंकि एक ही .baml फाइल सभी समर्थित भाषाओं के लिए क्लाइंट्स जनरेट करती है।
Instructor Pydantic के माध्यम से रनटाइम वैलिडेशन प्रदान करता है। जबकि Python टाइप हिंट्स IDE समर्थन प्रदान करते हैं, त्रुटियाँ निष्पादन के दौरान प्रकट होती हैं। यह Python के लिए मानक है लेकिन BAML के जनरेटेड कोड की तुलना में कम स्टैटिक गारंटी का मतलब है।
लोकल LLMs के साथ काम करना
दोनों फ्रेमवर्क्स लोकल मॉडल्स का समर्थन करते हैं, जो गोपनीयता, लागत नियंत्रण, और ऑफलाइन विकास के लिए महत्वपूर्ण है। Ollama या अन्य लोकल LLM प्रोवाइडर्स का उपयोग करते समय, आप बाहरी API निर्भरताओं के बिना ही संरचित आउटपुट लाभों का आनंद लेते हैं। Ollama, Qwen3, और Python या Go के साथ LLMs को संरचित आउटपुट के साथ सीमित करने के बारे में गहन विश्लेषण के लिए, ये फ्रेमवर्क्स लोअर-लेवल APIs पर उत्पादन-तैयार अभिसरण प्रदान करते हैं।
BAML को Ollama से कनेक्ट करने के लिए आप अपने .baml फाइल में क्लाइंट को कॉन्फ़िगर करते हैं:
# अपने .baml फाइल में:
client OllamaLocal {
provider ollama
options {
model "llama2"
base_url "http://localhost:11434"
}
}
Instructor OpenAI-समर्थित API के माध्यम से Ollama के साथ काम करता है:
from openai import OpenAI
from instructor import from_openai
client = from_openai(OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama" # डमी की
))
ध्यान दें कि लोकल मॉडल्स के साथ काम करते समय, आपको Ollama और GPT-OSS मॉडल्स के साथ संरचित आउटपुट मुद्दों के बारे में जानना चाहिए, क्योंकि सभी मॉडल्स संरचित आउटपुट्स को समान विश्वसनीयता के साथ हैंडल नहीं करते हैं।
एरर हैंडलिंग और रीट्राइज
BAML फ्रेमवर्क स्तर पर रीट्राइज हैंडल करता है जिसमें कॉन्फ़िगरेबल रणनीतियाँ हैं। स्कीमा वैलिडेशन में त्रुटियाँ स्वचालित रूप से एरर कॉन्टेक्स्ट के साथ रीप्रॉम्प्टिंग ट्रिगर करती हैं।
Instructor डिकोरेटिव रीट्राई लॉजिक प्रदान करता है जिसमें कस्टम व्यवहार के लिए हुक्स हैं। आप वैलिडेटर्स परिभाषित कर सकते हैं जो संशोधित प्रॉम्प्ट्स के साथ रीट्राइज ट्रिगर करते हैं:
from instructor import patch
from tenacity import retry, stop_after_attempt
@retry(stop=stop_after_attempt(3))
def extract_with_retry(text: str) -> Person:
return client.chat.completions.create(
model="gpt-4",
response_model=Person,
messages=[{"role": "user", "content": text}]
)
टेस्टिंग और ऑब्जर्वेबिलिटी
BAML एक टेस्टिंग फ्रेमवर्क शामिल करता है जहां आप सीधे .baml फाइलों में टेस्ट केस लिख सकते हैं, विभिन्न इनपुट्स के साथ प्रॉम्प्ट व्यवहार को वैलिडेट करते हुए। प्लेग्राउंड दृश्य डिबगिंग प्रदान करता है।
Instructor मानक Python टेस्टिंग फ्रेमवर्क्स के साथ एकीकृत होता है। आप pytest फिक्स्चर्स, मॉकिंग लाइब्रेरीज, और एसर्टियन हेल्पर्स का उपयोग कर सकते हैं जैसे किसी भी Python कोड की तरह।
प्रदर्शन विचार
रनटाइम प्रदर्शन समान है - दोनों फ्रेमवर्क्स अंततः वही LLM API कॉल करते हैं। वैलिडेशन और पार्सिंग के लिए ओवरहेड नेटवर्क लेटेंसी और मॉडल इन्फरेंस टाइम के मुकाबले नगण्य है।
विकास गति में महत्वपूर्ण अंतर होता है:
- BAML का कोड जनरेशन बेहतर ऑटोकम्प्लीट और पहले त्रुटि पता लगाने का मतलब है लेकिन एक बिल्ड स्टेप की आवश्यकता है
- Instructor का डिकोरेटर दृष्टिकोण तेज़ इटरेशन का मतलब है लेकिन रनटाइम त्रुटि खोज
लाखों रिक्वेस्ट्स को प्रोसेस करने वाले उत्पादन सिस्टम के लिए, दोनों फ्रेमवर्क्स लोड को समान रूप से संभालते हैं। आपका चयन प्रदर्शन विशेषताओं के बजाय विकास वर्कफ्लो प्राथमिकताओं पर अधिक निर्भर करता है।
BAML का चयन करने का समय
BAML का चयन करें जब आपको आवश्यकता हो:
- मल्टी-लैंग्वेज समर्थन: Python, TypeScript, और Ruby सेविसेस से एक ही LLM कॉन्ट्रैक्ट्स तक पहुंच
- कॉन्ट्रैक्ट-फर्स्ट विकास: API-शैली विकास जहां LLM इंटरफेस डिजाइन से पहले होते हैं
- टीम सहयोग: प्रॉम्प्ट इंजीनियरिंग वर्कफ्लो को एप्लिकेशन विकास से अलग करना
- मजबूत टाइपिंग गारंटी: पूरे स्टैक में कंपाइल-टाइम चेक्स
- दृश्य प्रॉम्प्ट विकास: प्रॉम्प्ट्स पर प्लेग्राउंड-ड्राइवन इटरेशन
Instructor का चयन करने का समय
Instructor का चयन करें जब आप चाहते हैं:
- Python-केवल प्रोजेक्ट्स: क्रॉस-लैंग्वेज संरक्षण की आवश्यकता नहीं
- त्वरित प्रोटोटाइपिंग: संरचित आउटपुट्स को काम करने के लिए न्यूनतम सेटअप
- Pydantic एकीकरण: मौजूदा Pydantic मॉडल्स और वैलिडेटर्स का लाभ उठाना
- सरल डिप्लॉयमेंट: बिल्ड स्टेप या जनरेटेड कोड का प्रबंधन नहीं करना
- संपूर्ण Python पारिस्थितिकी: Python-विशिष्ट लाइब्रेरीज और पैटर्न्स का उपयोग करना
दृष्टिकोणों को मिलाना
कुछ प्रोजेक्ट्स दोनों फ्रेमवर्क्स का उपयोग करने से लाभान्वित होते हैं। उदाहरण के लिए, आप BAML का उपयोग क्रॉस-लैंग्वेज क्लाइंट्स की आवश्यकता वाले ग्राहक-संवादित APIs के लिए कर सकते हैं, जबकि Instructor का उपयोग तेज़ इटरेशन की आवश्यकता वाले आंतरिक Python सेविसेस के लिए कर सकते हैं।
आप फ्रेमवर्क्स के बीच भी संक्रमण कर सकते हैं जैसे-जैसे आपका प्रोजेक्ट परिपक्व होता है - Instructor के साथ तेज़ वैलिडेशन के लिए शुरू करें, फिर BAML में बदलें जब आपको व्यापक भाषा समर्थन या सख्त कॉन्ट्रैक्ट्स की आवश्यकता हो।
वास्तविक दुनिया के उपयोग के मामले
डेटा एक्सट्रैक्शन पाइपलाइन (BAML)
एक दस्तावेज़ प्रोसेसिंग सिस्टम BAML का उपयोग करके इन्वॉइस, अनुबंधों, और रसीदों से संरचित डेटा निकालता है। .baml परिभाषाएं ML टीम और बैकएंड सर्विसों के बीच अनुबंधों का काम करती हैं, जिसमें वेब डैशबोर्ड के लिए टाइपस्क्रिप्ट क्लाइंट्स और बैच प्रोसेसिंग के लिए पाइथन क्लाइंट्स होते हैं।
ग्राहक समर्थन बोट (Instructor)
एक समर्थन बोट Instructor का उपयोग करके टिकट्स को वर्गीकृत करता है, उपयोगकर्ता इंटेंट्स निकालता है, और प्रतिक्रियाएं उत्पन्न करता है। टीम Pydantic मॉडल्स का उपयोग करके प्रॉम्प्ट्स पर तेजी से इटरेट करती है, जिसमें वैलिडेटर्स यह सुनिश्चित करते हैं कि निकाले गए फोन नंबर, ईमेल, और टिकट आईडी फॉर्मेट आवश्यकताओं को पूरा करते हैं।
मल्टी-मोडल AI एजेंट (दोनों)
एक AI एजेंट सिस्टम BAML का उपयोग कोर एजेंट-टू-एजेंट कम्युनिकेशन अनुबंधों के लिए करता है, जिससे वितरित सिस्टम में टाइप सेफ्टी सुनिश्चित होती है, जबकि व्यक्तिगत एजेंट्स उपयोगकर्ता इनपुट्स के लिए फ्लेक्सिबल, पाइथन-नेटिव प्रोसेसिंग के लिए आंतरिक रूप से Instructor का उपयोग करते हैं। समान पैटर्न लागू होते हैं जब Python में MCP सर्वर बनाए जाते हैं में, जहां संरचित आउटपुट्स AI असिस्टेंट्स के साथ विश्वसनीय टूल इंटीग्रेशन को सक्षम करते हैं।
माइग्रेशन और इंटीग्रेशन पथ
अगर आप पहले से ही LLMs के साथ बुनियादी JSON पार्सिंग का उपयोग कर रहे हैं, तो दोनों फ्रेमवर्क सरल माइग्रेशन पथ प्रदान करते हैं:
JSON से BAML में: अपने JSON स्कीमास को BAML टाइप परिभाषाओं में बदलें, प्रॉम्प्ट्स को .baml फाइलों में स्थानांतरित करें, क्लाइंट्स को जनरेट करें, और मैनुअल पार्सिंग को जनरेटेड टाइप्स से बदलें।
JSON से Instructor में: अपने JSON संरचना के साथ मेल खाने वाले Pydantic मॉडल्स जोड़ें, instructor इंस्टॉल करें, अपने OpenAI क्लाइंट को पैच करें, और JSON पार्सिंग को response_model पैरामीटर्स से बदलें।
दोनों माइग्रेशन इंक्रीमेंटल हो सकते हैं—आपको अपने पूरे कोडबेस को एक बार में बदलने की आवश्यकता नहीं है।
भविष्य का दृष्टिकोण और समुदाय
दोनों फ्रेमवर्क सक्रिय रूप से विकसित होते हैं, जिनके मजबूत समुदाय होते हैं:
BAML (BoundaryML) भाषा समर्थन को बढ़ाने, प्लेग्राउंड को सुधारने, और टेस्टिंग क्षमताओं को बढ़ाने पर केंद्रित है। वाणिज्यिक बैकिंग लंबे समय तक स्थिरता का सुझाव देती है।
Instructor एक मजबूत ओपन-सोर्स उपस्थिति बनाए रखता है, जिसमें नियमित अपडेट्स, विस्तृत दस्तावेज़ीकरण, और बढ़ती हुई अपनावृत्ति होती है। इस प्रोजेक्ट को जेसन लियू और योगदानकर्ताओं द्वारा अच्छी तरह से बनाए रखा जाता है।
निष्कर्ष
BAML और Instructor संरचित LLM आउटपुट्स के लिए दो उत्कृष्ट लेकिन अलग-अलग दृष्टिकोण प्रस्तुत करते हैं। BAML का कॉन्ट्रैक्ट-फर्स्ट, मल्टी-लैंग्वेज दर्शन उन टीमों के लिए उपयुक्त है जो स्ट्रिक्ट टाइप आवश्यकताओं के साथ वितरित सिस्टम बनाते हैं। Instructor का पाइथन-नेटिव, Pydantic-आधारित दृष्टिकोण तेज़ विकास और पाइथन-केन्द्रित स्टैक्स के लिए उपयुक्त है।
कोई भी सार्वभौमिक रूप से बेहतर नहीं है—आपका चयन आपकी टीम की साइज़, भाषा पसंद, विकास वर्कफ्लो, और टाइप सेफ्टी आवश्यकताओं पर निर्भर करता है। कई टीमों को यह पाएगा कि प्रोटोटाइपिंग के लिए Instructor से शुरू करना, फिर उत्पादन मल्टी-सर्विस आर्किटेक्चर के लिए BAML अपनाना, दोनों के सर्वोत्तम लाभ प्रदान करता है।
उपयोगी लिंक्स
इस साइट पर संबंधित लेख
- LLMs को संरचित आउटपुट के साथ सीमित करना: Ollama, Qwen3 & Python या Go
- प्रसिद्ध LLM प्रदाताओं - OpenAI, Gemini, Anthropic, Mistral और AWS Bedrock के बीच संरचित आउटपुट तुलना
- Ollama GPT-OSS संरचित आउटपुट समस्याएं
- Python में MCP सर्वर बनाना: वेबसर्च और स्क्रेप
- Python चिट्ठा
- Ollama चिट्ठा