تعريف التوقيعات والوحدات
صياغة التوقيعات، وChainOfThought، وReAct، ووحدات DSPy المخصصة
تعريف التوقيعات والوحدات درس مجاني في AI Prompt Engineering على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Prompt Engineering، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Prompt Engineering 4 دروس في المجموع.
التوقيعات عقود مَكتوبة
التوقيع في DSPy هو فئة Python تعلن مدخلات خطوة الاستدلال ومخرجاتها. فكّر فيه باعتباره عقد دالة مَكتوبًا لاستدعاء LLM.
يصبح docstring وصفًا للمهمة. وتوضح تعليقات الحقول لـ DSPy ما الذي ينبغي إنتاجه. ولا تكتب نص المطالبة الفعلي أبدًا، إذ يستخلصه DSPy من هذا الإعلان.
تعريف توقيع أساسي
يرث التوقيع المصغّر من dspy.Signature ويضع تعليقات على الحقول بصفتها InputField أو OutputField. ويوفر docstring الخاص بالفئة تعليمات المهمة.
import dspy
class QASignature(dspy.Signature):
"""Answer the question based on the given context."""
context: str = dspy.InputField(desc='Relevant background text')
question: str = dspy.InputField(desc='The question to answer')
answer: str = dspy.OutputField(desc='A concise answer')
# Inspect what DSPy sees
print(QASignature.instructions) # The docstring
print(list(QASignature.input_fields.keys())) # ['context', 'question']
print(list(QASignature.output_fields.keys())) # ['answer']حقول مخرجات متعددة
يمكن أن تحتوي التوقيعات على عدة حقول للمخرجات. وسيطلب DSPy من النموذج إنتاجها جميعًا في استدعاء واحد. ويفيد ذلك في استخراج المعلومات المهيكلة.
import dspy
class EntityExtraction(dspy.Signature):
"""Extract named entities from the text."""
text: str = dspy.InputField()
people: list[str] = dspy.OutputField(desc='List of person names mentioned')
organizations: list[str] = dspy.OutputField(desc='List of organization names')
locations: list[str] = dspy.OutputField(desc='List of place names')
extractor = dspy.Predict(EntityExtraction)
result = extractor(text='Elon Musk founded SpaceX in Hawthorne, California.')
print(result.people, result.organizations, result.locations)وحدة Predict
dspy.Predict هي أبسط الوحدات. فهي تتلقى توقيعًا وتطلب مباشرةً من LM إنتاج المخرج. ولا تضيف أي بنية للاستدلال، بل تنشئ مطالبة مهيكلة تطابق التوقيع.
استخدم Predict عندما تكون المهمة مباشرة ولا تتطلب خطوات استدلال صريحة.
import dspy
class Classify(dspy.Signature):
"""Classify the sentiment of the review."""
review: str = dspy.InputField()
sentiment: str = dspy.OutputField(desc='positive, negative, or neutral')
# Predict wraps the signature with a direct prompt
classifier = dspy.Predict(Classify)
result = classifier(review='The food was amazing and the service was excellent!')
print(result.sentiment) # positiveوحدة ChainOfThought
توسّع dspy.ChainOfThought التوقيع بإضافة حقل وسيط باسم reasoning. يكتب النموذج استدلاله أولًا، ثم ينتج الإجابة النهائية.
يؤدي ذلك باستمرار إلى تحسين الدقة في المسائل متعددة الخطوات، من دون أن تكتب أي تعليمات لمطالبة سلسلة التفكير.
import dspy
class MathSolver(dspy.Signature):
"""Solve the math problem."""
problem: str = dspy.InputField()
answer: str = dspy.OutputField(desc='The numerical answer')
# ChainOfThought adds a 'reasoning' step automatically
solver = dspy.ChainOfThought(MathSolver)
result = solver(problem='If a train travels 60 mph for 2.5 hours, how far does it go?')
print(result.reasoning) # Step-by-step reasoning
print(result.answer) # 150 milesوحدة ReAct
تنفذ dspy.ReAct حلقة الاستدلال والفعل. إذ يتناوب النموذج بين خطوات الاستدلال واستدعاءات الأدوات، ما يجعلها مثالية للوكلاء الذين يحتاجون إلى البحث أو الحساب أو جلب البيانات.
تقدم قائمة بالأدوات (دوال Python التي تحتوي على docstrings)، ويتولى DSPy تلقائيًا تنسيق التناوب بينها.
import dspy
def search_web(query: str) -> str:
"""Search the web and return relevant results."""
# In production, call a real search API
return f'Search results for: {query}'
def calculate(expression: str) -> str:
"""Evaluate a mathematical expression."""
return str(eval(expression))
class ResearchQA(dspy.Signature):
"""Answer the question using web search and calculation as needed."""
question: str = dspy.InputField()
answer: str = dspy.OutputField()
agent = dspy.ReAct(ResearchQA, tools=[search_web, calculate])
result = agent(question='What is 15% of 847?')
print(result.answer)تركيب الوحدات في برامج
تظهر القوة الحقيقية عند تركيب الوحدات في برامج متعددة الخطوات. أنشئ فئة فرعية من dspy.Module، وعرّف الوحدات الفرعية في __init__، ثم نفّذ forward() لربطها معًا.
import dspy
class RetrieveAndAnswer(dspy.Module):
def __init__(self):
super().__init__()
self.retrieve = dspy.Retrieve(k=3) # Retrieves top-3 passages
self.generate = dspy.ChainOfThought('context, question -> answer')
def forward(self, question):
passages = self.retrieve(question).passages
context = '\n'.join(passages)
return self.generate(context=context, question=question)
# This is a complete RAG pipeline in ~10 lines
rag = RetrieveAndAnswer()
result = rag(question='What are the main causes of climate change?')
print(result.answer)اختصار التوقيع المضمّن
في الحالات البسيطة، يقبل DSPy توقيعًا نصيًا مضمّنًا: 'input1, input2 -> output1, output2'. وهذا مناسب لإنشاء نماذج أولية سريعة من دون تعريف فئة كاملة.
import dspy
# Full class signature
class Translate(dspy.Signature):
"""Translate text to French."""
text: str = dspy.InputField()
translation: str = dspy.OutputField()
# Equivalent inline shorthand
translator_v1 = dspy.Predict(Translate)
translator_v2 = dspy.Predict('text -> translation') # Less metadata
# Both work the same way
result = translator_v1(text='Hello world')
print(result.translation)أوصاف الحقول مهمة
تُضمّن قيمة المعامل desc في InputField وOutputField داخل المطالبة التي يتم إنشاؤها. وتساعد الأوصاف الجيدة في توجيه النموذج بدقة.
فكّر في desc باعتباره توثيقًا على مستوى الحقل يظهر في المطالبة بجانب اسم الحقل.
import dspy
class Summarize(dspy.Signature):
"""Summarize the article for a busy executive."""
article: str = dspy.InputField(
desc='The full article text to summarize'
)
summary: str = dspy.OutputField(
desc='3-5 bullet points highlighting key decisions and numbers'
)
confidence: float = dspy.OutputField(
desc='Your confidence in the summary accuracy from 0.0 to 1.0'
)
summarizer = dspy.Predict(Summarize)
# DSPy constructs a prompt using all the desc values automaticallyحفظ البرامج وتحميلها
بعد التحسين، احفظ البرنامج المجمّع حتى لا تضطر إلى إعادة تشغيل التحسين في كل مرة. يعمل DSPy على تسلسل الحالة المحسّنة في ملف JSON.
import dspy
class QA(dspy.Signature):
"""Answer questions accurately."""
question: str = dspy.InputField()
answer: str = dspy.OutputField()
program = dspy.ChainOfThought(QA)
# After optimization, save the compiled state
program.save('optimized_qa.json')
# Load it later without re-running optimization
loaded_program = dspy.ChainOfThought(QA)
loaded_program.load('optimized_qa.json')
result = loaded_program(question='What is the speed of light?')
print(result.answer)التأكيدات لفرض قيود على المخرجات
تتيح لك التأكيدات في DSPy إعلان القيود المفروضة على المخرجات. فإذا خالف النموذج القيد، يعيد DSPy المحاولة تلقائيًا مع ملاحظات تصحيحية، من دون الحاجة إلى كتابة منطق لإعادة المحاولة يدويًا.
import dspy
class ShortAnswer(dspy.Signature):
"""Answer in at most 10 words."""
question: str = dspy.InputField()
answer: str = dspy.OutputField()
class ConstrainedQA(dspy.Module):
def __init__(self):
super().__init__()
self.predict = dspy.Predict(ShortAnswer)
def forward(self, question):
result = self.predict(question=question)
# Assert: answer must be at most 10 words
dspy.Assert(
len(result.answer.split()) <= 10,
'The answer must be 10 words or fewer.'
)
return resultاختبار المعرفة: ChainOfThought
ماذا تضيف dspy.ChainOfThought مقارنةً بـ dspy.Predict عند استخدام التوقيع نفسه؟
مراجعة: التوقيعات والوحدات
التوقيعات في DSPy هي إعلانات لفئات مَكتوبة تصف ما ينبغي أن تنفذه خطوة LLM، بما في ذلك المدخلات والمخرجات وتعليمة docstring. وتنفذ وحدات مثل Predict وChainOfThought وReAct استراتيجيات استدلال مختلفة حول التوقيع. ويمكنك تركيب عدة وحدات داخل فئة فرعية من dspy.Module لإنشاء مسارات معالجة متعددة الخطوات. وتوجه قيم desc الخاصة بالحقول النموذج داخل المطالبة التي يتم إنشاؤها تلقائيًا، بينما تفرض التأكيدات قيود المخرجات مع إعادة المحاولة تلقائيًا.
الأسئلة الشائعة
هل درس «تعريف التوقيعات والوحدات» مجاني؟
نعم — نص درس «تعريف التوقيعات والوحدات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Prompt Engineering، انتقل إلى CoddyKit PRO. تتضمن دورة AI Prompt Engineering 4 دروس في المجموع.
ماذا ستتعلم في «تعريف التوقيعات والوحدات»؟
صياغة التوقيعات، وChainOfThought، وReAct، ووحدات DSPy المخصصة تتمرن على AI Prompt Engineering مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Prompt Engineering؟
لا تُشترط خبرة سابقة. AI Prompt Engineering على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «تعريف التوقيعات والوحدات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Prompt Engineering هذا؟
نعم. كل درس في AI Prompt Engineering يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مقدمة إلى إطار DSPy
- تعريف التوقيعات والوحدات
- تجميع المطالبات وتحسينها
- تقييم مسارات DSPy