GenAI ve Cloud Run ile Test Oluşturucu Derleme

1. Giriş

Bu laboratuvarda, bilgi yarışması sınavları oluşturmak için bir web hizmeti oluşturacak ve bunu eğlenceli, çalışan bir uygulamaya entegre edeceksiniz. Daha önce kullanmış olabileceğinizden farklı bir programlama dili kullanacaksınız: İngilizce!

Yapacaklarınız...

  • Bir dizi ölçüte göre bilgi yarışması testi oluşturan bir istem hazırlayacaksınız.
  • Basit bir web uygulaması oluşturacak ve geliştirme ortamınızda beklendiği gibi çalıştığını doğrulayacaksınız.
  • Web uygulamanıza, bir dizi giriş parametresine göre sınavlar oluşturan bir API sunucusuna dönüştürmek için kademeli olarak mantık ekleyeceksiniz.
  • Google Cloud Run'ı kullanarak sınav oluşturma hizmetinizi buluta dağıtmanın ne kadar kolay olduğunu göreceksiniz.
  • Son olarak, dağıtılan sınav oluşturma hizmetinizi kullanmak için gerçek bir uygulama ( quizaic.com) yapılandıracak ve çıkışa dayalı canlı sınavlar oynayabileceksiniz.

Öğrenecekleriniz...

  • Büyük dil modeli (LLM) için şablonlu istem oluşturma
  • Python'da basit bir web sunucusu uygulaması oluşturma
  • Google'ın LLM'si için web uygulamanıza nasıl destek ekleyeceğinizi öğrenin.
  • Uygulamanızı buluta dağıtarak herkesin yeni oluşturduğunuz içeriği denemesini sağlama
  • Test oluşturucunuzu daha büyük bir uygulamaya entegre etme

İhtiyacınız olanlar...

  • Chrome web tarayıcısı
  • Google Hesabı
  • Faturalandırmanın etkin olduğu bir Cloud projesi

Bu laboratuvar, yeni başlayanlar da dahil olmak üzere her seviyeden geliştiriciye yöneliktir. Python kullanacak olsanız da gördüğünüz tüm kodları açıklayacağımız için neler olduğunu anlamak için Python programlamayı bilmeniz gerekmez.

2. Kurulum

a08aa5878e36b60c.png

Bu bölümde, laboratuvarı kullanmaya başlamak için yapmanız gereken her şey açıklanmaktadır.

Yönlendirmesiz ortam kurulumu

  1. Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Bu bilgiyi istediğiniz zaman güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğinize (genellikle PROJECT_ID olarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adım tamamlandıktan sonra değiştirilemez ve proje süresince geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırılmayı önlemek için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

Cloud Shell'i başlatma

Bu laboratuvarda, Google'ın bulutunda çalışan bir sanal makine tarafından barındırılan bir komut yorumlayıcı olan Cloud Shell oturumunda çalışacaksınız. Bu bölümü kendi bilgisayarınızda yerel olarak da çalıştırabilirsiniz ancak Cloud Shell'i kullanmak, herkesin tutarlı bir ortamda tekrarlanabilir bir deneyime erişmesini sağlar. Laboratuvarın ardından bu bölümü kendi bilgisayarınızda tekrar deneyebilirsiniz.

4a95152439f0159b.png

Cloud Shell'i etkinleştirme

  1. Cloud Console'da Cloud Shell'i etkinleştir 'i 853e55310c205094.png tıklayın.

3c1dabeca90e44e5.png

Cloud Shell'i ilk kez başlatıyorsanız ne olduğunu açıklayan bir ara ekran gösterilir. Ara ekran gösterildiyse Devam'ı tıklayın.

9c92662c6a846a5c.png

Cloud Shell'in temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır.

9f0e51b578fecce5.png

Bu sanal makineye, ihtiyaç duyacağınız tüm geliştirme araçları yüklenmiştir. 5 GB boyutunda kalıcı bir ana dizin bulunur ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu codelab'deki çalışmalarınızın neredeyse tamamını tarayıcıyla yapabilirsiniz.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin, proje kimliğinize ayarlandığını görürsünüz.

  1. Kimliğinizin doğrulandığını onaylamak için Cloud Shell'de şu komutu çalıştırın:
gcloud auth list

Komut çıkışı

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud komutunun projeniz hakkında bilgi sahibi olduğunu onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Değilse şu komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

Bazı API'leri etkinleştirme

Bu hizmetlerin nerede (ve neden) gerekli olduğunu sonraki adımlarda göreceksiniz. Ancak şimdilik projenizin Cloud Build, Artifact Registry, Vertex AI ve Cloud Run'a erişmesini sağlamak için bu komutu çalıştırın:

gcloud services enable cloudbuild.googleapis.com        \
                       artifactregistry.googleapis.com  \
                       aiplatform.googleapis.com        \
                       run.googleapis.com          

Bu işlem, aşağıdakine benzer bir başarılı mesajı oluşturur:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

3. İstem oluşturma - Doğal dilde programlama

92f630373224ead8.png

Öncelikle büyük dil modeli için nasıl istem geliştirileceğini öğreneceğiz. Google Cloud Console > Vertex AI > Vertex AI Studio (Language) bölümüne gidin. Aşağıdaki gibi bir sayfa görmeniz gerekir:

bfe5706041ae6454.png

Generate Text bölümünde Text Prompt düğmesini tıklayın. Sonraki iletişim kutusunda, aşağıdaki şartlara göre bilgi yarışması oluşturmak için etkili olabileceğini düşündüğünüz bir istem girin:

  • Konu: Dünya Tarihi
  • Soru sayısı: 5
  • Zorluk seviyesi: orta
  • Dil: İngilizce

Çıkışı görmek için Gönder düğmesini tıklayın.

Aşağıdaki ekran görüntüsünde gösterildiği gibi, sağdaki panelde kullanmak istediğiniz modeli seçebilir ve bazı ayarları ince ayarlayabilirsiniz:

8aa89a1970ea9335.png

Aşağıdaki ayarlar kullanılabilir:

  • Bölge, oluşturma isteğinizin çalıştırılması gereken yerdir.
  • Model, kullanmak istediğiniz büyük dil modelini seçer. Bu Codelab'de "gemini-1.0-pro-001"i kullanın.
  • Sıcaklık, jeton seçimindeki rastgelelik derecesini kontrol eder. Düşük sıcaklıklar, gerçek bilgilere dayalı veya doğru yanıt beklenen istemler için tercih edilir. Yüksek sıcaklıklar ise daha çeşitli veya beklenmedik sonuçlar sunabilir.
  • Jeton sınırı, bir istemden elde edilebilecek maksimum metin çıktısını belirler. Bir jeton, yaklaşık dört karakterden oluşur. Varsayılan değer 1.024'tür.
  • Top-k, modelin çıkış için jetonları nasıl seçeceğini değiştirir. Top-k değeri 1 olduğunda, seçilen jeton modelin kelime dağarcığındaki tüm jetonlar arasında en olası olanıdır (açgözlü kod çözme olarak da adlandırılır). Top-k değeri 3 olduğunda ise bir sonraki jeton, en olası 3 jeton arasından (sıcaklık kullanılarak) seçilir. Varsayılan top-k değeri 40'tır.
  • Top-p, modelin çıkış için jetonları nasıl seçeceğini değiştirir. Olasılıklarının toplamı üst-p değerine eşit olana kadar en olasıdan en az olasıya doğru jetonlar seçilir.
  • Maks. yanıt sayısı, istem başına oluşturulan maksimum model yanıtı sayısıdır.
  • Durdurma dizisi, modelin karşılaştığında yanıt oluşturmayı durdurduğu bir karakter dizisidir (boşluklar dahil).
  • Yanıtların akış şeklinde gösterilmesi, yanıtların oluşturuldukça yazdırılıp yazdırılmayacağını veya tamamlandığında gösterilmek üzere kaydedilip kaydedilmeyeceğini belirler.
  • Güvenlik filtresi eşiği, zararlı olabilecek yanıtları görme olasılığınızı ayarlar.

Yukarıda belirtilen şartlara göre makul bir sınav oluşturduğu anlaşılan bir isteminiz olduğunda bu sınavı özel kod kullanarak ayrıştırabiliriz. Ancak LLM'nin sınavı doğrudan programımıza yükleyebileceğimiz yapılandırılmış bir biçimde oluşturması daha iyi olmaz mıydı? Bu laboratuvarda daha sonra jeneratörünüzü çağırmak için kullanacağımız program, sınavların yapılandırılmış verileri temsil etmek için kullanılan popüler bir dil ötesi biçim olan JSON olarak ifade edilmesini bekler.

Bu laboratuvardaki testler, bir nesne dizisi olarak ifade edilir. Her nesne bir soru, bu soruya verilebilecek olası yanıtların dizisi ve doğru yanıtı içerir. Bu laboratuvardaki sınavların JSON kodlaması aşağıda verilmiştir:

[
    {
        "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"
    },

    ...
]

İsteminizi, testi gerekli JSON biçiminde oluşturacak şekilde değiştirip değiştiremeyeceğinizi kontrol edin.

  1. Aradığınız biçimi kelimelerle belirtin (ör. yukarıdaki italik cümle).
  2. İsteminize, istenen JSON biçiminin bir örneğini ekleyin.

İstediğiniz spesifikasyona göre testler oluşturan isteminizi aldıktan sonra, isteminizi programatik olarak Vertex AI LLM'ye göndermek için kullanılabilecek Python kodunu görmek üzere sayfanın sağ üst köşesindeki GET CODE düğmesini tıklayın. Python dışında bir programlama dili kullanmak istiyorsanız https://cloud.google.com/vertex-ai/docs/samples?text=generative adresini ziyaret edin.

4. Basit bir web sunucusu oluşturma

c73008bb8a72b57b.png

Çalışan bir isteminiz olduğuna göre, bunu daha büyük bir uygulamaya entegre etmek istiyoruz. İstemlerinizi daha büyük uygulamanın kaynak koduna yerleştirebiliriz ancak oluşturucunuzun diğer uygulamalar için quiz oluşturma hizmeti sağlayan bir mikro hizmet olarak çalışmasını istiyoruz. Bunun için basit bir web sunucusu oluşturup herkese açık hale getirmemiz gerekir. Bu işlemi aşağıdaki adımlarda yapacağız.

Cloud Shell panelinizin üst kısmındaki Open Editor düğmesini tıklayarak başlayın. Şöyle görünür:

e2a06b5304079efc.png

Ardından, Visual Studio Code'a benzer bir IDE ortamına yönlendirilirsiniz. Bu ortamda projeler oluşturabilir, kaynak kodu düzenleyebilir, programlarınızı çalıştırabilirsiniz.

Ekranınız çok dar ise konsol ile düzenleme/terminal pencereniz arasındaki ayırma çizgisini, bu iki bölge arasındaki yatay çubuğu (burada vurgulanmıştır) sürükleyerek genişletebilir veya daraltabilirsiniz:

8dea35450851af53.png

Sırasıyla Open Editor ve Open Terminal düğmelerini tıklayarak düzenleyici ile terminal arasında geçiş yapabilirsiniz. Şimdi bu iki ortam arasında geçiş yapmayı deneyin.

Ardından, klasör ekle düğmesini 5f4e64909bc15e30.png tıklayarak, quiz-generator yazıp Enter tuşuna basarak bu laboratuvar için çalışmanızı saklayacağınız bir klasör oluşturun. Bu laboratuvarda oluşturduğunuz tüm dosyalar ve Cloud Shell'de yaptığınız tüm çalışmalar bu klasörde yer alır.

Şimdi bir requirements.txt dosyası oluşturun. Bu, Python'a uygulamanızın hangi kitaplıklara bağlı olduğunu bildirir. Bu basit web uygulamasında, web sunucuları oluşturmak için popüler bir Python modülü olan Flask, google-cloud-aiplatform istemci kitaplığını ve gunicorn adlı bir web sunucusu çerçevesini kullanacaksınız. Dosya gezinme bölmesinde quiz-generator klasörünü sağ tıklayın ve New file menü öğesini seçin. Örneğin:

613eb3de4b9b750a.png

Yeni dosyanın adı istendiğinde requirements.txt girin ve Enter tuşuna basın. Yeni dosyanın quiz-generator proje klasörüne eklendiğinden emin olun.

Uygulamanızın Python flask paketine, gunicorn web sunucusuna ve google-cloud-aiplatform istemci kitaplığına ve bunların ilişkili sürümlerine bağlı olduğunu belirtmek için aşağıdaki satırları yeni dosyaya yapıştırın.

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

Cloud Editor, değişiklikleri otomatik olarak kaydettiği için bu dosyayı açıkça kaydetmeniz gerekmez.

Aynı tekniği kullanarak main.py adlı başka bir yeni dosya oluşturun. Bu dosya, uygulamanızın ana (ve tek) Python kaynak dosyası olacaktır. Yeni dosyanın quiz-generator klasörüne gittiğinden emin olun.

Bu dosyaya aşağıdaki kodu ekleyin:

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)

Terminale geri dönün ve şu komutla proje klasörüne geçin:

cd quiz-generator

Proje bağımlılıklarınızı yüklemek için aşağıdaki komutu çalıştırın:

pip3 install -r requirements.txt

Bağımlılıkları yükledikten sonra, şu şekilde biten bir çıkış görmeniz gerekir:

Successfully installed flask-3.0.0

Şimdi terminalde şu komutu çalıştırarak uygulamanızı başlatın:

flask --app main.py --debug run --port 8080

Bu noktada uygulamanız, Cloud Shell oturumunuza ayrılmış sanal makinede çalışıyor. Cloud Shell, sanal makinenizde çalışan web sunucularına (ör. az önce başlattığınız sunucu) küresel internetin herhangi bir yerinden erişmenizi sağlayan bir proxy mekanizması içerir.

web preview düğmesini ve ardından Preview on Port 8080 menü öğesini aşağıdaki gibi tıklayın:

7f938c0bc1b4154c.png

Bu işlem, çalışan uygulamanız için bir web tarayıcısı sekmesi açar. Bu sekme aşağıdaki gibi görünmelidir:

aaaf366f9bf74a28.png

5. Parametre ayrıştırmayla bir oluşturma yöntemi ekleyin

Şimdi ise generate adlı yeni bir yöntemin kullanılmasını desteklemek istiyoruz. Bunu, HTTP isteğini işlemek ve bu isteği ayrıştırıp parametreleri yazdırmak için ana rotayı değiştirmek üzere bir içe aktarma ifadesi ekleyerek yapın.

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)

Sonuçları görmek için mevcut web tarayıcısı sekmenizi yeniden yükleyin. Bu kez URL'nize otomatik olarak eklenen bir sorgu parametresiyle birlikte "Quiz Generator"ı (authuser) görmelisiniz. Tarayıcınızın adres çubuğundaki URL'nin sonuna "`&param1=val1&param2=val2`" dizesini ekleyerek iki parametre daha eklemeyi deneyin, sayfayı yeniden yükleyin. Şuna benzer bir şey görmelisiniz:

6e223ca358e4e009.png

Bir URL'de sorgu parametrelerinin nasıl gönderilip ayrıştırılacağını gördüğümüze göre, artık quiz oluşturucumuza göndermek istediğimiz belirli parametreler için destek ekleyeceğiz. Bu parametreler şunlardır:

  • topic: İstenen sınav konusu
  • num_q: İstenen soru sayısı
  • diff - İstenen zorluk seviyesi (kolay, orta, zor)
  • lang: İstenen test dili
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)

Sonuçları görmek için mevcut web tarayıcısı sekmenizi yeniden yükleyin. Aşağıdaki gibi bir web sayfası görmeniz gerekir:

15eed60f6a805212.png

Çeşitli parametreler için değerler ayarlamak üzere URL'yi değiştirmeyi deneyin. Örneğin, adres çubuğunuzdaki URL'nin sonuna "?authuser=0&topic=Literature&num_q=10&diff=easy&lang=French" sonekini eklemeyi deneyin:

f629dba5fa207cef.png

6. İsteminizi ekleme ve biçimlendirme

Ardından, quiz oluşturucumuza göndermek istediğimiz belirli parametreler için destek ekleyeceğiz. Bu parametreler şunlardır:

  • topic: İstenen sınav konusu
  • num_q: İstenen soru sayısı
  • diff - İstenen zorluk seviyesi (kolay, orta, zor)
  • lang: İstenen test dili

Önceki adımda Vertex Üretken Yapay Zeka Stüdyosu ile geliştirdiğiniz istemi kopyalayın ancak konu, soru sayısı ve zorluk seviyesi için sabit kodlanmış değerleri şu dizelerle değiştirin:

  • {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)

Sonuçları görmek için mevcut web tarayıcısı sekmenizi yeniden yükleyin. Aşağıdaki gibi bir web sayfası görmeniz gerekir:

3c2b9dfcfba86b7a.png

Bu dört parametreyi değiştirmek için URL'yi değiştirmeyi deneyin.

7. Vertex AI istemci kitaplığını ekleme

Artık Vertex AI Python istemci kitaplığını kullanarak sınavınızı oluşturmaya hazırsınız. Bu işlem, 3. adımda yaptığınız etkileşimli istemleri otomatikleştirir ve jeneratör hizmetinize Google'ın LLM özelliklerine programatik erişim izni verir. main.py dosyanızı aşağıdaki gibi güncelleyin:

"YOUR_PROJECT" değerini gerçek proje kimliğinizle değiştirdiğinizden emin olun.

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)

Sonuçları görmek için mevcut web tarayıcısı sekmenizi yeniden yükleyin. Bu işlemin birkaç saniye sürebileceğini unutmayın. Bunun nedeni, artık gerçek bir LLM isteği gönderiyor olmanızdır. Aşağıdaki gibi bir web sayfası görmeniz gerekir:

f43d3ba5102857b8.png

Farklı bir test konusu, soru sayısı ve zorluk seviyesi istemek için URL'yi değiştirmeyi deneyin.

Böylece mikro hizmetiniz tamamlandı. Tebrikler. Bir sonraki adımda, hizmetinizi buluta nasıl dağıtacağınızı öğreneceksiniz. Böylece herkes hizmetinize her yerden erişebilecek.

8. Buluta!

67c99bf45a7b7805.png

Artık kendi sınav oluşturucunuzu geliştirdiğinize göre bu harika aracı tüm dünyayla paylaşmak isteyeceksiniz. Bu nedenle, aracı Cloud'a dağıtmanın zamanı geldi. Ancak bu fotoğrafı paylaşmaktan daha fazlasını yapmak istiyorsunuz. Şunlardan emin olmak istiyorsanız:

  • Güvenilir şekilde çalışır: Uygulamanızı çalıştıran bir bilgisayar kilitlenirse otomatik hata toleransı elde edersiniz.
  • Otomatik ölçeklendirme: Uygulamanız, yüksek trafik seviyelerine ayak uydurur ve kullanılmadığında kapladığı alanı otomatik olarak azaltır.
  • Kullanmadığınız kaynaklar için sizden ücret almayarak maliyetlerinizi en aza indirir. Yalnızca trafiğe yanıt verirken kullanılan kaynaklar için ücretlendirilirsiniz.
  • Özel bir alan adı üzerinden erişilebilir. Hizmetinize özel bir alan adı atamak için tek tıklamayla çözüme erişebilirsiniz.
  • Mükemmel yanıt süresi sunar. Soğuk başlatmalar makul düzeyde yanıt verir ancak minimum örnek yapılandırması belirterek bu durumu daha iyi hale getirebilirsiniz.
  • Standart SSL/TLS web güvenliği kullanılarak uçtan uca şifrelemeyi destekler. Bir hizmet dağıttığınızda, standart web şifrelemesini ve gerekli sertifikaları ücretsiz ve otomatik olarak alırsınız.

Uygulamanızı Google Cloud Run'a dağıtarak yukarıdakilerin tümüne ve daha fazlasına sahip olursunuz. Uygulamanızı Cloud Run ile paylaşmanın temel yapı taşı container'dır.

Container'lar, tüm bağımlılıkları bir arada paketlenmiş bir uygulamayı çalıştırmak için modüler bir kutu oluşturmamıza olanak tanır. Container'lar neredeyse tüm sanal veya gerçek sunucularda kullanılabildiğinden uygulamanızı şirket içi ortamdan buluta ve hatta bir hizmet sağlayıcıdan diğerine taşıyarak istediğiniz yerde dağıtmanıza olanak tanır.

Container'lar ve Google Cloud Run'da nasıl çalıştıkları hakkında daha fazla bilgi edinmek için Dev to Prod in Three Easy Steps with Cloud Run (Cloud Run ile Üç Kolay Adımda Geliştirmeden Üretime) başlıklı codelab'i inceleyin.

Uygulamanızı Cloud Run'a Dağıtma

Cloud Run bölgesel bir hizmettir. Bu nedenle, Cloud Run hizmetlerinizi çalıştıran altyapı belirli bir bölgede bulunur ve Google tarafından bu bölgedeki tüm bölgelerde yedekli olarak kullanılabilir şekilde yönetilir. Bu laboratuvarda, kolaylık sağlaması için sabit kodlanmış bölge us-central1 kullanılacaktır.

Kapsayıcınızı otomatik olarak oluşturmak için buildpack adı verilen bir araç kullanacağız. Cloud Editor'da Procfile adlı yeni bir dosya oluşturun ve şu metin satırını ekleyin:

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

Bu, derleme paketi sistemine uygulamanızı otomatik olarak oluşturulan kapsayıcıda nasıl çalıştıracağını söyler. Ardından, Cloud Shell terminalinde (aynı quiz-generator dizininden) aşağıdaki komutu çalıştırın:

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

Bu komut, gcloud komutuna, geçerli dizinde bulduğu kaynak dosyalarına (--source . içindeki dot, geçerli dizinin kısaltmasıdır) göre container görüntünüzü oluşturmak için buildpack'leri kullanmasını istediğinizi bildirir. Hizmet, kapsayıcı resmini örtülü olarak ele aldığından bu gcloud komutunda bir resim belirtmeniz gerekmez.

Dağıtım tamamlanana kadar birkaç dakika bekleyin. İşlem başarılı olduğunda gcloud komutu, yeni hizmetin URL'sini gösterir:

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

Hizmet URL'nizi şu komutla da alabilirsiniz:

gcloud run services describe quiz-generator  \
  --region us-central1                       \
  --format "value(status.url)"

Bu işlem sonucunda aşağıdakine benzer bir mesaj gösterilir:

https://quiz-generator-co24gukjmq-uc.a.run.app

Bu bağlantı, Cloud Run hizmetiniz için TLS güvenliğine sahip özel bir URL'dir. Bu bağlantı, hizmetinizi devre dışı bırakmadığınız sürece kalıcıdır ve internetin her yerinde kullanılabilir. Geçici bir sanal makineye bağlı olan ve daha önce bahsedilen Cloud Shell'in proxy mekanizmasını kullanmaz.

Çalışan uygulamanız için bir web tarayıcısı sekmesi açmak üzere vurgulanan Service URL simgesini tıklayın. Sonucun, geliştirme ortamınızda gördüğünüz sonuçla aynı olduğunu doğrulayın. Ayrıca, URL'nin sonuna parametreler ekleyerek oluşturulan testi düzenleyebildiğinizi de doğrulayın.

Tebrikler! Uygulamanız artık Google'ın bulutunda çalışıyor. Uygulamanız, TLS (HTTPS) şifrelemesiyle ve akıl almaz düzeylerdeki trafiğe otomatik ölçeklendirmeyle herkese açık olarak kullanılabilir.

9. Tüm parçaları bir araya getirme

9927db1725bcd5d6.png

Bu son adımda, quizaic uygulamasının bir parçası olarak sınav oluşturucunuzu çalıştırmaya hazırız. quizaic URL'sini ziyaret edin, Google Hesabınıza giriş yapın ve Create Quiz sekmesine gidin. Oluşturucu türünü seçin Custom, Cloud Run URL'nizi URL alanına yapıştırın, diğer zorunlu alanları doldurun ve formu gönderin.

328ee05579ea05f9.png

Kısa süre içinde, yapay zeka tarafından oluşturulmuş bir küçük resim içeren yeni bir quiziniz olur (aşağıdaki resimde "Yeni quizim" bölümüne bakın). Bu quiz'i düzenleyebilir, oynayabilir, klonlayabilir veya ilgili düğmeleri kullanarak silebilirsiniz. Bu yeni test, şablonlu isteminize göre az önce dağıttığınız web hizmeti kullanılarak oluşturuldu.

1719169140978b63.png

10. Temizleme

c1592d590c563428.png

Cloud Run, hizmet kullanılmadığında ücret almaz ancak oluşturulan container görüntüsünü depolama için ücretlendirilebilirsiniz.

Ücretlendirilmemek için GCP projenizi silebilirsiniz. Bu işlem, söz konusu projede kullanılan tüm kaynaklar için faturalandırmayı durdurur. Alternatif olarak, aşağıdaki komutu kullanarak kapsayıcı resminizi silebilirsiniz:

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 hizmetinizi silmek için şu komutu kullanın:

gcloud run services delete quiz-generator --region us-central1 --quiet

11. Tebrikler!

910162be58c0f6d6.png

Tebrikler! Başarıyla bir LLM istemi oluşturdunuz ve bu istemi kullanarak bir Cloud Run mikro hizmeti dağıttınız. Artık doğal dilde programlama yapabilir ve oluşturduklarınızı dünyayla paylaşabilirsiniz.

Sizi önemli bir soruyla baş başa bırakmak istiyorum:

Uygulamanızı geliştirme ortamınızda çalışır hale getirdikten sonra, Cloud Run'ın sunduğu tüm üretim düzeyinde özelliklerle birlikte buluta dağıtmak için kaç satır kodu değiştirmeniz gerekti?

Yanıt tabii ki sıfır. :)

Göz atabileceğiniz diğer codelab'ler...

Referans belgeler...

12. Harekete Geçirici Mesaj

Bu codelab'i beğendiyseniz ve Google Cloud ile daha fazla pratik deneyim kazanmak istiyorsanız hemen Google Cloud Innovators'a katılın.

498cab7d87ec12d3.png

Google Cloud Innovators ücretsizdir ve şunları içerir:

  • Google çalışanlarından doğrudan en son bilgileri öğrenmek için canlı tartışmalar, soru-cevap oturumları ve yol haritası oturumları
  • En son Google Cloud haberleri doğrudan gelen kutunuza gelsin.
  • Dijital rozet ve video konferans arka planı
  • Öğrenim Merkezi'nde 500 kredi değerinde laboratuvar ve eğitim

Kaydolmak için burayı tıklayın.