1. Genel Bakış
Üretken yapay zeka uygulamaları da diğer uygulamalar gibi gözlemlenebilirlik gerektirir. Üretken yapay zeka için özel gözlemlenebilirlik teknikleri gerekli mi?
Bu laboratuvarda basit bir üretken yapay zeka uygulaması oluşturacaksınız. Cloud Run'a dağıtın. Ayrıca, Google Cloud gözlemlenebilirlik hizmetlerini ve ürünlerini kullanarak gerekli izleme ve günlük kaydı özellikleriyle donatın.
Öğrenecekleriniz
- Cloud Shell Düzenleyici ile Vertex AI kullanan bir uygulama yazma
- Uygulama kodunuzu GitHub'da depolama
- Uygulamanızın kaynak kodunu Cloud Run'a dağıtmak için gcloud KSA'yı kullanın
- Üretken yapay zeka uygulamanıza izleme ve günlük kaydı özellikleri ekleme
- Günlük tabanlı metrikleri kullanma
- Open Telemetry SDK'sı ile günlük kaydını ve izlemeyi uygulama
- Sorumlu yapay zeka verileriyle ilgili analizler edinme
2. Ön koşullar
Google Hesabınız yoksa yeni bir hesap oluşturmanız gerekir.
3. Proje ayarlama
- Google Hesabınızla Google Cloud Console'da oturum açın.
- Yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanmayı seçin. Yeni oluşturduğunuz veya seçtiğiniz projenin proje kimliğini not edin.
- Proje için faturalandırmayı etkinleştirin.
- Bu laboratuvarı tamamlamanın faturalandırma maliyeti 5 ABD dolarından az olmalıdır.
- Daha fazla ödeme alınmaması için bu laboratuvarın sonundaki adımları uygulayarak kaynakları silebilirsiniz.
- Yeni kullanıcılar 300 ABD doları tutarındaki ücretsiz deneme sürümünden yararlanabilir.
- Cloud Faturalandırma'daki Projelerim bölümünde faturalandırmanın etkinleştirildiğini onaylayın
- Yeni projenizin
Billing account
sütunundaBilling is disabled
yazıyorsa:Actions
sütunundaki üç noktayı tıklayın- Faturalandırmayı değiştir'i tıklayın.
- Kullanmak istediğiniz faturalandırma hesabını seçin
- Canlı bir etkinliğe katılıyorsanız hesabın adı büyük olasılıkla Google Cloud Platform Deneme Sürümü Faturalandırma Hesabı şeklinde olacaktır.
- Yeni projenizin
4. Cloud Shell Düzenleyici'yi hazırlama
- Cloud Shell Düzenleyici'ye gidin. Cloud Shell'in kimlik bilgilerinizle gcloud'u çağırması için yetkilendirilmesini isteyen aşağıdaki mesaj gösterilirse devam etmek üzere Yetkilendir'i tıklayın.
- Terminal penceresini açma
- Hamburger menüsünü
tıklayın.
- Terminal'i tıklayın.
- Yeni Terminal
'i tıklayın.
- Hamburger menüsünü
- Terminalde proje kimliğinizi yapılandırın:
gcloud config set project [PROJECT_ID]
[PROJECT_ID]
yerine projenizin kimliğini yazın. Örneğin, proje kimliğinizlab-example-project
ise komut şu şekilde olur: gcloud'un GCPI API için kimlik bilgilerinizi istediğini belirten aşağıdaki mesajı görürseniz devam etmek üzere Yetkilendir'i tıklayın.gcloud config set project lab-project-id-example
İşlem başarıyla tamamlandığında aşağıdaki mesajı görürsünüz:Updated property [core/project].
WARNING
görüyorsanız veDo you want to continue (Y/N)?
soruyorsanız proje kimliğini yanlış girdiğiniz muhtemeldir. Doğru proje kimliğini bulduktan sonraN
,Enter
tuşlarına basın vegcloud config set project
komutunu tekrar çalıştırmayı deneyin. - (İsteğe bağlı) Proje kimliğini bulmakta sorun yaşıyorsanız tüm projelerinizin proje kimliğini, oluşturma zamanına göre azalan düzende görmek için aşağıdaki komutu çalıştırın:
gcloud projects list \ --format='value(projectId,createTime)' \ --sort-by=~createTime
5. Google API'lerini etkinleştirme
Terminalde, bu laboratuvar için gerekli olan Google API'lerini etkinleştirin:
gcloud services enable \
run.googleapis.com \
cloudbuild.googleapis.com \
aiplatform.googleapis.com \
logging.googleapis.com \
monitoring.googleapis.com \
cloudtrace.googleapis.com
Bu komutun tamamlanması biraz zaman alacaktır. Sonunda şuna benzer bir başarılı mesaj gösterilir:
Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.
ERROR: (gcloud.services.enable) HttpError accessing
ile başlayan ve aşağıdaki gibi hata ayrıntıları içeren bir hata mesajı alırsanız 1-2 dakika bekledikten sonra komutu tekrar deneyin.
"error": { "code": 429, "message": "Quota exceeded for quota metric 'Mutate requests' and limit 'Mutate requests per minute' of service 'serviceusage.googleapis.com' ...", "status": "RESOURCE_EXHAUSTED", ... }
6. Üretken yapay zeka uygulaması oluşturma
Bu adımda, seçtiğiniz bir hayvanla ilgili 10 ilginç bilgi göstermek için Gemini modelini kullanan basit bir istek tabanlı uygulamanın kodunu yazacaksınız. Uygulama kodunu oluşturmak için aşağıdakileri yapın.
- Terminalde
codelab-o11y
dizinini oluşturun:mkdir "${HOME}/codelab-o11y"
- Mevcut dizini
codelab-o11y
olarak değiştirin:cd "${HOME}/codelab-o11y"
- Spring çerçevesi başlatıcısını kullanarak Java uygulamasının önyükleme kodunu indirin:
curl https://start.spring.io/starter.zip \ -d dependencies=web \ -d javaVersion=17 \ -d type=maven-project \ -d bootVersion=3.4.1 -o java-starter.zip
- Önyükleme kodunun arşivini mevcut klasöre açın:
unzip java-starter.zip
- Ardından, arşiv dosyasını klasörden kaldırın:
rm java-starter.zip
- Kodu Cloud Run'a dağıtırken kullanılacak Java Runtime sürümünü tanımlamak için
project.toml
dosyası oluşturun:cat > "${HOME}/codelab-o11y/project.toml" << EOF [[build.env]] name = "GOOGLE_RUNTIME_VERSION" value = "17" EOF
- Google Cloud SDK bağımlılıklarını
pom.xml
dosyasına ekleyin:- Google Cloud Core paketini ekleme:
sed -i 's/<dependencies>/<dependencies>\ \ <dependency>\ <groupId>com.google.cloud<\/groupId>\ <artifactId>google-cloud-core<\/artifactId>\ <version>2.49.1<\/version>\ <\/dependency>\ /g' "${HOME}/codelab-o11y/pom.xml"
- Google Cloud Vertex AI paketini ekleyin:
sed -i 's/<dependencies>/<dependencies>\ \ <dependency>\ <groupId>com.google.cloud<\/groupId>\ <artifactId>google-cloud-vertexai<\/artifactId>\ <version>1.16.0<\/version>\ <\/dependency>\ /g' "${HOME}/codelab-o11y/pom.xml"
- Google Cloud Core paketini ekleme:
DemoApplication.java
dosyasını Cloud Shell Düzenleyici'de açın: Artık terminalin üzerindeki düzenleyici penceresindecloudshell edit "${HOME}/codelab-o11y/src/main/java/com/example/demo/DemoApplication.java"
DemoApplication.java
dosyasının iskeletli kaynak kodu gösterilecektir. Dosyanın kaynak kodu aşağıdakine benzer olacaktır:package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
- Düzenleyicideki kodu aşağıda gösterilen sürümle değiştirin. Kodu değiştirmek için dosyanın içeriğini silin ve aşağıdaki kodu düzenleyiciye kopyalayın:
Cloud Shell Düzenleyici, birkaç saniye sonra kodunuzu otomatik olarak kaydeder.package com.example.demo; import java.io.IOException; import java.util.Collections; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.google.cloud.ServiceOptions; import com.google.cloud.vertexai.VertexAI; import com.google.cloud.vertexai.api.GenerateContentResponse; import com.google.cloud.vertexai.generativeai.GenerativeModel; import com.google.cloud.vertexai.generativeai.ResponseHandler; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { String port = System.getenv().getOrDefault("PORT", "8080"); SpringApplication app = new SpringApplication(DemoApplication.class); app.setDefaultProperties(Collections.singletonMap("server.port", port)); app.run(args); } } @RestController class HelloController { private final String projectId = ServiceOptions.getDefaultProjectId(); private VertexAI vertexAI; private GenerativeModel model; @PostConstruct public void init() { vertexAI = new VertexAI(projectId, "us-central1"); model = new GenerativeModel("gemini-1.5-flash", vertexAI); } @PreDestroy public void destroy() { vertexAI.close(); } @GetMapping("/") public String getFacts(@RequestParam(defaultValue = "dog") String animal) throws IOException { String prompt = "Give me 10 fun facts about " + animal + ". Return this as html without backticks."; GenerateContentResponse response = model.generateContent(prompt); return ResponseHandler.getText(response); } }
Yapay zeka üretme uygulamasının kodunu Cloud Run'a dağıtma
- Terminal penceresinde, uygulamanın kaynak kodunu Cloud Run'a dağıtmak için komutu çalıştırın.
Aşağıdaki gibi bir istem görürseniz komutun yeni bir depo oluşturacağını bildiriyordur.gcloud run deploy codelab-o11y-service \ --source="${HOME}/codelab-o11y/" \ --region=us-central1 \ --allow-unauthenticated
Enter
simgesini tıklayın. Yayınlama işlemi birkaç dakika sürebilir. Dağıtım işlemi tamamlandıktan sonra aşağıdaki gibi bir çıkış görürsünüz:Deploying from source requires an Artifact Registry Docker repository to store built containers. A repository named [cloud-run-source-deploy] in region [us-central1] will be created. Do you want to continue (Y/n)?
Service [codelab-o11y-service] revision [codelab-o11y-service-00001-t2q] has been deployed and is serving 100 percent of traffic. Service URL: https://codelab-o11y-service-12345678901.us-central1.run.app
- Görüntülenen Cloud Run hizmet URL'sini tarayıcınızdaki ayrı bir sekmeye veya pencereye kopyalayın. Alternatif olarak, hizmet URL'sini yazdırmak için terminalde aşağıdaki komutu çalıştırın ve Ctrl tuşunu basılı tutarken gösterilen URL'yi tıklayarak URL'yi açın:
URL açıldığında 500 hatası alabilir veya şu mesajı görebilirsiniz:gcloud run services list \ --format='value(URL)' \ --filter='SERVICE:"codelab-o11y-service"'
Bu, hizmetlerin dağıtımı tamamlanmadığı anlamına gelir. Birkaç dakika bekleyip sayfayı yenileyin. Sonunda, Köpekler Hakkında İlginç Bilgiler ile başlayan ve köpeklerle ilgili 10 ilginç bilgi içeren bir metin görürsünüz.Sorry, this is just a placeholder...
Farklı hayvanlar hakkında eğlenceli bilgiler edinmek için uygulamayla etkileşim kurmayı deneyin. Bunu yapmak için URL'ye animal
parametresini ekleyin. Örneğin, [ANIMAL]
bir hayvan adıysa ?animal=[ANIMAL]
. Örneğin, kediler hakkında 10 ilginç bilgi almak için ?animal=cat
, deniz kaplumbağaları hakkında 10 ilginç bilgi almak için ?animal=sea turtle
ekleyin.
7. Vertex API çağrılarınızı denetleme
Google API çağrılarının denetlenmesi, "Belirli bir API'yi kim, nerede ve ne zaman çağırıyor?" gibi soruların yanıtlarını sağlar. Uygulamanızda sorun giderirken, kaynak tüketimini araştırırken veya yazılım adli tıp analizi yaparken denetim önemlidir.
Denetleme günlükleri, yönetim ve sistem etkinliklerini izlemenize ve "veri okuma" ve "veri yazma" API işlemlerine yönelik çağrıları kaydetmenize olanak tanır. İçerik oluşturmak için Vertex AI isteklerini denetlemek istiyorsanız Cloud Console'da "Veri Okuma" denetleme günlüklerini etkinleştirmeniz gerekir.
- Cloud Console'da Denetleme Günlükleri sayfasını açmak için aşağıdaki düğmeyi tıklayın
- Sayfada, bu laboratuvar için oluşturduğunuz projenin seçili olduğundan emin olun. Seçilen proje, sayfanın sol üst köşesinde hamburger menüsünün hemen yanında gösterilir:
Gerekirse, açılır listeden doğru projeyi seçin. - Veri erişimi denetim günlükleri yapılandırması tablosunda, Hizmet sütununda
Vertex AI API
hizmetini bulun ve hizmet adının solunda bulunan onay kutusunu işaretleyerek hizmeti seçin. - Sağdaki bilgi panelinde "Veri Okuma" denetim türünü seçin.
- Kaydet'i tıklayın.
Denetleme günlükleri oluşturmak için hizmet URL'sini açın. Farklı sonuçlar almak için ?animal=
parametresinin değerini değiştirirken sayfayı yenileyin.
Denetleme günlüklerini keşfetme
- Cloud Console'da Günlük Gezgini sayfasını açmak için aşağıdaki düğmeyi tıklayın:
- Aşağıdaki filtreyi Sorgu bölmesine yapıştırın.
Sorgu bölmesi, Günlük Gezgini sayfasının üst kısmında bulunan bir düzenleyicidir:LOG_ID("cloudaudit.googleapis.com%2Fdata_access") AND protoPayload.serviceName="aiplatform.googleapis.com"
- Sorguyu çalıştır'ı tıklayın.
- Denetleme günlük girişlerinden birini seçin ve günlükte yakalanan bilgileri incelemek için alanları genişletin.
Kullanılan yöntem ve model de dahil olmak üzere Vertex API çağrısıyla ilgili ayrıntıları görebilirsiniz. Ayrıca, çağrıyı başlatanın kimliğini ve hangi izinlerin çağrıyı yetkilendirdiğini de görebilirsiniz.
8. Üretken yapay zeka ile etkileşimleri günlüğe kaydetme
Denetleme günlüklerinde API istek parametreleri veya yanıt verileri bulunmaz. Ancak bu bilgiler, uygulama ve iş akışı analiziyle ilgili sorunları gidermek için önemli olabilir. Bu adımda, uygulama günlüğü ekleyerek bu boşluğu dolduruyoruz.
Uygulama günlüklerini standart çıkışa yazdırmak için Spring Boot ile Logback kullanılır. Bu yöntem, standart çıkışa yazdırılan bilgileri yakalayıp Cloud Logging'e otomatik olarak besleme özelliğine sahip Cloud Run'u kullanır. Bilgilerin yapılandırılmış veri olarak yakalanabilmesi için basılı günlükler uygun şekilde biçimlendirilmelidir. Uygulamaya yapılandırılmış günlük kaydı özellikleri eklemek için aşağıdaki talimatları uygulayın.
- Tarayıcınızdaki "Cloud Shell" penceresine (veya sekmesine) dönün.
- Cloud Shell Düzenleyici'de yeni bir dosya
LoggingEventGoogleCloudEncoder.java
oluşturup açın:cloudshell edit "${HOME}/codelab-o11y/src/main/java/com/example/demo/LoggingEventGoogleCloudEncoder.java"
- Günlüğü, Google Cloud yapılandırılmış günlük biçimine uygun şekilde dize haline getirilmiş bir JSON olarak kodlayan Logback kodlayıcıyı uygulamak için aşağıdaki kodu kopyalayıp yapıştırın:
package com.example.demo; import static ch.qos.logback.core.CoreConstants.UTF_8_CHARSET; import java.time.Instant; import ch.qos.logback.core.encoder.EncoderBase; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.spi.ILoggingEvent; import java.util.HashMap; import com.google.gson.Gson; public class LoggingEventGoogleCloudEncoder extends EncoderBase<ILoggingEvent> { private static final byte[] EMPTY_BYTES = new byte[0]; private final Gson gson = new Gson(); @Override public byte[] headerBytes() { return EMPTY_BYTES; } @Override public byte[] encode(ILoggingEvent e) { var timestamp = Instant.ofEpochMilli(e.getTimeStamp()); var fields = new HashMap<String, Object>() { { put("timestamp", timestamp.toString()); put("severity", severityFor(e.getLevel())); put("message", e.getMessage()); } }; var params = e.getKeyValuePairs(); if (params != null && params.size() > 0) { params.forEach(kv -> fields.putIfAbsent(kv.key, kv.value)); } var data = gson.toJson(fields) + "\n"; return data.getBytes(UTF_8_CHARSET); } @Override public byte[] footerBytes() { return EMPTY_BYTES; } private static String severityFor(Level level) { switch (level.toInt()) { case Level.TRACE_INT: return "DEBUG"; case Level.DEBUG_INT: return "DEBUG"; case Level.INFO_INT: return "INFO"; case Level.WARN_INT: return "WARNING"; case Level.ERROR_INT: return "ERROR"; default: return "DEFAULT"; } } }
- Cloud Shell Düzenleyici'de yeni bir dosya
logback.xml
oluşturup açın:cloudshell edit "${HOME}/codelab-o11y/src/main/resources/logback.xml"
- Logback'i, kodlayıcıyı standart çıkışa günlük yazdıran Logback ekleyiciyle kullanacak şekilde yapılandırmak için aşağıdaki XML'i kopyalayıp yapıştırın:
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="true"> <appender name="Console" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="com.example.demo.LoggingEventGoogleCloudEncoder"/> </appender> <root level="info"> <appender-ref ref="Console" /> </root> </configuration>
DemoApplication.java
dosyasını Cloud Shell Düzenleyici'de yeniden açın:cloudshell edit "${HOME}/codelab-o11y/src/main/java/com/example/demo/DemoApplication.java"
- Gen AI isteğini ve yanıtını günlüğe kaydetmek için düzenleyicideki kodu aşağıda gösterilen sürümle değiştirin. Kodu değiştirmek için dosyanın içeriğini silin ve aşağıdaki kodu düzenleyiciye kopyalayın:
package com.example.demo; import java.io.IOException; import java.util.Collections; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.google.cloud.ServiceOptions; import com.google.cloud.vertexai.VertexAI; import com.google.cloud.vertexai.api.GenerateContentResponse; import com.google.cloud.vertexai.generativeai.GenerativeModel; import com.google.cloud.vertexai.generativeai.ResponseHandler; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { String port = System.getenv().getOrDefault("PORT", "8080"); SpringApplication app = new SpringApplication(DemoApplication.class); app.setDefaultProperties(Collections.singletonMap("server.port", port)); app.run(args); } } @RestController class HelloController { private final String projectId = ServiceOptions.getDefaultProjectId(); private VertexAI vertexAI; private GenerativeModel model; private final Logger LOGGER = LoggerFactory.getLogger(HelloController.class); @PostConstruct public void init() { vertexAI = new VertexAI(projectId, "us-central1"); model = new GenerativeModel("gemini-1.5-flash", vertexAI); } @PreDestroy public void destroy() { vertexAI.close(); } @GetMapping("/") public String getFacts(@RequestParam(defaultValue = "dog") String animal) throws IOException { String prompt = "Give me 10 fun facts about " + animal + ". Return this as html without backticks."; GenerateContentResponse response = model.generateContent(prompt); LOGGER.atInfo() .addKeyValue("animal", animal) .addKeyValue("prompt", prompt) .addKeyValue("response", response) .log("Content is generated"); return ResponseHandler.getText(response); } }
Cloud Shell Düzenleyici, birkaç saniye sonra değişikliklerinizi otomatik olarak kaydeder.
Yapay zeka üretme uygulamasının kodunu Cloud Run'a dağıtma
- Terminal penceresinde, uygulamanın kaynak kodunu Cloud Run'a dağıtmak için komutu çalıştırın.
Aşağıdaki gibi bir istem görürseniz komutun yeni bir depo oluşturacağını bildiriyordur.gcloud run deploy codelab-o11y-service \ --source="${HOME}/codelab-o11y/" \ --region=us-central1 \ --allow-unauthenticated
Enter
simgesini tıklayın. Yayınlama işlemi birkaç dakika sürebilir. Dağıtım işlemi tamamlandıktan sonra aşağıdaki gibi bir çıkış görürsünüz:Deploying from source requires an Artifact Registry Docker repository to store built containers. A repository named [cloud-run-source-deploy] in region [us-central1] will be created. Do you want to continue (Y/n)?
Service [codelab-o11y-service] revision [codelab-o11y-service-00001-t2q] has been deployed and is serving 100 percent of traffic. Service URL: https://codelab-o11y-service-12345678901.us-central1.run.app
- Görüntülenen Cloud Run hizmet URL'sini tarayıcınızdaki ayrı bir sekmeye veya pencereye kopyalayın. Alternatif olarak, hizmet URL'sini yazdırmak için terminalde aşağıdaki komutu çalıştırın ve Ctrl tuşunu basılı tutarken gösterilen URL'yi tıklayarak URL'yi açın:
URL açıldığında 500 hatası alabilir veya şu mesajı görebilirsiniz:gcloud run services list \ --format='value(URL)' \ --filter='SERVICE:"codelab-o11y-service"'
Bu, hizmetlerin dağıtımı tamamlanmadığı anlamına gelir. Birkaç dakika bekleyip sayfayı yenileyin. Sonunda, Köpekler Hakkında İlginç Bilgiler ile başlayan ve köpeklerle ilgili 10 ilginç bilgi içeren bir metin görürsünüz.Sorry, this is just a placeholder...
Uygulama günlükleri oluşturmak için hizmet URL'sini açın. Farklı sonuçlar almak için ?animal=
parametresinin değerini değiştirirken sayfayı yenileyin.
Uygulama günlüklerini görmek için şunları yapın:
- Cloud Console'da Günlük gezgini sayfasını açmak için aşağıdaki düğmeyi tıklayın:
- Aşağıdaki filtreyi sorgu bölmesine (Günlük gezgini arayüzünde 2. öğe) yapıştırın:
LOG_ID("run.googleapis.com%2Fstdout") AND severity=DEBUG
- Sorguyu çalıştır'ı tıklayın.
Sorgunun sonucu, istemi ve güvenlik derecelendirmelerini içeren Vertex AI yanıtını içeren günlükleri gösterir.
9. Üretken yapay zeka ile etkileşimleri sayma
Cloud Run, dağıtılan hizmetleri izlemek için kullanılabilecek yönetilen metrikler yazar. Kullanıcı tarafından yönetilen izleme metrikleri, veriler ve metrik güncellemesinin sıklığı üzerinde daha fazla kontrol sağlar. Bu tür bir metriği uygulamak için verileri toplayıp Cloud Monitoring'e yazan bir kod yazmanız gerekir. OpenTelemetry SDK'sını kullanarak uygulama yöntemi için sonraki (isteğe bağlı) adıma bakın.
Bu adımda, kullanıcı metriğini koda uygulamanın alternatifi olan günlüğe dayalı metrikler gösterilmektedir. Günlüğe dayalı metrikler, uygulamanızın Cloud Logging'e yazdığı günlük girişlerinden izleme metrikleri oluşturmanıza olanak tanır. Tür sayıcı türüne sahip, günlük tabanlı bir metrik tanımlamak için önceki adımda uyguladığımız uygulama günlüklerini kullanacağız. Metrik, Vertex API'ye yapılan başarılı çağrıların sayısını sayar.
- Önceki adımda kullandığımız Günlük gezgini penceresine bakın. Sorgu bölmesinin altında İşlemler açılır menüsünü bulun ve açmak için tıklayın. Menüyü bulmak için aşağıdaki ekran görüntüsüne bakın:
- Açılan menüde Günlüğe dayalı metrik oluştur panelini açmak için Metrik oluştur'u seçin.
- Günlük tabanlı metrik oluştur panelinde yeni bir sayaç metriği yapılandırmak için aşağıdaki adımları uygulayın:
- Metrik türünü ayarlayın: Sayaç'ı seçin.
- Ayrıntılar bölümünde aşağıdaki alanları ayarlayın:
- Günlük kaydı metriği adı: Adı
model_interaction_count
olarak ayarlayın. Bazı adlandırma kısıtlamaları geçerlidir. Ayrıntılar için adlandırma kısıtlamaları Sorun giderme bölümüne bakın. - Açıklama: Metrik için bir açıklama girin. Örneğin,
Number of log entries capturing successful call to model inference.
- Birimler: Bu alanı boş bırakın veya
1
rakamını ekleyin.
- Günlük kaydı metriği adı: Adı
- Filtre seçimi bölümündeki değerleri olduğu gibi bırakın. Derleme filtresi alanının, uygulama günlüklerini görmek için kullandığımız filtreyle aynı olduğunu unutmayın.
- (İsteğe bağlı) Her hayvan için yapılan arama sayısını saymanıza yardımcı olacak bir etiket ekleyin. NOT: Bu etiket, metriğin kardinalitesini büyük ölçüde artırma potansiyeline sahiptir ve üretimde kullanılması önerilmez:
- Etiket ekle'yi tıklayın.
- Etiketler bölümünde aşağıdaki alanları ayarlayın:
- Etiket adı: Adı
animal
olarak ayarlayın. - Açıklama: Etiketin açıklamasını girin. Örneğin,
Animal parameter
. - Etiket türü:
STRING
öğesini seçin. - Alan adı:
jsonPayload.animal
yazın. - Normal ifade: Boş bırakın.
- Etiket adı: Adı
- Bitti'yi tıklayın
- Metriği oluşturmak için Metrik oluştur'u tıklayın.
Günlük tabanlı metrikler sayfasından gcloud logging metrics create
CLI komutunu veya google_logging_metric
Terraform kaynağını kullanarak da günlük tabanlı metrik oluşturabilirsiniz.
Metrik verileri oluşturmak için hizmet URL'sini açın. Modele birden fazla çağrı yapmak için açılan sayfayı birkaç kez yenileyin. Önceki gibi, parametrede farklı hayvanlar kullanmayı deneyin.
Günlük tabanlı metrik verilerini aramak için PromQL sorgusunu girin. PromQL sorgusu girmek için aşağıdakileri yapın:
- Cloud Console'da Metrik Gezgini sayfasını açmak için aşağıdaki düğmeyi tıklayın:
- Sorgu oluşturucu bölmesinin araç çubuğunda, adı < > MQL veya < > PromQL olan düğmeyi seçin. Düğmenin konumu için aşağıdaki resme bakın.
- Dil açma/kapatma düğmesinde PromQL'nin seçili olduğunu doğrulayın. Dil değiştirme düğmesi, sorgunuzu biçimlendirmenize olanak tanıyan aynı araç çubuğunda bulunur.
- Sorgunuzu Sorgular düzenleyicisine girin:
PromQL'yi kullanma hakkında daha fazla bilgi için Cloud Monitoring'de PromQL başlıklı makaleyi inceleyin.sum(rate(logging_googleapis_com:user_model_interaction_count{monitored_resource="cloud_run_revision"}[${__interval}]))
- Sorgu Çalıştır'ı tıklayın. Bu ekran görüntüsüne benzer bir çizgi grafik görürsünüz:
Otomatik çalıştırma açma/kapatma düğmesi etkinleştirildiğinde Sorguyu çalıştır düğmesinin gösterilmediğini unutmayın.
10. (İsteğe bağlı) İzleme ve izleme için Open Telemetry'yi kullanma
Önceki adımda belirtildiği gibi, OpenTelemetry (Otel) SDK'sını kullanarak metrikleri uygulamak mümkündür. Çok hizmetli mimarilerde OTel kullanılması önerilir. Bu adımda, bir Spring Boot uygulamasına OTel enstrümantasyonu ekleme gösterilmektedir. Bu adımda şunları yapacaksınız:
- Spring Boot uygulamasını otomatik izleme özellikleriyle donatma
- Birkaç başarılı model çağrısını izlemek için bir sayaç metriği uygulama
- İzlemeyi uygulama günlükleriyle ilişkilendirme
Ürün düzeyindeki hizmetler için önerilen mimari, birden fazla hizmetten gelen tüm gözlemlenebilirlik verilerini toplamak ve beslemek için OTel toplayıcı'yı kullanmaktır. Bu adımdaki kod, basitlik açısından toplayıcıyı kullanmaz. Bunun yerine, verileri doğrudan Google Cloud'a yazan OTel dışa aktarma işlemlerini kullanır.
OTel bileşenleri ve otomatik izleme ile Spring Boot uygulaması oluşturma
- Tarayıcınızdaki "Cloud Shell" penceresine (veya sekmesine) dönün.
- Terminalde
application.permissions
dosyasını ek yapılandırma parametreleriyle güncelleyin: Bu parametreler, gözlemlenebilirlik verilerinin Cloud Trace ve Cloud Monitoring'e aktarılmasını tanımlar ve tüm izlerin örneklenmesini zorunlu kılar.cat >> "${HOME}/codelab-o11y/src/main/resources/application.properties" << EOF otel.logs.exporter=none otel.traces.exporter=google_cloud_trace otel.metrics.exporter=google_cloud_monitoring otel.resource.attributes.service.name=codelab-o11y-service otel.traces.sampler=always_on EOF
- Gerekli OpenTelemetry bağımlılıklarını
pom.xml
dosyasına ekleyin:sed -i 's/<dependencies>/<dependencies>\ \ <dependency>\ <groupId>io.opentelemetry.instrumentation<\/groupId>\ <artifactId>opentelemetry-spring-boot-starter<\/artifactId>\ <\/dependency>\ <dependency>\ <groupId>com.google.cloud.opentelemetry<\/groupId>\ <artifactId>exporter-auto<\/artifactId>\ <version>0.33.0-alpha<\/version>\ <\/dependency>\ <dependency>\ <groupId>com.google.cloud.opentelemetry<\/groupId>\ <artifactId>exporter-trace<\/artifactId>\ <version>0.33.0<\/version>\ <\/dependency>\ <dependency>\ <groupId>com.google.cloud.opentelemetry<\/groupId>\ <artifactId>exporter-metrics<\/artifactId>\ <version>0.33.0<\/version>\ <\/dependency>\ /g' "${HOME}/codelab-o11y/pom.xml"
pom.xml
dosyasına OpenTelemetry BOM'u ekleyin:sed -i 's/<\/properties>/<\/properties>\ <dependencyManagement>\ <dependencies>\ <dependency>\ <groupId>io.opentelemetry.instrumentation<\/groupId>\ <artifactId>opentelemetry-instrumentation-bom<\/artifactId>\ <version>2.12.0<\/version>\ <type>pom<\/type>\ <scope>import<\/scope>\ <\/dependency>\ <\/dependencies>\ <\/dependencyManagement>\ /g' "${HOME}/codelab-o11y/pom.xml"
DemoApplication.java
dosyasını Cloud Shell Düzenleyici'de yeniden açın:cloudshell edit "${HOME}/codelab-o11y/src/main/java/com/example/demo/DemoApplication.java"
- Mevcut kodu, performans metriğini artıran sürümle değiştirin. Kodu değiştirmek için dosyanın içeriğini silin ve aşağıdaki kodu düzenleyiciye kopyalayın:
package com.example.demo; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.metrics.LongCounter; import java.io.IOException; import java.util.Collections; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.google.cloud.ServiceOptions; import com.google.cloud.vertexai.VertexAI; import com.google.cloud.vertexai.api.GenerateContentResponse; import com.google.cloud.vertexai.generativeai.GenerativeModel; import com.google.cloud.vertexai.generativeai.ResponseHandler; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { String port = System.getenv().getOrDefault("PORT", "8080"); SpringApplication app = new SpringApplication(DemoApplication.class); app.setDefaultProperties(Collections.singletonMap("server.port", port)); app.run(args); } } @RestController class HelloController { private final String projectId = ServiceOptions.getDefaultProjectId(); private VertexAI vertexAI; private GenerativeModel model; private final Logger LOGGER = LoggerFactory.getLogger(HelloController.class); private static final String INSTRUMENTATION_NAME = "genai-o11y/java/workshop/example"; private static final AttributeKey<String> ANIMAL = AttributeKey.stringKey("animal"); private final LongCounter counter; public HelloController(OpenTelemetry openTelemetry) { this.counter = openTelemetry.getMeter(INSTRUMENTATION_NAME) .counterBuilder("model_call_counter") .setDescription("Number of successful model calls") .build(); } @PostConstruct public void init() { vertexAI = new VertexAI(projectId, "us-central1"); model = new GenerativeModel("gemini-1.5-flash", vertexAI); } @PreDestroy public void destroy() { vertexAI.close(); } @GetMapping("/") public String getFacts(@RequestParam(defaultValue = "dog") String animal) throws IOException { String prompt = "Give me 10 fun facts about " + animal + ". Return this as html without backticks."; GenerateContentResponse response = model.generateContent(prompt); LOGGER.atInfo() .addKeyValue("animal", animal) .addKeyValue("prompt", prompt) .addKeyValue("response", response) .log("Content is generated"); counter.add(1, Attributes.of(ANIMAL, animal)); return ResponseHandler.getText(response); } }
LoggingEventGoogleCloudEncoder.java
dosyasını Cloud Shell Düzenleyici'de yeniden açın:cloudshell edit "${HOME}/codelab-o11y/src/main/java/com/example/demo/LoggingEventGoogleCloudEncoder.java"
- Mevcut kodu, yazılı günlüklere izleme özellikleri ekleyen sürümle değiştirin. Özellikleri eklemek, günlüklerin doğru izleme aralıkları ile ilişkilendirilmesini sağlar. Kodu değiştirmek için dosyanın içeriğini silin ve aşağıdaki kodu düzenleyiciye kopyalayın:
package com.example.demo; import static ch.qos.logback.core.CoreConstants.UTF_8_CHARSET; import java.time.Instant; import java.util.HashMap; import ch.qos.logback.core.encoder.EncoderBase; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.spi.ILoggingEvent; import com.google.cloud.ServiceOptions; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.context.Context; import com.google.gson.Gson; public class LoggingEventGoogleCloudEncoder extends EncoderBase<ILoggingEvent> { private static final byte[] EMPTY_BYTES = new byte[0]; private final Gson gson; private final String projectId; private final String tracePrefix; public LoggingEventGoogleCloudEncoder() { this.gson = new Gson(); this.projectId = lookUpProjectId(); this.tracePrefix = "projects/" + (projectId == null ? "" : projectId) + "/traces/"; } private static String lookUpProjectId() { return ServiceOptions.getDefaultProjectId(); } @Override public byte[] headerBytes() { return EMPTY_BYTES; } @Override public byte[] encode(ILoggingEvent e) { var timestamp = Instant.ofEpochMilli(e.getTimeStamp()); var fields = new HashMap<String, Object>() { { put("timestamp", timestamp.toString()); put("severity", severityFor(e.getLevel())); put("message", e.getMessage()); SpanContext context = Span.fromContext(Context.current()).getSpanContext(); if (context.isValid()) { put("logging.googleapis.com/trace", tracePrefix + context.getTraceId()); put("logging.googleapis.com/spanId", context.getSpanId()); put("logging.googleapis.com/trace_sampled", Boolean.toString(context.isSampled())); } } }; var params = e.getKeyValuePairs(); if (params != null && params.size() > 0) { params.forEach(kv -> fields.putIfAbsent(kv.key, kv.value)); } var data = gson.toJson(fields) + "\n"; return data.getBytes(UTF_8_CHARSET); } @Override public byte[] footerBytes() { return EMPTY_BYTES; } private static String severityFor(Level level) { switch (level.toInt()) { case Level.TRACE_INT: return "DEBUG"; case Level.DEBUG_INT: return "DEBUG"; case Level.INFO_INT: return "INFO"; case Level.WARN_INT: return "WARNING"; case Level.ERROR_INT: return "ERROR"; default: return "DEFAULT"; } } }
Cloud Shell Düzenleyici, birkaç saniye sonra değişikliklerinizi otomatik olarak kaydeder.
Yapay zeka üretme uygulamasının kodunu Cloud Run'a dağıtma
- Terminal penceresinde, uygulamanın kaynak kodunu Cloud Run'a dağıtmak için komutu çalıştırın.
Aşağıdaki gibi bir istem görürseniz komutun yeni bir depo oluşturacağını bildiriyordur.gcloud run deploy codelab-o11y-service \ --source="${HOME}/codelab-o11y/" \ --region=us-central1 \ --allow-unauthenticated
Enter
simgesini tıklayın. Yayınlama işlemi birkaç dakika sürebilir. Dağıtım işlemi tamamlandıktan sonra aşağıdaki gibi bir çıkış görürsünüz:Deploying from source requires an Artifact Registry Docker repository to store built containers. A repository named [cloud-run-source-deploy] in region [us-central1] will be created. Do you want to continue (Y/n)?
Service [codelab-o11y-service] revision [codelab-o11y-service-00001-t2q] has been deployed and is serving 100 percent of traffic. Service URL: https://codelab-o11y-service-12345678901.us-central1.run.app
- Görüntülenen Cloud Run hizmet URL'sini tarayıcınızdaki ayrı bir sekmeye veya pencereye kopyalayın. Alternatif olarak, hizmet URL'sini yazdırmak için terminalde aşağıdaki komutu çalıştırın ve Ctrl tuşunu basılı tutarken gösterilen URL'yi tıklayarak URL'yi açın:
URL açıldığında 500 hatası alabilir veya şu mesajı görebilirsiniz:gcloud run services list \ --format='value(URL)' \ --filter='SERVICE:"codelab-o11y-service"'
Bu, hizmetlerin dağıtımı tamamlanmadığı anlamına gelir. Birkaç dakika bekleyip sayfayı yenileyin. Sonunda, Köpekler Hakkında İlginç Bilgiler ile başlayan ve köpeklerle ilgili 10 ilginç bilgi içeren bir metin görürsünüz.Sorry, this is just a placeholder...
Telemetri verileri oluşturmak için hizmet URL'sini açın. Farklı sonuçlar almak için ?animal=
parametresinin değerini değiştirirken sayfayı yenileyin.
Uygulama izlerini keşfetme
- Cloud Console'da Trace Explorer sayfasını açmak için aşağıdaki düğmeyi tıklayın:
- En son izlemelerden birini seçin. Aşağıdaki ekran görüntüsüne benzeyen 5 veya 6 span görmeniz gerekir.
- Etkinlik işleyiciye yapılan çağrıyı izleyen aralığı (
fun_facts
yöntemi) bulun./
adlı son span olacaktır. - İzleme ayrıntıları bölmesinde Günlükler ve etkinlikler'i seçin. Bu belirli aralıkla ilişkili uygulama günlüklerini görürsünüz. İlişkilendirme, iz ve günlükteki iz ve aralık kimlikleri kullanılarak algılanır. İstemi yazan uygulama günlüğünü ve Vertex API'nin yanıtını görmeniz gerekir.
Sayaç metriğini keşfetme
- Cloud Console'da Metrik Gezgini sayfasını açmak için aşağıdaki düğmeyi tıklayın:
- Sorgu oluşturucu bölmesinin araç çubuğunda, adı < > MQL veya < > PromQL olan düğmeyi seçin. Düğmenin konumu için aşağıdaki resme bakın.
- Dil açma/kapatma düğmesinde PromQL'nin seçili olduğunu doğrulayın. Dil değiştirme düğmesi, sorgunuzu biçimlendirmenize olanak tanıyan aynı araç çubuğunda bulunur.
- Sorgunuzu Sorgular düzenleyicisine girin:
sum(rate(workload_googleapis_com:model_call_counter{monitored_resource="generic_task"}[${__interval}]))
- Sorgu Çalıştır'ı tıklayın.Otomatik çalıştırma açma/kapatma düğmesi etkinleştirildiğinde Sorgu Çalıştır düğmesi gösterilmez.
11. (İsteğe bağlı) Günlüklerdeki karartılmış hassas bilgiler
10. adımda, uygulamanın Gemini modeliyle etkileşimi hakkındaki bilgileri günlüğe kaydettik. Bu bilgiler arasında hayvanın adı, gerçek istem ve modelin yanıtı yer alıyordu. Bu bilgilerin günlükte saklanması güvenli olsa da diğer birçok senaryo için bu durum geçerli olmayabilir. İstem, kullanıcının depolanmasını istemediği bazı kişisel veya hassas bilgileri içerebilir. Bu sorunu gidermek için Cloud Logging'a yazılan hassas verileri karartabilirsiniz. Kod değişikliklerini en aza indirmek için aşağıdaki çözüm önerilir.
- Gelen günlük girişlerini depolamak için Pub/Sub konusu oluşturma
- Alınan günlükleri PubSub konusuna yönlendiren bir günlük havuzu oluşturun.
- Aşağıdaki adımları uygulayarak Pub/Sub konusuna yönlendirilen günlükleri değiştiren bir Dataflow ardışık düzeni oluşturun:
- PubSub konusundaki bir günlük girişini okuma
- DLP inceleme API'sini kullanarak girişin hassas bilgiler içeren yükü olup olmadığını kontrol edin.
- VKÖ azaltma yöntemlerinden birini kullanarak yükteki hassas bilgileri çıkartın.
- Kodu karartılmış günlük girişini Cloud Logging'e yazma
- Ardışık düzeni dağıtma
12. (İsteğe bağlı) Temizleme
Codelab'de kullanılan kaynaklar ve API'ler için ücret ödeme riskini önlemek amacıyla, lab'i tamamladıktan sonra temizlik yapmanız önerilir. Faturalandırılmanın önüne geçmenin en kolay yolu, kod laboratuvarı için oluşturduğunuz projeyi silmektir.
- Projeyi silmek için terminalde delete project komutunu çalıştırın:
Cloud projeniz silindiğinde, söz konusu projede kullanılan tüm kaynakların ve API'lerin faturalandırması durdurulur.PROJECT_ID=$(gcloud config get-value project) gcloud projects delete ${PROJECT_ID} --quiet
PROJECT_ID
yerine proje kimliğinizi girdiğinizde şu mesajı görürsünüz:Deleted [https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID]. You can undo this operation for a limited period by running the command below. $ gcloud projects undelete PROJECT_ID See https://cloud.google.com/resource-manager/docs/creating-managing-projects for information on shutting down projects.
- (İsteğe bağlı) Hata alırsanız laboratuvar sırasında kullandığınız proje kimliğini bulmak için 5. adıma bakın. Bu değeri, ilk talimattaki komutla değiştirin. Örneğin, proje kimliğiniz
lab-example-project
ise komut şu şekilde olur:gcloud projects delete lab-project-id-example --quiet
13. Tebrikler
Bu laboratuvarda, tahmin yapmak için Gemini modelini kullanan bir üretken yapay zeka uygulaması oluşturdunuz. Ayrıca uygulamayı temel izleme ve günlük kaydı özellikleriyle donattı. Uygulamayı ve kaynak koddaki değişiklikleri Cloud Run'a dağıttınız. Ardından, uygulamanın güvenilirliğinden emin olmak için Google Cloud Observability ürünlerini kullanarak uygulamanın performansını izleyebilirsiniz.
Şu anda kullandığınız ürünleri iyileştirmek için bir kullanıcı deneyimi (UX) araştırmasına katılmak istiyorsanız buradan kaydolun.
Öğrenmeye devam etmek için kullanabileceğiniz bazı seçenekler:
- Codelab Gemini destekli sohbet uygulamasını Cloud Run'a dağıtma
- Codelab Cloud Run ile Gemini işlev çağrısını kullanma
- Videoyu sahne sahne işlemek için Cloud Run Jobs Video Intelligence API'yi kullanma
- İsteğe bağlı atölye Google Kubernetes Engine'e ilk katılım
- Uygulama günlüklerini kullanarak karşı ve dağıtım metriklerini yapılandırma hakkında daha fazla bilgi edinin
- OpenTelemetry yardımcı aracı kullanarak OTLP metrikleri yazma
- Google Cloud'da Open Telemetry'nin kullanımıyla ilgili Referans