نشرح في مقال اليوم الخطوات الأساسية لدمج نماذج الذكاء الاصطناعي التي توفرها شركة OpenAI في تطبيق جانغو Django، ففي الآونة الأخيرة ازادت شعبية نماذج OpenAI أو ما يعرف بنماذج GPT OpenAI بشكل كبير بفضل قدرتها على توليد محتوى نصي عالي الجودة في مختلف المجالات سواء كتابة رسائل البريد الإلكتروني، أو القصص، أو الإجابة على استفسارات العملاء، أو حتى ترجمة المحتوى من لغة لأخرى.
تُستخدم نماذج جي بي تي GPT عادة من خلال روبوت الدردشة تشات جي بي تي ChatGPT، وهو نظام محادثة ذكي أطلقته OpenAI، ويمكن الاستفادة من هذه النماذج في تطبيقاتنا الخاصة باستعمال واجهة برمجة التطبيقات API التي وفرتها OpenAI للمطورين. وسنوضح في الفقرات التالية خطوات إنشاء تطبيق جانغو يستخدم هذه الواجهة البرمجية، وبالتحديد نموذج إكمال المحادثة ChatCompletion API من أجل توليد قصة قصيرة ونتعرف على طريقة تخصص معاملات النموذج المختلفة، وتنسيق ردوده واستجاباته.
المتطلبات
كي تتمكن من إكمال هذه المقالة، سوف تحتاج الآتي:
- إطار جانغو Django مثبت على بيئة افتراضية ضمن حاسوبك، إن كانت هذه أول مرة تستخدم فيها جانغو فيمكنك مطالعة مقال البدء مع إطار العمل جانغو لإنشاء تطبيق ويب ومقال تنصيب إطار العمل Django وتهيئة بيئته البرمجية على Ubuntu.
- حساب على منصة OpenAI، فإذا لم يكن لديك حساب سابق انتقل لموقعها الرسمي وسجل حساب جديد Sign up
-
مفتاح الواجهة البرمجية OpenAI API key فبعد إنشاء حسابك في OpenAI، عليك تسجيل الدخول للوحة تحكم حسابك، والانتقال لقسم مفاتيح الواجهة البرمجية API keys وتوليد المفتاح الخاص بك، يكون المفتاح المٌولد شبيهًا للتالي
sk-abcdefghijklmnop
، احرص على نسخه وحفظه في مكان آمن -
تثبيت حزمة OpenAI Package الخاصة بلغة بايثون، فعند تثبيت جانغو بالخطوة الأولى ستكون قد أنشأت بيئة افتراضية باسم
env
ضمن المجلدdjango-apps
. تأكد من تفعيل البيئة الافتراضية وظهور اسمها داخل قوسين()
في سطر الأوامر Terminal.
إذا لم تكن البيئة الافتراضية مفعلة فيمكنك تفعيلها يدويًا بالانتقال للمجلدdjango-apps
في سطر الأوامر وكتابة الأمر التالي:
hasoub-academy@ubuntu:$ .env/bin/activate
بمجرد تفعيل البيئة الافتراضية، شغل الأمر التالي لتنزيل حزمة OpenAI Package الخاصة بلغة بايثون:
(env)hasoub-academy@ubuntu:$ pip install openai
أنت جاهز الآن للبدء بتطوير تطبيق جانغو الخاص بك كما نوضح في الخطوات التالية.
إرسال الطلبات للواجهة البرمجية OpenAI API
نحتاج بداية لإضافة مفتاح الواجهة البرمجية OpenAI API key لتطبيقنا ليتمكن من إرسال الطلبات للواجهة البرمجية ChatCompletion API. واختبار الرد الذي نحصل عليه منها.
لنكتب الأمر التالي لتشغيل بايثون داخل البيئة الافتراضية:
(env)hasoub-academy@ubuntu:$ python
نستورد بعدها المكتبة OpenAI ونعرًف العميل client المخصص للتفاعل مع الواجهة البرمجية كما يلي:
import openai client = OpenAI(api_key="your-api-key")
ملاحظة: تحتاج لاستبدال"your-api-key"
بمفتاح الواجهة البرمجية الخاص بك.
بعدها نرسل طلب للواجهة البرمجية ChatCompletion API باستخدم الدالة chat.completions.create
:
response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[ {"role": "user", "content": "عد من 1 إلى 10"} ] )
حددنا في الكود السابق النموذج المراد استخدامه ليكون gpt-3.5-turbo
، وأضفنا كائن رسالة واحد يحتوي على الدور مستخدم user
، ومرّرنا الأمر أو المُوجّه prompt المطلوب إرساله للواجهة البرمجية وهو في حالتنا طلب العد من واحد إلى عشرة.
ملاحظة1: عند التفاعل مع نموذج GPT ستلاحظ وجود ثلاثة أدوار رئيسية وهي دور المستخدم user
الذي يطرح الأسئلة أو يطلب المساعدة من النموذج، ودور النظام system
الذي يتضمن القواعد والتعليمات التي توجه للنموذج، ودور المساعد assistance
الذي يمثل نموذج الذكاء الاصطناعي نفسه والمستخدم للإجابة على أسئلة المستخدم أو تنفيذ الأوامر التي يطلبها منه.
ملاحظة2: من المهم دائمًا الرجوع إلى التوثيق الرسمي لمنصة OpenAI للحصول على تعليمات دقيقة وشاملة حول كيفية استخدام نماذج GPT في تطبيقاتك، فهذه التعليمات قد تتغير مع مرور الوقت.
لنطبع الآن الرد المستلم من الواجهة البرمجية API والتي تتضمن الأعداد من واحد إلى عشرة على شكل قائمة من خلال الأمر التالي:
print(response.choices[0].message.content)
سنحصل على النتيجة التالية:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
بهذا نكون قد نجحنا بإرسال طلب بسيط إلى الواجهة البرمجية، واستلمنا الرد منها وتأكدنا أن كل شيء يسير على ما يرام، نحن جاهزون الآن لاستخدام الواجهة البرمجية لأمر أكثر صعوبة وهو كتابة محتوى لقصة.
ضبط معاملات النموذج Parameters
بعد أن نجنا في إرسال طلب API بسيط إلى الواجهة البرمجية لإكمال المحادثة ChatCompletion API، لنتعرف على طريقة ضبط معاملات النموذج والتعامل معها للتحكم بسلوك النموذج. فهنالك العديد من المعاملات المتاحة للتحكم في النص المولد، سنوضح ثلاثة منها.
1. درجة الحرارة Temperature
يتحكم هذا المعامل في مدى عشوائية الردود المولدة من قبل النموذج، ويأخذ قيمة بين الصفر والواحد، كلما ارتفعت قيمته سنحصل على تنوع وإبداع في الردود والعكس صحيح.
response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "اذكر خمس كلمات"}], temperature=0.1 ) print(response.choices[0].message.content)
المخرجــــات 1. تفاح 2. سيارة 3. كتاب 4. شمس 5. شجرة
لنجرب منحه قيمة قريبة من الصفر مثل 0.1
ونرى كيف ستولد الكلمات:
response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "اذكر خمس كلمات"}], temperature=0.1 ) print(response.choices[0].message.content)
المخرجــــات 1. تفاح 2. فيل 3. ضوء الشمس 4. مغامرة 5. سكون
ستلاحظ بالتجربة أنك عندما تطلب من النموذج أن يذكر خمس كلمات عدة مرات باستخدام القيمة 0.1
للبرامتر فسوف تحصل على نفس الكلمات في كل مرة، أما عندما ترفع قيمته إلى 0.8
وتجرب الطلب عدة مرات فستلاحظ تغير النتائج كل مرة:
response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "اذكر خمس كلمات باللغة العربية"}], temperature=0.8 ) print(response.choices[0].message.content)
المخرجــــات 1. تفاح 2. ضوء الشمس 3. سعادة 4. صداقة 5. تقنية
2. العدد الأقصى للوحدات النصية Max token
يسمح لك هذا المعامل بتحديد طول النص المولد، فعند تحديد قيمة معينة يضمن لك هذا المعامل أن الردود لن تتجاوز الرقم الذي حددته في الوحدات النصية tokens، على سبيل المثال:
response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "اذكر خمس كلمات"}], max_tokens=10 ) print(response.choices[0].message.content)
المخرجــــات 1. تفاحة 2. سيارة
لاحظ المخرجات عند تغير قيمة max-token
إلى 20:
response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "اذكر خمس كلمات"}], max_tokens=20 ) print(response.choices[0].message.content)
المخرجــــات 1. تفاح 2. سيارة 3. موسيقى 4. محيط 5. صداقة
3. التدفق Stream
يحدد هذا المعامل هل نريد أن تتدفق الردود على دفعات streams أو تعود دفعة واحدة، فعند ضبطه بالقيمة True
، ستستلم الرد بشكل متدفق، أي على دفعات خلال عملية توليدها. يكون هذا مفيدًا في المحادثات الطويلة أو تطبيقات الزمن الحقيقي التفاعلية.
response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": "اذكر خمس كلمات"}], stream=True ) collected_messages = [] for chunk in response: chunk_message = chunk.choices[0].delta.content if chunk_message is not None: collected_messages.append(chunk_message) print(collected_messages)
المخرجــــات ['', 'قطة', '\n', 'كتاب', '\n', 'حاسوب', '\n', 'شمس', '\n', 'ماء']
سيحتفظ المتغير chunk_message
بكل جزء من الرسالة المتدفقة بشكل مؤقت أثناء استلامها من الواجهة البرمجية، بعد ذلك، ستضاف هذه الأجزاء إلى القائمة collected_messages
التي تُجمع فيها كل الرسائل. يجب التأكد من أن الجزء المتدفق ليس None
، لأن هذه القيمة تدل على انتهاء تدفق الردود وتستخدم كشرط للخروج من الحلقة التكرارية.
صياغة مُوجِّه نظام مخصص
في هذه الخطوة، سنستخدم كل ما تعلمناه من مفاهيم أساسية لكتابة مُوجِّه نظام مخصص system prompt وتوفير السياق الذي يحتاجه نموذج GPT لفهم المطلوب منه ضمن تطبيق جانغو، وسنحدد القواعد التي يجب أن يتبعها النموذج لتوليد المحتوى.
ننشئ بداية وحدة بايثون module تحتوي على دالة تتولى المهمة المطلوبة. لذا ننشئ ملفًا جديدًا باسم story_generator.py
داخل مجلد مشروع جانغو بكتابة الأمر التالي:
(env)hasoub-academy@ubuntu:$ touch ~/my_blog_app/blog/blogsite/story_generator.py
ثم نضيف مفتاح الواجهة البرمجية OpenAI API key لمتغيرات البيئة environmental variables فلا نضيفها في ملف بايثون مباشرة لحماية المفتاح:
(env)hasoub-academy@ubuntu:$ export OPENAI_KEY="your-api-key"
افتح الآن الملف story_generator.py
وأنشئ بداخله عميل OpenAI client وعرف دالة باسم generate_story
وظيفتها توليد محتوى قصة بناءً على مجموعة من الكلمات المدخلة لها من طرف المستخدم:
import os from openai import OpenAI client = OpenAI(api_key=os.environ["OPENAI_KEY"]) def generate_story(words): # استدعاء واجهة برمجة التطبيقات من OpenAI لتوليد القصة response = get_short_story(words) # تنسيق الاستجابة وإرجاعها return format_response(response)
لتنظيم الكود البرمجي، نستدعي ضمن هذه الدالة البرمجية دالة منفصلة باسم get_short_story
تطلب توليد القصة من الواجهة البرمجية OpenAI API، ودالة أخرى format_response
تنسق الرد المستلم من الواجهة البرمجية.
لنركز الآن على دالة توليد القصة get_short_story
. نضيف الكود الخاص بها في نهاية الملف story_generator.py
.
def get_short_story(words): # إنشاء موجه النظام system_prompt = f"""أنت مولد قصص قصيرة. اكتب قصة قصيرة باستخدام الكلمات التالية: {words}. لا تتجاوز فقرة واحدة.""" # الاتصال بواجهة برمجة التطبيقات response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[{ "role": "user", "content": system_prompt }], temperature=0.8, max_tokens=1000 ) # إرجاع استجابة الواجهة البرمجية return response
كما تلاحظ فقد ضبطنا مُوجِّه النظام system prompt كي يخبر النموذج ما هو وما هي المهمة التي عليه لتأديتها، وحددنا في الموجّه حجم القصة المطلوبة، ثم مررنا الموجّه للواجهة البرمجية ChatCompletion API.
أخيرًا نكتب كود دالة التنسيق format_response
في نهاية الملف story_generator.py
:
def format_response(response): # استخرج القصة المولدة من الاستجابة story = response.choices[0].message.content # إزالة أي نص أو تنسيقات غير مرغوبة story = story.strip() # إرجاع القصة المنسقة return story
لاختبار هذه الدوال نستدعي الدالة generate_story
ونمرر لها مجموعة كلمات كمعاملات، ثم نطبع الرد الذي تعيده لنا من خلال إضافة سطر الكود التالي للملف:
print(generate_story("قطة، كتاب، حاسوب شمس، ماء"))
الآن، احفظ الملف وأغلقه ثم نفذّ الأمر التالي من داخل سطر الأوامر:
(env)hasoub-academy@ubuntu:$ python ~/my_blog_app/blog/blogsite/story_generator.py
يجب أن تحصل على قصة تشابه القصة التالية:
في زاوية مريحة من غرفة مشمسة، كانت هناك قطة ذات فرو ناعم تُدعى "مشمش"، تتمدد بكسل بجانب رف كتب شاهق. بين صفوف الكتب، كان حاسوب فضولي يهمس بهدوء. بينما كانت أشعة الشمس تتسلل عبر النافذة، مُلَقيةً ضوءًا دافئًا، لاحظت "مشمش" بقعة ماء صغيرة على الرف. مدفوعةً بالفضول، دفعت القطة الكتاب الأقرب إلى البقعة، ليُفتح الكتاب ويكشف عن مكان مخفي يحتوي على عقد ماسي متلألئ. مع اكتشاف السر، بدأت "مشمش" مغامرة غير متوقعة، حيث امتزجت أشعة الشمس، والماء، وقوة المعرفة لتنسج قصة مثيرة من الغموض والاكتشاف.
بعد أن تأكدنا من عمل الدالة generate_story
وتوليد القصة بشكل صحيح، لنغير طريقة تنفيذ الكود وبدلاً من طباعة القصة مباشرة في سطر الأوامر، سنستدعي الدالة من خلال عرض جانغو Django view لعرض القصة على واجهة المستخدم.
print(generate_story("قطة، كتاب، حاسوب شمس، ماء"))
يمكن تجربة تعديل مُوجّه النظام system prompt بما يناسبك لتوليد محتوى أفضل. ستلاحظ بالتجربة أن بإمكانك دائمًا تحسين النتائج بما يتناسب مع احتياجاتك.
لننتقل إلى الخطوة التالية، حيث سندمج الوحدة التي عرفناها في الملف story_generator.py
مع مشروع جانغو الخاص بنا.
دمج وحدة بايثون مع جانغو في الواجهة الخلفية
لدمج وحدة story_generator
مع مشروع جانغو في الواجهة الخلفية، علينا تنفيذ عدة خطوات بسيطة، سنبدأ أولاً بإنشاء عرض view جديد في جانغو لاستقبال الكلمات من المستخدم، ثم سنستخدم الدالة generate_story
لتوليد القصة بناءً على تلك الكلمات، وفي النهاية سنعرض النتيجة للمستخدم عبر المتصفح.
افتح ملف views.py
داخل مجلد مشروع جانغو، واستورد الوحدات والحزم البرمجية اللازمة، ثم أضف دالة عرض view باسم generate_story_from_words
واكتب ضمنها ما يلي:
from django.http import JsonResponse from .story_generator import generate_story def generate_story_from_words(request): words = request.GET.get('words') # استخراج الكلمات المتوقعة من الطلب story = generate_story(words) # استدعاء دالة generate_story باستخدام الكلمات المستخرجة return JsonResponse({'story': story}) # إرجاع القصة في استجابة JSON
بعدها نحتاج لربط الدالة بمسار URL في مشروع جانغو لتمكين المستخدمين من الوصول إليها عبر المتصفح. لنفتح الملف urls.py
ونضيف نمط الرابط URL pattern للدالة generate_story_from_words
كما يلي:
urlpatterns = [ # أنماط URL الأخرى... path('generate-story/', views.generate_story_from_words, name='generate-story'), ]
الآن يمكننا إرسال الطلبات من خلال نقطة الوصول التالية/generate-story/
باستخدام المتصفح، وإرسال طلب من النوع GET لها وتمرير الكلمات المتوقعة كمعاملات للطلب، نفتح سطر الأوامر ونكتب الأمر curl بالشكل التالي:
(env)hasoub-academy@ubuntu:$ curl "http://your_domain/generate-story/?words=قطة,كتاب,حاسوب,شمس,ماء"
استبدل http://your_domain
بعنوان النطاق الفعلي الذي يستضيف مشروعك. تمثل الكلمات الممررة عبر هذا الرابط مثل كتاب وماء وحاسوي فهي الكلمات التي نريد استخدامها لتوليد محتوى القصة. يمكنك بالطبع تغيير هذه الكلمات واستخدام كلمات أخرى حسب رغبتك.
بعد تشغيل أمر curl يجب أن نرى ردًا من الخادم يحتوي على القصة المولدة استنادًا إلى الكلمات التي قدمتها.
(env)hasoub-academy@ubuntu:$ curl "http://your_domain/generate-story/?words="قطة,كتاب,حاسوب,شمس,ماء"
وسنحصل على مخرجات قريبة للتالي:
{ "story": "كان يا مكان، في كوخ صغير مريح يقع وسط غابة كثيفة، قطة فضولية تُدعى 'مشمش' تجلس بجانب النافذة، تستمتع بأشعة الشمس الدافئة. بينما كانت 'مشمش' تحرك ذيلها بكسل، لفت نظرها كتاب مغبر ملقى على رف قريب. بدافع الفضول، قفزت بعناية إلى الرف، مما أدى إلى سقوط مجموعة من الكتب، فتح أحدها ليكشف عن مكان مخفي. داخل هذا المكان، اكتشفت 'مشمش' حاسوبًا قديمًا، بدأ شاشته يومض عندما لمست زر الطاقة. مفتونةً بالشاشة المتوهجة، انطلقت 'مشمش' في عالم من المناظر الافتراضية، حيث تجولت بحرية، تطارد الأسماك الرقمية وتوقف للإعجاب بشلالات رائعة. ضائعة في هذه المغامرة الجديدة، اكتشفت 'مشمش' عجائب العوالم الملموسة والافتراضية معًا، مدركةً أن الاستكشاف الحقيقي لا يعرف حدودًا." }
الخلاصة
إلى هنا نكون قد وصلنا لنهاية هذا المقال، يجب أن تكون قد فهمت الخطوات الأساسية التي تحتاجها لدمج OpenAI modes داخل تطبيق جانغو Django باستخدام الواجهة البرمجية OpenAI API، وتعلمت طريقة إرسال الطلبات للواجهة البرمجية ChatCompletion API والتحكم بسلوك النموذج عن طريق ضبط معاملاته المختلفة. لتحسين هذا المشروع وزيادة ميزاته، يمكنك استكشاف المزيد من مميزات الواجهة البرمجية OpenAI API وتجرب مُوجِّهات نظام system prompt مختلفة، وقيم معاملات متنوعة حتى تحصل على قصة مميزة وإبداعية.
ترجمة-وبتصرٌّف-للمقال How to Integrate OpenAI GPT Models in Your Django Project
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.