1. مقدمة
في هذا الدرس التطبيقي، ستنشئ خدمة ويب لإنشاء اختبارات معلومات عامة وتدمجها في تطبيق ممتع يعمل بشكل جيد. ستستخدم لغة برمجة مختلفة عن تلك التي استخدمتها من قبل، وهي الإنجليزية.
المهام التي ستنفذها...
- ستصمّم طلبًا ينشئ اختبار معلومات عامة وفقًا لمجموعة من المعايير.
- ستنشئ تطبيق ويب بسيطًا وتتأكّد من أنّه يعمل على النحو المتوقّع في بيئة التطوير.
- ستضيف بشكل تدريجي منطقًا إلى تطبيق الويب لتحويله إلى خادم واجهة برمجة تطبيقات ينشئ اختبارات استنادًا إلى مجموعة من مَعلمات الإدخال.
- ستتعرّف على مدى سهولة نشر خدمة إنشاء الاختبارات على السحابة الإلكترونية باستخدام Google Cloud Run.
- أخيرًا، ستضبط تطبيقًا حقيقيًا ( quizaic.com) لاستخدام خدمة إنشاء الاختبارات التي تم نشرها، وستتمكّن من إجراء اختبارات مباشرة استنادًا إلى النتائج.
ما ستتعلمه...
- كيفية إنشاء طلب مستند إلى نموذج للنموذج اللغوي الكبير (LLM)
- كيفية إنشاء تطبيق خادم ويب بسيط في Python
- كيفية إضافة دعم للنماذج اللغوية الكبيرة من Google إلى تطبيق الويب
- كيفية نشر تطبيقك على السحابة الإلكترونية ليتمكّن أي شخص من تجربة ابتكارك الجديد
- كيفية دمج أداة إنشاء الاختبارات في تطبيق أكبر
المتطلبات...
- متصفّح الويب Chrome
- حساب Google
- مشروع على السحابة الإلكترونية تم تفعيل الفوترة فيه
هذا المختبر مخصّص للمطوّرين من جميع المستويات، بما في ذلك المبتدئين. على الرغم من أنّك ستستخدم Python، ليس عليك أن تكون على دراية ببرمجة Python لفهم ما يحدث لأنّنا سنشرح كل الرموز البرمجية التي ستراها.
2. الإعداد

يغطّي هذا القسم كل ما عليك فعله لبدء هذا الدرس التطبيقي.
إعداد البيئة بالسرعة التي تناسبك
- سجِّل الدخول إلى Google Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.



- اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديلها في أي وقت.
- رقم تعريف المشروع هو معرّف فريد في جميع مشاريع Google Cloud ولا يمكن تغييره بعد ضبطه. تنشئ Cloud Console تلقائيًا سلسلة فريدة، ولا يهمّك عادةً ما هي. في معظم دروس البرمجة، عليك الرجوع إلى رقم تعريف مشروعك (يُشار إليه عادةً باسم
PROJECT_ID). إذا لم يعجبك رقم التعريف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. يمكنك بدلاً من ذلك تجربة اسم مستخدم من اختيارك ومعرفة ما إذا كان متاحًا. لا يمكن تغيير هذا الخيار بعد هذه الخطوة وسيظل ساريًا طوال مدة المشروع. - للعلم، هناك قيمة ثالثة، وهي رقم المشروع، تستخدمها بعض واجهات برمجة التطبيقات. يمكنك الاطّلاع على مزيد من المعلومات عن كل هذه القيم الثلاث في المستندات.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات Cloud. لن تكلفك تجربة هذا الدرس التطبيقي حول الترميز الكثير، إن وُجدت أي تكلفة على الإطلاق. لإيقاف الموارد وتجنُّب تحمّل تكاليف تتجاوز هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.
بدء Cloud Shell
في هذا التمرين، ستعمل في جلسة Cloud Shell، وهي أداة تفسير أوامر تستضيفها آلة افتراضية تعمل في سحابة Google. يمكنك تشغيل هذا القسم بسهولة على جهاز الكمبيوتر الخاص بك، ولكن استخدام Cloud Shell يتيح للجميع الاستفادة من تجربة قابلة للتكرار في بيئة متسقة. بعد انتهاء الجلسة، يمكنك إعادة محاولة إكمال هذا القسم على جهاز الكمبيوتر الخاص بك.

تفعيل Cloud Shell
- من Cloud Console، انقر على تفعيل Cloud Shell
.

إذا كانت هذه هي المرة الأولى التي تبدأ فيها Cloud Shell، ستظهر لك شاشة وسيطة توضّح ماهية هذه الخدمة. إذا ظهرت لك شاشة وسيطة، انقر على متابعة.

يستغرق توفير Cloud Shell والاتصال به بضع لحظات فقط.

يتم تحميل هذا الجهاز الافتراضي بجميع أدوات التطوير اللازمة. توفّر هذه الخدمة دليلًا رئيسيًا دائمًا بسعة 5 غيغابايت وتعمل في Google Cloud، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير. يمكن إنجاز معظم عملك في هذا الدرس التطبيقي حول الترميز، إن لم يكن كله، باستخدام متصفح.
بعد الاتصال بـ Cloud Shell، من المفترض أن يظهر لك أنّه تم إثبات هويتك وأنّه تم ضبط المشروع على رقم تعريف مشروعك.
- نفِّذ الأمر التالي في Cloud Shell للتأكّد من إكمال عملية المصادقة:
gcloud auth list
ناتج الأمر
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- نفِّذ الأمر التالي في Cloud Shell للتأكّد من أنّ أمر gcloud يعرف مشروعك:
gcloud config list project
ناتج الأمر
[core] project = <PROJECT_ID>
إذا لم يكن كذلك، يمكنك تعيينه من خلال هذا الأمر:
gcloud config set project <PROJECT_ID>
ناتج الأمر
Updated property [core/project].
تفعيل بعض واجهات برمجة التطبيقات
في الخطوات اللاحقة، ستعرف الأماكن التي تحتاج فيها إلى هذه الخدمات (والسبب)، ولكن في الوقت الحالي، شغِّل هذا الأمر لمنح مشروعك إذن الوصول إلى Cloud Build وArtifact Registry وVertex AI وCloud Run:
gcloud services enable cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
aiplatform.googleapis.com \
run.googleapis.com
من المفترض أن يؤدي ذلك إلى ظهور رسالة نجاح مشابهة لما يلي:
Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.
3- التحفيز - البرمجة باللغة الطبيعية

سنبدأ بتعلُّم كيفية تطوير طلب لنموذج لغوي كبير. انتقِل إلى Google Cloud Console > Vertex AI > Vertex AI Studio (اللغة). من المفترض أن تظهر لك صفحة مشابهة لما يلي:

ضمن Generate Text، انقر على الزر Text Prompt. في مربّع الحوار التالي، أدخِل طلبًا تعتقد أنّه قد يكون فعّالاً لإنشاء اختبار معلومات عامة وفقًا للمتطلبات التالية:
- الموضوع: تاريخ العالم
- عدد الأسئلة: 5
- مستوى الصعوبة: متوسط
- اللغة: الإنجليزية
انقر على الزر "إرسال" للاطّلاع على الناتج.
كما هو موضّح في لقطة الشاشة التالية، تتيح لك اللوحة الجانبية اليسرى إمكانية اختيار النموذج الذي تريد استخدامه وضبط بعض الإعدادات:

تتوفر الإعدادات التالية:
- المنطقة التي يجب أن يتم فيها تنفيذ طلب الإنشاء
- يحدّد النموذج النموذج اللغوي الكبير الذي تريد استخدامه. في هذا الدرس العملي، استخدِم "gemini-1.0-pro-001".
- تتحكّم درجة العشوائية في مستوى العشوائية في اختيار الرموز المميزة. تكون درجات الحرارة المنخفضة مناسبة للطلبات التي تتوقّع ردًا صحيحًا، بينما يمكن أن تؤدي درجات الحرارة المرتفعة إلى نتائج أكثر تنوعًا أو غير متوقعة.
- يحدّد الحد الأقصى لعدد الرموز المميزة الحد الأقصى لكمية النص الناتج من طلب واحد. الرمز المميز الواحد يعادل أربعة أحرف تقريبًا. القيمة التلقائية هي 1024.
- تغيّر عملية اختيار أعلى k عدد من الرموز المميزة طريقة اختيار النموذج للرموز المميزة في الناتج. يعني top-k بقيمة 1 أنّ الرمز المميز المحدّد هو الأكثر احتمالاً بين جميع الرموز المميزة في مفردات النموذج (يُعرف أيضًا باسم فك الترميز الجشع)، بينما يعني top-k بقيمة 3 أنّه يتم تحديد الرمز المميز التالي من بين الرموز المميزة الثلاثة الأكثر احتمالاً (باستخدام درجة العشوائية). القيمة التلقائية لـ top-k هي 40.
- تغيّر مَعلمة أعلى احتمال تراكمي طريقة اختيار النموذج للرموز المميزة في الردّ. يتم اختيار الرموز المميزة من الأكثر احتمالاً إلى الأقل احتمالاً إلى أن يساوي مجموع احتمالاتها قيمة top-p.
- الحد الأقصى للردود هو الحد الأقصى لعدد الردود التي ينشئها النموذج لكل طلب.
- تسلسل الإيقاف هو سلسلة من الأحرف (بما في ذلك المسافات) توقف عملية إنشاء الرد إذا صادفها النموذج.
- يحدّد خيار "عرض الردود تدريجيًا" ما إذا كان يجب طباعة الردود أثناء إنشائها أو حفظها وعرضها عند اكتمالها.
- يعدّل الحد الأدنى لفلتر الأمان مدى احتمال ظهور ردود قد تكون ضارة لك.
بعد الحصول على طلب يبدو أنّه ينشئ اختبارًا معقولاً وفقًا للمتطلبات المذكورة أعلاه، يمكننا تحليل هذا الاختبار باستخدام رمز مخصّص، ولكن ألن يكون من الأفضل أن ينشئ النموذج اللغوي الكبير الاختبار بتنسيق منظَّم يمكننا تحميله مباشرةً في برنامجنا؟ يتوقّع البرنامج الذي سنستخدمه لاحقًا في هذا المختبر لاستدعاء أداة الإنشاء أن يتم التعبير عن الاختبارات بتنسيق JSON، وهو تنسيق شائع متعدد اللغات لتمثيل البيانات المنظَّمة.
يتم التعبير عن الاختبارات في هذا المختبر على أنّها مصفوفة من العناصر، حيث يحتوي كل عنصر على سؤال ومصفوفة من الردود المحتملة على هذا السؤال ورد صحيح. في ما يلي ترميز JSON الخاص بالاختبارات في هذه الميزة الاختبارية:
[
{
"question": "Who was the first person to walk on the moon?",
"responses": [
"Neil Armstrong",
"Buzz Aldrin",
"Michael Collins",
"Yuri Gagarin"
],
"correct": "Neil Armstrong"
},
{
"question": "What was the name of the war that took place between the British and the French in North America from 1754 to 1763??",
"responses": [
"The French and Indian War",
"The Seven Years' War",
"The War of the Austrian Succession",
"The Great War"
],
"correct": "The French and Indian War"
},
...
]
معرفة ما إذا كان بإمكانك تعديل طلبك لإنشاء الاختبار بتنسيق JSON المطلوب
- حدِّد بالكلمات التنسيق الدقيق الذي تبحث عنه (مثل الجملة المائلة أعلاه).
- ضمِّن في طلبك مثالاً على تنسيق JSON المطلوب.
بعد أن يصبح لديك طلب يولد اختبارات وفقًا للمواصفات المطلوبة، انقر على الزر GET CODE في أعلى يسار الصفحة للاطّلاع على رمز Python الذي يمكن استخدامه لإرسال طلبك آليًا إلى نموذج لغوي كبير في Vertex AI. إذا كنت مهتمًا باستخدام لغة برمجة أخرى غير Python، يمكنك الاطّلاع على https://cloud.google.com/vertex-ai/docs/samples?text=generative.
4. إنشاء خادم ويب بسيط

بعد أن أصبح لديك طلب يعمل بشكل صحيح، نريد دمجه في تطبيق أكبر. بالطبع، يمكننا تضمين طلبك في رمز المصدر للتطبيق الأكبر، ولكننا نريد أن يعمل مولّد الاختبارات كخدمة مصغّرة توفّر خدمة إنشاء الاختبارات لتطبيقات أخرى. لتحقيق ذلك، علينا إنشاء خادم ويب بسيط وإتاحته للجميع. سنوضّح لك طريقة إجراء ذلك في الخطوات التالية.
ابدأ بالنقر على الزر Open Editor في أعلى لوحة Cloud Shell. يبدو على النحو التالي:

بعد ذلك، ستنتقل إلى بيئة تطوير متكاملة (IDE) مشابهة لـ Visual Studio Code، حيث يمكنك إنشاء المشاريع وتعديل الرمز المصدر وتشغيل برامجك وما إلى ذلك.
إذا كانت شاشتك ضيقة جدًا، يمكنك توسيع أو تصغير خط التقسيم بين وحدة التحكّم ونافذة التعديل/الوحدة الطرفية من خلال سحب الشريط الأفقي بين هاتين المنطقتين، كما هو موضّح هنا:

يمكنك التبديل بين "المحرّر" و"نافذة الأوامر" من خلال النقر على الزرّين Open Editor وOpen Terminal على التوالي. جرِّب التبديل بين هذين الوضعين الآن.
بعد ذلك، أنشئ مجلدًا لتخزين عملك في هذا المختبر، وذلك بالنقر على زر إضافة مجلد
، ثم أدخِل quiz-generator واضغط على Enter. سيتم إنشاء جميع الملفات التي تنشئها في هذا الدرس التطبيقي وكل العمل الذي تقوم به في Cloud Shell في هذا المجلد.
الآن، أنشئ ملف requirements.txt. يُعلم هذا الملف لغة Python بالمكتبات التي يعتمد عليها تطبيقك. بالنسبة إلى تطبيق الويب البسيط هذا، ستستخدم وحدة Python شائعة لإنشاء خوادم الويب تُسمى Flask, مكتبة عميل google-cloud-aiplatform وإطار عمل لخادم الويب يُسمى gunicorn. في لوحة التنقّل بين الملفات، انقر بزر الماوس الأيمن على المجلد quiz-generator واختَر عنصر القائمة New file، كما يلي:

عندما يُطلب منك إدخال اسم الملف الجديد، أدخِل requirements.txt واضغط على مفتاح Enter. تأكَّد من أنّ الملف الجديد ينتهي به المطاف في مجلد مشروع quiz-generator.
ألصِق الأسطر التالية في الملف الجديد لتحديد أنّ تطبيقك يعتمد على حزمة flask من Python وخادم الويب gunicorn ومكتبة العميل google-cloud-aiplatform، بالإضافة إلى الإصدارات المرتبطة بكل منها.
flask==3.0.0 gunicorn==21.2.0 google-cloud-aiplatform==1.47.0
لست بحاجة إلى حفظ هذا الملف بشكل صريح لأنّ "محرّر السحابة الإلكترونية" سيحفظ التغييرات تلقائيًا.
باستخدام الأسلوب نفسه، أنشئ ملفًا جديدًا آخر باسم main.py. سيكون هذا هو ملف مصدر Python الرئيسي (والوحيد) لتطبيقك. تأكَّد مرة أخرى من أنّ الملف الجديد ينتهي به المطاف في المجلد quiz-generator.
أدخِل الرمز التالي في هذا الملف:
from flask import Flask
import os
app = Flask(__name__) # Create a Flask object.
PORT = os.environ.get("PORT") # Get PORT setting from environment.
if not PORT:
PORT = 8080
# The app.route decorator routes any GET requests sent to the root path
# to this function, which responds with a "Hello world!" HTML document.
@app.route("/", methods=["GET"])
def say_hello():
html = "<h1>Hello world!</h1>"
return html
# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
app.run(host="0.0.0.0", port=PORT)
عُد إلى الوحدة الطرفية وانتقِل إلى مجلد المشروع باستخدام الأمر التالي:
cd quiz-generator
نفِّذ الأمر التالي لتثبيت تبعيات مشروعك:
pip3 install -r requirements.txt
بعد تثبيت التبعيات، من المفترض أن تظهر لك نتيجة تنتهي على النحو التالي:
Successfully installed flask-3.0.0
الآن، شغِّل تطبيقك من خلال تنفيذ الأمر التالي في الوحدة الطرفية:
flask --app main.py --debug run --port 8080
في هذه المرحلة، يكون تطبيقك قيد التشغيل على الجهاز الظاهري المخصّص لجلسة Cloud Shell. يتضمّن Cloud Shell آلية وكيل تتيح لك الوصول إلى خوادم الويب (مثل الخادم الذي بدأت تشغيله للتو) التي تعمل على جهازك الافتراضي من أي مكان على الإنترنت العالمي.
انقر على الزر web preview ثم على عنصر القائمة Preview on Port 8080 كما يلي:

سيؤدي ذلك إلى فتح علامة تبويب متصفّح ويب لتطبيقك قيد التشغيل، والذي من المفترض أن يظهر على النحو التالي:

5- إضافة طريقة إنشاء مع تحليل المَعلمات
نريد الآن إضافة إمكانية التعامل مع طريقة جديدة تُسمى generate. يمكنك إجراء ذلك من خلال إضافة عبارة استيراد لمعالجة طلب HTTP وتعديل المسار الرئيسي لتحليل هذا الطلب وطباعة المَعلمات، كما يلي:
from flask import Flask
from flask import request #<-CHANGED
import os
app = Flask(__name__) # Create a Flask object.
PORT = os.environ.get("PORT") # Get PORT setting from environment.
if not PORT:
PORT = 8080
# The app.route decorator routes any GET requests sent to the /generate
# path to this function, which responds with "Generating:" followed by
# the body of the request.
@app.route("/", methods=["GET"]) #<-CHANGED
def generate(): #<-CHANGED
params = request.args.to_dict() #<-CHANGED
html = f"<h1>Quiz Generator</h1>" #<-CHANGED
for param in params: #<-CHANGED
html += f"<br>{param}={params[param]}" #<-CHANGED
return html #<-CHANGED
# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
app.run(host="0.0.0.0", port=PORT)
أعِد الآن تحميل علامة تبويب متصفّح الويب الحالية للاطّلاع على النتائج. في هذه المرة، من المفترض أن يظهر لك "منشئ الاختبار"، بالإضافة إلى مَعلمة طلب بحث تتم إضافتها تلقائيًا إلى عنوان URL (authuser). حاوِل إضافة مَعلمتَين إضافيتَين عن طريق إلحاق السلسلة "`¶m1=val1¶m2=val2`" بنهاية عنوان URL في شريط العناوين في المتصفّح، ثم إعادة تحميل الصفحة، ومن المفترض أن يظهر لك ما يلي:

بعد أن تعرّفنا على كيفية إرسال معلَمات طلب البحث وتحليلها في عنوان URL، سنضيف إمكانية استخدام المَعلمات المحدّدة التي نريد إرسالها إلى أداة إنشاء الاختبار، وهي كما يلي:
topic: موضوع الاختبار المطلوب-
num_q: عدد الأسئلة المطلوبة -
diff: مستوى الصعوبة المطلوب (سهل أو متوسط أو صعب) lang: لغة الاختبار المطلوبة
from flask import Flask
from flask import request
import os
# Default quiz settings #<-CHANGED
TOPIC = "History" #<-CHANGED
NUM_Q = "5" #<-CHANGED
DIFF = "intermediate" #<-CHANGED
LANG = "English" #<-CHANGED
app = Flask(__name__) # Create a Flask object.
PORT = os.environ.get("PORT") # Get PORT setting from environment.
if not PORT:
PORT = 8080
# This function takes a dictionary, a name, and a default value.
# If the name exists as a key in the dictionary, the corresponding
# value is returned. Otherwise, the default value is returned.
def check(args, name, default): #<-CHANGED
if name in args: #<-CHANGED
return args[name] #<-CHANGED
return default #<-CHANGED
# The app.route decorator routes any GET requests sent to the /generate
# path to this function, which responds with "Generating:" followed by
# the body of the request.
@app.route("/", methods=["GET"])
# This function generates a quiz using Vertex AI.
def generate():
args = request.args.to_dict() #<-CHANGED
topic = check(args, "topic", TOPIC) #<-CHANGED
num_q = check(args, "num_q", NUM_Q) #<-CHANGED
diff = check(args, "diff", DIFF) #<-CHANGED
lang = check(args, "lang", LANG) #<-CHANGED
html = f"""
<h1>Quiz Generator</h1><br>
{topic=}<br>
{num_q=}<br>
{diff=}<br>
{lang=}""" #<-CHANGED
return html
# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
app.run(host="0.0.0.0", port=PORT)
أعِد الآن تحميل علامة تبويب متصفّح الويب الحالية للاطّلاع على النتائج. من المفترض أن تظهر لك صفحة ويب مشابهة لما يلي:

جرِّب تغيير عنوان URL لضبط قيم لمختلف المَعلمات. على سبيل المثال، حاوِل استخدام اللاحقة "?authuser=0&topic=Literature&num_q=10&diff=easy&lang=French" في نهاية عنوان URL في شريط العناوين:

6. إضافة طلبك وتنسيقه
بعد ذلك، سنضيف دعمًا للمَعلمات المحدّدة التي نريد إرسالها إلى أداة إنشاء الاختبارات، وهي كما يلي:
topic: موضوع الاختبار المطلوب-
num_q: عدد الأسئلة المطلوبة -
diff: مستوى الصعوبة المطلوب (سهل أو متوسط أو صعب) lang: لغة الاختبار المطلوبة
انسخ الطلب الذي طوّرته باستخدام Vertex Generative AI Studio في خطوة سابقة، ولكن غيِّر القيم المحدّدة مسبقًا للموضوع وعدد الأسئلة ومستوى الصعوبة باستخدام السلاسل التالية:
- {topic}
- {num_q}
- {diff}
- {lang}
from flask import Flask
from flask import request
import os
# Default quiz settings
TOPIC = "History"
NUM_Q = 5
DIFF = "intermediate"
LANG = "English"
PROMPT = """
Generate a quiz according to the following specifications:
- topic: {topic}
- num_q: {num_q}
- diff: {diff}
- lang: {lang}
Output should be (only) an unquoted json array of objects with keys:
"Question", "responses", and "correct".
""" #<-CHANGED
app = Flask(__name__) # Create a Flask object.
PORT = os.environ.get("PORT") # Get PORT setting from environment.
if not PORT:
PORT = 8080
# This function takes a dictionary, a name, and a default value.
# If the name exists as a key in the dictionary, the corresponding
# value is returned. Otherwise, the default value is returned.
def check(args, name, default):
if name in args:
return args[name]
return default
# The app.route decorator routes any GET requests sent to the /generate
# path to this function, which responds with "Generating:" followed by
# the body of the request.
@app.route("/", methods=["GET"])
# This function generates a quiz using Vertex AI.
def generate():
args = request.args.to_dict()
topic = check(args, "topic", TOPIC)
num_q = check(args, "num_q", NUM_Q)
diff = check(args, "diff", DIFF)
lang = check(args, "lang", LANG)
prompt = PROMPT.format(topic=topic, num_q=num_q, diff=diff, lang=lang) #<-CHANGED
html = f"<h1>Prompt:</h1><br><pre>{prompt}</pre>" #<-CHANGED
return html
# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
app.run(host="0.0.0.0", port=PORT)
أعِد الآن تحميل علامة تبويب متصفّح الويب الحالية للاطّلاع على النتائج. من المفترض أن تظهر لك صفحة ويب مشابهة لما يلي:

حاوِل تعديل عنوان URL لتغيير هذه المَعلمات الأربع.
7. إضافة مكتبة برامج Vertex AI
أصبحنا الآن جاهزين لاستخدام مكتبة برامج Python الخاصة بمنصة Vertex AI لإنشاء الاختبار. سيؤدي ذلك إلى أتمتة الطلبات التفاعلية التي نفّذتها في الخطوة رقم 3، ومنح خدمة الإنشاء إمكانية الوصول آليًا إلى إمكانات النماذج اللغوية الكبيرة من Google. عدِّل ملف main.py على النحو التالي:
احرص على استبدال "YOUR_PROJECT" برقم تعريف مشروعك الفعلي.
from flask import Flask
from flask import request
from flask import Response #<-CHANGED
import os
import vertexai
from vertexai.generative_models import GenerativeModel #<-CHANGED
# Default quiz settings
TOPIC = "History"
NUM_Q = 5
DIFF = "intermediate"
LANG = "English"
MODEL = "gemini-1.0-pro" #<-CHANGED
PROMPT = """
Generate a quiz according to the following specifications:
- topic: {topic}
- num_q: {num_q}
- diff: {diff}
- lang: {lang}
Output should be (only) an unquoted json array of objects with keys "question", "responses", and "correct".
"""
app = Flask(__name__) # Create a Flask object.
PORT = os.environ.get("PORT") # Get PORT setting from environment.
if not PORT:
PORT = 8080
# Initialize Vertex AI access.
vertexai.init(project="YOUR_PROJECT", location="us-central1") #<-CHANGED
parameters = { #<-CHANGED
"candidate_count": 1, #<-CHANGED
"max_output_tokens": 1024, #<-CHANGED
"temperature": 0.5, #<-CHANGED
"top_p": 0.8, #<-CHANGED
"top_k": 40, #<-CHANGED
} #<-CHANGED
model = GenerativeModel(MODEL) #<-CHANGED
# This function takes a dictionary, a name, and a default value.
# If the name exists as a key in the dictionary, the corresponding
# value is returned. Otherwise, the default value is returned.
def check(args, name, default):
if name in args:
return args[name]
return default
# The app.route decorator routes any GET requests sent to the /generate
# path to this function, which responds with "Generating:" followed by
# the body of the request.
@app.route("/", methods=["GET"])
# This function generates a quiz using Vertex AI.
def generate():
args = request.args.to_dict()
topic = check(args, "topic", TOPIC)
num_q = check(args, "num_q", NUM_Q)
diff = check(args, "diff", DIFF)
lang = check(args, "lang", LANG)
prompt = PROMPT.format(topic=topic, num_q=num_q, diff=diff, lang=lang)
response = model.generate_content(prompt, generation_config=parameters) #<-CHANGED
print(f"Response from Model: {response.text}") #<-CHANGED
html = f"{response.text}" #<-CHANGED
return Response(html, mimetype="application/json") #<-CHANGED
# This code ensures that your Flask app is started and listens for
# incoming connections on the local interface and port 8080.
if __name__ == "__main__":
app.run(host="0.0.0.0", port=PORT)
أعِد الآن تحميل علامة تبويب متصفّح الويب الحالية للاطّلاع على النتائج. يُرجى العِلم أنّ هذه العملية قد تستغرق عدة ثوانٍ لأنّك تقدّم الآن طلبًا إلى نموذج لغوي كبير. من المفترض أن تظهر لك صفحة ويب مشابهة لما يلي:

جرِّب تعديل عنوان URL لطلب موضوع اختبار مختلف وعدد أسئلة مختلف ومستوى صعوبة مختلف.
بهذا نكون قد انتهينا من إنشاء الخدمة المصغّرة، تهانينا! في الخطوة التالية، ستتعرّف على كيفية نشر خدمتك على السحابة الإلكترونية ليتمكّن أي مستخدم من الوصول إليها من أي مكان.
8. إلى السحابة الإلكترونية!

بعد إنشاء أداة إنشاء الاختبارات الخاصة بك، ستحتاج إلى مشاركة هذه الأداة الرائعة مع بقية العالم، لذا حان الوقت لنشرها على السحابة الإلكترونية. لكنّك تريد أن تفعل أكثر من مجرد مشاركته. عليك التأكّد من أنّها:
- يعمل بشكل موثوق: يمكنك الحصول على ميزة تحمّل الأعطال تلقائيًا في حال تعرُّض جهاز الكمبيوتر الذي يشغّل تطبيقك لعطل
- التوسّع تلقائيًا: سيواكب تطبيقك مستويات الزيارات الهائلة، وسيقلّل تلقائيًا من حجمه عند عدم استخدامه
- تقليل التكاليف إلى الحدّ الأدنى، من خلال عدم تحصيل رسوم منك مقابل الموارد التي لا تستخدمها، بل يتم تحصيل رسوم منك فقط مقابل الموارد المستهلكة أثناء الاستجابة للزيارات
- يمكن الوصول إليه من خلال اسم نطاق مخصّص، ويمكنك الاستفادة من حلّ بنقرة واحدة لتعيين اسم نطاق مخصّص لخدمتك
- توفّر وقت استجابة ممتازًا، إذ تكون عمليات التشغيل على البارد سريعة الاستجابة بشكل معقول، ولكن يمكنك تحسين ذلك عن طريق تحديد إعداد الحد الأدنى لعدد المثيلات.
- يتيح التشفير التام بين الأطراف باستخدام أمان الويب العادي SSL/TLS. وعند نشر خدمة، ستحصل على تشفير الويب العادي والشهادات المطلوبة المقابلة مجانًا وبشكل تلقائي.
من خلال نشر تطبيقك على Google Cloud Run، يمكنك الحصول على كل ما سبق والمزيد. إنّ وحدة الإنشاء الأساسية لمشاركة تطبيقك مع Cloud Run هي الحاوية.
تمنحنا الحاويات القدرة على إنشاء مربّع نمطي لتشغيل تطبيق مع جميع العناصر التابعة له مجمّعة معًا. بما أنّه يمكن استخدام الحاويات على أي خادم افتراضي أو حقيقي تقريبًا، يتيح لنا ذلك نشر تطبيقك في أي مكان تريده، بدءًا من الخادم المحلي إلى السحابة الإلكترونية، وحتى نقل تطبيقك من مزوّد خدمة إلى آخر.
لمزيد من المعلومات حول الحاويات وطريقة عملها في Google Cloud Run، يمكنك الاطّلاع على درس Dev to Prod في ثلاث خطوات سهلة باستخدام Cloud Run تطبيقي حول الترميز.
نشر تطبيقك على Cloud Run
Cloud Run هي خدمة إقليمية، ما يعني أنّ البنية الأساسية التي تشغّل خدمات Cloud Run تقع في منطقة معيّنة وتديرها Google لتكون متاحة بشكل متكرّر في جميع المناطق داخل تلك المنطقة. للتسهيل، سنستخدم في هذا الدرس التطبيقي المنطقة المرمّزة us-central1.
سنستخدم أداة تُعرف باسم buildpack لإنشاء الحاوية تلقائيًا. أنشئ ملفًا جديدًا باسم Procfile في "محرّر السحابة الإلكترونية" وأدرِج سطر النص التالي:
web: gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app
يُعلم ذلك نظام حِزم الإنشاء بكيفية تشغيل تطبيقك في الحاوية التي يتم إنشاؤها تلقائيًا. بعد ذلك، نفِّذ الأمر التالي في "وحدة Cloud Shell الطرفية" (من دليل quiz-generator نفسه) :
gcloud run deploy quiz-generator \
--source . \
--region us-central1 \
--allow-unauthenticated
يُعلم هذا الأمر gcloud بأنّك تريد منه استخدام حِزم الإنشاء لإنشاء صورة الحاوية، استنادًا إلى ملفات المصدر التي يعثر عليها في الدليل الحالي (dot في --source . هو اختصار للدليل الحالي). بما أنّ الخدمة تتولّى أمر صورة الحاوية ضمنيًا، لن تحتاج إلى تحديد صورة في أمر gcloud هذا.
انتظِر بضع لحظات حتى يكتمل النشر. عند النجاح، يعرض الأمر gcloud عنوان URL الخاص بالخدمة الجديدة:
Building using Buildpacks and deploying container to Cloud Run service [quiz-generator] in project [YOUR_PROJECT] region [YOUR_REGION] OK Building and deploying new service... Done. OK Creating Container Repository... OK Uploading sources... OK Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/0cf1383f-35db-412d -a973-557d5e2cd4a4?project=780573810218]. OK Creating Revision... OK Routing traffic... OK Setting IAM Policy... Done. Service [quiz-generator] revision [quiz-generator-00001-xnr] has been deployed and is serving 100 percent of traffic. Service URL: https://quiz-generator-co24gukjmq-uc.a.run.app
يمكنك أيضًا استرداد عنوان URL الخاص بالخدمة باستخدام الأمر التالي:
gcloud run services describe quiz-generator \ --region us-central1 \ --format "value(status.url)"
يجب أن يظهر ما يلي:
https://quiz-generator-co24gukjmq-uc.a.run.app
هذا الرابط هو عنوان URL مخصّص، مع أمان طبقة النقل الآمنة (TLS)، لخدمة Cloud Run. هذا الرابط دائم (ما دمت لم توقف خدمتك) ويمكن استخدامه في أي مكان على الإنترنت. لا تستخدم هذه الطريقة آلية الخادم الوكيل في Cloud Shell المذكورة سابقًا، والتي كانت تعتمد على جهاز افتراضي مؤقت.
انقر على Service URL المميّز لفتح علامة تبويب متصفّح ويب إلى تطبيقك قيد التشغيل. تأكَّد من أنّ النتيجة هي نفسها التي رأيتها في بيئة التطوير. تأكَّد أيضًا من إمكانية تعديل الاختبار الذي تم إنشاؤه من خلال تقديم مَعلمات في نهاية عنوان URL.
تهانينا! يعمل تطبيقك الآن في Google Cloud. بدون الحاجة إلى التفكير في ذلك، يصبح تطبيقك متاحًا للجميع، مع تشفير بروتوكول أمان طبقة النقل (HTTPS)، وتدرّج تلقائي لمستويات هائلة من عدد الزيارات.
9- وضع كل القطع معًا
في هذه الخطوة الأخيرة، سنكون مستعدين لتشغيل أداة إنشاء الاختبارات كجزء من تطبيق Quizaic. انتقِل إلى عنوان URL الخاص بتطبيق Quizaic، وسجِّل الدخول إلى حسابك على Google، ثم انتقِل إلى علامة التبويب Create Quiz. اختَر نوع أداة الإنشاء Custom، وألصِق عنوان URL الخاص بـ Cloud Run في حقل عنوان URL، واملأ الحقول المطلوبة الأخرى، ثم أرسِل النموذج.

بعد لحظات قليلة، سيصبح لديك اختبار جديد (راجِع "اختباري الجديد" في الصورة أدناه)، مع صورة مصغّرة من إنشاء الذكاء الاصطناعي، ويمكنك تعديلها أو تشغيلها أو استنساخها أو حذفها من خلال الأزرار المناسبة. تم إنشاء هذا الاختبار الجديد باستخدام خدمة الويب التي نشرتها للتو استنادًا إلى طلبك المستند إلى القالب.

10. تنظيف

على الرغم من أنّ Cloud Run لا تفرض رسومًا عندما لا تكون الخدمة قيد الاستخدام، قد يتم تحصيل رسوم منك مقابل تخزين صورة الحاوية التي تم إنشاؤها.
يمكنك إما حذف مشروع Google Cloud Platform لتجنُّب تحمّل رسوم، ما سيؤدي إلى إيقاف الفوترة لجميع الموارد المستخدَمة في هذا المشروع، أو يمكنك ببساطة حذف صورة الحاوية باستخدام الأمر التالي:
gcloud config set artifacts/repository cloud-run-source-deploy gcloud config set artifacts/location us-central1 gcloud artifacts docker images list # Note image tag for resulting list gcloud artifacts docker images delete <IMAGE-TAG>
لحذف خدمة Cloud Run، استخدِم الأمر التالي:
gcloud run services delete quiz-generator --region us-central1 --quiet
11. أحسنت!

تهانينا، لقد نجحت في إنشاء طلب LLM ونشر خدمة مصغّرة على Cloud Run باستخدام هذا الطلب. يمكنك الآن البرمجة باللغة الطبيعية ومشاركة إبداعاتك مع العالم.
أريد أن أطرح عليك سؤالاً مهمًا:
بعد أن تمكّنت من تشغيل تطبيقك في بيئة التطوير، كم عدد أسطر الرمز البرمجي التي كان عليك تعديلها لنشره على السحابة الإلكترونية، مع جميع السمات المناسبة لمرحلة الإنتاج التي يوفّرها Cloud Run؟
والإجابة، بالطبع، هي صفر. :)
دروس تطبيقية أخرى حول الترميز يمكنك الاطّلاع عليها...
- من مرحلة التطوير إلى مرحلة الإنتاج في ثلاث خطوات سهلة باستخدام Cloud Run
- تطبيق تلخيص النصوص باستخدام Vertex AI وSvelte Kit
- تطبيق Chat باستخدام PaLM API على Cloud Run
- دالة Cloud Function التي تتضمّن نماذج PaLM Text Bison
- Data to Generative AI with Spanner and Vertex AI Imagen API
المستندات المرجعية...
12. الحث على اتخاذ إجراء
إذا استمتعت بهذا الدرس التطبيقي حول الترميز ومن المرجّح أن تقضي المزيد من الوقت في استخدام Google Cloud، ننصحك بالانضمام إلى برنامج Google Cloud Innovators اليوم.

برنامج Google Cloud Innovators مجاني ويتضمّن ما يلي:
- مناقشات مباشرة وجلسات "اسألني أي سؤال" وجلسات حول خارطة الطريق لمعرفة آخر الأخبار مباشرةً من موظفي Google
- آخر الأخبار حول Google Cloud مباشرةً في بريدك الوارد
- شارة رقمية وخلفية لاجتماع الفيديو
- 500 رصيد من التدريبات العملية والدروس على Skills Boost
انقر هنا للتسجيل.
