كيفية كتابة "Prompt" برمجي للحصول على نتائج ثابتة (JSON)
ماذا سنبني اليوم؟
في هذا الدرس التقني، سنتعلم كيفية صياغة "Prompt" فعال ومحدد للنماذج اللغوية الكبيرة (LLMs) لضمان الحصول على استجابات بصيغة JSON ثابتة ومنظمة. هذا أمر بالغ الأهمية لأتمتة المهام، معالجة البيانات، وتطبيقات تحسين محركات البحث (SEO) التي تتطلب بيانات مهيكلة.
أساسيات كتابة الـ Prompt للحصول على JSON
للحصول على JSON ثابت من LLM، يجب أن يكون الـ Prompt الخاص بك واضحًا، محددًا، ويضع قيودًا واضحة على التنسيق. النماذج اللغوية ممتازة في فهم السياق، ولكنها تحتاج إلى توجيه صارم عندما يتعلق الأمر بالهيكلة الدقيقة للمخرجات.
ملاحظة تقنية هامة: النماذج الأحدث مثل GPT-4o أو Gemini 1.5 Pro تدعم ميزة
response_format={"type": "json_object"}في واجهة برمجة التطبيقات (API) الخاصة بها. هذه الميزة تزيد بشكل كبير من موثوقية الحصول على JSON صالح، ولكن حتى معها، فإن الـ Prompt المصمم جيدًا يظل ضروريًا لتحديد هيكل الـ JSON المطلوب، وليس فقط تنسيقه.
مكونات الـ Prompt الفعال لـ JSON
يتكون الـ Prompt المثالي لإنتاج JSON من عدة عناصر أساسية:
- تحديد الشخصية (Persona): امنح النموذج دورًا محددًا (مثال: "أنت خبير في SEO"، "أنت محلل بيانات").
- المهمة (Task Definition): اشرح بوضوح ما يجب على النموذج فعله.
- تنسيق الإخراج (Output Format): حدد بوضوح أن الناتج يجب أن يكون بصيغة JSON فقط.
- هيكل JSON (JSON Schema): قم بتعريف بنية JSON المتوقعة بالتفصيل، بما في ذلك أسماء المفاتيح وأنواع البيانات لكل قيمة (سلسلة نصية، رقم، قائمة، كائن، إلخ).
- أمثلة (Few-shot Examples - اختياري ولكن موصى به): إذا كانت بنية JSON معقدة أو هناك حاجة لتفسير معين، قدم مثالاً أو مثالين لمدخلات ومخرجات JSON المتوقعة.
- تعليمات إضافية: أي قيود أخرى مثل عدد العناصر، طول الأوصاف، أو القيم المسموح بها.
مثال عملي: بناء Prompt لإنشاء قائمة منتجات (JSON)
لنفترض أننا نريد إنشاء قائمة من المنتجات في فئة معينة، مع تفاصيل محددة لكل منتج، وذلك باستخدام LLM. سنستخدم بايثون لتوليد الـ Prompt ومحاكاة الاستجابة.
import json
# For demonstration, we'll simulate an LLM response.
# In a real scenario, you'd integrate with an API like OpenAI, Google Gemini, etc.
def generate_product_list(topic: str, num_products: int = 3) -> dict:
"""
Generates a prompt for an LLM to create a list of products in JSON format.
"""
prompt = f"""
أنت خبير في التجارة الإلكترونية وإنشاء وصف المنتجات.
مهمتك هي إنشاء قائمة من {num_products} منتجات حول موضوع "{topic}".
لكل منتج، تحتاج إلى توفير:
- "id": معرف فريد للمنتج (رقم صحيح).
- "name": اسم المنتج (سلسلة نصية).
- "description": وصف موجز وجذاب للمنتج (سلسلة نصية).
- "price": سعر المنتج (رقم عشري).
- "category": فئة المنتج (سلسلة نصية).
الناتج يجب أن يكون بصيغة JSON فقط، ويجب أن يكون عبارة عن قائمة من كائنات المنتجات.
تأكد من أن الـ JSON صالح تمامًا.
مثال على التنسيق المطلوب:
[
{{
"id": 101,
"name": "مثال منتج 1",
"description": "هذا وصف للمنتج الأول.",
"price": 29.99,
"category": "إلكترونيات"
}},
{{
"id": 102,
"name": "مثال منتج 2",
"description": "هذا وصف للمنتج الثاني.",
"price": 15.50,
"category": "ملابس"
}}
]
الآن، قم بإنشاء قائمة المنتجات المطلوبة.
"""
print("--- Prompt Generated ---")
print(prompt)
print("------------------------")
# Simulate LLM response for demonstration purposes
# In a real application, you would send 'prompt' to an LLM API.
# For example:
# from openai import OpenAI
# client = OpenAI()
# response = client.chat.completions.create(
# model="gpt-4o",
# response_format={"type": "json_object"}, # For models that support this
# messages=[
# {"role": "system", "content": "You are a helpful assistant designed to output JSON."},
# {"role": "user", "content": prompt}
# ]
# )
# llm_output_text = response.choices[0].message.content
# Placeholder LLM response (replace with actual API call)
llm_output_text = """
[
{
"id": 1,
"name": "لوحة مفاتيح ميكانيكية احترافية",
"description": "لوحة مفاتيح ميكانيكية عالية الأداء للاعبين والمبرمجين مع إضاءة RGB قابلة للتخصيص.",
"price": 129.99,
"category": "إلكترونيات"
},
{
"id": 2,
"name": "سماعة رأس لاسلكية بخاصية إلغاء الضوضاء",
"description": "تجربة صوتية غامرة مع تقنية إلغاء الضوضاء النشطة، مثالية للسفر والعمل.",
"price": 199.50,
"category": "إلكترونيات"
},
{
"id": 3,
"name": "شاحن لاسلكي سريع 3 في 1",
"description": "اشحن هاتفك، ساعتك الذكية، وسماعات الأذن لاسلكيًا في وقت واحد وبسرعة فائقة.",
"price": 49.99,
"category": "إلكترونيات"
}
]
"""
try:
product_list = json.loads(llm_output_text)
print("\n--- Parsed JSON Output ---")
print(json.dumps(product_list, indent=2, ensure_ascii=False))
return product_list
except json.JSONDecodeError as e:
print(f"\nError decoding JSON: {e}")
print("Raw LLM output causing error:")
print(llm_output_text)
return None
if __name__ == "__main__":
products = generate_product_list("أجهزة إلكترونية", 3)
if products:
print(f"\nتم استخراج {len(products)} منتجات بنجاح.")
# Example of using the data:
# for product in products:
# print(f"Product Name: {product['name']}, Price: ${product['price']}")
لماذا الثبات مهم؟ (من منظور الأتمتة و SEO)
يعد الحصول على مخرجات JSON ثابتة أمرًا حيويًا للعديد من التطبيقات:
- الأتمتة: يسمح بالتحليل التلقائي للبيانات، مثل استخراج الكلمات المفتاحية، إنشاء أوصاف الميتا، أو تحديث قواعد البيانات. أي تباين في التنسيق يمكن أن يكسر سير العمل الآلي.
- SEO: يمكن استخدام JSON المهيكل لتوليد بيانات Schema Markup (مثل Product Schema، Article Schema) تلقائيًا، مما يساعد محركات البحث على فهم المحتوى بشكل أفضل ويعزز ظهور الموقع في نتائج البحث الغنية (Rich Snippets).
- تطوير المحتوى: إنشاء محتوى مهيكل (مثل قوائم الأسئلة الشائعة، مقارنات المنتجات) بكميات كبيرة بكفاءة.
- تكامل الأنظمة: ضمان أن البيانات التي يولدها LLM يمكن استهلاكها بسهولة من قبل الأنظمة والتطبيقات الأخرى.
النتيجة النهائية المتوقعة
بعد تشغيل الكود البرمجي أعلاه، سيقوم البرنامج بطباعة الـ Prompt الذي تم إنشاؤه، ثم سيحاكي استجابة من نموذج لغوي كبير بصيغة JSON. سيتم بعد ذلك تحليل هذه الاستجابة إلى كائن Python (في هذه الحالة، قائمة من القواميس)، مما يتيح لك الوصول البرمجي إلى تفاصيل المنتجات مثل الاسم والسعر والفئة. سيتم طباعة قائمة المنتجات المحللة بشكل منسق إلى وحدة التحكم، مؤكدة استخراج البيانات بنجاح في شكل مهيكل وثابت.