با GenAI و Cloud Run یک Quiz Generator بسازید

۱. مقدمه

در این آزمایش، شما یک سرویس وب برای تولید آزمون‌های چیزهای بی اهمیت خواهید ساخت و آن را در یک برنامه کاربردی و سرگرم کننده ادغام خواهید کرد. شما از یک زبان برنامه نویسی متفاوت از آنچه قبلاً استفاده کرده‌اید استفاده خواهید کرد: انگلیسی!

کاری که انجام خواهی داد...

  • شما یک سوال ایجاد خواهید کرد که بر اساس مجموعه‌ای از معیارها، یک مسابقه‌ی اطلاعات عمومی ایجاد می‌کند.
  • شما یک برنامه وب ساده خواهید ساخت و تأیید خواهید کرد که مطابق انتظار در محیط توسعه شما اجرا می‌شود.
  • شما به تدریج منطق را به برنامه وب خود اضافه خواهید کرد تا آن را به یک سرور API تبدیل کنید که بر اساس مجموعه‌ای از پارامترهای ورودی، آزمون‌ها را تولید می‌کند.
  • خواهید دید که استقرار سرویس تولید آزمون خود در فضای ابری با استفاده از Google Cloud Run چقدر آسان است.
  • در نهایت، یک برنامه واقعی ( quizaic.com ) را برای استفاده از سرویس تولیدکننده آزمون مستقر شده خود پیکربندی خواهید کرد و می‌توانید بر اساس خروجی، آزمون‌های زنده برگزار کنید.

آنچه یاد خواهید گرفت...

  • نحوه ایجاد یک الگوی آماده برای یک مدل زبان بزرگ (LLM).
  • چگونه یک برنامه وب سرور ساده در پایتون ایجاد کنیم؟
  • چگونه پشتیبانی از LLM گوگل را به برنامه وب خود اضافه کنیم؟
  • چگونه برنامه خود را در فضای ابری مستقر کنید تا هر کسی بتواند ساخته جدید شما را امتحان کند.
  • چگونه مولد آزمون خود را در یک برنامه بزرگتر ادغام کنید.

آنچه نیاز خواهید داشت...

  • مرورگر وب کروم
  • یک حساب گوگل
  • یک پروژه ابری با قابلیت پرداخت صورتحساب

این آزمایشگاه برای توسعه‌دهندگان در تمام سطوح، از جمله مبتدیان، مناسب است. اگرچه از پایتون استفاده خواهید کرد، اما برای درک آنچه اتفاق می‌افتد نیازی به آشنایی با برنامه‌نویسی پایتون ندارید زیرا ما تمام کدهایی را که خواهید دید توضیح خواهیم داد.

۲. راه‌اندازی

a08aa5878e36b60c.png

این بخش شامل تمام مواردی است که برای شروع کار با این آزمایشگاه باید انجام دهید.

تنظیم محیط خودتنظیم

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • نام پروژه، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود. شما همیشه می‌توانید آن را به‌روزرسانی کنید.
  • شناسه پروژه در تمام پروژه‌های گوگل کلود منحصر به فرد است و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چه باشد. در اکثر آزمایشگاه‌های کد، باید شناسه پروژه خود را (که معمولاً با عنوان PROJECT_ID شناخته می‌شود) ارجاع دهید. اگر شناسه تولید شده را دوست ندارید، می‌توانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، می‌توانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی می‌ماند.
  • برای اطلاع شما، یک مقدار سوم، شماره پروژه ، وجود دارد که برخی از APIها از آن استفاده می‌کنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد هزینه زیادی نخواهد داشت، اگر اصلاً هزینه‌ای داشته باشد. برای خاموش کردن منابع به منظور جلوگیری از پرداخت صورتحساب پس از این آموزش، می‌توانید منابعی را که ایجاد کرده‌اید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

شروع پوسته ابری

در این آزمایش، شما در یک جلسه Cloud Shell کار خواهید کرد، که یک مفسر فرمان است که توسط یک ماشین مجازی که در فضای ابری گوگل اجرا می‌شود، میزبانی می‌شود. شما می‌توانید به راحتی این بخش را به صورت محلی روی رایانه خود اجرا کنید، اما استفاده از Cloud Shell به همه امکان دسترسی به یک تجربه قابل تکرار در یک محیط سازگار را می‌دهد. پس از آزمایش، می‌توانید این بخش را دوباره روی رایانه خود امتحان کنید.

4a95152439f0159b.png

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید 853e55310c205094.png .

3c1dabeca90e44e5.png

اگر این اولین باری است که Cloud Shell را اجرا می‌کنید، یک صفحه میانی برای توضیح آن به شما نمایش داده می‌شود. اگر با یک صفحه میانی مواجه شدید، روی ادامه کلیک کنید.

9c92662c6a846a5c.png

آماده‌سازی و اتصال به Cloud Shell فقط چند لحظه طول می‌کشد.

9f0e51b578fecce5.png

این ماشین مجازی مجهز به تمام ابزارهای توسعه مورد نیاز است. این ماشین یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی افزایش می‌دهد. بخش عمده‌ای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را می‌توان با یک مرورگر انجام داد.

پس از اتصال به Cloud Shell، باید ببینید که احراز هویت شده‌اید و پروژه روی شناسه پروژه شما تنظیم شده است.

  1. برای تأیید احراز هویت، دستور زیر را در 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`
  1. دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد:
gcloud config list project

خروجی دستور

[core]
project = <PROJECT_ID>

اگر اینطور نیست، می‌توانید با این دستور آن را تنظیم کنید:

gcloud config set project <PROJECT_ID>

خروجی دستور

Updated property [core/project].

فعال کردن برخی از APIها

در مراحل بعدی، خواهید دید که این سرویس‌ها کجا مورد نیاز هستند (و چرا)، اما فعلاً این دستور را اجرا کنید تا به پروژه خود دسترسی به 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.

۳. اعلان - برنامه‌نویسی به زبان طبیعی

92f630373224ead8.png

ما قصد داریم با یادگیری نحوه توسعه یک prompt برای یک مدل زبان بزرگ شروع کنیم. به Google Cloud Console > Vertex AI > Vertex AI Studio (Language) بروید. باید صفحه‌ای مانند این را ببینید:

bfe5706041ae6454.png

در زیر بخش Generate Text ، روی دکمه‌ی Text Prompt کلیک کنید. در پنجره‌ی بعدی، پیامی را وارد کنید که فکر می‌کنید ممکن است برای تولید یک آزمون اطلاعات عمومی مطابق با الزامات زیر مؤثر باشد:

  • موضوع: تاریخ جهان
  • تعداد سوالات: ۵
  • سطح دشواری: متوسط
  • زبان: انگلیسی

برای مشاهده خروجی، روی دکمه ارسال کلیک کنید.

همانطور که در تصویر زیر نشان داده شده است، پنل سمت راست به شما این امکان را می‌دهد که مدل مورد نظر خود را انتخاب کنید و برخی از تنظیمات را به طور دقیق تنظیم کنید:

8aa89a1970ea9335.png

تنظیمات زیر موجود است:

  • منطقه جایی است که درخواست تولید شما باید اجرا شود.
  • مدل، مدل زبان بزرگی را که می‌خواهید استفاده کنید انتخاب می‌کند. برای این آزمایشگاه کد، از "gemini-1.0-pro-001" استفاده کنید.
  • دما میزان تصادفی بودن انتخاب توکن را کنترل می‌کند. دماهای پایین‌تر برای درخواست‌هایی که انتظار پاسخ درست یا واقعی دارند، مناسب هستند، در حالی که دماهای بالاتر می‌توانند منجر به نتایج متنوع‌تر یا غیرمنتظره‌تری شوند.
  • محدودیت توکن، حداکثر مقدار متن خروجی از یک اعلان را تعیین می‌کند. یک توکن تقریباً چهار کاراکتر است. مقدار پیش‌فرض آن ۱۰۲۴ است.
  • Top-k نحوه انتخاب توکن‌ها برای خروجی توسط مدل را تغییر می‌دهد. top-k برابر با ۱ به این معنی است که توکن انتخاب شده محتمل‌ترین توکن در بین تمام توکن‌های موجود در واژگان مدل است (که به آن رمزگشایی حریصانه نیز گفته می‌شود)، در حالی که top-k برابر با ۳ به این معنی است که توکن بعدی از بین ۳ توکن محتمل‌تر (با استفاده از دما) انتخاب می‌شود. مقدار پیش‌فرض top-k برابر با ۴۰ است.
  • Top-p نحوه انتخاب توکن‌ها برای خروجی توسط مدل را تغییر می‌دهد. توکن‌ها از محتمل‌ترین به کمترین انتخاب می‌شوند تا زمانی که مجموع احتمالات آنها برابر با مقدار top-p شود.
  • حداکثر پاسخ‌ها، حداکثر تعداد پاسخ‌های مدل تولید شده در هر اعلان است.
  • یک توالی توقف، مجموعه‌ای از کاراکترها (شامل فاصله‌ها) است که در صورت مواجهه مدل با آن، تولید پاسخ را متوقف می‌کند.
  • پاسخ‌های جاری انتخاب می‌کنند که آیا پاسخ‌ها هنگام تولید چاپ شوند یا ذخیره شوند و پس از تکمیل نمایش داده شوند.
  • آستانه فیلتر ایمنی، احتمال مشاهده پاسخ‌هایی که می‌توانند مضر باشند را تنظیم می‌کند.

وقتی که به نظر می‌رسد یک آزمون منطقی مطابق با الزامات ذکر شده در بالا تولید می‌کند، می‌توانیم این آزمون را با استفاده از کد سفارشی تجزیه کنیم، اما آیا بهتر نیست که LLM آزمون را در قالبی ساختاریافته تولید کند که بتوانیم مستقیماً آن را در برنامه خود بارگذاری کنیم؟ برنامه‌ای که بعداً در این آزمایش برای فراخوانی مولد شما استفاده خواهیم کرد، انتظار دارد که آزمون‌ها به صورت 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 مورد نیاز خروجی دهد.

  1. قالب دقیقی که به دنبال آن هستید را با کلمات مشخص کنید (مثلاً جمله‌ی ایتالیک بالا).
  2. در اعلان خود، نمونه‌ای از قالب JSON مورد نظر را قرار دهید.

وقتی که آزمون‌های مورد نظر خود را مطابق با مشخصات مورد نظرتان ایجاد کردید، روی دکمه GET CODE در گوشه سمت راست بالای صفحه کلیک کنید تا کد پایتونی را که می‌تواند برای ارسال برنامه‌ای آزمون شما به یک Vertex AI LLM استفاده شود، مشاهده کنید. اگر به استفاده از زبان برنامه‌نویسی دیگری غیر از پایتون علاقه‌مند هستید، به https://cloud.google.com/vertex-ai/docs/samples?text=generative مراجعه کنید.

۴. یک وب سرور ساده بسازید

c73008bb8a72b57b.png

حالا که یک اعلان کارساز دارید، می‌خواهیم آن را در یک برنامه بزرگتر ادغام کنیم. البته، می‌توانیم اعلان شما را در کد منبع برنامه بزرگتر جاسازی کنیم، اما می‌خواهیم مولد شما به عنوان یک میکروسرویس عمل کند که سرویس تولید آزمون را برای سایر برنامه‌ها فراهم می‌کند. برای تحقق این امر، باید یک وب سرور ساده ایجاد کنیم و آن را در دسترس عموم قرار دهیم. این کار را در مراحل بعدی انجام خواهیم داد.

با کلیک روی دکمه‌ی Open Editor در بالای پنل Cloud Shell خود شروع کنید. این دکمه چیزی شبیه به این است:

e2a06b5304079efc.png

سپس خود را در یک محیط IDE مشابه Visual Studio Code خواهید یافت که در آن می‌توانید پروژه‌ها را ایجاد کنید، کد منبع را ویرایش کنید، برنامه‌های خود را اجرا کنید و غیره.

اگر صفحه نمایش شما خیلی کوچک است، می‌توانید با کشیدن نوار افقی بین کنسول و پنجره ویرایش/ترمینال خود، که در اینجا هایلایت شده است، خط جداکننده بین آن دو ناحیه را بزرگ یا کوچک کنید:

8dea35450851af53.png

شما می‌توانید با کلیک کردن روی دکمه‌های Open Editor و Open Terminal به ترتیب بین ویرایشگر و ترمینال جابجا شوید. اکنون سعی کنید بین این دو محیط جابجا شوید.

سپس، با کلیک بر روی دکمه‌ی افزودن پوشه، پوشه‌ای برای ذخیره‌ی کار خود در این آزمایشگاه ایجاد کنید. 5f4e64909bc15e30.png ، quiz-generator را وارد کنید و اینتر را بزنید. تمام فایل‌هایی که در این آزمایشگاه ایجاد می‌کنید و تمام کارهایی که در Cloud Shell انجام می‌دهید، در این پوشه انجام خواهد شد.

حالا یک فایل requirements.txt ایجاد کنید. این فایل به پایتون می‌گوید که برنامه شما به کدام کتابخانه‌ها وابسته است. برای این برنامه وب ساده، شما از یک ماژول محبوب پایتون برای ساخت سرورهای وب به نام Flask, کتابخانه کلاینت google-cloud-aiplatform و یک چارچوب سرور وب به نام gunicorn استفاده خواهید کرد. در پنل ناوبری فایل، روی پوشه quiz-generator کلیک راست کرده و گزینه New file را از منوی زیر انتخاب کنید:

613eb3de4b9b750a.png

وقتی از شما نام فایل جدید پرسیده شد، requirements.txt را وارد کنید و کلید اینتر را فشار دهید. مطمئن شوید که فایل جدید در پوشه پروژه quiz-generator قرار می‌گیرد.

خطوط زیر را در فایل جدید قرار دهید تا مشخص شود که برنامه شما به بسته پایتون فلاسک ، وب سرور gunicorn و کتابخانه کلاینت google-cloud-aiplatform به همراه نسخه‌های مرتبط با هر یک وابسته است.

flask==3.0.0
gunicorn==21.2.0
google-cloud-aiplatform==1.47.0

لازم نیست این فایل را صریحاً ذخیره کنید زیرا ویرایشگر ابر به طور خودکار تغییرات را برای شما ذخیره می‌کند.

با استفاده از همین تکنیک، یک فایل جدید دیگر با نام main.py ایجاد کنید. این فایل، فایل اصلی (و تنها فایل) منبع پایتون برنامه شما خواهد بود. دوباره، مطمئن شوید که فایل جدید در پوشه 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 مانند تصویر زیر کلیک کنید:

7f938c0bc1b4154c.png

این یک برگه مرورگر وب را برای برنامه در حال اجرا باز می‌کند که باید چیزی شبیه به این باشد:

aaaf366f9bf74a28.png

۵. یک متد generate با تجزیه پارامتر اضافه کنید

حالا می‌خواهیم پشتیبانی از فیلدبندی یک متد جدید به نام generate را اضافه کنیم. این کار را با اضافه کردن یک دستور import برای دستکاری درخواست 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)

حالا تب مرورگر وب فعلی خود را دوباره بارگذاری کنید تا نتایج را ببینید. این بار باید "Quiz Generator" را به همراه یک پارامتر پرس‌وجو که به طور خودکار به آدرس اینترنتی شما ( authuser ) اضافه شده است، ببینید. سعی کنید با افزودن رشته "`&param1=val1&param2=val2`" به انتهای آدرس اینترنتی در نوار آدرس مرورگر خود، دو پارامتر دیگر اضافه کنید، صفحه را دوباره بارگذاری کنید و باید چیزی شبیه به این را ببینید:

6e223ca358e4e009.png

حالا که دیدیم چگونه پارامترهای کوئری را در یک 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)

اکنون برای مشاهده نتایج، تب مرورگر وب فعلی خود را مجدداً بارگذاری کنید. باید چیزی شبیه به صفحه وب زیر را مشاهده کنید:

15eed60f6a805212.png

سعی کنید URL را تغییر دهید تا مقادیر پارامترهای مختلف را تنظیم کنید. برای مثال، سعی کنید از پسوند " ?authuser=0&topic=Literature&num_q=10&diff=easy&lang=French " در انتهای URL در نوار آدرس خود استفاده کنید:

f629dba5fa207cef.png

۶. اعلان خود را اضافه و قالب‌بندی کنید

در مرحله بعد، پشتیبانی از پارامترهای خاصی را که می‌خواهیم برای مولد آزمون خود ارسال کنیم، اضافه خواهیم کرد که به شرح زیر است:

  • topic - موضوع مورد نظر برای آزمون
  • num_q - تعداد سوالات مورد نظر
  • diff - سطح دشواری مورد نظر (آسان، متوسط، سخت)
  • lang - زبان مورد نظر برای آزمون

دستوری که در مرحله قبل با Vertex Generative AI Studio ایجاد کردید را کپی کنید، اما مقادیر ثابت‌شده برای موضوع، تعداد سوالات و سطح دشواری را با این رشته‌ها تغییر دهید:

  • {موضوع}
  • {num_q}
  • {تفاوت}
  • {زبان}
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)

اکنون برای مشاهده نتایج، تب مرورگر وب فعلی خود را مجدداً بارگذاری کنید. باید چیزی شبیه به صفحه وب زیر را مشاهده کنید:

3c2b9dfcfba86b7a.png

سعی کنید URL را طوری تغییر دهید که آن چهار پارامتر تغییر کنند.

۷. کتابخانه کلاینت Vertex AI را اضافه کنید

اکنون آماده‌ایم تا از کتابخانه کلاینت Vertex AI پایتون برای تولید آزمون خود استفاده کنیم. این کار باعث خودکار شدن فراخوانی تعاملی که در مرحله ۳ انجام دادید می‌شود و به سرویس مولد شما دسترسی برنامه‌نویسی به قابلیت‌های LLM گوگل را می‌دهد. فایل 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)

اکنون برای دیدن نتایج، تب مرورگر وب فعلی خود را مجدداً بارگذاری کنید. توجه داشته باشید که این ممکن است چند ثانیه طول بکشد زیرا اکنون در واقع در حال ارسال یک درخواست LLM هستید . باید چیزی شبیه به صفحه وب زیر را مشاهده کنید:

f43d3ba5102857b8.png

سعی کنید URL را تغییر دهید تا موضوع آزمون، تعداد سوالات و سطح دشواری متفاوتی درخواست کنید.

و با این کار، میکروسرویس شما تمام شد - تبریک می‌گویم! در مرحله بعدی، یاد خواهید گرفت که چگونه سرویس خود را در فضای ابری مستقر کنید تا هر کسی بتواند از هر مکانی به آن دسترسی داشته باشد.

۸. به سوی ابر!

67c99bf45a7b7805.png

حالا که مولد آزمون خودتان را ساخته‌اید، می‌خواهید این تجربه شگفت‌انگیز را با بقیه دنیا به اشتراک بگذارید، بنابراین وقت آن رسیده که آن را در فضای ابری مستقر کنید. اما واقعاً دوست دارید کاری بیش از به اشتراک گذاشتن آن انجام دهید. می‌خواهید مطمئن شوید که:

  • به طور قابل اعتمادی اجرا می‌شود - در صورتی که کامپیوتری که برنامه شما را اجرا می‌کند از کار بیفتد، تحمل خطای خودکار را دریافت می‌کنید
  • به طور خودکار مقیاس‌پذیر می‌شود - برنامه شما با سطوح وسیع ترافیک همگام می‌شود و در صورت عدم استفاده، به طور خودکار ردپای خود را کاهش می‌دهد.
  • هزینه‌های شما را به حداقل می‌رساند، زیرا برای منابعی که استفاده نمی‌کنید از شما هزینه دریافت نمی‌کند - فقط برای منابعی که هنگام پاسخگویی به ترافیک مصرف می‌کنید، هزینه دریافت می‌شود
  • از طریق یک نام دامنه سفارشی قابل دسترسی است - شما به یک راه حل تک کلیکی برای اختصاص یک نام دامنه سفارشی به سرویس خود دسترسی دارید.
  • زمان پاسخگویی عالی ارائه می‌دهد - شروع‌های سرد به طور معقولی پاسخگو هستند، اما می‌توانید با مشخص کردن حداقل پیکربندی نمونه، آن را به طور دقیق تنظیم کنید.
  • از رمزگذاری سرتاسری با استفاده از امنیت وب استاندارد SSL/TLS پشتیبانی می‌کند - وقتی سرویسی را مستقر می‌کنید، رمزگذاری وب استاندارد و گواهینامه‌های مورد نیاز مربوطه را به صورت رایگان و خودکار دریافت می‌کنید.

با استقرار برنامه خود در Google Cloud Run، همه موارد فوق و حتی بیشتر را دریافت خواهید کرد. بلوک سازنده اصلی برای اشتراک گذاری برنامه شما با Cloud Run، یک کانتینر است.

کانتینرها به ما این امکان را می‌دهند که یک جعبه ماژولار ایجاد کنیم تا بتوانیم یک برنامه را با تمام وابستگی‌های آن به صورت بسته‌بندی شده اجرا کنیم. از آنجا که کانتینرها تقریباً روی هر سرور مجازی یا واقعی قابل استفاده هستند، این به ما راهی می‌دهد تا برنامه خود را در هر مکانی که دوست دارید، از محل کار گرفته تا فضای ابری، مستقر کنیم و حتی برنامه خود را از یک ارائه دهنده خدمات به ارائه دهنده خدمات دیگر منتقل کنیم.

برای کسب اطلاعات بیشتر در مورد کانتینرها و نحوه کار آنها در Google Cloud Run، به بخش Dev to Prod in Three Easy Steps with Cloud Run codelab مراجعه کنید.

برنامه خود را روی Cloud Run مستقر کنید

Cloud Run یک سرویس منطقه‌ای است، به این معنی که زیرساختی که سرویس‌های Cloud Run شما را اجرا می‌کند در یک منطقه خاص قرار دارد و توسط گوگل مدیریت می‌شود تا به طور اضافی در تمام مناطق درون آن منطقه در دسترس باشد. برای سادگی، در این آزمایش از منطقه کدگذاری شده us-central1 استفاده خواهیم کرد.

ما قصد داریم از چیزی به نام buildpack برای تولید خودکار کانتینر شما استفاده کنیم. یک فایل جدید به نام Procfile در ویرایشگر ابری ایجاد کنید و این یک خط متن را در آن وارد کنید:

web: gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

این به سیستم buildpack می‌گوید که چگونه برنامه شما را در کانتینر تولید شده خودکار اجرا کند. در مرحله بعد، دستور زیر را در ترمینال Cloud Shell (از همان دایرکتوری quiz-generator ) اجرا کنید:

gcloud run deploy quiz-generator  \
    --source .                    \
    --region us-central1          \
    --allow-unauthenticated

این به دستور gcloud می‌گوید که شما می‌خواهید از buildpacks برای ایجاد تصویر کانتینر شما، بر اساس فایل‌های منبعی که در دایرکتوری فعلی پیدا می‌کند، استفاده کند ( dot در --source . مخفف دایرکتوری فعلی است). از آنجا که این سرویس به طور ضمنی از تصویر کانتینر مراقبت می‌کند، نیازی به مشخص کردن تصویر در این دستور gcloud ندارید.

چند لحظه صبر کنید تا استقرار کامل شود. در صورت موفقیت، دستور gcloud آدرس اینترنتی سرویس جدید را نمایش می‌دهد:

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

همچنین می‌توانید آدرس اینترنتی سرویس خود را با این دستور بازیابی کنید:

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، آزمون تولید شده را تنظیم کنید.

تبریک! برنامه شما اکنون در فضای ابری گوگل اجرا می‌شود. بدون نیاز به فکر کردن، برنامه شما به صورت عمومی در دسترس است، با رمزگذاری TLS (HTTPS) و مقیاس‌پذیری خودکار تا سطوح شگفت‌انگیز ترافیک.

۹. کنار هم قرار دادن تمام قطعات

9927db1725bcd5d6.png

در این مرحله آخر، ما آماده‌ایم تا مولد آزمون شما را به عنوان بخشی از برنامه quizaic اجرا کنیم. به آدرس اینترنتی quizaic مراجعه کنید، به حساب گوگل خود وارد شوید و به برگه Create Quiz بروید. نوع مولد را Custom انتخاب کنید، URL Cloud Run خود را در قسمت URL قرار دهید، سایر فیلدهای مورد نیاز را پر کنید و فرم را ارسال کنید.

۳۲۸ee05579ea05f9.png

تا چند لحظه دیگر، شما باید یک آزمون جدید (به بخش «آزمون جدید من» در تصویر زیر مراجعه کنید) با یک تصویر کوچک تولید شده توسط هوش مصنوعی داشته باشید که می‌توانید آن را از طریق دکمه‌های مربوطه ویرایش، پخش، کپی یا حذف کنید. این آزمون جدید با استفاده از سرویس وبی که شما بر اساس الگوی اعلان خود مستقر کرده‌اید، ایجاد شده است!

۱۷۱۹۱۶۹۱۴۰۹۷۸b۶۳.png

۱۰. تمیز کردن

c1592d590c563428.png

اگرچه Cloud Run در صورت عدم استفاده از سرویس، هزینه‌ای دریافت نمی‌کند، اما ممکن است همچنان برای ذخیره تصویر کانتینر ساخته شده هزینه دریافت شود.

شما می‌توانید پروژه GCP خود را حذف کنید تا از پرداخت هزینه‌ها جلوگیری شود، که باعث توقف پرداخت هزینه برای تمام منابع مورد استفاده در آن پروژه می‌شود، یا به سادگی تصویر کانتینر خود را با استفاده از این دستور حذف کنید:

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

۱۱. تو موفق شدی!

۹۱۰۱۶۲be58c0f6d6.png

تبریک می‌گویم - شما با موفقیت یک LLM prompt ساختید و یک میکروسرویس Cloud Run را با استفاده از آن prompt مستقر کردید. اکنون می‌توانید به زبان طبیعی برنامه‌نویسی کنید و ساخته‌های خود را با جهان به اشتراک بگذارید!

می‌خواهم شما را با یک سوال مهم تنها بگذارم:

وقتی برنامه‌تان را در محیط توسعه‌دهنده‌تان راه‌اندازی کردید، برای استقرار آن در فضای ابری، با تمام ویژگی‌های سطح تولید ارائه شده توسط Cloud Run، چند خط کد را باید تغییر می‌دادید؟

جواب، البته، صفر است. :)

سایر آزمایشگاه‌های کد برای بررسی...

اسناد مرجع ...

۱۲. دعوت به اقدام

اگر از این آزمایشگاه کد لذت برده‌اید و احتمالاً زمان بیشتری را به صورت عملی با Google Cloud صرف خواهید کرد، واقعاً باید همین امروز به Google Cloud Innovators بپیوندید !

498cab7d87ec12d3.png

Google Cloud Innovators رایگان است و شامل موارد زیر می‌شود:

  • بحث‌های زنده، جلسات پرسش و پاسخ (AMA) و جلسات نقشه راه برای یادگیری جدیدترین‌ها مستقیماً از گوگلی‌ها
  • آخرین اخبار گوگل کلود درست در صندوق ورودی شما
  • نشان دیجیتال و پس‌زمینه کنفرانس ویدیویی
  • ۵۰۰ واحد آزمایشگاه و یادگیری در Skills Boost

برای ثبت نام اینجا کلیک کنید!