GenAI ve Cloud Run ile Test Oluşturucu Derleme

1. Giriş

Bu laboratuvarda, bilgi testleri oluşturmak ve eğlenceli, çalışan bir uygulamaya entegre etmek için bir web hizmeti geliştireceksiniz. Daha önce kullandığınızdan farklı bir programlama dili kullanacaksınız: Türkçe!

Yapacağınız işlemler

  • Bir dizi ölçüte göre bilgi yarışması oluşturan bir istem oluşturacaksınız.
  • Basit bir web uygulaması derleyecek ve geliştirme ortamınızda beklendiği gibi çalıştığını doğrulayacaksınız.
  • Web uygulamanızı, bir dizi giriş parametresine göre testler oluşturan bir API sunucusuna dönüştürmek için uygulamanıza aşamalı olarak mantık eklersiniz.
  • Google Cloud Run'ı kullanarak test oluşturma hizmetinizi buluta dağıtmanın ne kadar kolay olduğunu göreceksiniz.
  • Son olarak, dağıtılmış test oluşturma hizmetinizi kullanmak için gerçek bir uygulama ( quizaic.com) yapılandırır ve bu uygulamadaki sonucu temel alarak canlı testler oynayabilirsiniz.

Öğrenecekleriniz...

  • Büyük dil modeli (LLM) için şablonlu istem oluşturma.
  • Python'da basit bir web sunucusu uygulaması oluşturma.
  • Web uygulamanıza Google'ın geniş kapsamlı dil modeli desteği ekleme.
  • Yeni oluşturduğunuz içeriği herkesin deneyebilmesi için uygulamanızı buluta dağıtma.
  • Test oluşturma aracınızı daha büyük bir uygulamaya entegre etme.

Gerekenler

  • 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 kullanıyor olsanız da, neler olup bittiğini anlamak için Python programlamasına aşina olmanız gerekmez. Burada göreceğiniz tüm kodu açıklayacağız.

2. Kurulum

a08aa5878e36b60c.png

Bu bölümde, bu laboratuvara başlamak için yapmanız gereken tüm işlemler ele alınmaktadır.

Kendi hızınızda ortam kurulumu

  1. Google Cloud Console'da oturum açıp 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. İstediğiniz zaman güncelleyebilirsiniz.
  • Proje Kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de proje kimliğinizi (genellikle PROJECT_ID olarak tanımlanır) belirtmeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele bir kimlik daha oluşturabilirsiniz. Alternatif olarak, kendi ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince kalır.
  • Bilginiz olması açısından, bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Sonraki adımda, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırmanın tekrarlanmasını önlemek amacıyla kaynakları kapatmak için oluşturduğunuz kaynakları silebilir veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

Cloud Shell'i başlatın

Bu laboratuvarda, Google'ın bulutunda çalışan bir sanal makine tarafından barındırılan bir komut çevirmeni olan Cloud Shell oturumunda çalışacaksınız. Bu bölümü yerel olarak kendi bilgisayarınızda da yerel olarak çalıştırabilirsiniz. Ancak Cloud Shell kullanarak herkes tutarlı bir ortamda tekrarlanabilir bir deneyime erişebilir. Laboratuvardan sonra bu bölümü bilgisayarınızda yeniden deneyebilirsiniz.

4a95152439f0159b.png

Cloud Shell'i etkinleştirme

  1. Cloud Console'da, Cloud Shell'i etkinleştir 853e55310c205094.png simgesini 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 bir ekran görüntülendiyse Devam'ı tıklayın.

9c92662c6a846a5c.png

Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.

9f0e51b578fecce5.png

Gereken tüm geliştirme araçları bu sanal makinede yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Bu codelab'deki çalışmalarınızın tamamı olmasa bile büyük bir kısmı tarayıcıyla yapılabilir.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını göreceksiniz.

  1. Kimlik doğrulamanızın tamamlandığını onaylamak için Cloud Shell'de aşağıdaki 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 projenizi bildiğini onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Doğru değilse aşağıdaki komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

Bazı API'leri etkinleştirin

Sonraki adımlarda bu hizmetlerin nerede, neden gerekli olduğunu göreceksiniz. Şimdilik projenizin Cloud Build, Artifact Registry, Vertex AI ve Cloud Run'a erişmesine izin vermek için şu 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 başarılı bir mesaj üretir:

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

3. İstem - Doğal Dilde Programlama

92f630373224ead8.png

Büyük dil modeli için istem geliştirmeyi öğrenerek başlayacağız. Google Cloud Console'a gidin > Vertex AI > Vertex AI Studio (Dil). Şuna benzer bir sayfa görmeniz gerekir:

bfe5706041ae6454.png

Generate Text altında, Text Prompt düğmesini tıklayın. Sonraki iletişim kutusuna, 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

Sonucu 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 panelden kullanmak istediğiniz modeli seçebilir ve ayarlardan bazılarının ince ayarını yapabilirsiniz:

8aa89a1970ea9335.png

Aşağıdaki ayarlar kullanılabilir:

  • Bölge, oluşturma isteğinizin çalıştırılacağı yerdir.
  • Model, kullanmak istediğiniz büyük dil modelini seçer. Bu codelab'de "gemini-1.0-pro-001" kullanmaya devam edin.
  • Sıcaklık, jeton seçimindeki rastgelelik derecesini kontrol eder. Daha düşük sıcaklıklar doğru veya doğru yanıt almayı bekleyen istemler için iyiyken, yüksek sıcaklıklar daha çeşitli veya beklenmedik sonuçlara yol açabilir.
  • Jeton sınırı, tek bir istemden maksimum metin çıkışı miktarını belirler. Jeton yaklaşık dört karakterden oluşur. Varsayılan değer 1024'tür.
  • Üst-k, modelin çıkış için jetonları seçme şeklini değiştirir. 1'in üstünde bir simge olması, modelin sözlüğündeki tüm simgeler arasında seçilen jetonun en olası olduğu anlamına gelir (açkanlı kod çözme olarak da adlandırılır); 3'ün ilk k değeri ise en olası 3 jeton arasından (sıcaklığı kullanarak) bir sonraki jetonun seçildiği anlamına gelir. Varsayılan üst k değeri 40'tır.
  • Top-p, modelin çıkış için jeton seçme şeklini değiştirir. Jetonlar, olasılıkların toplamı, top-p değerine eşit olana kadar en olası olandan en az olana doğru seçilir.
  • Maksimum yanıt sayısı, istem başına üretilen maksimum model yanıtı sayısıdır.
  • Durdurma dizisi, modelle karşılaştığında yanıt oluşturmayı durduran bir karakter dizisi (boşluklar dahil).
  • Yanıtların akışı, yanıtların oluşturuldukları veya kaydedildiği sırada yazdırılıp yazdırılmayacağını seçer ve tamamlandığında gösterilir.
  • Güvenlik filtresi eşiği, zararlı olabilecek yanıtları görme olasılığınızı ayarlar.

Yukarıda belirtilen gereksinimlere göre makul bir test oluşturuyormuş gibi görünen bir istem olduğunda, bu testi özel kod kullanarak ayrıştırabiliriz. Peki LLM'nin testi doğrudan programımıza yükleyebileceğimiz yapılandırılmış bir biçimde oluşturması daha güzel olmaz mıydı? Bu laboratuvarın ilerleyen bölümlerinde oluşturucunuzu çağırmak için kullanacağımız programda, testlerin, yapılandırılmış verileri temsil etmek için diller arası popüler bir biçim olan JSON ile ifade edilmesi beklenmektedir.

Bu laboratuvardaki testler, bir nesne dizisi olarak ifade edilir. Bu nesnede her nesne bir soru, bu soruya verilen bir dizi olası yanıt ve bir doğru yanıt içerir. Bu laboratuvardaki testler için 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"
    },

    ...
]

Artık testi gerekli JSON biçiminde çıktı almak için isteminizi değiştirip değiştiremeyeceğinize bakın.

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

İsteminizin istediğiniz spesifikasyona göre testler oluşturmasını sağladıktan sonra, isteminizi bir Vertex AI LLM'ye programatik olarak göndermek için kullanabileceğiniz Python kodunu görmek için sayfanın sağ üst köşesindeki GET CODE düğmesini tıklayın. Python dışında bir programlama dili kullanmak isterseniz https://cloud.google.com/vertex-ai/docs/samples?text=generative adresine göz atın.

4. Basit Bir Web Sunucusu Derleme

c73008bb8a72b57b.png

Artık çalışan bir isteminiz olduğuna göre bunu daha büyük bir uygulamaya entegre etmek istiyoruz. İsteminizi elbette daha büyük olan uygulamanın kaynak koduna yerleştirebiliriz. Ancak üreticinizin, diğer uygulamalar için test oluşturma hizmeti sağlayan bir mikro hizmet olarak çalışmasını istiyoruz. Bunu gerçekleştirmek için basit bir web sunucusu oluşturmamız ve bunu herkese açık hale getirmemiz gerekecek. Bunu sonraki 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 kendinizi Visual Studio Code'a benzer bir IDE ortamında bulursunuz. Bu ortamda proje oluşturabilir, kaynak kodunu düzenleyebilir, programlarınızı çalıştırabilir ve daha pek çok işlem yapabilirsiniz.

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

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, bu laboratuvarda çalışmalarınızı saklayabileceğiniz bir klasör oluşturun. Bunun için Klasör ekle düğmesini 5f4e64909bc15e30.png tıklayıp quiz-generator komutunu girin ve Enter tuşuna basın. 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 söyler. Bu basit web uygulamasında, web sunucuları oluşturmak için Flask, google-cloud-aiplatform istemci kitaplığı adlı popüler bir Python modülünü ve gunicorn adlı bir web sunucusu çerçevesi 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 yazın ve Enter tuşuna basın. Yeni dosyanın quiz-generator proje klasörüne eklendiğinden emin olun.

Uygulamanızın, ilişkili sürümleriyle birlikte Python flask paketi, gunicorn web sunucusu ve google-cloud-aiplatform istemci kitaplığına 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 sizin yerinize otomatik olarak kaydedeceğinden bu dosyayı açıkça kaydetmeniz gerekmez.

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

Şu kodu bu dosyaya 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ünü değiştirin:

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örürsünüz:

Successfully installed flask-3.0.0

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

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

Bu noktada, uygulamanız Cloud Shell oturumunuza özel sanal makinede çalışmaktadır. Cloud Shell, sanal makinenizde çalışan web sunucularına (yeni başlattığınız gibi) küresel internetteki herhangi bir yerden erişmenize olanak tanıyan bir proxy mekanizması içerir.

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

7f938c0bc1b4154c.png

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

aaaf366f9bf74a28.png

5. Parametre ayrıştırmasıyla bir oluşturma yöntemi ekleme

Şimdi, generate adlı yeni bir yöntemin uygulanması için destek eklemek istiyoruz. Bu işlemi, HTTP isteğini işlemek için bir içe aktarma ifadesi ekleyerek ve bu isteği ayrıştıracak ana yolu ve yazdırma parametrelerini aşağıdaki şekilde değiştirerek 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)

Şimdi, sonuçları görmek için mevcut web tarayıcısı sekmenizi yeniden yükleyin. Bu kez, URL'nize (authuser) otomatik olarak eklenen bir sorgu parametresiyle birlikte "Test Oluşturucu"yu görürsünüz. "`&param1=val1&param2=val2`" dizesini ekleyerek iki yeni parametre eklemeyi deneyin. URL'nin sonuna ekleyerek sayfayı yeniden yükleyin. Şuna benzer bir sayfa görürsünüz:

6e223ca358e4e009.png

Bir URL'deki sorgu parametrelerinin nasıl gönderildiğini ve ayrıştırıldığını gördüğümüze göre, test oluşturucumuzu göndereceğimiz belirli parametreler için destek ekleyeceğiz. Bu parametreler aşağıdaki gibidir:

  • topic - istenen test konusu
  • num_q - istenen soruların sayısı
  • diff - istenen zorluk seviyesi (kolay, orta, zor)
  • lang - istenen 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)

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

15eed60f6a805212.png

Çeşitli parametrelerin değerlerini ayarlamak için URL'yi değiştirmeyi deneyin. Örneğin, "?authuser=0&topic=Literature&num_q=10&diff=easy&lang=French" son ekini kullanmayı deneyin sonuna eklemeniz gerekir:

f629dba5fa207cef.png

6. İsteminizi ekleme ve biçimlendirme

Ardından, test oluşturucumuzu göndermek isteyeceğimiz belirli parametreler için destek ekleyeceğiz. Bu parametreler aşağıdaki gibidir:

  • topic - istenen test konusu
  • num_q - istenen soruların sayısı
  • diff - istenen zorluk seviyesi (kolay, orta, zor)
  • lang - istenen test dili

Önceki adımda Vertex Generative AI Studio ile geliştirdiğiniz istemi kopyalayın ancak konu, soru sayısı ve zorluk seviyesi için sabit kodlu 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)

Şimdi, sonuçları görmek için mevcut web tarayıcısı sekmenizi yeniden yükleyin. Aşağıdaki web sayfası gibi bir sayfa 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 testinizi oluşturmaya hazırız. Bu, 3. adımda yaptığınız etkileşimli istemi otomatikleştirir ve oluşturma aracı hizmetinizin Google'ın LLM özelliklerine programatik olarak erişmesine olanak tanır. main.py dosyanızı aşağıdaki şekilde güncelleyin:

"PROJENİZ" kısmını değiştirdiğinizden emin olun. bilgileri girin.

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)

Şimdi, sonuçları görmek için mevcut web tarayıcısı sekmenizi yeniden yükleyin. Şu anda aslında bir LLM isteğinde bulunduğunuz için bu işlemin birkaç saniye sürebileceğini unutmayın. Aşağıdaki web sayfası gibi bir sayfa 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, herkesin istediği yerden erişebilmesi için hizmetinizi Cloud'da nasıl dağıtacağınızı öğreneceksiniz.

8. Buluta!

67c99bf45a7b7805.png

Artık kendi test oluşturucunuzu oluşturduğunuza göre bu muhteşemliği dünyanın geri kalanıyla paylaşabilirsiniz. Şimdi sıra bunu Buluta dağıtmaya geldi. Ama gerçekten paylaşmaktan daha fazlasını yapmak istiyorsunuz. Aşağıdakileri kontrol edin:

  • güvenilir bir şekilde çalışır; uygulamanızı çalıştıran bir bilgisayarın kilitlenmesi durumunda otomatik hata toleransı alırsınız
  • otomatik olarak ölçeklenir. Uygulamanız çok büyük trafik miktarlarına ayak uydurur ve kullanılmadığında ayak izini otomatik olarak azaltır
  • kullanmadığınız kaynaklar için sizi ücretlendirmeyerek maliyetlerinizi en aza indirir; yalnızca trafiğe yanıt verirken tükettiğiniz kaynaklar için ücretlendirilirsiniz
  • özel bir alan adı yoluyla erişilebilir; hizmetinize özel bir alan adı atamak için tek tıklamayla erişilebilen
  • mükemmel yanıt süresi sunar; baştan başlatmalar makul ölçüde yanıt verir ancak minimum örnek yapılandırması belirleyerek bu konuda ince ayar yapabilirsiniz.
  • standart SSL/TLS web güvenliği kullanan uçtan uca şifrelemeyi destekler. Bir hizmeti dağıttığınızda standart web şifrelemesini ve ilgili 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 erişirsiniz. Uygulamanızı Cloud Run ile paylaşmak için temel yapı taşı bir container'dır.

Container'lar bize bir uygulamayı tüm bağımlılıkları birlikte paketlenmiş şekilde çalıştırabileceğimiz modüler bir kutu oluşturma imkanı veriyor. Container'lar neredeyse tüm sanal veya gerçek sunucularda kullanılabildiğinden bu sayede uygulamanızı şirket içi ortamdan buluta kadar istediğiniz yere dağıtabilir, hatta uygulamanızı bir servis sağlayıcıdan diğerine taşıyabiliriz.

Container'lar ve Google Cloud Run'da nasıl çalıştıkları hakkında daha fazla bilgi edinmek için Cloud Run ile Üç Kolay Adımda Üretim Ortamına Geçiş codelab'ine göz atın.

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

Cloud Run bölgesel bir hizmettir. Yani Cloud Run hizmetlerinizi çalıştıran altyapı belirli bir bölgede yer alır ve Google tarafından yönetilir. Bu sayede o bölgedeki tüm alt bölgelerde yedek olarak kullanılabilir. Bu laboratuvarda kolaylık sağlaması için, sabit kodlu us-central1 bölgesini kullanacağız.

Container'ınızı otomatik olarak oluşturmak için buildpack adlı bir sistem kullanacağız. Cloud Editor'da Procfile adlı yeni bir dosya oluşturun ve şu tek satırlık metni 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 Terminal'de (aynı quiz-generator dizininden) aşağıdaki komutu çalıştırın:

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

Bu işlem, gcloud komutuna, geçerli dizinde bulduğu kaynak dosyalara bağlı olarak container görüntünüzü oluşturmak için derleme paketlerini kullanmasını istediğinizi bildirir (--source . içindeki dot, geçerli dizinin kısaltmasıdır). Hizmet, container görüntüsünü dolaylı olarak yönettiğinden bu gcloud komutunda görüntü belirtmeniz gerekmez.

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

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 komutu kullanarak da alabilirsiniz:

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

Aşağıdaki gibi bir değer görüntülenmelidir:

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ı kalıcıdır (hizmetinizi devre dışı bırakmadığınız sürece) ve internetin her yerinde kullanılabilir. Daha önce bahsedilen ve geçici bir sanal makineye bağlı olan Cloud Shell'in proxy mekanizmasını kullanmaz.

Vurgulanan Service URL simgesini tıklayarak çalışan uygulamanızın web tarayıcısı sekmesini açın. Sonucun, geliştirme ortamınızda gördüğünüzle aynı olduğunu doğrulayın. Ayrıca, URL'nin sonunda parametreler sağlayarak, oluşturulan testi ayarlayabileceğinizi doğrulayın.

Tebrikler! Uygulamanız artık Google'ın Cloud'da çalışıyor. Uygulamanız, TLS (HTTPS) şifrelemesi ve akıl almaz trafik seviyelerine göre otomatik ölçeklendirme ile herkes tarafından kullanılabilir.

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

9927db1725bcd5d6.png

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

328ee05579ea05f9.png

Birkaç dakika içinde, yapay zeka tarafından üretilmiş küçük resim görüntüsü içeren yeni bir test göreceksiniz (aşağıdaki resimde "Yeni testim"e bakın). Bu küçük resmi düzenleyebilir, oynatabilir, klonlayabilir veya 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ımda değilken ücret almaz. Ancak, derleme container görüntüsünü depolamak için ücret ödemeniz gerekebilir.

Ücret ödemek istemiyorsanız GCP projenizi silebilirsiniz. Bu durumda, ilgili proje içinde kullanılan tüm kaynakların faturalandırması durdurulur veya şu komutu kullanarak container görüntünüzü 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. Başardınız!

910162be58c0f6d6.png

Tebrikler! LLM istemini başarıyla oluşturdunuz ve bu istemi kullanarak Cloud Run mikro hizmetini dağıttınız. Artık doğal dilde programlayabilir ve eserlerinizi dünyayla paylaşabilirsiniz.

Size önemli bir soru sormak istiyorum:

Uygulamanızı geliştirici ortamınızda çalıştırmaya başladıktan sonra, Cloud Run'ın sunduğu tüm üretim düzeyi özelliklere sahip olan ve buluta dağıtmak için kaç kod satırını değiştirmeniz gerekti?

Elbette cevap sıfır. :)

Göz atmanız gereken diğer codelab'ler...

Referans belgeler...

12. Harekete Geçirici Mesaj

Bu codelab'den memnun kaldıysanız ve Google Cloud'da uygulamalı olarak daha fazla zaman geçirmeye hazırsanız Google Cloud Innovators'a hemen katılmanızı öneririz.

498cab7d87ec12d3.png

Google Cloud Fikir Liderleri Ücretsizdir ve şunları içerir:

  • Doğrudan Google çalışanlarından son gelişmeleri öğrenmek için canlı tartışmalar, AMA'lar ve yol haritası oturumları
  • En son Google Cloud haberleri doğrudan gelen kutunuzda
  • Dijital rozet ve video konferans arka planı
  • Öğrenim Merkezi Öğrenim Merkezi ve laboratuvarlar için 500 kredi

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