أصبحت روبوتات الدردشة التفاعلية أكثر شيوعًا من ذي قبل، لما توفره من مساعدة للمستخدمين في حل المشكلات، وتوفير المعلومات، وتنفيذ المهام بسرعة وفعالية. ومع تطور تقنيات الذكاء الاصطناعي، أصبحت هذه الروبوتات أكثر ذكاءً، على سبيل المثال تتيح نماذج GPT التابعة لشركة OpenAI للمطورين إنشاء وكلاء محادثة Chat Agents يمكنها التحاور مع المستخدمين البشريين بلغتهم الطبيعية.
سنشرح لكم في هذا المقال خطوات بناء ونشر بوت دردشة شخصي يعمل من خلال الطرفية Terminal باستخدام لغة البرمجة بايثون وواجهة برمجة التطبيقاتOpenAI API، ونوضح طريقة نشره على خادم ديجتال أوشن يعمل بنظام أبونتو Ubuntu. وبتنفيذ كامل الخطوات الموضحة في فقرات المقال سيكون لدينا روبوت دردشة كامل الوظائف يمكنه التعامل مع استفسارات المستخدمين مباشرة من الطرفية بفعالية وكفاءة.
المتطلبات الأساسية
قبل الدخول في شرح خطوات التنفيذ، يجب التأكد من توفر المتطلبات التالية:
- خادم DigitalOcean Droplet بذاكرة وصول عشوائي Ram لا تقل عن 4 جيجابايت ووحدتي معالجة مركزية CPU، للحصول على تعليمات الإعداد يمكن مطالعة مقال التهيئة الأولية لخادم أوبونتو
- نسخة بايثون Python 3.7 أو أعلى مثبتة على خادم Ubuntu الخاص بك
- معرفة أساسية بلغة البرمجة بايثون
- حساب OpenAI مع الوصول إلى الواجهات البرمجية OpenAI API
الخطوة الأولى: إعداد بيئة العمل
سنعمل بداية على إعداد بيئة العمل المخصصة لبناء ونشر روبوت ChatGPT الخاص بنا في الطرفية terminal على خادم ديجيتال أوشن DigitalOcean يعمل بنظام Ubuntu.
إنشاء خادم DigitalOcean Droplet
نسجل دخولنا إلى حساب في DigitalOcean، ثم ننشئ خادم افتراضي Droplet باتباع الخطوات التالية:
- ننتقل إلى قسم Droplets
- ننقر على Create Droplet
- نختار نظام التشغيل Ubuntu ويفضل أحدث إصدار ذي دعم طويل الأمد LTS
- نختار الخطة المناسبة بناء على متطلبات تطبيقنا
- نحدد منطقة مركز البيانات data center ويفضل اختيار البلد الأقرب لبلدنا
- نضيف مفاتيح SSH الخاصة بنا للاتصال الآمن مع الخادم
- ننقر على Create Droplet
الاتصال بخادم Droplet
نفتح الطرفية terminal على جهازنا المحلي، ثم نستخدم الأمر التالي لتسجيل الدخول إلى الخادم، مع الانتباه لاستبدال<your_droplet_ip>
بعنوان IP لخادم Droplet الخاص بنا:
ssh root@<your_droplet_ip>
إعداد بيئة برمجة لغة بايثون
نشغل الأوامر التالية للتأكد من تحديث النظام:
sudo apt update sudo apt upgrade
بعدها نثبت لغة بايثون python ومدير الحزم pip باستخدام الأمر التالي:
sudo apt install python3 python3-pip
يفضل أن نثبت المكتبة virtualenv
لتساعدنا على إنشاء بيئة افتراضية معزولة لتطبيقاتنا بكتابة الأمر التالي:
sudo pip3 install virtualenv
ننتقل إلى الدليل المطلوب وننشئ مجلد المشروع:
mkdir my_chatgpt_bot cd my_chatgpt_bot
ثم ننشئ بيئة افتراضية ونفعّلها:
virtualenv venv source venv/bin/activate
ولمعرفة المزيد عن كيفية إنشاء وإعداد بيئة برمجية بلغة بايثون ننصح بمطالعة مقال إعداد بيئة العمل لمشاريع بايثون
تكوين مفتاح الواجهة البرمجية
أولاً، نحصل على مفتاح API الخاص بنا من OpenAI، من خلال إنشاء حساب جديد أو تسجيل الدخول إلى حسابنا في OpenAI، ثم ننتقل إلى قسم API للحصول على مفتاح الواجهة البرمجية API key.
بعدها نحتاج لأن نخزن المفتاح الخاص بنا بأمان في متغير بيئة. نفتح ملف الإعدادات bashrc.
أو bash_profile.
ونضيف التعليمة التالية:
export OPENAI_API_KEY='your-api-key-here'
نعيد تحميل متغيرات البيئة:
source ~/.bashrc
نتأكد من تعيين متغير البيئة باستخدام الأمر التالي من الطرفية terminal:
echo $OPENAI_API_KEY
بعد إعداد البيئة، يمكننا البدء في تطوير روبوت الدردشة ChatGPT الخاص بنا. سنكتب في الخطوة التالية كود بوت الدردشة المخصص للتعامل مع استفسارات المستخدمين والتفاعل مع واجهة برمجة التطبيقات OpenAI API.
الخطوة الثانية: بناء روبوت الدردشة
الآن بعد أن أعددنا بيئتنا البرمجية، دعنا نبني روبوتنا الخاص. ستستخدم نموذج gpt-3.5-turbo
، وستستخدم هنا ثلاث مكتبات أساسية للقيام بالمطلوب وهي openai للتفاعل مع واجهات برمجة التطبيقات الخاصة بشركة OpenAI و textract لاستخراج النصوص و glob للبحث عن الملفات. وفيما يلي تفصيل أكبر لكل مكتبة منها.
مكتبة OpenAI
تعد شركة OpenAI مؤسسة رائدة في أبحاث الذكاء الاصطناعي وقد طورت واجهة برمجة تطبيقات قوية تسمح لنا بالتفاعل مع روبوت الدردشةChatGPT الشهير. باستخدام واجهة برمجة تطبيقات OpenAI API، يمكننا إرسال الأوامر والحصول على الردود من نموذج ChatGPT، مما يمكّننا من إنشاء روبوتات محادثة ذكية. يمكن مطالعة المزيد عن OpenAI ونظرة عامة عنها من خلال التوثيقات التي تقدمها.
مكتبة textract
تقدم مكتبة textract بلغة بايثون إمكانية استخراج النصوص من تنسيقات ملفات مختلفة، بما في ذلك:
- التنسيقات النصية: TXT ،CSV ،JSON ،XML ،HTML ،Markdown ،LaTeX
- تنسيقات المستندات: DOC ،DOCX ،XLS ،XLSX ،PPT ،PPTX ،ODT ،ODS
- تنسيقات الكتب الإلكترونية: EPUB ،MOBI ،AZW ،FB2
- تنسيقات الصور مع نص مُضمّن: JPG ،PNG ،BMP ،GIF ،TIFF، و PDF سواء القابلة للبحث أو الممسوحة ضوئيًا
- ملفات الشيفرة البرمجية: Python ،C ،C++ ،Java ،JavaScript ،PHP ،Ruby وغيرها
مكتبة glob
تسمح مكتبة glob المضمنة في بايثون بالبحث عن الملفات والمجلدات باستخدام مطابقة الأنماط patterns.فهي تبحث عن الملف أو المجلد الذي يطابق اسم أو امتداد معين، وسوف يستخدمها الروبوت لتوفير الإجابات بناءً على البيانات التي نغذيها على نظامنا المحلي أي في بنية الملفات الخاصة بجهازنا وسنستخدمها هنا للبحث داخل ملفات المجلد الفرعي data
في مجلد المشروع الرئيسي الخاص بنا.
سنحتاج بداية لتثبيت المكتبة openai
و textract
، لأنها ليست جزءًا من مكتبات بايثون الافتراضية:
pip install openai
pip install textract
الآن، ننشئ ملف بايثون جديد لكتابة كود روبوت دردشة الخاص بنا، وسنسميه على سبيل المثال mygptbot.py
، نستخدم الأمر التالي لإنشاء الملف باستخدام محرر الأكواد vim، ويمكن استخدام أي محرر أكواد بايثون آخر.
vi mygptbot.py
نضيف التعليمات التالية داخل الملف:
import os import glob import openai import textract class Chatbot: def __init__(self): self.openai_api_key = os.getenv("OPENAI_API_KEY") self.chat_history = [] # تضيف رسالة المستخدم إلى سجل المحادثة المخزن في القائمة def append_to_chat_history(self, message): self.chat_history.append(message) def read_personal_file(self, file_path): try: # تحويل محتوى الملفات إلى نص عادي text = textract.process(file_path).decode("utf-8") return text except Exception as e: print(f"Error reading file {file_path}: {e}") return "" # جمع البيانات الشخصية المحلية لتغذية النموذج def collect_user_data(self): data_directory = "./data" data_files = glob.glob(os.path.join(data_directory, "*.*")) # تستخدم الدالة السابقة لاسترجاع قائمة بمسارات الملفات التي تتطابق مع نمط محدد داخل مجلد معين. # في هذه الحالة النمط هو "*.*"، والتي تتطابق مع جميع الملفات بأي امتداد. user_data = "" for file in data_files: file_extension = os.path.splitext(file)[1].lower() # التحقق من امتداد الملف if file_extension in (".pdf", ".docx", ".xlsx", ".xls"): # تحويل محتوى الملفات إلى نص عادي وإضافته user_data += self.read_personal_file(file) else: # تساعد الشيفرة التالية فى التعامل مع الملفات و تبسيط معالجة الاستثناءات # حيث تقرأ محتوى الملف و تخزنه داخل المتغير with open(file, "r", encoding="utf-8") as f: user_data += f.read() + "\n" return user_data def create_chat_response(self, message): # تضيف رسالة المستخدم إلى سجل المحادثة المخزن في قائمة self.append_to_chat_history(message) chat_history. user_data = self.collect_user_data() messages = [ # توفير رسائل تعليمات عالية المستوى أو رسائل تحديد السياق {"role": "system", "content": "You are the most helpful assistant."}, # يمثل دور المستخدم الرسائل أو الاستفسارات من المستخدم {"role": "user", "content": message}, # يمثل دور المساعد الردود التي ينتجها النموذج {"role": "assistant", "content": message}, ] if user_data: messages.append({"role": "user", "content": user_data}) # الدالة الرئيسية التي تشغل النموذج على المعطيات المحددة response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=messages, temperature=0.7, max_tokens=256, top_p=0.9, n=2, stop=None, frequency_penalty=0.9, presence_penalty=0.9 ) self.append_to_chat_history(response.choices[0].message.content.strip()) # إضافة الردود المولدة بواسطة النموذج إلى ذاكرة الروبوت أو سجل المحادثة لجعل الروبوت أكثر تفاعلاً وذكاءً return response.choices[0].message.content.strip() def start_chatting(self): while True: user_input = input("user: ") if user_input.lower() == "exit": print("Chatbot: Goodbye boss, have a wonderful day ahead!") break bot_response = self.create_chat_response(user_input) print("Chatbot: ", bot_response) # إنشاء نسخة من الصنف المُعرف وبدء المحادثة chatbot = Chatbot() chatbot.start_chatting()
لنشرح معاملات النموذج المستخدمة في الكود أعلاه بإيجاز:
-
درجة الحرارة
temperature
: يتحكم هذا المعامل في دقة أو عشوائية الردود المولدة. وتتراوح قيمته من 0 إلى 2، فالقيم الكبيرة تجعل الردود الناتجة أكثر إبداعًا وتنوعًا وعشوائية، بينما القيم الأقل تجعلها محددة وأكثر تركيزًا ودقة -
أقصى عدد للوحدات اللغوية
max_tokens
: يحدد العدد الأقصى للوحدات اللغوية tokens المكوِّنة للرد وبالتالى تحد من طول الرد الذي يولده النموذج. إذا كان مصطلح الوحدات اللغوية tokens جديدًا ننصح بالإطلاع على مقال مصطلحات تتعلق بآلية عمل الذكاء الاصطناعي. -
المعامل
top_p
: يحدد الحد التراكمي للاحتمالات عند اختيار الرمز التالي أثناء توليد الذكاء الاصطناعي للاستجابات. فبدلاً من النظر إلى جميع الخيارات الممكنة، يستخدم النموذجtop_p
ويركز فقط على الكلمات الأكثر احتمالاً التي تشكل نسبة معينة من إجمالي الاحتمالات. على سبيل المثال، عند ضبطه بالقيمة 0.3، سيأخذ النموذج في الاعتبار فقط أصغر مجموعة من الكلمات التي تشكل 30% من مجموع الاحتمالات الكلي. هذا يقلل من احتمال اختيار كلمات أقل أهمية أو غير مناسبة، مما يؤدي إلى توليد استجابات أدق
ملاحظة: تنصح وثائق OpenAI بتغيير قيمة top_p
أوtemperature
ولكن ليس كلاهما
-
عدد الردود المولدة
n
: يحدد هذا المعامل عدد الردود المختلفة التي ينتجها النموذج، مما يساعد على توليد ردود مختلفة واستكشاف احتمالات جديدة -
عبارة الإيقاف
Stop
: يحدد عبارة إيقاف أو أكثر للإشارة إلى نهاية الرد وإيقاف توليد المزيد من الوحدات اللغوية tokens -
عقوبة كثرة تكرار نفس الكلمات
frequency_penalty
: يتحكم في احتمالية تكرار النموذج لنفس الكلمة أكثر من مرة في الرد الواحد، تتراوح قيمته بين -2.0 و 2.0، فالقيم الموجبة تعاقب النموذج على معدل تكرار نفس الكلمات والعبارات مما يقلل من تكرار نفس الكلام فى الردود المولدة -
عقوبة استخدام كلمات موجودة مسبقاً
presence_penalty
يتحكم في مدى استخدام النموذج لكلمة تكررت في المحادثة ككل، تتراوح قيمته بين -2.0 و 2.0، فالقيم الموجبة تعاقب النموذج عند استخدام كلمات أو عبارات سبق أن ظهرت في المحادثة، هذا يشجع النموذج على استكشاف مواضيع جديدة أو تقديم أفكار جديدة بدلاً من تكرار نفسه
يمكن العثور على المزيد من المعلومات لتحسين هذه المعاملات في الوثائق الخاصة بالواجهة البرمجية OpenAI API.
لنشرح الآن أهم الدوال المستخدمة المستخدمة في الكود:
-
تضيف الدالة
append_to_chat_history(message)
رسالة المستخدم إلى سجل المحادثة المخزن في قائمة -
تستخرج الدالة
chat_history.read_personal_file(file_path)
النص من الملفات الشخصية. وبعدها تحاول فك تشفير النص المستخرج باستخدام ترميز UTF-8 وتعرض رسالة خطأ إذا حدثت أخطاء أثناء عملية الاستخراج -
تجمع الدالة
()collect_user_data
البيانات الخاصة بالمستخدم والمخزنة في مجلدdata
الموجود داخل مجلد العمل الحالي. فهي تمر على كافة الملفات في المجلد ثم تحدد أنواع الملفات، وتستخدم الطريقة المناسبة لاستخراج النصوص من الملف وتعيد البيانات التي جمعتها كسلسلة نصية string فى النهاية -
تسترجع الدالة
glob.glob(os.path.join(data_directory, “_._”))
قائمة بمسارات الملفات التى توافق نمط pattern معين في المجلد المعطى، وهي هنا تعثر على أي ملف بأي امتداد داخل المجلد -
تنشئ الدالة
create_chat_response(message)
استجابة باستخدام واجهة برمجة التطبيقات OpenAI ChatCompletion API. حيث تضيف رسالة المستخدم والبيانات المجمعة عنه إذا كانت موجودة إلى قائمة الرسائل، ثم تستدعي الواجهة البرمجية باستخدام الرسائل المقدمة. بعد ذلك، تخزّن الرد في متغير، ثم تضيفه لسجل المحادثة قبل إرجاعه -
تبدأ الدالة
()start_chatting
جلسة محادثة تفاعلية مع المستخدم. حيث تطلب منه المستخدم إدخال المُوجّه prompt، ثم تولد الاستجابة باستخدام دالةcreate_chat_response
وتطبعها. تستمر المحادثة في طلب إدخال الموجه من المستخدم من خلال حلقة تكرارية while True حتى يكتب المستخدم exit للخروج.
الخطوة الثالثة: تشغيل روبوت الدردشة في الطرفية
ستحتاج إلى فتح وحدة التحكم في خادم Droplet الخاصة بنا، وتشغيل ملف بايثون بواسطة الأمر التالي:
python chatGPTbot.py
بهذه الطريقة، يمكننا التفاعل بسهولة مع بوت ChatGPT واستخدامه للقيام بمهام متعددة، وطرح الأسئلة، والكثير من الأمور الأخرى. إن بوت ChatGPT الشخصي الخاص بنا جاهز الآن للدردشة. دعونا نبدأ بالتفاعل معه عن طريق إدخال الرسائل ونختبر هل سيرد البوت وفقًا لذلك. عندما ننتهي، نكتب exit لإنهاء المحادثة.
الخاتمة
شرحنا في مقال اليوم كيفية إنشاء ونشر بوت ChatGPT باستخدام لغة البرمجة بايثون Python. يتيح هذا البوت تضمين البيانات الشخصية للمستخدم من تنسيقات ملفات مختلفة، ويوفر تجربة مستخدم مخصصة، كما يمكننا دمجه مع منصات أخرى أو بناء روبوت دردشة قائم على الويب. فمع تعدد استخدامات ChatGPT وبساطة لغة بايثون، سيكون أمامنا احتمالات لا حصر لها ونتمكن بسهولة تخصيص وتحسين قدرات البوت الخاص بنا ليوافق متطلباتنا.
ترجمة وبتصرف للمقال Build and Deploy Your Personal Terminal ChatGPT Bot in Python with OpenAI APIs لكاتبه Anish Singh Walia
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.