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 kullanmış olabileceğinizden farklı bir programlama dili kullanacaksınız: Türkçe!

Yapacaklarınız...

  • Bir dizi ölçüte göre bilgi yarışması oluşturan bir istem oluşturursunuz.
  • Basit bir web uygulaması oluşturup geliştirme ortamınızda beklendiği gibi çalıştığını doğrularsı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 oluşturduğunuz sonuca göre 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.
  • Google'ın LLM desteğini web uygulamanıza ekleme.
  • Yeni oluşturduğunuz içeriği herkesin deneyebilmesi için uygulamanızı buluta dağıtma.
  • Test oluşturucunuzu 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, başlangıç seviyesindekiler de dahil olmak üzere her seviyedeki geliştiricileri hedeflemektedir. Python kullanacak olsanız da ne olduğunu anlamak için Python programlamasını bilmeniz gerekmez. Göreceğiniz tüm kodları açıklayacağız.

2. Kurulum

a08aa5878e36b60c.png

Bu bölümde, bu laboratuvarda çalışmaya başlamak için yapmanız gereken her şey açıklanmaktadır.

Kendine ait tempoda ortam oluşturma

  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ının görünen adıdır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Dilediğiniz zaman güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dize otomatik olarak oluşturur. Bu dizenin ne olduğu genellikle önemli değildir. Çoğu kod laboratuvarında proje kimliğinize (genellikle PROJECT_ID olarak tanımlanır) referans vermeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele başka bir kimlik oluşturabilirsiniz. Alternatif olarak, kendi ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje boyunca geçerli kalır.
  • Bilginiz olması açısından, bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu üç değer hakkında daha fazla bilgiyi dokümanlar bölümünde 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ırmak çok pahalı 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 deneme programına uygundur.

Cloud Shell'i başlatın

Bu laboratuvarda, Google'ın bulutunda çalışan bir sanal makine tarafından barındırılan bir komut yorumlayıcısı 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, herkese tutarlı bir ortamda yeniden üretilebilir bir deneyime erişim sağlar. Laboratuvardan sonra 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 Cloud Shell'in ne olduğunu açıklayan bir ara ekran gösterilir. Ara ekran gösterildiyse Devam'ı tıklayın.

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

Bu sanal makine, ihtiyaç duyulan tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışır. Bu sayede ağ performansını ve kimlik doğrulamayı büyük ölçüde iyileştirir. Bu kod laboratuvarındaki çalışmanızın tamamı olmasa da büyük bir kısmı tarayıcıda yapılabilir.

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ğinizi doğrulamak 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 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>

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

Bu hizmetlerin nerelerde (ve neden) gerekli olduğunu sonraki adımlarda göreceksiniz. Şimdilik projenize Cloud Build, Artifact Registry, Vertex AI ve Cloud Run'a erişim 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 bir başarılı mesaj döndürür:

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 > Vertex AI > Vertex AI Studio (Dil) bölümüne gidin. Aşağıdaki gibi bir sayfa görürsünüz:

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

Çıktıyı 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ışacağı yerdir.
  • Model, kullanmak istediğiniz büyük dil modelini seçer. Bu codelab için "gemini-1.0-pro-001" sürümünü 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 istemdeki maksimum metin çıkışı miktarını belirler. Bir jeton, yaklaşık dört karakterden oluşur. Varsayılan değer 1024'tür.
  • Top-k, modelin çıkış için jetonları seçme şeklini değiştirir. 1'e ayarlanmış bir en iyi k değeri, seçilen jetonun modelin kelime haznesindeki tüm jetonlar arasında en olası jeton olduğu anlamına gelir (açgözlü kod çözme olarak da bilinir). 3'e ayarlanmış bir en iyi k değeri ise bir sonraki jetonun, en olası 3 jeton arasından seçildiği anlamına gelir (sıcaklık kullanılır). Varsayılan en iyi 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ış şeklinde gösterilmesi, yanıtların oluşturuldukları sırada mı yoksa kaydedilip tamamlandığında mı yazdırılacağını seçer.
  • 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 test oluşturacak bir istem oluşturduğunuzda bu testi özel kod kullanarak ayrıştırabiliriz. Ancak LLM'nin testi doğrudan programımıza yükleyebileceğimiz yapılandırılmış bir biçimde oluşturması daha iyi olmaz mı? 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 testlerin 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 yayınlayacak şekilde 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, istediğiniz JSON biçimine ait bir örnek ekleyin.

İsteğiniz spesifikasyona göre testler oluşturan isteminizi oluşturduktan sonra, isteminizi programatik olarak bir 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 adresine göz atın.

4. Basit bir web sunucusu oluşturma

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 uygulamanın kaynak koduna yerleştirebiliriz. Ancak oluşturucunuzun 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 aşağıdaki adımlarda yapacağız.

Cloud Shell panelinizin üst kısmındaki Open Editor düğmesini tıklayarak başlayın. Bu uzantı aşağıdaki gibi görünür:

e2a06b5304079efc.png

Ardından, Visual Studio Code'a benzer bir IDE ortamında bulursunuz. Burada proje oluşturabilir, kaynak kodunu düzenleyebilir, programlarınızı çalıştırabilirsiniz.

Ekranınız çok dar ise konsol ile düzenleme/terminal pencereniz arasındaki yatay çubuğu sürükleyerek bu iki bölge arasındaki ayırma çizgisini genişletebilir veya daraltabilirsiniz. Bu çubuk aşağıda 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, klasör ekle düğmesini 5f4e64909bc15e30.png tıklayıp quiz-generator yazıp Enter tuşuna basarak bu laboratuvardaki ç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 gerçekleşir.

Ş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ı için web sunucusu oluşturmak amacıyla Flask, google-cloud-aiplatform istemci kitaplığı adlı popüler bir Python modülü 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.

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 Düzenleyici, değişiklikleri sizin için otomatik olarak kaydedeceğinden bu dosyayı açıkça kaydetmeniz gerekmez.

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

Aşağıdaki 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 ş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 özel sanal makinede çalışır. Cloud Shell, sanal makinenizde çalışan web sunucularına (yeni başlattığınız gibi) dünya genelindeki 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 tıklayın:

7f938c0bc1b4154c.png

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

aaaf366f9bf74a28.png

5. Parametre ayrıştırma içeren bir oluşturma yöntemi ekleme

Şimdi generate adlı yeni bir yöntemin girilmesi için destek eklemek istiyoruz. Bunu, HTTP isteğini değiştirmek için bir içe aktarma ifadesi ekleyerek ve bu isteği ayrıştırıp parametreleri yazdırmak için ana rotayı değiştirerek yapabilirsiniz.

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 parametresi (authuser) ile birlikte "Test Oluşturucu"yu görürsünüz. Tarayıcınızın adres çubuğundaki URL'nin sonuna "`&param1=val1&param2=val2`" dizesini ekleyerek iki ek parametre eklemeyi deneyin. Sayfayı yeniden yüklediğinizde şuna benzer bir şey görürsünüz:

6e223ca358e4e009.png

URL'de sorgu parametrelerinin nasıl gönderileceğini ve ayrıştırılacağını gördük. Şimdi, test oluşturucumuza göndermek istediğimiz belirli parametreler için destek ekleyeceğiz. Bu parametreler şunlardır:

  • topic: İstenilen test konusu
  • num_q: İstenen soru 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)

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

15eed60f6a805212.png

Çeşitli parametreler için değer 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" son ekini eklemeyi deneyin:

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

Vertex Üretken Yapay Zeka Studio ile daha önceki bir adımda geliştirdiğiniz isteği 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 web sayfasına benzer bir sayfa görürsünüz:

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 işlem, 3. adımda yaptığınız etkileşimli istemi otomatikleştirir ve jeneratör hizmetinize Google'ın LLM özelliklerine programatik erişim sağlar. main.py dosyanızı aşağıdaki gibi güncelleyin:

"PROJENİZ" ifadesini 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. Artık gerçek bir LLM isteği gönderdiğiniz için bu işlemin birkaç saniye sürebileceğini unutmayın. Aşağıdaki web sayfasına benzer bir sayfa görürsünüz:

f43d3ba5102857b8.png

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

Mikro hizmetiniz tamamlandı. Tebrikler. Sonraki adımda, hizmetinizin herkes tarafından her yerden erişilebilir olması için Bulut'a nasıl dağıtacağınızı öğreneceksiniz.

8. Buluta!

67c99bf45a7b7805.png

Kendi test oluşturucunuzu oluşturduğunuza göre, bu harika aracı dünyanın geri kalanıyla paylaşmak isteyeceksiniz. Şimdi Cloud'a dağıtma zamanı. Ama gerçekten paylaşmaktan daha fazlasını yapmak istiyorsunuz. Aşağıdakilerden emin olmak istersiniz:

  • Güvenilir bir şekilde çalışır: Uygulamanızı çalıştıran bir bilgisayar kilitlenirse otomatik hata toleransı elde edersiniz.
  • 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 sahip olabilirsiniz. Uygulamanızı Cloud Run ile paylaşmak için temel yapı taşı bir container'dır.

Container'lar, bir uygulamayı tüm bağımlılıklarıyla birlikte çalıştırabileceğimiz modüler bir kutu oluşturma olanağı sunar. Container'lar neredeyse her sanal veya gerçek sunucuda kullanılabildiğinden, uygulamanızı şirket içinden buluta kadar dilediğiniz yere dağıtabilir ve hatta bir servis sağlayıcıdan diğerine taşıyabilirsiniz.

Container'lar ve bunların Google Cloud Run'da nasıl çalıştığı hakkında daha fazla bilgi edinmek için Cloud Run ile Üç Kolay Adımda Geliştirme Aşamasından Üretim Aşamasına kod laboratuvarını inceleyin.

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 bulunur ve Google tarafından bu bölgedeki tüm alt bölgelerde yedek olarak kullanılabilir şekilde yönetilir. Basitlik açısından bu laboratuvarda sabit kodlanmış 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, buildpack sistemine uygulamanızın otomatik olarak oluşturulan kapsayıcıda nasıl çalıştırılacağını bildirir. 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, gcloud komutuna, mevcut dizinde bulduğu kaynak dosyalara göre kapsayıcı görüntünüzü oluşturmak için buildpack'leri kullanmasını istediğinizi bildirir (--source . içindeki dot, geçerli dizinin kısaltmasıdır). Hizmet, kapsayıcı resmiyle dolaylı olarak ilgilendiği için bu gcloud komutunda bir resim belirtmeniz gerekmez.

Dağıtım tamamlanana kadar birkaç dakika bekleyin. 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ğı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ı 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 dayanan Cloud Shell proxy mekanizmasını kullanmaz.

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

Tebrikler! Uygulamanız artık Google'ın bulutunda çalışıyor. Uygulamanız, TLS (HTTPS) şifrelemesi ve inanılmaz trafik seviyelerine otomatik ölçeklendirme ile herkese açık olarak kullanılabilir.

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

9927db1725bcd5d6.png

Bu son adımda, quizaic uygulaması kapsamında test 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ü Custom 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 oluşturulan bir küçük resim içeren yeni bir testiniz (aşağıdaki resimde "Yeni testim" bölümüne bakın) olur. İlgili düğmeler aracılığıyla bu testi düzenleyebilir, oynatabilir, kopyalayabilir veya silebilirsiniz. Bu yeni test, şablon isteminize göre 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 derlenen kapsayıcı görüntüsünün depolanması için sizden ücret alınabilir.

Ü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 program yazabilir ve yarattıklarınızı 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?

Yanıt elbette sıfırdır. :)

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

Referans dokümanları...

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:

  • En son gelişmeleri doğrudan Google çalışanlarından öğrenmek için canlı tartışmalar, soru-cevap oturumları ve yol haritası oturumları
  • en son Google Cloud haberlerini 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.