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
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
- 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.
- 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.
- 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.
Cloud Shell'i etkinleştirme
- Cloud Console'da Cloud Shell'i etkinleştir 'i tıklayın.
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.
Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.
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.
- 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`
- 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
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:
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:
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.
- Aradığınız biçimi tam olarak kelimelerle belirtin (ör. yukarıdaki italik cümle).
- İ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
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:
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:
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 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.
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:
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:
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 "`¶m1=val1¶m2=val2`" dizesini ekleyerek iki ek parametre eklemeyi deneyin. Sayfayı yeniden yüklediğinizde şuna benzer bir şey görürsünüz:
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 konusunum_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:
Ç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:
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 konusunum_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:
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:
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!
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
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.
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.
10. Temizleme
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!
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...
- Cloud Run ile Üç Kolay Adımda Geliştirmeden Üretime
- Vertex AI ve Svelte Kit içeren Metin Özetleyici uygulaması
- Cloud Run'da PaLM API ile Chat Uygulaması
- PaLM Text Bison modellerini sarmalayan Cloud Functions işlevi
- Spanner ve Vertex AI Imagen API ile Üretken Yapay Zeka'ya veri aktarma
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.
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.