1. ภาพรวม
แอปพลิเคชัน Gen AI ต้องมีการสังเกตการณ์เช่นเดียวกับแอปพลิเคชันอื่นๆ Generative AI ต้องใช้เทคนิคการสังเกตการณ์พิเศษไหม
ในชั้นเรียนนี้ คุณจะได้สร้างแอปพลิเคชัน Generative AI แบบง่าย ทำให้ใช้งานได้ใน Cloud Run และติดตั้งใช้งานด้วยความสามารถในการตรวจสอบและการบันทึกที่จำเป็นโดยใช้บริการและผลิตภัณฑ์ด้านความสามารถในการสังเกตการณ์ของ Google Cloud
สิ่งที่คุณจะได้เรียนรู้
- เขียนแอปพลิเคชันที่ใช้ Vertex AI ด้วย Cloud Shell Editor
- จัดเก็บโค้ดแอปพลิเคชันใน GitHub
- ใช้ gcloud CLI เพื่อทำให้โค้ดต้นทางของแอปพลิเคชันใช้งานได้ใน Cloud Run
- เพิ่มความสามารถในการตรวจสอบและการบันทึกลงในแอปพลิเคชัน Gen AI
- การใช้เมตริกตามบันทึก
- การใช้การบันทึกและการตรวจสอบด้วย Open Telemetry SDK
- รับข้อมูลเชิงลึกเกี่ยวกับการจัดการข้อมูล AI อย่างมีความรับผิดชอบ
2. ข้อกำหนดเบื้องต้น
หากยังไม่มีบัญชี Google คุณต้องสร้างบัญชีใหม่
3. การตั้งค่าโปรเจ็กต์
- ลงชื่อเข้าใช้คอนโซล Google Cloud ด้วยบัญชี Google
- สร้างโปรเจ็กต์ใหม่หรือเลือกนําโปรเจ็กต์ที่มีอยู่มาใช้ซ้ำ จดรหัสโปรเจ็กต์ของโปรเจ็กต์ที่คุณเพิ่งสร้างหรือเลือกไว้
- เปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์
- การทําภารกิจนี้ให้เสร็จสมบูรณ์จะมีค่าใช้จ่ายในการเรียกเก็บเงินไม่ถึง $5
- คุณสามารถทำตามขั้นตอนที่ส่วนท้ายของห้องทดลองนี้เพื่อลบทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินเพิ่มเติม
- ผู้ใช้ใหม่มีสิทธิ์รับช่วงทดลองใช้ฟรีมูลค่า$300 USD
- ยืนยันว่าเปิดใช้การเรียกเก็บเงินในโปรเจ็กต์ของฉันในการเรียกเก็บเงินใน Cloud
- หากโปรเจ็กต์ใหม่แสดง
Billing is disabled
ในคอลัมน์Billing account
ให้ทำดังนี้- คลิกจุด 3 จุดในคอลัมน์
Actions
- คลิกเปลี่ยนการเรียกเก็บเงิน
- เลือกบัญชีสำหรับการเรียกเก็บเงินที่ต้องการใช้
- คลิกจุด 3 จุดในคอลัมน์
- หากคุณเข้าร่วมกิจกรรมแบบสด บัญชีมีแนวโน้มที่จะชื่อว่าบัญชีสำหรับการเรียกเก็บเงินของ Google Cloud Platform เวอร์ชันทดลองใช้
- หากโปรเจ็กต์ใหม่แสดง
4. เตรียมเครื่องมือแก้ไข Cloud Shell
- ไปที่ Cloud Shell Editor หากได้รับข้อความต่อไปนี้ที่ขอสิทธิ์ให้ Cloud Shell เรียกใช้ gcloud ด้วยข้อมูลเข้าสู่ระบบของคุณ ให้คลิกให้สิทธิ์เพื่อดำเนินการต่อ
- เปิดหน้าต่างเทอร์มินัล
- คลิกเมนู 3 ขีด
- คลิก Terminal
- คลิก New Terminal
- คลิกเมนู 3 ขีด
- ในเทอร์มินัล ให้กําหนดค่ารหัสโปรเจ็กต์โดยทําดังนี้
แทนที่gcloud config set project [PROJECT_ID]
[PROJECT_ID]
ด้วยรหัสโปรเจ็กต์ ตัวอย่างเช่น หากรหัสโปรเจ็กต์คือlab-example-project
คำสั่งจะเป็น หากได้รับข้อความต่อไปนี้ว่า gcloud ขอข้อมูลเข้าสู่ระบบของคุณเพื่อ GCPI API ให้คลิกให้สิทธิ์เพื่อดําเนินการต่อgcloud config set project lab-project-id-example
เมื่อดําเนินการเสร็จเรียบร้อยแล้ว คุณควรเห็นข้อความต่อไปนี้ หากเห็นUpdated property [core/project].
WARNING
และระบบถามDo you want to continue (Y/N)?
แสดงว่าคุณอาจป้อนรหัสโปรเจ็กต์ไม่ถูกต้อง กดN
แล้วกดEnter
แล้วลองเรียกใช้คําสั่งgcloud config set project
อีกครั้งหลังจากพบรหัสโปรเจ็กต์ที่ถูกต้อง - (ไม่บังคับ) หากพบปัญหาในการค้นหารหัสโปรเจ็กต์ ให้เรียกใช้คําสั่งต่อไปนี้เพื่อดูรหัสโปรเจ็กต์ของโปรเจ็กต์ทั้งหมดที่จัดเรียงตามเวลาสร้างจากน้อยไปมาก
gcloud projects list \ --format='value(projectId,createTime)' \ --sort-by=~createTime
5. เปิดใช้ Google APIs
ในเทอร์มินัล ให้เปิดใช้ Google API ที่จําเป็นสําหรับห้องทดลองนี้
gcloud services enable \
run.googleapis.com \
cloudbuild.googleapis.com \
aiplatform.googleapis.com \
logging.googleapis.com \
monitoring.googleapis.com \
cloudtrace.googleapis.com
คำสั่งนี้จะใช้เวลาสักครู่จึงจะเสร็จสมบูรณ์ ในที่สุด ระบบจะแสดงข้อความสำเร็จที่คล้ายกับข้อความนี้
Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.
หากได้รับข้อความแสดงข้อผิดพลาดที่ขึ้นต้นด้วย ERROR: (gcloud.services.enable) HttpError accessing
และมีรายละเอียดข้อผิดพลาดดังด้านล่าง ให้ลองใช้คำสั่งอีกครั้งหลังจากรอ 1-2 นาที
"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. สร้างแอปพลิเคชัน Gen AI
ในขั้นตอนนี้ คุณจะเขียนโค้ดของแอปพลิเคชันตามคำขอแบบง่ายที่ใช้โมเดล Gemini เพื่อแสดงเกร็ดความรู้สนุกๆ 10 ข้อเกี่ยวกับสัตว์ที่คุณเลือก ทําตามขั้นตอนต่อไปนี้เพื่อสร้างรหัสแอปพลิเคชัน
- สร้างไดเรกทอรี
codelab-o11y
ในเทอร์มินัลโดยทำดังนี้mkdir "${HOME}/codelab-o11y"
- เปลี่ยนไดเรกทอรีปัจจุบันเป็น
codelab-o11y
cd "${HOME}/codelab-o11y"
- ดาวน์โหลดโค้ดการเริ่มต้นใช้งานของแอปพลิเคชัน Java โดยใช้เงื่อนไขเริ่มต้นของเฟรมเวิร์ก Spring
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
- แตกไฟล์รหัส Bootstrap ลงในโฟลเดอร์ปัจจุบันโดยทำดังนี้
unzip java-starter.zip
- และนำไฟล์ที่เก็บถาวรออกจากโฟลเดอร์โดยทำดังนี้
rm java-starter.zip
- สร้างไฟล์
project.toml
เพื่อกำหนดเวอร์ชันรันไทม์ Java ที่จะใช้เมื่อทำให้โค้ดใช้งานได้ใน Cloud Run โดยทำดังนี้cat > "${HOME}/codelab-o11y/project.toml" << EOF [[build.env]] name = "GOOGLE_RUNTIME_VERSION" value = "17" EOF
- เพิ่ม Dependency ของ Google Cloud SDK ลงในไฟล์
pom.xml
- เพิ่มแพ็กเกจ Google Cloud Core
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"
- เพิ่มแพ็กเกจ Vertex AI ของ Google Cloud
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
- เปิดไฟล์
DemoApplication.java
ใน Cloud Shell Editor โดยทำดังนี้ ตอนนี้ซอร์สโค้ดสแคฟเฟิลด์ของไฟล์cloudshell edit "${HOME}/codelab-o11y/src/main/java/com/example/demo/DemoApplication.java"
DemoApplication.java
ควรปรากฏในหน้าต่างเครื่องมือแก้ไขเหนือเทอร์มินัล ซอร์สโค้ดของไฟล์จะคล้ายกับตัวอย่างต่อไปนี้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); } }
- แทนที่โค้ดในตัวแก้ไขด้วยเวอร์ชันที่แสดงด้านล่าง หากต้องการแทนที่โค้ด ให้ลบเนื้อหาของไฟล์ แล้วคัดลอกโค้ดด้านล่างลงในเครื่องมือแก้ไข
หลังจากผ่านไป 2-3 วินาที เครื่องมือแก้ไข Cloud Shell จะบันทึกโค้ดโดยอัตโนมัติ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); } }
ทำให้โค้ดของแอปพลิเคชัน Gen AI ใช้งานได้ใน Cloud Run
- ในหน้าต่างเทอร์มินัล ให้เรียกใช้คำสั่งเพื่อทำให้ซอร์สโค้ดของแอปพลิเคชันใช้งานได้ใน Cloud Run
หากคุณเห็นข้อความแจ้งด้านล่างที่แจ้งว่าคําสั่งจะสร้างที่เก็บข้อมูลใหม่ คลิกgcloud run deploy codelab-o11y-service \ --source="${HOME}/codelab-o11y/" \ --region=us-central1 \ --allow-unauthenticated
Enter
กระบวนการติดตั้งใช้งานอาจใช้เวลาสักครู่ หลังจากกระบวนการทำให้ใช้งานได้เสร็จสมบูรณ์ คุณจะเห็นเอาต์พุตดังต่อไปนี้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
- คัดลอก URL บริการ Cloud Run ที่แสดงไปยังแท็บหรือหน้าต่างแยกต่างหากในเบราว์เซอร์ หรือเรียกใช้คําสั่งต่อไปนี้ในเทอร์มินัลเพื่อพิมพ์ URL ของบริการ แล้วคลิก URL ที่แสดงขณะกดแป้น Ctrl ค้างไว้เพื่อเปิด URL
เมื่อเปิด URL คุณอาจได้รับข้อผิดพลาด 500 หรือเห็นข้อความต่อไปนี้gcloud run services list \ --format='value(URL)' \ --filter='SERVICE:"codelab-o11y-service"'
หมายความว่าบริการยังไม่ได้ติดตั้งใช้งานจนเสร็จสมบูรณ์ โปรดรอสักครู่แล้วรีเฟรชหน้าเว็บ ในตอนท้าย คุณจะเห็นข้อความที่ขึ้นต้นด้วย เกร็ดความรู้สนุกๆ เกี่ยวกับสุนัข และมีเกร็ดความรู้สนุกๆ เกี่ยวกับสุนัข 10 ข้อSorry, this is just a placeholder...
ลองโต้ตอบกับแอปพลิเคชันเพื่อดูข้อเท็จจริงที่น่าสนใจเกี่ยวกับสัตว์ต่างๆ โดยเพิ่มพารามิเตอร์ animal
ต่อท้าย URL เช่น ?animal=[ANIMAL]
โดยที่ [ANIMAL]
คือชื่อสัตว์ เช่น ต่อท้ายด้วย ?animal=cat
เพื่อดูสาระน่ารู้ 10 เรื่องเกี่ยวกับแมว หรือ ?animal=sea turtle
เพื่อดูสาระน่ารู้ 10 เรื่องเกี่ยวกับเต่าทะเล
7. ตรวจสอบการเรียก Vertex API
การตรวจสอบการเรียกใช้ Google API จะตอบคําถามต่างๆ เช่น "ใครเรียกใช้ API หนึ่งๆ ที่ไหนและเมื่อใด" การตรวจสอบเป็นสิ่งสําคัญเมื่อคุณแก้ปัญหาแอปพลิเคชัน ตรวจสอบการใช้ทรัพยากร หรือทําการวิเคราะห์ทางนิติวิทยาศาสตร์ของซอฟต์แวร์
บันทึกการตรวจสอบช่วยให้คุณติดตามกิจกรรมการดูแลระบบและระบบ รวมถึงบันทึกการเรียกใช้การดำเนินการ "อ่านข้อมูล" และ "เขียนข้อมูล" ของ API หากต้องการตรวจสอบคำขอ Vertex AI เพื่อสร้างเนื้อหา คุณต้องเปิดใช้บันทึกการตรวจสอบ "การอ่านข้อมูล" ในคอนโซล Cloud
- คลิกปุ่มด้านล่างเพื่อเปิดหน้าบันทึกการตรวจสอบในคอนโซลระบบคลาวด์
- ตรวจสอบว่าหน้าเว็บมีโปรเจ็กต์ที่คุณสร้างสําหรับห้องทดลองนี้ โปรเจ็กต์ที่เลือกจะแสดงที่มุมซ้ายบนของหน้าจากเมนูแฮมเบอร์เกอร์
เลือกโปรเจ็กต์ที่ถูกต้องจากช่องทําการเลือกหากจําเป็น - ในตารางการกําหนดค่าบันทึกการตรวจสอบการเข้าถึงข้อมูล ในคอลัมน์บริการ ให้ค้นหาบริการ
Vertex AI API
แล้วเลือกบริการโดยเลือกช่องทําเครื่องหมายทางด้านซ้ายจากชื่อบริการ - ในแผงข้อมูลทางด้านขวา ให้เลือกประเภทการตรวจสอบ "การอ่านข้อมูล"
- คลิกบันทึก
หากต้องการสร้างบันทึกการตรวจสอบ ให้เปิด URL ของบริการ รีเฟรชหน้าเว็บขณะเปลี่ยนค่าพารามิเตอร์ ?animal=
เพื่อดูผลลัพธ์อื่น
สํารวจบันทึกการตรวจสอบ
- คลิกปุ่มด้านล่างเพื่อเปิดหน้า Logs Explorer ในคอนโซลของ Cloud
- วางตัวกรองต่อไปนี้ลงในแผงการค้นหา
แผงการค้นหาคือเครื่องมือแก้ไขที่อยู่ใกล้กับด้านบนของหน้า Logs ExplorerLOG_ID("cloudaudit.googleapis.com%2Fdata_access") AND protoPayload.serviceName="aiplatform.googleapis.com"
- คลิกเรียกใช้การค้นหา
- เลือกรายการบันทึกการตรวจสอบรายการใดรายการหนึ่ง แล้วขยายช่องเพื่อตรวจสอบข้อมูลที่บันทึกไว้ในบันทึก
คุณสามารถดูรายละเอียดเกี่ยวกับการเรียก Vertex API รวมถึงเมธอดและรูปแบบที่ใช้ นอกจากนี้ คุณยังดูตัวตนของผู้เรียกใช้และสิทธิ์ที่อนุญาตให้เรียกใช้ได้ด้วย
8. บันทึกการโต้ตอบกับ Gen AI
คุณไม่เห็นพารามิเตอร์คำขอ API หรือข้อมูลการตอบกลับในบันทึกการตรวจสอบ อย่างไรก็ตาม ข้อมูลนี้อาจมีความสำคัญต่อการแก้ปัญหาการวิเคราะห์แอปพลิเคชันและเวิร์กโฟลว์ ในขั้นตอนนี้ เราจะเติมเต็มช่องว่างนี้ด้วยการเพิ่มการบันทึกแอปพลิเคชัน
การใช้งานจะใช้ Logback กับ Spring Boot เพื่อพิมพ์บันทึกของแอปพลิเคชันไปยังเอาต์พุตมาตรฐาน วิธีนี้ใช้ความสามารถของ Cloud Run ในการบันทึกข้อมูลที่พิมพ์ไปยังเอาต์พุตมาตรฐานและส่งผ่านไปยัง Cloud Logging โดยอัตโนมัติ ในการบันทึกข้อมูลเป็น Structured Data คุณควรจัดรูปแบบบันทึกที่พิมพ์ตามนั้น ทําตามวิธีการด้านล่างเพื่อเพิ่มความสามารถในการบันทึกแบบมีโครงสร้างลงในแอปพลิเคชัน
- กลับไปที่หน้าต่าง (หรือแท็บ) "Cloud Shell" ในเบราว์เซอร์
- สร้างและเปิดไฟล์ใหม่
LoggingEventGoogleCloudEncoder.java
ใน Cloud Shell Editor โดยทำดังนี้cloudshell edit "${HOME}/codelab-o11y/src/main/java/com/example/demo/LoggingEventGoogleCloudEncoder.java"
- คัดลอกและวางโค้ดต่อไปนี้เพื่อใช้โปรแกรมเข้ารหัส Logback ซึ่งเข้ารหัสบันทึกเป็น JSON ที่เป็นสตริงตามรูปแบบบันทึกที่มีโครงสร้างของ Google Cloud
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"; } } }
- สร้างและเปิดไฟล์ใหม่
logback.xml
ใน Cloud Shell Editor โดยทำดังนี้cloudshell edit "${HOME}/codelab-o11y/src/main/resources/logback.xml"
- คัดลอกและวาง XML ต่อไปนี้เพื่อกำหนดค่า Logback ให้ใช้โปรแกรมเปลี่ยนไฟล์กับโปรแกรมต่อท้าย Logback ที่พิมพ์บันทึกไปยังเอาต์พุตมาตรฐาน
<?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
อีกครั้งในเครื่องมือแก้ไข Cloud Shell โดยทำดังนี้cloudshell edit "${HOME}/codelab-o11y/src/main/java/com/example/demo/DemoApplication.java"
- แทนที่โค้ดในตัวแก้ไขด้วยเวอร์ชันที่แสดงด้านล่างเพื่อบันทึกคําขอและการตอบกลับของ Gen AI หากต้องการแทนที่โค้ด ให้ลบเนื้อหาของไฟล์ แล้วคัดลอกโค้ดด้านล่างลงในเครื่องมือแก้ไข
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); } }
หลังจากผ่านไป 2-3 วินาที เครื่องมือแก้ไข Cloud Shell จะบันทึกการเปลี่ยนแปลงโดยอัตโนมัติ
ทำให้โค้ดของแอปพลิเคชัน Gen AI ใช้งานได้ใน Cloud Run
- ในหน้าต่างเทอร์มินัล ให้เรียกใช้คำสั่งเพื่อทำให้ซอร์สโค้ดของแอปพลิเคชันใช้งานได้ใน Cloud Run
หากคุณเห็นข้อความแจ้งด้านล่างที่แจ้งว่าคําสั่งจะสร้างที่เก็บข้อมูลใหม่ คลิกgcloud run deploy codelab-o11y-service \ --source="${HOME}/codelab-o11y/" \ --region=us-central1 \ --allow-unauthenticated
Enter
กระบวนการติดตั้งใช้งานอาจใช้เวลาสักครู่ หลังจากกระบวนการทำให้ใช้งานได้เสร็จสมบูรณ์ คุณจะเห็นเอาต์พุตดังต่อไปนี้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
- คัดลอก URL บริการ Cloud Run ที่แสดงไปยังแท็บหรือหน้าต่างแยกต่างหากในเบราว์เซอร์ หรือเรียกใช้คําสั่งต่อไปนี้ในเทอร์มินัลเพื่อพิมพ์ URL ของบริการ แล้วคลิก URL ที่แสดงขณะกดแป้น Ctrl ค้างไว้เพื่อเปิด URL
เมื่อเปิด URL คุณอาจได้รับข้อผิดพลาด 500 หรือเห็นข้อความต่อไปนี้gcloud run services list \ --format='value(URL)' \ --filter='SERVICE:"codelab-o11y-service"'
หมายความว่าบริการยังไม่ได้ติดตั้งใช้งานจนเสร็จสมบูรณ์ โปรดรอสักครู่แล้วรีเฟรชหน้าเว็บ ในตอนท้าย คุณจะเห็นข้อความที่ขึ้นต้นด้วย เกร็ดความรู้สนุกๆ เกี่ยวกับสุนัข และมีเกร็ดความรู้สนุกๆ เกี่ยวกับสุนัข 10 ข้อSorry, this is just a placeholder...
หากต้องการสร้างบันทึกของแอปพลิเคชัน ให้เปิด URL ของบริการ รีเฟรชหน้าเว็บขณะเปลี่ยนค่าพารามิเตอร์ ?animal=
เพื่อดูผลลัพธ์อื่น
หากต้องการดูบันทึกของแอปพลิเคชัน ให้ทำดังนี้
- คลิกปุ่มด้านล่างเพื่อเปิดหน้าเครื่องมือสำรวจบันทึกในคอนโซลระบบคลาวด์
- วางตัวกรองต่อไปนี้ลงในแผงการค้นหา (#2 ในอินเทอร์เฟซเครื่องมือสำรวจบันทึก)
LOG_ID("run.googleapis.com%2Fstdout") AND severity=DEBUG
- คลิกเรียกใช้การค้นหา
ผลการค้นหาจะแสดงบันทึกพร้อมพรอมต์และการตอบกลับของ Vertex AI รวมถึงคะแนนความปลอดภัย
9. นับการโต้ตอบกับ Gen AI
Cloud Run จะเขียนเมตริกที่มีการจัดการซึ่งสามารถใช้เพื่อตรวจสอบบริการที่ติดตั้งใช้งาน เมตริกการตรวจสอบที่ผู้ใช้จัดการช่วยให้ควบคุมข้อมูลและความถี่ในการอัปเดตเมตริกได้มากขึ้น การใช้เมตริกดังกล่าวต้องเขียนโค้ดที่รวบรวมข้อมูลและเขียนลงใน Cloud Monitoring ดูขั้นตอนถัดไป (ไม่บังคับ) เพื่อดูวิธีติดตั้งใช้งานโดยใช้ OpenTelemetry SDK
ขั้นตอนนี้จะแสดงทางเลือกในการใช้เมตริกผู้ใช้ในโค้ด ซึ่งก็คือเมตริกที่อิงตามบันทึก เมตริกตามบันทึกช่วยให้คุณสร้างเมตริกการตรวจสอบจากรายการบันทึกที่แอปพลิเคชันเขียนลงใน Cloud Logging ได้ เราจะใช้บันทึกของแอปพลิเคชันที่ติดตั้งใช้งานในขั้นตอนก่อนหน้าเพื่อกําหนดเมตริกตามบันทึกของตัวนับประเภท เมตริกจะนับจํานวนการเรียก Vertex API ที่ประสบความสําเร็จ
- ดูที่หน้าต่างเครื่องมือสำรวจบันทึกที่เราใช้ในขั้นตอนก่อนหน้า ค้นหาเมนูแบบเลื่อนลงการดําเนินการในแผงการค้นหา แล้วคลิกเพื่อเปิด ดูภาพหน้าจอด้านล่างเพื่อค้นหาเมนู
- ในเมนูที่เปิดขึ้น ให้เลือกสร้างเมตริกเพื่อเปิดแผงสร้างเมตริกที่อิงตามบันทึก
- ทําตามขั้นตอนต่อไปนี้เพื่อกําหนดค่าเมตริกตัวนับใหม่ในแผงสร้างเมตริกตามบันทึก
- ตั้งค่าประเภทเมตริก: เลือกตัวนับ
- ตั้งค่าช่องต่อไปนี้ในส่วนรายละเอียด
- ชื่อเมตริกบันทึก: ตั้งชื่อเป็น
model_interaction_count
มีข้อจํากัดในการตั้งชื่อบางประการ โปรดดูรายละเอียดที่การแก้ปัญหาข้อจํากัดในการตั้งชื่อ - คําอธิบาย: ป้อนคําอธิบายสําหรับเมตริก เช่น
Number of log entries capturing successful call to model inference.
- หน่วย: เว้นว่างไว้หรือแทรกตัวเลข
1
- ชื่อเมตริกบันทึก: ตั้งชื่อเป็น
- ปล่อยค่าไว้ในส่วนการเลือกตัวกรอง โปรดทราบว่าช่องตัวกรองการสร้างมีตัวกรองเดียวกับที่เราใช้ดูบันทึกของแอปพลิเคชัน
- (ไม่บังคับ) เพิ่มป้ายกำกับที่ช่วยนับจํานวนการร้องของสัตว์แต่ละชนิด หมายเหตุ: ป้ายกํากับนี้อาจทําให้จํานวนสมาชิกของเมตริกเพิ่มขึ้นอย่างมากและไม่แนะนําให้ใช้ในเวอร์ชันที่ใช้งานจริง
- คลิกเพิ่มป้ายกำกับ
- ตั้งค่าช่องต่อไปนี้ในส่วนป้ายกำกับ
- ชื่อป้ายกำกับ: ตั้งชื่อเป็น
animal
- คําอธิบาย: ป้อนคําอธิบายของป้ายกํากับ เช่น
Animal parameter
- ประเภทป้ายกํากับ: เลือก
STRING
- ชื่อช่อง: ประเภท
jsonPayload.animal
- นิพจน์ทั่วไป: เว้นว่างไว้
- ชื่อป้ายกำกับ: ตั้งชื่อเป็น
- คลิกเสร็จสิ้น
- คลิกสร้างเมตริกเพื่อสร้างเมตริก
นอกจากนี้ คุณยังสร้างเมตริกตามบันทึกได้จากหน้าเมตริกตามบันทึก โดยใช้gcloud logging metrics create
คําสั่ง CLI หรือgoogle_logging_metric
ทรัพยากร Terraform
หากต้องการสร้างข้อมูลเมตริก ให้เปิด URL ของบริการ รีเฟรชหน้าเว็บที่เปิดอยู่หลายครั้งเพื่อเรียกใช้โมเดลหลายครั้ง เช่นเดียวกับก่อนหน้านี้ ให้ลองใช้สัตว์ชนิดอื่นในพารามิเตอร์
ป้อนการค้นหา PromQL เพื่อค้นหาข้อมูลเมตริกตามบันทึก หากต้องการป้อนการค้นหา PromQL ให้ทําดังนี้
- คลิกปุ่มด้านล่างเพื่อเปิดหน้าเครื่องมือสํารวจเมตริกในคอนโซลระบบคลาวด์
- ในแถบเครื่องมือของแผงเครื่องมือสร้างคําค้นหา ให้เลือกปุ่มที่มีชื่อเป็น < > MQL หรือ < > PromQL ดูตำแหน่งของปุ่มในรูปภาพด้านล่าง
- ตรวจสอบว่าได้เลือก PromQL ในปุ่มสลับภาษา ปุ่มสลับภาษาอยู่ในแถบเครื่องมือเดียวกับที่ให้คุณจัดรูปแบบข้อความค้นหาได้
- ป้อนคําค้นหาลงในเครื่องมือแก้ไขคําค้นหา
ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ PromQL ได้ที่ PromQL ใน Cloud Monitoringsum(rate(logging_googleapis_com:user_model_interaction_count{monitored_resource="cloud_run_revision"}[${__interval}]))
- คลิกเรียกใช้การค้นหา คุณจะเห็นแผนภูมิเส้นที่คล้ายกับภาพหน้าจอนี้
โปรดทราบว่าเมื่อเปิดใช้ปุ่มสลับเรียกใช้อัตโนมัติ ปุ่มเรียกใช้การค้นหาจะไม่แสดง
10. (ไม่บังคับ) ใช้ Open Telemetry สําหรับการตรวจสอบและการติดตาม
ดังที่ได้กล่าวไว้ในขั้นตอนก่อนหน้า คุณสามารถติดตั้งใช้งานเมตริกโดยใช้ OpenTelemetry (Otel) SDK ได้ เราขอแนะนําให้ใช้ OTel ในสถาปัตยกรรมแบบหลายบริการ ขั้นตอนนี้แสดงการเพิ่มเครื่องมือวัด OTel ลงในแอปพลิเคชัน Spring Boot ในขั้นตอนนี้ คุณจะทำสิ่งต่อไปนี้
- เครื่องมือวัดแอปพลิเคชัน Spring Boot ที่มีความสามารถในการติดตามอัตโนมัติ
- การใช้เมตริกตัวนับเพื่อติดตามจํานวนการเรียกใช้โมเดลที่ประสบความสําเร็จ
- เชื่อมโยงการติดตามกับบันทึกของแอปพลิเคชัน
สถาปัตยกรรมที่แนะนําสําหรับบริการระดับผลิตภัณฑ์คือการใช้ OTel Collector เพื่อรวบรวมและส่งผ่านข้อมูลการสังเกตการณ์ทั้งหมดจากบริการหลายรายการ โค้ดในขั้นตอนนี้ไม่ได้ใช้เครื่องมือรวบรวมข้อมูลเพื่อความเรียบง่าย แต่จะใช้การส่งออก OTel ที่เขียนข้อมูลไปยัง Google Cloud โดยตรงแทน
ตั้งค่าแอปพลิเคชัน Spring Boot ด้วยคอมโพเนนต์ OTel และการติดตามอัตโนมัติ
- กลับไปที่หน้าต่าง (หรือแท็บ) "Cloud Shell" ในเบราว์เซอร์
- ในเทอร์มินัล ให้อัปเดตไฟล์
application.permissions
ด้วยพารามิเตอร์การกําหนดค่าเพิ่มเติม ดังนี้ พารามิเตอร์เหล่านี้จะกำหนดการส่งออกข้อมูลการสังเกตการณ์ไปยัง Cloud Trace และ Cloud Monitoring รวมถึงบังคับใช้การสุ่มตัวอย่างร่องรอยทั้งหมด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
- เพิ่มการพึ่งพา OpenTelemetry ที่จําเป็นลงในไฟล์
pom.xml
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"
- เพิ่ม BOM ของ OpenTelemetry ลงในไฟล์
pom.xml
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
อีกครั้งในเครื่องมือแก้ไข Cloud Shell โดยทำดังนี้cloudshell edit "${HOME}/codelab-o11y/src/main/java/com/example/demo/DemoApplication.java"
- แทนที่โค้ดปัจจุบันด้วยเวอร์ชันที่เพิ่มเมตริกประสิทธิภาพ หากต้องการแทนที่โค้ด ให้ลบเนื้อหาของไฟล์ แล้วคัดลอกโค้ดด้านล่างลงในเครื่องมือแก้ไข
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
อีกครั้งในเครื่องมือแก้ไข Cloud Shell โดยทำดังนี้cloudshell edit "${HOME}/codelab-o11y/src/main/java/com/example/demo/LoggingEventGoogleCloudEncoder.java"
- แทนที่โค้ดปัจจุบันด้วยเวอร์ชันที่เพิ่มแอตทริบิวต์การติดตามลงในบันทึกที่เขียน การเพิ่มแอตทริบิวต์ช่วยให้บันทึกมีความสัมพันธ์กับช่วงการติดตามที่ถูกต้อง หากต้องการแทนที่โค้ด ให้ลบเนื้อหาของไฟล์ แล้วคัดลอกโค้ดด้านล่างลงในเครื่องมือแก้ไข
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"; } } }
หลังจากผ่านไป 2-3 วินาที เครื่องมือแก้ไข Cloud Shell จะบันทึกการเปลี่ยนแปลงโดยอัตโนมัติ
ทำให้โค้ดของแอปพลิเคชัน Gen AI ใช้งานได้ใน Cloud Run
- ในหน้าต่างเทอร์มินัล ให้เรียกใช้คำสั่งเพื่อทำให้ซอร์สโค้ดของแอปพลิเคชันใช้งานได้ใน Cloud Run
หากคุณเห็นข้อความแจ้งด้านล่างที่แจ้งว่าคําสั่งจะสร้างที่เก็บข้อมูลใหม่ คลิกgcloud run deploy codelab-o11y-service \ --source="${HOME}/codelab-o11y/" \ --region=us-central1 \ --allow-unauthenticated
Enter
กระบวนการติดตั้งใช้งานอาจใช้เวลาสักครู่ หลังจากกระบวนการทำให้ใช้งานได้เสร็จสมบูรณ์ คุณจะเห็นเอาต์พุตดังต่อไปนี้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
- คัดลอก URL บริการ Cloud Run ที่แสดงไปยังแท็บหรือหน้าต่างแยกต่างหากในเบราว์เซอร์ หรือเรียกใช้คําสั่งต่อไปนี้ในเทอร์มินัลเพื่อพิมพ์ URL ของบริการ แล้วคลิก URL ที่แสดงขณะกดแป้น Ctrl ค้างไว้เพื่อเปิด URL
เมื่อเปิด URL คุณอาจได้รับข้อผิดพลาด 500 หรือเห็นข้อความต่อไปนี้gcloud run services list \ --format='value(URL)' \ --filter='SERVICE:"codelab-o11y-service"'
หมายความว่าบริการยังไม่ได้ติดตั้งใช้งานจนเสร็จสมบูรณ์ โปรดรอสักครู่แล้วรีเฟรชหน้าเว็บ ในตอนท้าย คุณจะเห็นข้อความที่ขึ้นต้นด้วย เกร็ดความรู้สนุกๆ เกี่ยวกับสุนัข และมีเกร็ดความรู้สนุกๆ เกี่ยวกับสุนัข 10 ข้อSorry, this is just a placeholder...
หากต้องการสร้างข้อมูลการวัดผล ให้เปิด URL ของบริการ รีเฟรชหน้าเว็บขณะเปลี่ยนค่าพารามิเตอร์ ?animal=
เพื่อดูผลลัพธ์อื่น
สำรวจร่องรอยแอปพลิเคชัน
- คลิกปุ่มด้านล่างเพื่อเปิดหน้าเครื่องมือสํารวจการติดตามในคอนโซลระบบคลาวด์
- เลือกร่องรอยล่าสุดรายการใดรายการหนึ่ง คุณควรเห็นช่วง 5 หรือ 6 ช่วงซึ่งมีลักษณะดังภาพหน้าจอด้านล่าง
- ค้นหาสแปนที่ติดตามการเรียกใช้ตัวแฮนเดิลเหตุการณ์ (เมธอด
fun_facts
) ซึ่งจะเป็นช่วงสุดท้ายที่มีชื่อ/
- ในแผงรายละเอียดการติดตาม ให้เลือกบันทึกและเหตุการณ์ คุณจะเห็นบันทึกแอปพลิเคชันที่เชื่อมโยงกับช่วงดังกล่าว ระบบจะตรวจหาความสัมพันธ์โดยใช้รหัสการติดตามและ Span ในการติดตามและในบันทึก คุณควรจะเห็นบันทึกแอปพลิเคชันที่เขียนพรอมต์และการตอบกลับของ Vertex API
สำรวจเมตริกตัวนับ
- คลิกปุ่มด้านล่างเพื่อเปิดหน้าเครื่องมือสํารวจเมตริกในคอนโซลระบบคลาวด์
- ในแถบเครื่องมือของแผงเครื่องมือสร้างคําค้นหา ให้เลือกปุ่มที่มีชื่อเป็น < > MQL หรือ < > PromQL ดูตำแหน่งของปุ่มในรูปภาพด้านล่าง
- ตรวจสอบว่าได้เลือก PromQL ในปุ่มสลับภาษา ปุ่มสลับภาษาอยู่ในแถบเครื่องมือเดียวกับที่ให้คุณจัดรูปแบบข้อความค้นหาได้
- ป้อนคําค้นหาลงในเครื่องมือแก้ไขคําค้นหา
sum(rate(workload_googleapis_com:model_call_counter{monitored_resource="generic_task"}[${__interval}]))
- คลิกเรียกใช้การค้นหา เมื่อเปิดใช้ปุ่มสลับเรียกใช้อัตโนมัติ ปุ่มเรียกใช้การค้นหาจะไม่แสดง
11. (ไม่บังคับ) ข้อมูลที่ละเอียดอ่อนที่มีการสร้างความสับสนจากบันทึก
ในขั้นตอนที่ 10 เราได้บันทึกข้อมูลเกี่ยวกับการโต้ตอบของแอปพลิเคชันกับโมเดล Gemini ข้อมูลนี้รวมถึงชื่อสัตว์ พรอมต์จริง และคำตอบของโมเดล แม้ว่าการจัดเก็บข้อมูลนี้ไว้ในบันทึกจะปลอดภัย แต่ก็ไม่ได้เป็นเช่นนั้นเสมอไปสำหรับสถานการณ์อื่นๆ อีกมากมาย พรอมต์อาจประกอบด้วยข้อมูลส่วนบุคคลหรือข้อมูลที่ละเอียดอ่อนบางอย่างที่ผู้ใช้ไม่ต้องการให้จัดเก็บ ในการแก้ปัญหานี้ คุณสามารถสร้างความสับสนให้กับข้อมูลที่ละเอียดอ่อนซึ่งเขียนลงใน Cloud Logging เราขอแนะนําให้ใช้วิธีแก้ปัญหาต่อไปนี้เพื่อลดการแก้ไขโค้ด
- สร้างหัวข้อ PubSub เพื่อจัดเก็บรายการบันทึกขาเข้า
- สร้างซิงค์บันทึกที่เปลี่ยนเส้นทางบันทึกที่ส่งผ่านข้อมูลไปยังหัวข้อ PubSub
- สร้างไปป์ไลน์ Dataflow ที่แก้ไขบันทึกที่เปลี่ยนเส้นทางไปยังหัวข้อ PubSub โดยทําตามขั้นตอนต่อไปนี้
- อ่านรายการบันทึกจากหัวข้อ PubSub
- ตรวจสอบเพย์โหลดของรายการเพื่อหาข้อมูลที่ละเอียดอ่อนโดยใช้ DLP inspection API
- ปกปิดข้อมูลที่ละเอียดอ่อนในเพย์โหลดโดยใช้วิธีการปกปิดข้อมูลของ DLP อย่างใดอย่างหนึ่ง
- เขียนรายการบันทึกที่มีการสร้างความสับสนไปยัง Cloud Logging
- ทำให้ไปป์ไลน์ใช้งานได้
12. (ไม่บังคับ) ล้าง
เราขอแนะนำให้ล้างข้อมูลหลังจากทำ Lab เสร็จแล้วเพื่อหลีกเลี่ยงความเสี่ยงที่จะถูกเรียกเก็บเงินสำหรับทรัพยากรและ API ที่ใช้ใน Codelab วิธีที่ง่ายที่สุดในการยกเลิกการเรียกเก็บเงินคือการลบโปรเจ็กต์ที่คุณสร้างสำหรับ Codelab
- หากต้องการลบโปรเจ็กต์ ให้เรียกใช้คำสั่ง delete project ในเทอร์มินัล
การลบโปรเจ็กต์ Cloud จะหยุดการเรียกเก็บเงินสำหรับทรัพยากรและ API ทั้งหมดที่ใช้ภายในโปรเจ็กต์นั้น คุณควรเห็นข้อความนี้ โดยPROJECT_ID=$(gcloud config get-value project) gcloud projects delete ${PROJECT_ID} --quiet
PROJECT_ID
จะเป็นรหัสโปรเจ็กต์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.
- (ไม่บังคับ) หากได้รับข้อผิดพลาด ให้ดูขั้นตอนที่ 5 เพื่อค้นหารหัสโปรเจ็กต์ที่คุณใช้ในระหว่างการทดสอบ แทนที่คำสั่งในคำสั่งแรก ตัวอย่างเช่น หากรหัสโปรเจ็กต์คือ
lab-example-project
คำสั่งจะเป็นgcloud projects delete lab-project-id-example --quiet
13. ขอแสดงความยินดี
ในห้องทดลองนี้ คุณได้สร้างแอปพลิเคชัน Generative AI ที่ใช้โมเดล Gemini เพื่อทำนาย และติดตั้งแอปพลิเคชันด้วยความสามารถในการตรวจสอบและการบันทึกที่จำเป็น คุณได้ทำให้แอปพลิเคชันและการเปลี่ยนแปลงจากซอร์สโค้ดใช้งานได้ใน Cloud Run จากนั้นใช้ผลิตภัณฑ์การสังเกตการณ์ของ Google Cloud เพื่อติดตามประสิทธิภาพของแอปพลิเคชัน เพื่อให้มั่นใจในความน่าเชื่อถือของแอปพลิเคชัน
หากสนใจเข้าร่วมการศึกษาวิจัยประสบการณ์ของผู้ใช้ (UX) เพื่อปรับปรุงผลิตภัณฑ์ที่คุณใช้อยู่ในปัจจุบัน โปรดลงทะเบียนที่นี่
ตัวเลือกในการเรียนต่อมีดังนี้
- Codelab วิธีทำให้แอปแชทที่ทำงานด้วย Gemini ใช้งานได้ใน Cloud Run
- Codelab วิธีใช้การเรียกฟังก์ชัน Gemini ด้วย Cloud Run
- วิธีใช้ Video Intelligence API ของ Cloud Run Jobs เพื่อประมวลผลวิดีโอทีละฉาก
- เวิร์กช็อปแบบออนดีมานด์ เริ่มต้นใช้งาน Google Kubernetes Engine
- ดูข้อมูลเพิ่มเติมเกี่ยวกับการกําหนดค่าเมตริกตัวนับและการแจกแจงโดยใช้บันทึกแอปพลิเคชัน
- เขียนเมตริก OTLP โดยใช้ OpenTelemetry Sidecar
- ข้อมูลอ้างอิงเกี่ยวกับการใช้ Open Telemetry ใน Google Cloud