هندسة المحفزات

تحسين LLM مع DSPy: دليل خطوة بخطوة لإنشاء وتحسين وتقييم أنظمة الذكاء الاصطناعي

mm
أضف Unite.AI إلى مصادرك المفضلة على Google
DSPy is a framework for algorithmically optimizing LM prompts and weights

随着 قدرات النماذج اللغوية الكبيرة (LLMs) تتوسع، أصبحت تطوير أنظمة ذكاء اصطناعي قوية تعتمد على هذه النماذج أكثر تعقيدا. وتتضمن Approaches التقليدية تقنيات التوجيه المعقدة وتوليد البيانات لتعليم الدقة والتوجيه اليدوي لضمان الالتزام بالقيود المحددة لنطاق معين. ومع ذلك، يمكن أن يكون هذا العملية متعبة ومسببة للأخطاء ومتعلقة بشكل كبير بالتدخل البشري.

ادخل DSPy، إطار عمل ثوري مصمم لتبسيط تطوير أنظمة الذكاء الاصطناعي التي تعمل بالنماذج اللغوية الكبيرة. يقدم DSPy نهجا منهجيا لتحسين التوجيهات والأوزان، مما يسمح للمطورين ببناء تطبيقات متقدمة مع مجهود يدوية أقل.

في هذا الدليل الشامل، سنستكشف المبادئ الأساسية لDSPy وهندسته الموديلارية والميزات القوية التي يقدمها. سنقوم أيضا بالغوص في الأمثلة العملية، مما يظهر كيف يمكن لDSPy تحويل الطريقة التي تطور بها أنظمة الذكاء الاصطناعي بالنماذج اللغوية الكبيرة.

ما هو DSPy، ولماذا تحتاجه؟

DSPy هو إطار عمل يفصل تدفق برنامجك (الوحدات) عن معاملات كل خطوة (توجيهات النموذج اللغوي وأوزانها). هذا الفصل يسمح بالتحسين المنهجي للتوجيهات والأوزان، مما يسمح لك ببناء أنظمة ذكاء اصطناعي معقدة مع موثوقية أكبر وتنبؤية أكبر وامتثال للقيود المحددة لنطاق معين.

تрадиغيا، كان تطوير أنظمة الذكاء الاصطناعي بالنماذج اللغوية الكبيرة يتضمن عملية متعبة لتحليل المشكلة إلى خطوات، وتصميم توجيهات معقدة لكل خطوة، وتوليد أمثلة اصطناعية لتعليم الدقة، والتوجيه اليدوي للنماذج اللغوية لتكون متوافقة مع القيود المحددة. كانت هذه النهج لا تتمحور فقط حول الوقت ولكن أيضا حول الأخطاء، حيث أن حتى التغييرات الصغيرة في خط الأنابيب أو النموذج أو البيانات يمكن أن تتطلب إعادة العمل الكبير للتوجيهات وخطوات تعليم الدقة.

يعالج DSPy هذه التحديات من خلال تقديم نموذج جديد: المحسّنات. هذه الخوارزميات التي تعمل بالنموذج اللغوي يمكن أن تعديل التوجيهات والأوزان لدعوات النموذج اللغوي، مع معيار تريد تحقيقه. من خلال تلقيم عملية التحسين، يمنح DSPy المطورين بناء أنظمة ذكاء اصطناعي قوية مع تدخل يدوية أقل، مما يعزز موثوقية وتنبؤية مخرجات النموذج اللغوي.

هندسة DSPy الموديلارية

في قلب DSPy تقع هندسة موديلارية تسهل تركيب أنظمة ذكاء اصطناعي معقدة. يوفر الإطار مجموعة من الوحدات المدمجة التي تabstract تقنيات التوجيه المختلفة، مثل dspy.ChainOfThought و dspy.ReAct. يمكن دمج هذه الوحدات وتكوينها في برامج أكبر، مما يسمح للمطورين ببناء خطوط أنابيب معقدة مخصصة لمتطلباتهم الخاصة.

كل وحدة تحوي معاملات قابلة للتعلم، بما في ذلك الإرشادات والأمثلة القليلة وأوزان النموذج اللغوي. عندما يتم استدعاء الوحدة، يمكن لمحسّنات DSPy تعديل هذه المعاملات لتحقيق أقصى معيار محدد، مما يضمن أن مخرجات النموذج اللغوي تتوافق مع القيود والمتطلبات المحددة.

تحسين DSPy

يقدم DSPy مجموعة من المحسّنات القوية المصممة لتعزيز أداء وموثوقية أنظمتك الذكاء الاصطناعي. تستخدم هذه المحسّنات خوارزميات تعمل بالنموذج اللغوي لتعديل التوجيهات والأوزان لدعوات النموذج اللغوي، مع معيار محدد وتوافق مع القيود المحددة لنطاق معين.

من بين المحسّنات الرئيسية المتاحة في DSPy:

  1. BootstrapFewShot: يوسع التوقيع تلقائيا بإضافة أمثلة محسّنة داخل التوجيه المرسل إلى النموذج، مما يطبق التعلم القليل.
  2. BootstrapFewShotWithRandomSearch: يطبق BootstrapFewShot عدة مرات مع بحث عشوائي عبر الأمثلة المولدة، واختيار أفضل برنامج خلال التحسين.
  3. MIPRO: يولد الإرشادات والأمثلة القليلة في كل خطوة، مع كون توليد الإرشادات متعلقا بالبيانات والتعليمات. يستخدم التحسين البيزي لتحقيق أقصى بحث عبر مساحة توليد الإرشادات والأمثلة عبر الوحدات.
  4. BootstrapFinetune: يدمج برنامج DSPy القائم على التوجيه في تحديثات الأوزان للنماذج اللغوية الصغيرة، مما يسمح لك بتعليم الدقة للنموذج اللغوي الأساسي لتحسين الكفاءة.

من خلال استخدام هذه المحسّنات، يمكن للمطورين تحسين أنظمتك الذكاء الاصطناعي بشكل منهجي، مما يضمن مخرجات عالية الجودة مع توافق مع القيود المحددة لنطاق معين.

بدء العمل مع DSPy

لتوضيح قوة DSPy، سنقوم بمراجعة مثال عملي لبناء نظام توليد معزز بالاسترجاع (RAG) للاستجابة على الأسئلة.

الخطوة 1: إعداد النموذج اللغوي ونموذج الاسترجاع

الخطوة الأولى تتضمن تكوين النموذج اللغوي (LM) ونموذج الاسترجاع (RM) داخل DSPy.

لتحميل DSPy، قم بتشغيل:


pip install dspy-ai

DSPy يدعم واجهات برمجة تطبيقات متعددة للنموذج اللغوي ونموذج الاسترجاع، بالإضافة إلى استضافة النماذج المحلية، مما يسهل دمج النماذج المفضلة لديك.


import dspy

<p># تكوين LM و RM
turbo = dspy.OpenAI(model='gpt-3.5-turbo')
colbertv2_wiki17_abstracts = dspy.ColBERTv2(url='http://20.102.90.50:2017/wiki17_abstracts')</p>

<p>dspy.settings.configure(lm=turbo, rm=colbertv2_wiki17_abstracts)</p>

الخطوة 2: تحميل مجموعة البيانات

بعد ذلك، سنقوم بتحميل مجموعة بيانات HotPotQA، التي تحتوي على مجموعة من الأزواج الأسئلة والإجابات المعقدة التي يتم الإجابة عليها عادةً بطريقة متعددة الخطوات.


from dspy.datasets import HotPotQA

<p># تحميل مجموعة البيانات
dataset = HotPotQA(train_seed=1, train_size=20, eval_seed=2023, dev_size=50, test_size=0)</p>

<p># تحديد حقل "السؤال" كمدخل
trainset = [x.with_inputs('question') for x in dataset.train]
devset = [x.with_inputs('question') for x in dataset.dev]</p>

الخطوة 3: بناء التوقيعات

DSPy يستخدم التوقيعات لتحديد سلوك الوحدات. في هذا المثال، سنحدد توقيعًا لمهمة توليد الإجابة، مع تحديد الحقول المدخلة (السياق والسؤال) وحقل الإخراج (الإجابة).


<p>class GenerateAnswer(dspy.Signature):
"""توليد الإجابات على الأسئلة القصيرة."""

context = dspy.InputField(desc="يمكن أن تحتوي على حقائق ذات صلة")
question = dspy.InputField()
answer = dspy.OutputField(desc="غالبًا ما تكون بين 1 و 5 كلمات")</p>

الخطوة 4: بناء خط الأنابيب

سنبني خط أنابيب RAG كوحدة DSPy، والذي يتكون من طريقة التهيئة (__init__) لاعلان الوحدات الفرعية (dspy.Retrieve و dspy.ChainOfThought) وطريقة التقدّم (forward) لوصف تدفق التحكم للاستجابة على السؤال باستخدام هذه الوحدات.


<p>class RAG(dspy.Module):
def __init__(self, num_passages=3):
super().__init__()

self.retrieve = dspy.Retrieve(k=num_passages)
self.generate_answer = dspy.ChainOfThought(GenerateAnswer)</p>

<p> def forward(self, question):
context = self.retrieve(question).passages
prediction = self.generate_answer(context=context, question=question)
return dspy.Prediction(context=context, answer=prediction.answer)</p>

الخطوة 5: تحسين خط الأنابيب

مع تحديد خط الأنابيب، يمكننا الآن تحسينه باستخدام محسّنات DSPy. في هذا المثال، سنستخدم محسّن BootstrapFewShot، الذي يولد ويختار توجيهات فعالة لوحداتنا بناءً على مجموعة تدريب و معيار التحقق.


<p>from dspy.teleprompt import BootstrapFewShot</p>

<p># معيار التحقق
def validate_context_and_answer(example, pred, trace=None):
answer_EM = dspy.evaluate.answer_exact_match(example, pred)
answer_PM = dspy.evaluate.answer_passage_match(example, pred)
return answer_EM and answer_PM</p>

<p># إعداد المحسّن
teleprompter = BootstrapFewShot(metric=validate_context_and_answer)</p>

<p># تجميع البرنامج
compiled_rag = teleprompter.compile(RAG(), trainset=trainset)</p>

الخطوة 6: تقييم خط الأنابيب

بعد تجميع البرنامج، من الضروري تقييم أدائه على مجموعة التطوير لضمان تحقيقه الدقة وال موثوقية المرغوبة.


from dspy.evaluate import Evaluate

<p># إعداد التقييم
evaluate = Evaluate(devset=devset, metric=validate_context_and_answer, num_threads=4, display_progress=True, display_table=0)</p>

<p># تقييم برنامج RAG المجمع
evaluation_result = evaluate(compiled_rag)</p>

<p>print(f"نتيجة التقييم: {evaluation_result}")</p>

الخطوة 7: فحص تاريخ النموذج

للحصول على فهم أعمق للتفاعلات النموذجية، يمكنك مراجعة الأجيال الأخيرة من خلال فحص تاريخ النموذج.


<p># فحص تاريخ النموذج
turbo.inspect_history(n=1)</p>

الخطوة 8: إجراء التنبؤات

مع تحسين خط الأنابيب وتقييمه، يمكنك الآن استخدامه لاجراء تنبؤات على أسئلة جديدة.


<p># سؤال مثال
question = "ما هي الجائزة التي حصل عليها كتاب غاري زوكاف الأول؟"</p>

<p># إجراء تنبؤ باستخدام برنامج RAG المجمع
prediction = compiled_rag(question)</p>

<p>print(f"السؤال: {question}")
print(f"الإجابة: {prediction.answer}")
print(f"السياق المسترجع: {prediction.context}")</p>

مثال عمل مصغر مع DSPy

الآن، دعونا نستكشف مثال عمل مصغر آخر باستخدام مجموعة بيانات GSM8K ونموذج OpenAI GPT-3.5-turbo لمحاكاة مهام التوجيه داخل DSPy.

الإعداد

أولاً، تأكد من أن بيئتك معدة بشكل صحيح:


<p>import dspy
from dspy.datasets.gsm8k import GSM8K, gsm8k_metric</p>

<p># إعداد LM
turbo = dspy.OpenAI(model='gpt-3.5-turbo-instruct', max_tokens=250)
dspy.settings.configure(lm=turbo)</p>

<p># تحميل أسئلة الرياضيات من مجموعة بيانات GSM8K
gsm8k = GSM8K()
gsm8k_trainset, gsm8k_devset = gsm8k.train[:10], gsm8k.dev[:10]</p>

print(gsm8k_trainset)

تحديد الوحدة

بعد ذلك، حدد برنامجًا مخصصًا باستخدام وحدة ChainOfThought لreasoning خطوة بخطوة:


<p>class CoT(dspy.Module):
def __init__(self):
super().__init__()
self.prog = dspy.ChainOfThought("question -&gt; answer")</p>

<p> def forward(self, question):
return self.prog(question=question)</p>

تجميع وتقييم النموذج

الآن، أجمع البرنامج باستخدام محسّن BootstrapFewShot:


<p>from dspy.teleprompt import BootstrapFewShot</p>

<p># إعداد المحسّن
config = dict(max_bootstrapped_demos=4, max_labeled_demos=4)</p>

<p># تحسين باستخدام gsm8k_metric
teleprompter = BootstrapFewShot(metric=gsm8k_metric, **config)
optimized_cot = teleprompter.compile(CoT(), trainset=gsm8k_trainset)</p>

<p># إعداد التقييم
from dspy.evaluate import Evaluate</p>

<p>evaluate = Evaluate(devset=gsm8k_devset, metric=gsm8k_metric, num_threads=4, display_progress=True, display_table=0)
evaluate(optimized_cot)</p>

<p># فحص تاريخ النموذج
turbo.inspect_history(n=1)</p>

هذا المثال يظهر كيفية إعداد بيئتك، تحديد وحدة مخصصة، تجميع نموذج، وتقييم أدائه باستخدام مجموعة بيانات وتكوين محسّن معين.

إدارة البيانات في DSPy

DSPy يعمل مع مجموعات التدريب والتحwicklung والاختبار. لمجموعة البيانات الخاصة بك، عادة ما يكون لديك ثلاثة أنواع من القيم: المدخلات والتعليمات الوسيطة والتعليمات النهائية. بينما تكون التعليمات الوسيطة أو النهائية اختيارية، يكون وجود بعض المدخلات ضروريًا.

إنشاء كائنات المثال

كائنات المثال في DSPy مشابهة للقواميس Python ولكنها تأتي مع أدوات مفيدة:


<p>qa_pair = dspy.Example(question="هذا سؤال؟", answer="هذا إجابة.")</p>

<p>print(qa_pair)
print(qa_pair.question)
print(qa_pair.answer)</p>

الإخراج:


<p>Example({'question': 'هذا سؤال؟', 'answer': 'هذا إجابة.'}) (input_keys=None)
هذا سؤال؟
هذا إجابة.</p>

تحديد المفاتيح المدخلة

في DSPy، يمكن لكائنات المثال استخدام طريقة with_inputs() لتحديد حقول معينة كمدخلات:


<p>print(qa_pair.with_inputs("question"))
print(qa_pair.with_inputs("question", "answer"))</p>

يمكن الوصول إلى القيم باستخدام مشغل النقطة، وترجع طرق مثل inputs() و labels() كائنات المثال الجديدة التي تحتوي فقط على مفاتيح المدخلات أو غير المدخلات، على التوالي.

المحسّنات في DSPy

محسّن DSPy يعدل معاملات برنامج DSPy (أي التوجيهات وأوزان النموذج اللغوي) لتحقيق أقصى معيار محدد. يوفر DSPy مجموعة متنوعة من المحسّنات المدمجة، كل منها يستخدم استراتيجيات مختلفة.

المحسّنات المتاحة

  • BootstrapFewShot: يولد أمثلة قليلة باستخدام البيانات المدخلة والمخرجة الموجودة.
  • BootstrapFewShotWithRandomSearch: يطبق BootstrapFewShot عدة مرات مع بحث عشوائي عبر الأمثلة المولدة.
  • COPRO: يولد ويحسن الإرشادات الجديدة لكل خطوة، مع تحسينها باستخدام الصعود المتوازي.
  • MIPRO: يعدل الإرشادات والأمثلة القليلة باستخدام التحسين البيزي.

اختيار المحسّن

إذا كنت غير متأكد من哪里 تبدأ، استخدم BootstrapFewShotWithRandomSearch:

للمجموعات الصغيرة (10 أمثلة)، استخدم BootstrapFewShot.
للمجموعات الصغيرة إلى المتوسطة (50 مثال)، استخدم BootstrapFewShotWithRandomSearch.
للمجموعات الكبيرة (300+ مثال)، استخدم MIPRO.

هنا كيفية استخدام BootstrapFewShotWithRandomSearch:


<p>from dspy.teleprompt import BootstrapFewShotWithRandomSearch</p>

<p>config = dict(max_bootstrapped_demos=4, max_labeled_demos=4, num_candidate_programs=10, num_threads=4)
teleprompter = BootstrapFewShotWithRandomSearch(metric=YOUR_METRIC_HERE, **config)
optimized_program = teleprompter.compile(YOUR_PROGRAM_HERE, trainset=YOUR_TRAINSET_HERE)</p>

حفظ وتحميل البرامج المحسّنة

بعد تشغيل برنامج عبر محسّن، احفظه للاستخدام في المستقبل:

optimized_program.save(YOUR_SAVE_PATH)

تحميل برنامج محفوظ:


<p>loaded_program = YOUR_PROGRAM_CLASS()
loaded_program.load(path=YOUR_SAVE_PATH)</p>

الميزات المتقدمة: تأكيدات DSPy

تأكيدات DSPy تلقيمية تطبيق القيود الحسابية على النماذج اللغوية، مما يعزز موثوقية وتنبؤية ودقة مخرجات النموذج اللغوي.

استخدام التأكيدات

حدد دوال التحقق وأعلن التأكيدات بعد توليد النموذج. على سبيل المثال:


<p>dspy.Suggest(
len(query) &lt;= 100,
&quot;يجب أن يكون السؤال قصيرًا وأقل من 100 حرف&quot;,
)</p>

<p>dspy.Suggest(
validate_query_distinction_local(prev_queries, query),
"يجب أن يكون السؤال متميزًا عن: " + "; ".join(f"{i+1}) {q}" for i, q in enumerate(prev_queries)),
)</p>

تحويل البرامج بالتأكيدات


<p>from dspy.primitives.assertions import assert_transform_module, backtrack_handler</p>

<p>baleen_with_assertions = assert_transform_module(SimplifiedBaleenAssertions(), backtrack_handler)</p>

بديلاً، يمكنك تفعيل التأكيدات مباشرة على البرنامج:


<p>baleen_with_assertions = SimplifiedBaleenAssertions().activate_assertions()</p>

تحسينات مدفوعة بالتأكيدات

تأكيدات DSPy تعمل مع تحسينات DSPy، خاصة مع BootstrapFewShotWithRandomSearch، بما في ذلك إعدادات مثل:

  • التجميع مع التأكيدات
  • التجميع والاستدلال مع التأكيدات

الختام

DSPy يقدم نهجًا قويًا ومنهجيًا لتحسين النماذج اللغوية وتوجيهاتها. من خلال اتباع الخطوات المحددة في هذه الأمثلة، يمكنك بناء وتحسين وتقييم أنظمة ذكاء اصطناعي معقدة بسهولة. تصميم DSPy الموديلاري و محسّناته المتقدمة يسمحان بدمج النماذج اللغوية المختلفة بفعالية، مما يجعله أداة قيمة لأي شخص يعمل في مجال معالجة اللغة الطبيعية والذكاء الاصطناعي.

سواء كنت تبني نظام استجابة بسيط للأسئلة أو خط أنابيب أكثر تعقيدًا، يوفر DSPy المرونة والموثوقية اللازمة لتحقيق أداء عالٍ وموثوقية.

لقد قمت بإنفاق الخمس سنوات الماضية في غمرة العالم المثير للاهتمام من التعلم الآلي والتعلم العميق. وقد أدت شغفي وخبرتي إلى المساهمة في أكثر من 50 مشروعًا متنوعًا في هندسة البرمجيات، مع التركيز بشكل خاص على الذكاء الاصطناعي والتعلم الآلي. كما أدت فضولي المستمر إلى جذبي نحو معالجة اللغة الطبيعية، وهو مجال أنا متحمس لاستكشافه بشكل أكبر.