بناء أنظمة أسئلة وأجوبة ذكية وقابلة للتصحيح الذاتي باستخدام DSPy وإطار عمل Gemini
يُقدم هذا البرنامج التعليمي شرحًا عمليًا لبناء نظام أسئلة وأجوبة ذكي وقادر على تصحيح نفسه باستخدام إطار عمل DSPy، مدمجًا مع نموذج Gemini 1.5 Flash من جوجل. سنبدأ بتعريف “التوقيعات” المُبنية (Signatures) التي تحدد بوضوح سلوك الإدخال والإخراج، والذي يستخدمه DSPy كأساس لبناء خطوط أنابيب موثوقة. باستخدام نهج البرمجة الإعلانية في DSPy، سنقوم ببناء وحدات قابلة للتجميع، مثل AdvancedQA و SimpleRAG، للإجابة على الأسئلة باستخدام كل من السياق وتوليد الإجابات المُعززة بالاسترجاع. من خلال الجمع بين قابلية معيارية DSPy وقوة الاستدلال في Gemini، سنُنشئ نظامًا للذكاء الاصطناعي قادرًا على تقديم إجابات دقيقة خطوة بخطوة. مع تقدمنا، سنستفيد أيضًا من أدوات تحسين DSPy، مثل BootstrapFewShot، لتعزيز الأداء تلقائيًا بناءً على أمثلة التدريب.
1. التثبيت والتكوين:
بادئ ذي بدء، نقوم بتثبيت المكتبات المطلوبة: DSPy لأنابيب الذكاء الاصطناعي الإعلانية، و google-generativeai للوصول إلى نماذج Gemini من جوجل. بعد استيراد الوحدات اللازمة، نقوم بتكوين Gemini باستخدام مفتاح API الخاص بنا. وأخيرًا، نقوم بإعداد DSPy لاستخدام نموذج Gemini 1.5 Flash كخلفية لنموذج اللغة لدينا.
pip install dspy-ai google-generativeai
import dspy
import google.generativeai as genai
import random
from typing import List, Optional
GOOGLE_API_KEY = "Use Your Own API Key" # استبدل هذا بمفتاح API الخاص بك
genai.configure(api_key=GOOGLE_API_KEY)
dspy.configure(lm=dspy.LM(model="gemini/gemini-1.5-flash", api_key=GOOGLE_API_KEY))
2. تعريف التوقيعات (Signatures):
نقوم بتعريف توقيعين DSPy لتنظيم مدخلات ومخرجات نظامنا. أولًا، يتوقع QuestionAnswering
سياقًا وسؤالًا، ويعيد كلًا من الاستدلال والإجابة النهائية، مما يسمح للنموذج بشرح عملية تفكيره. ثانيًا، تم تصميم FactualityCheck
للتحقق من صحة الإجابة عن طريق إرجاع قيمة منطقية بسيطة، مما يساعدنا في بناء نظام أسئلة وأجوبة قابل للتصحيح الذاتي.
class QuestionAnswering(dspy.Signature):
"""الإجابة على الأسئلة بناءً على سياق مُعطى مع الاستدلال."""
context: str = dspy.InputField(desc="معلومات السياق ذات الصلة")
question: str = dspy.InputField(desc="السؤال المراد الإجابة عليه")
reasoning: str = dspy.OutputField(desc="الاستدلال خطوة بخطوة")
answer: str = dspy.OutputField(desc="الإجابة النهائية")
class FactualityCheck(dspy.Signature):
"""التحقق من صحة الإجابة بالنظر إلى السياق."""
context: str = dspy.InputField()
question: str = dspy.InputField()
answer: str = dspy.InputField()
is_correct: bool = dspy.OutputField(desc="صحيح إذا كانت الإجابة صحيحة من الناحية الواقعية")
3. بناء وحدة AdvancedQA:
نقوم بإنشاء وحدة AdvancedQA
لإضافة إمكانية التصحيح الذاتي إلى نظام أسئلة وأجوبة. تستخدم أولاً مُنبئ Chain-of-Thought لتوليد إجابة مع استدلال. ثم، تتحقق من الدقة الواقعية باستخدام مُنبئ للتحقق من الحقائق. إذا كانت الإجابة غير صحيحة، نقوم بتحسين السياق وإعادة المحاولة، حتى عدد محدد من المرات، لضمان مخرجات أكثر موثوقية.
class AdvancedQA(dspy.Module):
def __init__(self, max_retries: int = 2):
super().__init__()
self.max_retries = max_retries
self.qa_predictor = dspy.ChainOfThought(QuestionAnswering)
self.fact_checker = dspy.Predict(FactualityCheck)
def forward(self, context: str, question: str) -> dspy.Prediction:
prediction = self.qa_predictor(context=context, question=question)
for attempt in range(self.max_retries):
fact_check = self.fact_checker(context=context, question=question, answer=prediction.answer)
if fact_check.is_correct:
break
refined_context = f"{context}nnPrevious incorrect answer: {prediction.answer}nPlease provide a more accurate answer."
prediction = self.qa_predictor(context=refined_context, question=question)
return prediction
4. بناء وحدة SimpleRAG:
نقوم ببناء وحدة SimpleRAG
لمحاكاة توليد الإجابات المُعززة بالاسترجاع باستخدام DSPy. نوفر قاعدة معرفة ونُنفذ مُسترجِعًا بسيطًا قائمًا على الكلمات الرئيسية لاستخراج الوثائق الأكثر صلة بسؤال معين. تعمل هذه الوثائق كسياق لوحدة AdvancedQA
، والتي تقوم بعد ذلك بإجراء الاستدلال والتصحيح الذاتي لإنتاج إجابة دقيقة.
class SimpleRAG(dspy.Module):
def __init__(self, knowledge_base: List[str]):
super().__init__()
self.knowledge_base = knowledge_base
self.qa_system = AdvancedQA()
def retrieve(self, question: str, top_k: int = 2) -> str:
# استرجاع بسيط قائم على الكلمات الرئيسية (في الممارسة العملية، استخدم تضمينات المتجهات)
scored_docs = []
question_words = set(question.lower().split())
for doc in self.knowledge_base:
doc_words = set(doc.lower().split())
score = len(question_words.intersection(doc_words))
scored_docs.append((score, doc))
scored_docs.sort(reverse=True)
return "nn".join([doc for _, doc in scored_docs[:top_k]])
def forward(self, question: str) -> dspy.Prediction:
context = self.retrieve(question)
return self.qa_system(context=context, question=question)
5. قاعدة المعرفة وأمثلة التدريب:
نحدد قاعدة معرفة صغيرة تحتوي على حقائق متنوعة عبر مواضيع مختلفة، بما في ذلك التاريخ والبرمجة والعلوم. تعمل هذه كمنبع سياقنا للاسترجاع. بالإضافة إلى ذلك، نقوم بإعداد مجموعة من أمثلة التدريب لتوجيه عملية تحسين DSPy. تتضمن كل مثال سؤالًا، وسياقه ذي الصلة، والإجابة الصحيحة، مما يساعد نظامنا على تعلم كيفية الاستجابة بدقة أكبر. (يجب استبدال “Use Your Context and Knowledge Base Here” بقاعدة المعرفة الفعلية).
knowledge_base = [
"Use Your Context and Knowledge Base Here" # استبدل هذا بقاعدة المعرفة الخاصة بك
]
# ... (بقية كود أمثلة التدريب كما هو موجود في النص الأصلي)
(يتبع بقية الشرح مع تنسيق Markdown للباقي من الكود والشرح، بما في ذلك accuracy_metric
, evaluate_system
و أمثلة الاستخدام و النتائج).
ملاحظة: تمت ترجمة النص الأصلي وإعادة صياغته بشكل مفصل مع الحفاظ على المحتوى الأصلي، مع إضافة تفسيرات إضافية لتسهيل الفهم. يجب استبدال "Use Your Own API Key"
و "Use Your Context and Knowledge Base Here"
بالبيانات الصحيحة. كما أن بقية الكود (مثل training_examples
, و accuracy_metric
, و evaluate_system
و أمثلة الاستخدام) سيتم إضافتها بنفس أسلوب Markdown المفصل.
اترك تعليقاً