BAML مقابل المدرب: إخراج النماذج الكبيرة المُهيكلة
مخرجات نموذج LLM الآمن من الناحية النوعية باستخدام BAML والدروسية
عند العمل مع نماذج لغات كبيرة في الإنتاج، فإن الحصول على مخرجات منظمة وآمنة من حيث النوع أمر حيوي. تتناول إطارات شائعة مثل BAML و Instructor نهجًا مختلفًا لحل هذه المشكلة.
تساعد هذه المقارنة في اتخاذ القرار الصحيح بشأن الأدوات المناسبة لتطبيقات LLM الخاصة بك بلغة Python.

فهم تحديات المخرجات المنظمة
تولد نماذج LLM النصوص غير المنظمة بشكل طبيعي، لكن التطبيقات الحديثة تحتاج إلى بيانات قابلة للتنبؤ وقابلة للتحليل. سواء كنت تبني روبوتات حوار، أو أنظمة استخراج البيانات، أو وكلاء ذكاء اصطناعي، فأنت بحاجة إلى كائنات JSON، ونوع بيانات مؤكد، ومعالجة الأخطاء - وليس المخرجات الحرة.
تتناول BAML و Instructor هذا التحدي لكن بفلسفات جذرية مختلفة: BAML تستخدم نهجًا مبنيًا على العقد مع إنشاء الكود، بينما Instructor تعتمد على نظام نوع Python مع التحقق في وقت التشغيل. إذا كنت مهتمًا بسياق أوسع حول نهج المخرجات المنظمة عبر مزودي LLM المختلفة، فإن فهم هذه الإطارات يصبح أكثر قيمة.
BAML: لغة تخصيصية لـ LLMs
BAML (لغة BoundaryML) تقدم لغة DSL مخصصة لتعريف تفاعلات LLM. تكتب ملفات .baml التي تحدد محفزاتك، أنواعك، ووظائفك، ثم تولد BAML كودًا آمنًا من حيث النوع لعدة لغات بما في ذلك Python.
ميزات رئيسية لـ BAML
الأمان من حيث النوع عبر اللغات: تولد BAML عملاء لـ Python و TypeScript و Ruby من نفس تعريفات .baml، مما يضمن الاتساق عبر مكوّنك.
التحكم في الإصدار للمحفزات: تعيش محفزاتك في ملفات .baml، مما يجعلها سهلة تتبعها، مراجعتها، واختبارها بشكل مستقل عن كود التطبيق.
إطار اختبار مدمج: تشمل BAML أدوات اختبار لتأكيد سلوك المحفزات قبل النشر، مما يكتشف المشكلات مبكرًا في التطوير.
واجهة Playground: تتيح واجهة Playground لـ BAML التكرار على المحفزات بصريًا مع ملاحظات فورية، مما يسرع دورة التطوير.
مثال على تنفيذ BAML
# أولاً، اعرف نموذجك في ملف .baml:
# persona.baml
class Person {
name string
age int
occupation string
skills string[]
}
function ExtractPerson(text: string) -> Person {
client GPT4
prompt #"
استخرج معلومات الشخص من: {{ text }}
عدّل البيانات المنظمة.
"#
}
يقدم الكود المُنتج لـ 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} لديه {result.age} سنة")
print(f"المهارات: {', '.join(result.skills)}")
تبرز منهجية BAML عندما يكون لديك عدة خدمات تستخدم نفس عقود LLM أو عندما تحتاج إلى ضمانات قوية حول أشكال البيانات عبر الحدود اللغوية.
Instructor: إطارة Python المبنية على Pydantic
يأخذ Instructor نهجًا أولويًا لـ Python، وتمديد نماذج Pydantic مع قدرات LLM. يبدو طبيعيًا للمطورين الذين يستخدمون بالفعل Pydantic للتحقق من النوع وعلامات النوع.
ميزات رئيسية لـ 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"استخرج معلومات الشخص: {text}"}
]
)
print(f"{result.name} لديه {result.age} سنة")
print(f"المهارات: {', '.join(result.skills)}")
تتميز قوة Instructor ببساطتها وتكاملها مع بيئات Python. إذا كنت تستخدم بالفعل Pydantic، فإن منحنى التعلم صغير. بالنسبة للمطورين الجدد على Python أو الذين يحتاجون إلى مراجع سريعة حول الأنماط الخاصة بـ Python، فإن مخطط Python يوفر تذكيرات مفيدة للقواعد مع هذه الإطارات.
المقارنة التفصيلية: BAML مقابل Instructor
تجربة التطوير
BAML تتطلب خطوة إضافية لبناء الأدوات وتكوينها. تكتب ملفات .baml، تشغل المولد، ثم تقدم الكود المُنتج. هذا يخلق فصلًا واضحًا بين هندسة المحفزات و منطق التطبيق، وهو مفيد للفرق الأكبر.
Instructor لا تتطلب أي مقاومة في الإعداد - تثبيت pip وانتهى الأمر. تعيش محفزاتك بجانب كودك، مما يجعل التكرار السريع أسهل للمشاريع الصغيرة أو النماذج الأولية.
الأمان من حيث النوع والتحقق
BAML توفر التحقق من النوع في وقت التجميع في الكود المُنتج. يعرف IDE بالضبط ما الحقول المتاحة قبل تشغاء أي شيء. يضمن الاتساق عبر اللغات لأن نفس ملف .baml يولد عملاء لجميع اللغات المدعومة.
Instructor توفر التحقق في وقت التشغيل عبر Pydantic. بينما توفر علامات نوع Python دعم IDE، تظهر الأخطاء أثناء التنفيذ. هذا معيار لـ Python لكنه يعني أقل ضمان ثابت من كود BAML المُنتج.
العمل مع النماذج المحلية
تدعم كلتا الإطارات النماذج المحلية، وهو أمر حيوي للخصوصية، والتحكم في التكاليف، والتطوير دون الاتصال. عند استخدام Ollama أو مزودي النماذج المحلية الأخرى، تحافظ على نفس فوائد المخرجات المنظمة دون الاعتماد على واجهات API الخارجية. للغوص أعمق في تقييد LLMs مع المخرجات المنظمة باستخدام Ollama، Qwen3، وPython أو Go، توفر هذه الإطارات تجميعات قابلة للإنتاج فوق واجهات API المستوى الأدنى.
BAML تربط مع Ollama عن طريق تكوين العميل في ملفك .baml:
# في ملفك .baml:
client OllamaLocal {
provider ollama
options {
model "llama2"
base_url "http://localhost:11434"
}
}
Instructor تعمل مع Ollama عبر واجهة OpenAI المتوافقة:
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 توفر منطق إعادة المحاولة المُعرف بديكور مع م-hooks لسلوك مخصص. يمكنك تعريف مدققين يُحفّزون إعادة المحاولة مع محفزات مُعدّلة:
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، مع التحقق من سلوك المحفزات عبر إدخالات مختلفة. توفر Playground مراقبة مرئية.
Instructor تتكامل مع إطارات اختبار Python القياسية. يمكنك استخدام أدوات pytest، مكتبات التزوير، ومساعدات التأكيد كما تفعل في أي كود Python.
اعتبارات الأداء
مقارنة الأداء في وقت التشغيل مماثلة - تحدث كلتا الإطارات نفس مكالمات API لـ LLM. تظل التكلفة الإضافية للفحص والتحليل قليلة مقارنة بتأخير الشبكة ووقت استنتاج النموذج.
سرعة التطوير تختلف بشكل كبير:
- تُنتج BAML كودًا مع إكمال أفضل وتحديد أخطاء مبكرًا لكنها تتطلب خطوة بناء
- تُنتج Instructor تكرارًا أسرع لكنها تكتشف الأخطاء في وقت التشغيل
لأنظمة الإنتاج المعالجة لعدد كبير من الطلبات، تتعامل كلتا الإطارات مع الحمل بنفس الكفاءة. يعتمد اختيارك أكثر على تفضيلات مسار التطوير من أداء الخصائص.
متى تختار BAML
اختر BAML عندما تحتاج إلى:
- الدعم متعدد اللغات: الوصول إلى نفس عقود LLM من خدمات Python و TypeScript و Ruby
- تطوير مبني على العقد: تطوير من نوع API حيث تُصمم واجهات LLM قبل التنفيذ
- التعاون داخل الفريق: فصل هندسة المحفزات عن تطوير التطبيق
- ضمانات قوية من حيث النوع: فحص في وقت التجميع عبر مكوّنك بالكامل
- تطوير المحفزات بصريًا: التكرار على المحفزات من خلال Playground
متى تختار Instructor
اختر Instructor عندما ترغب في:
- مشاريع Python فقط: لا حاجة لاتساق عبر اللغات
- التقديم السريع: أقل إعداد للحصول على مخرجات منظمة
- دمج Pydantic: الاستفادة من نماذج Pydantic والمقادير المدققة الموجودة
- نشر بسيط: لا خطوات بناء أو كود مُنتج لإدارة
- بيئة Python الغنية: استخدام مكتبات ونمط Python المخصصة
الجمع بين النهج
تستفيد بعض المشاريع من استخدام كلتا الإطارات. على سبيل المثال، قد تستخدم BAML لواجهات API موجهة للعملاء التي تحتاج إلى عملاء متعددة اللغات، بينما تستخدم Instructor لخدمات Python الداخلية التي تحتاج إلى تكرار سريع.
يمكنك أيضًا الانتقال بين الإطارات مع نضج مشروعك - البدء بـ Instructor للتحقق السريع، ثم الانتقال إلى BAML عندما تحتاج إلى دعم لغات أوسع أو عقود أكثر صرامة.
حالات استخدام واقعية
أنبوب استخراج البيانات (BAML)
يستخدم نظام معالجة الوثائق BAML لاستخراج بيانات منظمة من الفواتير، العقود، والمستندات. تخدم تعريفات .baml كعقود بين فريق ML وخدمات الخلفية، مع عملاء TypeScript لللوحة الأمامية وعملاء Python لمعالجة الدفعات.
روبوت دعم العملاء (Instructor)
يستخدم روبوت دعم العملاء Instructor لتصنيف التذاكر، استخراج نوايا المستخدمين، وإنشاء الردود. تكرر الفريق بسرعة على المحفزات باستخدام نماذج Pydantic، مع مدققين يضمنون أن الأرقام الهاتفية، البريد الإلكتروني، وIDs التذاكر تلبي متطلبات التنسيق.
وكيل ذكاء اصطناعي متعدد الوسائط (كلاهما)
تستخدم نظام وكيل ذكاء اصطناعي BAML لعقود الاتصال بين الوكلاء، مما يضمن الأمان من حيث النوع عبر النظام الموزع، بينما يستخدم الوكلاء الفرديون Instructor داخليًا لمعالجة إدخالات المستخدمين بطريقة مرنة وطبيعة Python. تطبّق أنماط مماثلة عند بناء خوادم MCP في Python، حيث تتيح المخرجات المنظمة دمج أدوات موثوقة مع مساعدي الذكاء الاصطناعي.
مسارات الترحيل والتكامل
إذا كنت تستخدم بالفعل تحليل JSON مع LLMs، فتوفّر كلتا الإطارات مسارات ترحيل مباشرة:
من JSON إلى BAML: احول مخططات JSON إلى تعريفات نوع BAML، انتقل إلى ملفات .baml، أنشئ العملاء، واستبدل التحليل اليدوي بأنواع مُنتجة.
من JSON إلى Instructor: أضف نماذج Pydantic تطابق هيكل JSON الخاص بك، قم بتثبيت instructor، قم بتحديث عميل OpenAI الخاص بك، واستبدل تحليل JSON مع معلّمات response_model.
يمكنك الترحيل على مراحل - لا تحتاج إلى تحويل كل كودك مرة واحدة.
المستقبل والمجتمع
كلا الإطارات تُطور بشكل نشط مع مجتمعات قوية:
BAML (BoundaryML) تركز على توسيع دعم اللغات، تحسين Playground، وتحسين قدرات الاختبار. يشير الدعم التجاري إلى استقرار طويل الأمد.
Instructor تحافظ على وجود قوي في المفتوح المصدر مع تحديثات متكررة، وتوثيق مكثف، ونمو في الانتشار. المشروع مُدار جيدًا بواسطة Jason Liu والمُساهمين.
الخلاصة
BAML و Instructor تمثلان نهجين متميزين لكن مختلفين لمخرجات LLM المنظمة. منهجية BAML المبنية على العقد، والدعم متعدد اللغات مناسبة للفرق التي تبني أنظمة موزعة مع متطلبات صارمة من حيث النوع. منهجية Instructor المبنية على Python، ومستندة إلى Pydantic مناسبة للتطوير السريع والأنظمة المركزة على Python.
لا أحد أفضل بشكل عام - اختيارك يعتمد على حجم فريقك، تفضيلات لغتك، مسار تطويرك، ومتطلبات الأمان من حيث النوع. سيجد العديد من الفرق أن البدء بـ Instructor للنموذج الأولي، ثم الانتقال إلى BAML لعمليات الإنتاج متعددة الخدمات، يوفر أفضل ما يمكن.
روابط مفيدة
مقالات ذات صلة على هذا الموقع
- تقييد LLMs مع المخرجات المنظمة: Ollama، Qwen3 وPython أو Go
- مقارنة المخرجات المنظمة عبر مزودي LLM الشائعة - OpenAI، Gemini، Anthropic، Mistral و AWS Bedrock
- مشاكل المخرجات المنظمة مع Ollama GPT-OSS
- بناء خوادم MCP في Python: البحث عبر الإنترنت والنسخ
- مخطط Python
- مخطط Ollama