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

1. مقدمه

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

کاری که خواهی کرد...

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

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

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

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

  • مرورگر وب کروم
  • یک اکانت گوگل
  • یک پروژه Cloud با فعال کردن صورت‌حساب

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

2. راه اندازی

a08aa5878e36b60c.png

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

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

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

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

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

Cloud Shell را راه اندازی کنید

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

4a95152439f0159b.png

Cloud Shell را فعال کنید

  1. از Cloud Console، روی Activate Cloud Shell کلیک کنید 853e55310c205094.png .

3c1dabeca90e44e5.png

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

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی ارائه می‌کند و در Google Cloud اجرا می‌شود، که عملکرد و احراز هویت شبکه را بسیار افزایش می‌دهد. بسیاری از کارهای شما، اگر نه همه، در این کد لبه با مرورگر قابل انجام است.

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

  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.

3. Prompting - برنامه نویسی به زبان طبیعی

92f630373224ead8.png

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

bfe5706041ae6454.png

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

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

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

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

8aa89a1970ea9335.png

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

  • منطقه جایی است که درخواست تولید شما باید اجرا شود.
  • مدل مدل زبان بزرگی را که می خواهید استفاده کنید انتخاب می کند. برای این کد لبه، از "gemini-1.0-pro-001" استفاده کنید.
  • دما درجه تصادفی بودن انتخاب نشانه را کنترل می کند. دمای پایین‌تر برای پیام‌هایی که انتظار پاسخ درست یا صحیح را دارند، خوب است، در حالی که دمای بالاتر می‌تواند منجر به نتایج متنوع‌تر یا غیرمنتظره‌تر شود.
  • محدودیت رمز حداکثر مقدار خروجی متن را از یک اعلان تعیین می کند. یک نشانه تقریباً چهار کاراکتر است. مقدار پیش فرض 1024 است.
  • Top-k نحوه انتخاب نشانه ها را برای خروجی توسط مدل تغییر می دهد. top-k از 1 به این معنی است که توکن انتخاب شده در واژگان مدل (که رمزگشایی حریص نیز نامیده می‌شود) محتمل‌ترین توکن است، در حالی که top-k از 3 به این معنی است که توکن بعدی از بین 3 توکن محتمل‌تر انتخاب شده است. با استفاده از دما). مقدار top-k پیش فرض 40 است.
  • 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 را بررسی کنید.

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

c73008bb8a72b57b.png

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

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

e2a06b5304079efc.png

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

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

8dea35450851af53.png

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

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

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

613eb3de4b9b750a.png

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

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

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

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

با استفاده از همین تکنیک، فایل جدید دیگری به نام 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

5. یک متد تولید با تجزیه پارامتر اضافه کنید

اکنون می خواهیم برای فیلد کردن روش جدیدی به نام 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" به انتهای URL در نوار آدرس مرورگر خود، دو پارامتر اضافی اضافه کنید، صفحه را مجددا بارگیری کنید، و چیزی شبیه به این خواهید دید:

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

6. درخواست خود را اضافه و قالب بندی کنید

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

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

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

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

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

3c2b9dfcfba86b7a.png

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

7. کتابخانه مشتری Vertex AI را اضافه کنید

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

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

f43d3ba5102857b8.png

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

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

8. به ابر!

67c99bf45a7b7805.png

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

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

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

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

برای کسب اطلاعات بیشتر در مورد کانتینرها و نحوه عملکرد آنها در Google Cloud Run، برنامه Dev to Prod را در سه مرحله آسان با کد لبه Cloud Run بررسی کنید.

برنامه خود را در Cloud Run اجرا کنید

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

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

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 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's Cloud اجرا می شود. بدون نیاز به فکر کردن در مورد آن، برنامه شما با رمزگذاری TLS (HTTPS) و مقیاس‌بندی خودکار به سطوح شگفت‌انگیز ترافیک در دسترس عموم قرار می‌گیرد.

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

9927db1725bcd5d6.png

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

328ee05579ea05f9.png

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

1719169140978b63.png

10. تمیز کردن

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

11. تو این کار را کردی!

910162be58c0f6d6.png

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

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

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

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

کدهای دیگر برای بررسی...

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

12. فراخوانی برای اقدام

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

498cab7d87ec12d3.png

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

  • بحث‌های زنده، جلسات AMA و نقشه راه برای یادگیری جدیدترین‌ها مستقیماً از کارمندان Google
  • آخرین اخبار Google Cloud درست در صندوق ورودی شما
  • نشان دیجیتال و پس زمینه ویدئو کنفرانس
  • 500 واحد آزمایشگاه و یادگیری در مورد تقویت مهارت ها

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