ทำให้ใช้งานได้ จัดการ และตรวจสอบ ADK Agent ใน Cloud Run

1. บทนำ

บทแนะนำนี้จะแนะนำวิธีติดตั้งใช้งาน จัดการ และตรวจสอบเอเจนต์ที่มีประสิทธิภาพซึ่งสร้างด้วย Agent Development Kit (ADK) ใน Google Cloud Run ADK ช่วยให้คุณสร้างเอเจนต์ที่สามารถทำงานเวิร์กโฟลว์ที่ซับซ้อนแบบหลายเอเจนต์ได้ การใช้ประโยชน์จาก Cloud Run ซึ่งเป็นแพลตฟอร์มแบบ Serverless ที่มีการจัดการครบวงจรจะช่วยให้คุณสามารถติดตั้งใช้งาน Agent เป็นแอปพลิเคชันที่ปรับขนาดได้และอยู่ในคอนเทนเนอร์โดยไม่ต้องกังวลเกี่ยวกับโครงสร้างพื้นฐาน การผสานรวมที่มีประสิทธิภาพนี้ช่วยให้คุณมุ่งเน้นที่ตรรกะหลักของเอเจนต์ได้ในขณะที่ได้รับประโยชน์จากสภาพแวดล้อมที่แข็งแกร่งและปรับขนาดได้ของ Google Cloud

ตลอดบทแนะนำนี้ เราจะดูการผสานรวม ADK กับ Cloud Run อย่างราบรื่น คุณจะได้เรียนรู้วิธีติดตั้งใช้งานเอเจนต์ จากนั้นจะเจาะลึกด้านการปฏิบัติจริงในการจัดการแอปพลิเคชันในสภาพแวดล้อมที่คล้ายกับการใช้งานจริง เราจะอธิบายวิธีเปิดตัวเอเจนต์เวอร์ชันใหม่ได้อย่างปลอดภัยด้วยการจัดการการเข้าชม ซึ่งจะช่วยให้คุณทดสอบฟีเจอร์ใหม่ๆ กับผู้ใช้บางกลุ่มก่อนที่จะเปิดตัวอย่างเต็มรูปแบบได้

นอกจากนี้ คุณจะได้รับประสบการณ์แบบลงมือปฏิบัติจริงในการตรวจสอบประสิทธิภาพของเอเจนต์ เราจะจำลองสถานการณ์ในโลกแห่งความเป็นจริงโดยทำการทดสอบโหลดเพื่อสังเกตความสามารถในการปรับขนาดอัตโนมัติของ Cloud Run ในการทำงาน เราจะเปิดใช้การติดตามด้วย Cloud Trace เพื่อให้ได้ข้อมูลเชิงลึกที่ละเอียดยิ่งขึ้นเกี่ยวกับพฤติกรรมและประสิทธิภาพของเอเจนต์ ซึ่งจะแสดงมุมมองแบบละเอียดตั้งแต่ต้นจนจบของคำขอขณะที่คำขอผ่านตัวแทนของคุณ ทำให้คุณระบุและแก้ไขปัญหาคอขวดด้านประสิทธิภาพได้ เมื่อจบบทแนะนำนี้ คุณจะมีความเข้าใจอย่างครอบคลุมเกี่ยวกับวิธีติดตั้งใช้งาน จัดการ และตรวจสอบเอเจนต์ที่ขับเคลื่อนด้วย ADK ใน Cloud Run อย่างมีประสิทธิภาพ

ใน Codelab นี้ คุณจะได้ใช้แนวทางแบบทีละขั้นตอนดังนี้

  1. สร้างฐานข้อมูล PostgreSQL ใน CloudSQL เพื่อใช้กับบริการเซสชันฐานข้อมูลของตัวแทน ADK
  2. ตั้งค่า Agent ของ ADK ขั้นพื้นฐาน
  3. ตั้งค่าบริการเซสชันฐานข้อมูลเพื่อให้ ADK Runner ใช้
  4. ทำให้ Agent ใช้งานได้กับ Cloud Run เป็นครั้งแรก
  5. การทดสอบโหลดและการตรวจสอบการปรับขนาดอัตโนมัติของ Cloud Run
  6. ทำให้การแก้ไข Agent ใหม่ใช้งานได้และค่อยๆ เพิ่มการเข้าชมไปยังการแก้ไขใหม่
  7. ตั้งค่าการติดตามระบบคลาวด์และตรวจสอบการติดตามการเรียกใช้ Agent

ภาพรวมสถาปัตยกรรม

20d503f01eaadfd.jpeg

ข้อกำหนดเบื้องต้น

  • คุ้นเคยกับการทำงานด้วย Python
  • ความเข้าใจเกี่ยวกับสถาปัตยกรรม Full-Stack พื้นฐานโดยใช้บริการ HTTP

สิ่งที่คุณจะได้เรียนรู้

  • โครงสร้าง ADK และยูทิลิตีในเครื่อง
  • ตั้งค่าเอเจนต์ ADK ด้วยบริการเซสชันฐานข้อมูล
  • ตั้งค่า PostgreSQL ใน CloudSQL เพื่อให้บริการเซสชันฐานข้อมูลใช้งานได้
  • ติดตั้งใช้งานแอปพลิเคชันใน Cloud Run โดยใช้ Dockerfile และตั้งค่าตัวแปรสภาพแวดล้อมเริ่มต้น
  • กำหนดค่าและทดสอบการปรับขนาดอัตโนมัติของ Cloud Run ด้วยการทดสอบโหลด
  • กลยุทธ์ในการเผยแพร่แบบค่อยเป็นค่อยไปด้วย Cloud Run
  • ตั้งค่าการติดตาม Agent ของ ADK ไปยัง Cloud Trace

สิ่งที่คุณต้องมี

  • เว็บเบราว์เซอร์ Chrome
  • บัญชี Gmail
  • โปรเจ็กต์ Cloud ที่เปิดใช้การเรียกเก็บเงิน

Codelab นี้ออกแบบมาสำหรับนักพัฒนาซอฟต์แวร์ทุกระดับ (รวมถึงผู้เริ่มต้น) โดยใช้ Python ในแอปพลิเคชันตัวอย่าง อย่างไรก็ตาม คุณไม่จำเป็นต้องมีความรู้เกี่ยวกับ Python เพื่อทำความเข้าใจแนวคิดที่นำเสนอ

2. 🚀 เตรียมการตั้งค่าเวิร์กช็อป

ตอนนี้เราจะใช้ Cloud Shell IDE สำหรับบทแนะนำนี้ ให้คลิกปุ่มต่อไปนี้เพื่อไปยังที่นั่น

เมื่ออยู่ใน Cloud Shell แล้ว ให้โคลนไดเรกทอรีการทำงานของเทมเพลตสำหรับโค้ดแล็บนี้จาก Github โดยเรียกใช้คำสั่งต่อไปนี้ ซึ่งจะสร้างไดเรกทอรีการทำงานในไดเรกทอรี deploy_and_manage_adk

git clone https://github.com/alphinside/deploy-and-manage-adk-service.git deploy_and_manage_adk

จากนั้นเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลเพื่อเปิดที่เก็บที่โคลนเป็นไดเรกทอรีการทำงาน

cloudshell workspace ~/deploy_and_manage_adk && cd ~/deploy_and_manage_adk

หลังจากนั้น อินเทอร์เฟซของคุณควรมีลักษณะคล้ายกับภาพนี้

82b938c0e24f13d5.png

นี่จะเป็นอินเทอร์เฟซหลักของเรา โดยมี IDE อยู่ด้านบนและเทอร์มินัลอยู่ด้านล่าง ตอนนี้เราต้องเตรียมเทอร์มินัลเพื่อสร้างและเปิดใช้งานโปรเจ็กต์ Google Cloud ซึ่งจะลิงก์กับบัญชีสำหรับการเรียกเก็บเงินแบบทดลองใช้ที่เราอ้างสิทธิ์ไปก่อนหน้านี้ เราได้เตรียมสคริปต์เพื่อให้คุณมั่นใจได้เสมอว่าเซสชันเทอร์มินัลพร้อมใช้งาน เรียกใช้คำสั่งต่อไปนี้ ( ตรวจสอบว่าคุณอยู่ในพื้นที่ทำงาน deploy_and_manage_adk แล้ว

bash setup_trial_project.sh && source .env

เมื่อเรียกใช้คำสั่งนี้ ระบบจะแจ้งให้คุณทราบชื่อรหัสโปรเจ็กต์ที่แนะนำ คุณสามารถกด Enter เพื่อดำเนินการต่อ

77f289b73a047a98.png

หลังจากรอสักครู่ หากคุณเห็นเอาต์พุตนี้ในคอนโซล แสดงว่าคุณพร้อมที่จะไปยังขั้นตอนถัดไปแล้ว e6db54f7313a98a.png

ซึ่งแสดงว่าเทอร์มินัลได้รับการตรวจสอบสิทธิ์แล้วและตั้งค่าเป็นรหัสโปรเจ็กต์ที่ถูกต้อง ( สีเหลืองข้างเส้นทางไดเรกทอรีปัจจุบัน) คำสั่งนี้จะช่วยคุณสร้างโปรเจ็กต์ใหม่ ค้นหาและลิงก์โปรเจ็กต์กับบัญชีการเรียกเก็บเงินแบบทดลอง เตรียมไฟล์ .env สำหรับการกำหนดค่าตัวแปรสภาพแวดล้อม และเปิดใช้งานรหัสโปรเจ็กต์ที่ถูกต้องในเทอร์มินัลให้คุณด้วย

ตอนนี้เราพร้อมที่จะดำเนินการในขั้นตอนถัดไปแล้ว

3. 🚀 การเปิดใช้ API

ในบทแนะนำนี้ เราจะโต้ตอบกับฐานข้อมูล CloudSQL, โมเดล Gemini และ Cloud Run โดยผลิตภัณฑ์เหล่านี้จะต้องเปิดใช้งาน API ต่อไปนี้ เรียกใช้คำสั่งเหล่านี้เพื่อเปิดใช้

อาจใช้เวลาสักครู่

gcloud services enable aiplatform.googleapis.com \
                       run.googleapis.com \
                       cloudbuild.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       sqladmin.googleapis.com \
                       compute.googleapis.com

เมื่อเรียกใช้คำสั่งสำเร็จ คุณควรเห็นข้อความที่คล้ายกับข้อความที่แสดงด้านล่าง

Operation "operations/..." finished successfully.

4. 🚀 การตั้งค่าสภาพแวดล้อม Python และตัวแปรสภาพแวดล้อม

เราจะใช้ Python 3.12 ในโค้ดแล็บนี้ และจะใช้ตัวจัดการโปรเจ็กต์ Python ของ uv เพื่อลดความจำเป็นในการสร้างและจัดการเวอร์ชัน Python และสภาพแวดล้อมเสมือน แพ็กเกจ uv ได้รับการติดตั้งล่วงหน้าใน Cloud Shell แล้ว

เรียกใช้คำสั่งนี้เพื่อติดตั้งการอ้างอิงที่จำเป็นลงในสภาพแวดล้อมเสมือนในไดเรกทอรี .venv

uv sync --frozen

จากนั้นเราจะตรวจสอบไฟล์ตัวแปรสภาพแวดล้อมที่จำเป็นสำหรับโปรเจ็กต์นี้ ก่อนหน้านี้สคริปต์ setup_trial_project.sh เป็นผู้ตั้งค่าไฟล์นี้ เรียกใช้คำสั่งต่อไปนี้เพื่อเปิดไฟล์ .env ในโปรแกรมแก้ไข

cloudshell open .env

คุณจะเห็นการกำหนดค่าต่อไปนี้ที่ใช้กับไฟล์ .env อยู่แล้ว

# .env

# Google Cloud and Vertex AI configuration
GOOGLE_CLOUD_PROJECT=your-project-id
GOOGLE_CLOUD_LOCATION=global
GOOGLE_GENAI_USE_VERTEXAI=True

# Database connection for session service
# DB_CONNECTION_NAME=your-db-connection-name

สำหรับ Codelab นี้ เราจะใช้ค่าที่กำหนดค่าไว้ล่วงหน้าสำหรับ GOOGLE_CLOUD_LOCATION และ GOOGLE_GENAI_USE_VERTEXAI.

ตอนนี้เราสามารถไปยังขั้นตอนถัดไปได้แล้ว นั่นคือการสร้างฐานข้อมูลที่เอเจนต์จะใช้เพื่อความคงทนของสถานะและเซสชัน

5. 🚀 เตรียมฐานข้อมูล CloudSQL

เราจะต้องมีฐานข้อมูลที่ตัวแทน ADK จะใช้ในภายหลัง มาสร้างฐานข้อมูล PostgreSQL ใน Cloud SQL กัน เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างอินสแตนซ์ฐานข้อมูลก่อน เราจะใช้ชื่อฐานข้อมูล postgres เริ่มต้น ดังนั้นเราจะข้ามการสร้างฐานข้อมูลในที่นี้ นอกจากนี้ เรายังต้องกำหนดค่าชื่อผู้ใช้ฐานข้อมูลเริ่มต้นด้วย (postgres เช่นกัน) เพื่อให้บทแนะนำนี้สมบูรณ์ เราจะใช้ ADK-deployment123 เป็นรหัสผ่าน

gcloud sql instances create adk-deployment \
  --database-version=POSTGRES_17 \
  --edition=ENTERPRISE \
  --tier=db-g1-small \
  --region=us-central1 \
  --availability-type=ZONAL \
  --project=${GOOGLE_CLOUD_PROJECT} && \
gcloud sql users set-password postgres \
  --instance=adk-deployment \
  --password=ADK-deployment123

ในคำสั่งข้างต้น gcloud sql instances create adk-deployment แรกคือคำสั่งที่เราใช้เพื่อสร้างอินสแตนซ์ฐานข้อมูล เราใช้ข้อกำหนดขั้นต่ำของแซนด์บ็อกซ์เพื่อประโยชน์ของบทแนะนำนี้ คำสั่งที่ 2 gcloud sql users set-password postgres ใช้เพื่อเปลี่ยนรหัสผ่านชื่อผู้ใช้เริ่มต้น postgres

โปรดทราบว่าเราใช้ adk-deployment เป็นชื่ออินสแตนซ์ฐานข้อมูล เมื่อเสร็จแล้ว คุณควรเห็นเอาต์พุตในเทอร์มินัลตามที่แสดงด้านล่าง ซึ่งแสดงว่าอินสแตนซ์พร้อมใช้งานและมีการอัปเดตรหัสผ่านของผู้ใช้เริ่มต้นแล้ว

Created [https://sqladmin.googleapis.com/sql/v1beta4/projects/your-project-id/instances/adk-deployment].
NAME: adk-deployment
DATABASE_VERSION: POSTGRES_17
LOCATION: us-central1-a
TIER: db-g1-small
PRIMARY_ADDRESS: xx.xx.xx.xx
PRIVATE_ADDRESS: -
STATUS: RUNNABLE
Updating Cloud SQL user...done. 

เนื่องจากการติดตั้งใช้งานฐานข้อมูลนี้จะต้องใช้เวลาสักครู่ เรามาต่อกันที่ส่วนถัดไปในขณะที่รอให้การติดตั้งใช้งานฐานข้อมูล CloudSQL พร้อมใช้งาน

6. 🚀 สร้าง Weather Agent ด้วย ADK และ Gemini 2.5

ข้อมูลเบื้องต้นเกี่ยวกับโครงสร้างไดเรกทอรี ADK

มาเริ่มสำรวจสิ่งที่ ADK มีให้และวิธีสร้าง Agent กัน คุณเข้าถึงเอกสารประกอบ ADK ฉบับสมบูรณ์ได้ใน URL นี้ ADK มีเครื่องมือมากมายให้เราใช้ในการเรียกใช้คำสั่ง CLI ตัวอย่างเช่น

  • ตั้งค่าโครงสร้างไดเรกทอรีของ Agent
  • ลองโต้ตอบอย่างรวดเร็วผ่านอินพุตเอาต์พุต CLI
  • ตั้งค่าอินเทอร์เฟซเว็บ UI การพัฒนาในเครื่องอย่างรวดเร็ว

ตอนนี้เรามาตรวจสอบโครงสร้างของ Agent ในไดเรกทอรี weather_agent กัน

weather_agent/
├── __init__.py
├── agent.py
└── tool.py

และหากตรวจสอบ init.py และ agent.py คุณจะเห็นโค้ดนี้

# __init__.py

from weather_agent.agent import root_agent

__all__ = ["root_agent"]
# agent.py


import os
from pathlib import Path

import google.auth
from dotenv import load_dotenv
from google.adk.agents import Agent
from weather_agent.tool import get_weather

# Load environment variables from .env file in root directory
root_dir = Path(__file__).parent.parent
dotenv_path = root_dir / ".env"
load_dotenv(dotenv_path=dotenv_path)


# Use default project from credentials if not in .env
_, project_id = google.auth.default()
os.environ.setdefault("GOOGLE_CLOUD_PROJECT", project_id)
os.environ.setdefault("GOOGLE_CLOUD_LOCATION", "global")
os.environ.setdefault("GOOGLE_GENAI_USE_VERTEXAI", "True")

root_agent = Agent(
    name="weather_agent",
    model="gemini-2.5-flash",
    instruction="""
You are a helpful AI assistant designed to provide accurate and useful information.
""",
    tools=[get_weather],
)

คำอธิบายโค้ดของ ADK

สคริปต์นี้มีการเริ่มต้นตัวแทนที่เราเริ่มต้นสิ่งต่อไปนี้

  • ตั้งค่าโมเดลที่จะใช้เป็น gemini-2.5-flash
  • จัดหาเครื่องมือ get_weather เพื่อรองรับฟังก์ชันการทำงานของเอเจนต์ในฐานะเอเจนต์สภาพอากาศ

เรียกใช้ UI บนเว็บในเครื่อง

ตอนนี้เราสามารถโต้ตอบกับ Agent และตรวจสอบลักษณะการทำงานของ Agent ในเครื่องได้แล้ว ADK ช่วยให้เรามีเว็บ UI สำหรับการพัฒนาเพื่อโต้ตอบและตรวจสอบสิ่งที่เกิดขึ้นระหว่างการโต้ตอบ เรียกใช้คำสั่งต่อไปนี้เพื่อเริ่มเซิร์ฟเวอร์ UI สำหรับการพัฒนาในเครื่อง

uv run adk web --port 8080

ซึ่งจะสร้างเอาต์พุตคล้ายกับตัวอย่างต่อไปนี้ ซึ่งหมายความว่าเราเข้าถึงอินเทอร์เฟซเว็บได้แล้ว

INFO:     Started server process [xxxx]
INFO:     Waiting for application startup.

+-----------------------------------------------------------------------------+
| ADK Web Server started                                                      |
|                                                                             |
| For local testing, access at http://localhost:8080.                         |
+-----------------------------------------------------------------------------+

INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)

ตอนนี้หากต้องการตรวจสอบ ให้คลิกปุ่มตัวอย่างเว็บที่ด้านบนของ Cloud Shell Editor แล้วเลือกแสดงตัวอย่างบนพอร์ต 8080

edc73e971b9fc60c.png

คุณจะเห็นหน้าเว็บต่อไปนี้ ซึ่งคุณสามารถเลือกเอเจนต์ที่พร้อมให้บริการได้ที่ปุ่มเมนูแบบเลื่อนลงด้านซ้ายบน ( ในกรณีของเราควรเป็น weather_agent) และโต้ตอบกับบ็อต คุณจะเห็นข้อมูลมากมายเกี่ยวกับรายละเอียดบันทึกในระหว่างรันไทม์ของเอเจนต์ในหน้าต่างด้านซ้าย

25999e0b71c3989.png

ตอนนี้ลองโต้ตอบกับวิดีโอนี้ ในแถบด้านซ้าย เราสามารถตรวจสอบการติดตามสำหรับอินพุตแต่ละรายการได้ เพื่อให้เข้าใจระยะเวลาที่ใช้สำหรับแต่ละการดำเนินการที่เอเจนต์ทำก่อนที่จะสร้างคำตอบสุดท้าย

b4ba38adf419017e.png

นี่เป็นหนึ่งในฟีเจอร์การสังเกตการณ์ที่สร้างขึ้นใน ADK และปัจจุบันเราตรวจสอบในเครื่อง ในภายหลัง เราจะมาดูวิธีผสานรวมกับ Cloud Tracing เพื่อให้เรามีการติดตามคำขอทั้งหมดแบบรวมศูนย์

7. 🚀 การทำให้ใช้งานได้กับ Cloud Run

ตอนนี้เรามาทำให้บริการตัวแทนนี้ใช้งานได้ใน Cloud Run กัน ในการสาธิตนี้ บริการนี้จะแสดงเป็นบริการสาธารณะที่ผู้อื่นเข้าถึงได้ อย่างไรก็ตาม โปรดทราบว่านี่ไม่ใช่แนวทางปฏิบัติแนะนำเนื่องจากไม่ปลอดภัย

20d503f01eaadfd.jpeg

สถานการณ์การติดตั้งใช้งานนี้ช่วยให้คุณปรับแต่งบริการแบ็กเอนด์ของเอเจนต์ได้ โดยเราจะใช้ Dockerfile เพื่อติดตั้งใช้งานเอเจนต์ใน Cloud Run ตอนนี้เรามีไฟล์ทั้งหมดที่จำเป็น ( Dockerfile และ server.py) เพื่อทำให้แอปพลิเคชันใช้งานได้ใน Cloud Run แล้ว เมื่อมี 2 รายการนี้ คุณจะปรับแต่งการติดตั้งใช้งานเอเจนต์ได้อย่างยืดหยุ่น ( เช่น การเพิ่มเส้นทางแบ็กเอนด์ที่กำหนดเอง และ/หรือการเพิ่มบริการ Sidecar เพิ่มเติมเพื่อวัตถุประสงค์ในการตรวจสอบ) เราจะพูดถึงเรื่องนี้อย่างละเอียดในภายหลัง

ตอนนี้มาทำให้บริการใช้งานได้ก่อน ไปที่เทอร์มินัล Cloud Shell และตรวจสอบว่าโปรเจ็กต์ปัจจุบันได้รับการกำหนดค่าเป็นโปรเจ็กต์ที่ใช้งานอยู่แล้ว จากนั้นเรียกใช้สคริปต์การตั้งค่าอีกครั้ง หรือคุณจะใช้คำสั่ง gcloud config set project [PROJECT_ID] เพื่อกำหนดค่าโปรเจ็กต์ที่ใช้งานอยู่ก็ได้

bash setup_trial_project.sh && source .env

ตอนนี้เราต้องกลับไปที่ไฟล์ .env อีกครั้ง เปิดไฟล์ แล้วคุณจะเห็นว่าเราต้องยกเลิกการแสดงความคิดเห็นของตัวแปร DB_CONNECTION_NAME และกรอกค่าที่ถูกต้อง

# Google Cloud and Vertex AI configuration
GOOGLE_CLOUD_PROJECT=your-project-id
GOOGLE_CLOUD_LOCATION=global
GOOGLE_GENAI_USE_VERTEXAI=True

# Database connection for session service
DB_CONNECTION_NAME=your-db-connection-name

หากต้องการรับค่า DB_CONNECTION_NAME ให้ไปที่แดชบอร์ด Cloud SQL

จากนั้นคลิกอินสแตนซ์ที่คุณสร้าง ไปที่แถบค้นหาในส่วนบนของคอนโซลระบบคลาวด์ แล้วพิมพ์ "Cloud SQL" จากนั้นคลิกผลิตภัณฑ์ Cloud SQL

39dbcf39661a8b65.png

หลังจากนั้นคุณจะเห็นอินสแตนซ์ที่สร้างไว้ก่อนหน้านี้ ให้คลิกอินสแตนซ์นั้น

8faf706622293e9a.png

ในหน้าอินสแตนซ์ ให้เลื่อนลงไปที่ส่วน "เชื่อมต่อกับอินสแตนซ์นี้" แล้วคัดลอกชื่อการเชื่อมต่อเพื่อแทนที่ค่า DB_CONNECTION_NAME

d669fc62ae37ab7d.png

หลังจากนั้น ให้เปิดไฟล์ .env ด้วยคำสั่งต่อไปนี้

cloudshell edit .env

และแก้ไขตัวแปร DB_CONNECTION_NAME ในไฟล์ .env ไฟล์ env ควรมีลักษณะดังตัวอย่างด้านล่าง

# Google Cloud and Vertex AI configuration
GOOGLE_CLOUD_PROJECT=your-project-id
GOOGLE_CLOUD_LOCATION=global
GOOGLE_GENAI_USE_VERTEXAI=True

# Database connection for session service
DB_CONNECTION_NAME=your-project-id:your-location:your-instance-name

หลังจากนั้น ให้เรียกใช้สคริปต์การติดตั้งใช้งาน

bash deploy_to_cloudrun.sh

หากระบบแจ้งให้รับทราบการสร้างรีจิสทรีของ Artifact สำหรับที่เก็บ Docker เพียงตอบว่า Y

ในระหว่างที่รอขั้นตอนการติดตั้งใช้งาน เรามาดู deploy_to_cloudrun.sh กัน

#!/bin/bash

# Load environment variables from .env file
if [ -f .env ]; then
    export $(cat .env | grep -v '^#' | xargs)
else
    echo "Error: .env file not found"
    exit 1
fi

# Validate required variables
required_vars=("GOOGLE_CLOUD_PROJECT" "DB_CONNECTION_NAME")
for var in "${required_vars[@]}"; do
    if [ -z "${!var}" ]; then
        echo "Error: $var is not set in .env file"
        exit 1
    fi
done

gcloud run deploy weather-agent \
    --source . \
    --port 8080 \
    --project ${GOOGLE_CLOUD_PROJECT} \
    --allow-unauthenticated \
    --add-cloudsql-instances ${DB_CONNECTION_NAME} \
    --update-env-vars SESSION_SERVICE_URI="postgresql+pg8000://postgres:ADK-deployment123@postgres/?unix_sock=/cloudsql/${DB_CONNECTION_NAME}/.s.PGSQL.5432",GOOGLE_CLOUD_PROJECT=${GOOGLE_CLOUD_PROJECT} \
    --region us-central1 \
    --min 1 \
    --memory 1G \
    --concurrency 10

สคริปต์นี้จะโหลดตัวแปร .env จากนั้นเรียกใช้คำสั่งการติดตั้งใช้งาน

หากพิจารณาอย่างละเอียดแล้ว เราจะเห็นว่าเราต้องการคำสั่ง gcloud run deploy เพียงคำสั่งเดียวเพื่อทำสิ่งจำเป็นทั้งหมดที่ต้องดำเนินการหากต้องการติดตั้งใช้งานบริการ ได้แก่ การสร้างอิมเมจ การพุชไปยังรีจิสทรี การติดตั้งใช้งานบริการ การตั้งค่านโยบาย IAM การสร้างรีวิชัน และแม้แต่การกำหนดเส้นทางการรับส่งข้อมูล ในตัวอย่างนี้ เราได้ระบุ Dockerfile ไว้แล้ว ดังนั้นคำสั่งนี้จะใช้ Dockerfile เพื่อสร้างแอป

เมื่อการติดตั้งใช้งานเสร็จสมบูรณ์แล้ว คุณจะได้รับลิงก์ที่คล้ายกับลิงก์ด้านล่าง

https://weather-agent-*******.us-central1.run.app

หลังจากได้รับ URL นี้แล้ว คุณจะใช้แอปพลิเคชันจากหน้าต่างโหมดไม่ระบุตัวตนหรืออุปกรณ์เคลื่อนที่ และเข้าถึง UI สำหรับนักพัฒนาซอฟต์แวร์ของเอเจนต์ได้ ในระหว่างรอการติดตั้งใช้งาน เรามาดูบริการโดยละเอียดที่เราเพิ่งติดตั้งใช้งานในส่วนถัดไปกัน

8. 💡 Dockerfile และสคริปต์เซิร์ฟเวอร์แบ็กเอนด์

เพื่อให้เข้าถึง Agent เป็นบริการได้ เราจะห่อหุ้ม Agent ไว้ภายในแอป FastAPI ซึ่งจะเรียกใช้ในคำสั่ง Dockerfile ด้านล่างนี้คือเนื้อหาของ Dockerfile

FROM python:3.12-slim

RUN pip install --no-cache-dir uv==0.7.13

WORKDIR /app

COPY . .

RUN uv sync --frozen

EXPOSE 8080

CMD ["uv", "run", "uvicorn", "server:app", "--host", "0.0.0.0", "--port", "8080"]

เราสามารถกำหนดค่าบริการที่จำเป็นเพื่อรองรับเอเจนต์ได้ที่นี่ เช่น การเตรียมบริการ Session, Memory หรือ Artifact เพื่อวัตถุประสงค์ในการผลิตที่นี่ นี่คือโค้ดของ server.py ที่จะใช้

import os

from dotenv import load_dotenv
from fastapi import FastAPI
from google.adk.cli.fast_api import get_fast_api_app
from pydantic import BaseModel
from typing import Literal
from google.cloud import logging as google_cloud_logging


# Load environment variables from .env file
load_dotenv()

logging_client = google_cloud_logging.Client()
logger = logging_client.logger(__name__)

AGENT_DIR = os.path.dirname(os.path.abspath(__file__))

# Get session service URI from environment variables
session_uri = os.getenv("SESSION_SERVICE_URI", None)

# Prepare arguments for get_fast_api_app
app_args = {"agents_dir": AGENT_DIR, "web": True, "trace_to_cloud": True}

# Only include session_service_uri if it's provided
if session_uri:
    app_args["session_service_uri"] = session_uri
else:
    logger.log_text(
        "SESSION_SERVICE_URI not provided. Using in-memory session service instead. "
        "All sessions will be lost when the server restarts.",
        severity="WARNING",
    )

# Create FastAPI app with appropriate arguments
app: FastAPI = get_fast_api_app(**app_args)

app.title = "weather-agent"
app.description = "API for interacting with the Agent weather-agent"


class Feedback(BaseModel):
    """Represents feedback for a conversation."""

    score: int | float
    text: str | None = ""
    invocation_id: str
    log_type: Literal["feedback"] = "feedback"
    service_name: Literal["weather-agent"] = "weather-agent"
    user_id: str = ""


# Example if you want to add your custom endpoint
@app.post("/feedback")
def collect_feedback(feedback: Feedback) -> dict[str, str]:
    """Collect and log feedback.

    Args:
        feedback: The feedback data to log

    Returns:
        Success message
    """
    logger.log_struct(feedback.model_dump(), severity="INFO")
    return {"status": "success"}


# Main execution
if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="0.0.0.0", port=8080)

คำอธิบายโค้ดฝั่งเซิร์ฟเวอร์

ต่อไปนี้คือสิ่งที่กำหนดไว้ในสคริปต์ server.py

  1. เปลี่ยนเอเจนต์ของเราให้เป็นแอป FastAPI โดยใช้วิธี get_fast_api_app ด้วยวิธีนี้ เราจะรับช่วงคำจำกัดความเส้นทางเดียวกันกับที่ใช้สำหรับ UI การพัฒนาเว็บ
  2. กำหนดค่าบริการเซสชัน หน่วยความจำ หรืออาร์ติแฟกต์ที่จำเป็นโดยการเพิ่มอาร์กิวเมนต์คีย์เวิร์ดลงในเมธอด get_fast_api_app ในบทแนะนำนี้ หากเรากำหนดค่าตัวแปรสภาพแวดล้อม SESSION_SERVICE_URI บริการเซสชันจะใช้ตัวแปรดังกล่าว ไม่เช่นนั้นจะใช้เซสชันในหน่วยความจำ
  3. เราสามารถเพิ่มเส้นทางที่กำหนดเองเพื่อรองรับตรรกะทางธุรกิจของแบ็กเอนด์อื่นๆ ได้ ในสคริปต์ เราจะเพิ่มตัวอย่างเส้นทางฟังก์ชันการทำงานของความคิดเห็น
  4. เปิดใช้การติดตามระบบคลาวด์ในพารามิเตอร์ get_fast_api_app arg เพื่อส่งการติดตามไปยัง Google Cloud Trace
  5. เรียกใช้บริการ FastAPI โดยใช้ Uvicorn

ตอนนี้หากการติดตั้งใช้งานเสร็จสมบูรณ์แล้ว โปรดลองโต้ตอบกับตัวแทนจาก UI สำหรับนักพัฒนาเว็บโดยเข้าถึง URL ของ Cloud Run

9. 🚀 ตรวจสอบการปรับขนาดอัตโนมัติของ Cloud Run ด้วยการทดสอบโหลด

ตอนนี้เราจะตรวจสอบความสามารถในการปรับขนาดอัตโนมัติของ Cloud Run สำหรับสถานการณ์นี้ เราจะทำให้เวอร์ชันใหม่ใช้งานได้ในขณะที่เปิดใช้การทำงานพร้อมกันสูงสุดต่ออินสแตนซ์ ในส่วนก่อนหน้า เราตั้งค่าการทำงานพร้อมกันสูงสุดเป็น 10 ( แฟล็ก --concurrency 10 ) ดังนั้นเราจึงคาดหวังได้ว่า Cloud Run จะพยายามปรับขนาดอินสแตนซ์เมื่อเราทำการทดสอบโหลดที่เกินจำนวนนี้

มาตรวจสอบไฟล์ load_test.py กัน นี่จะเป็นสคริปต์ที่เราใช้ในการทดสอบภาระงานโดยใช้เฟรมเวิร์ก locust สคริปต์นี้จะทำสิ่งต่อไปนี้

  1. user_id และ session_id แบบสุ่ม
  2. สร้าง session_id สำหรับ user_id
  3. เรียกใช้ปลายทาง "/run_sse" ด้วย user_id และ session_id ที่สร้างขึ้น

เราจะต้องทราบ URL ของบริการที่ติดตั้งใช้งาน หากคุณพลาดไป เราสามารถไปที่คอนโซล Cloud Run

จากนั้นค้นหาบริการ weather-agent แล้วคลิก

6f0874f1e96cdbd6.png

URL ของบริการจะแสดงอยู่ข้างข้อมูลภูมิภาค เช่น

6d0823829ee15d1.png

เราจะเรียกใช้สคริปต์ต่อไปนี้เพื่อรับ URL ของบริการที่เพิ่งติดตั้งใช้งานและจัดเก็บไว้ในตัวแปรสภาพแวดล้อม SERVICE_URL เพื่อให้คุณใช้งานได้ง่ายขึ้น

export SERVICE_URL=$(gcloud run services describe weather-agent \
    --platform managed \
    --region us-central1 \
    --format 'value(status.url)')

จากนั้นเรียกใช้คำสั่งต่อไปนี้เพื่อทดสอบการโหลดแอปตัวแทนของเรา

uv run locust -f load_test.py \
              -H $SERVICE_URL \
              -u 60 \
              -r 5 \
              -t 120 \
              --headless

เมื่อเรียกใช้แล้ว คุณจะเห็นเมตริกที่แสดงในลักษณะนี้ ( ในตัวอย่างนี้ คำขอทั้งหมดสำเร็จ )

Type     Name                                  # reqs      # fails |    Avg     Min     Max    Med |   req/s  failures/s
--------|------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
POST     /run_sse end                             813     0(0.00%) |   5817    2217   26421   5000 |    6.79        0.00
POST     /run_sse message                         813     0(0.00%) |   2678    1107   17195   2200 |    6.79        0.00
--------|------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
         Aggregated                              1626     0(0.00%) |   4247    1107   26421   3500 |   13.59        0.00  

จากนั้นมาดูกันว่าเกิดอะไรขึ้นใน Cloud Run โดยไปที่บริการที่ใช้งานจริงอีกครั้ง แล้วดูแดชบอร์ด ซึ่งจะแสดงวิธีที่ Cloud Run ปรับขนาดอินสแตนซ์โดยอัตโนมัติเพื่อจัดการคำขอขาเข้า เนื่องจากเราจำกัดการทำงานพร้อมกันสูงสุดไว้ที่ 10 รายการต่ออินสแตนซ์ อินสแตนซ์ Cloud Run จึงจะพยายามปรับจำนวนคอนเทนเนอร์ให้เป็นไปตามเงื่อนไขนี้โดยอัตโนมัติ

a23679982c072041.png

10. 🚀 การเปิดตัวการแก้ไขใหม่แบบค่อยเป็นค่อยไป

ลองพิจารณาสถานการณ์ต่อไปนี้ เราต้องการอัปเดตพรอมต์ของเอเจนต์ เปิด weather_agent/agent.py ด้วยคำสั่งต่อไปนี้

cloudshell edit weather_agent/agent.py

และเขียนทับด้วยโค้ดต่อไปนี้

# weather_agent/agent.py

import os
from pathlib import Path

import google.auth
from dotenv import load_dotenv
from google.adk.agents import Agent
from weather_agent.tool import get_weather

# Load environment variables from .env file in root directory
root_dir = Path(__file__).parent.parent
dotenv_path = root_dir / ".env"
load_dotenv(dotenv_path=dotenv_path)


# Use default project from credentials if not in .env
_, project_id = google.auth.default()
os.environ.setdefault("GOOGLE_CLOUD_PROJECT", project_id)
os.environ.setdefault("GOOGLE_CLOUD_LOCATION", "global")
os.environ.setdefault("GOOGLE_GENAI_USE_VERTEXAI", "True")

root_agent = Agent(
    name="weather_agent",
    model="gemini-2.5-flash",
    instruction="""
You are a helpful AI assistant designed to provide accurate and useful information.
You only answer inquiries about the weather. Refuse all other user query
""",
    tools=[get_weather],
)

จากนั้นคุณต้องการเผยแพร่การแก้ไขใหม่ แต่ไม่ต้องการให้การรับส่งข้อมูลคำขอทั้งหมดไปยังเวอร์ชันใหม่โดยตรง เราสามารถเปิดตัวแบบค่อยเป็นค่อยไปด้วย Cloud Run ก่อนอื่นเราต้องติดตั้งใช้งานรีวิชันใหม่ แต่มีแฟล็ก –no-traffic บันทึกสคริปต์ของ Agent ก่อนหน้า แล้วเรียกใช้คำสั่งต่อไปนี้

gcloud run deploy weather-agent \
                  --source . \
                  --port 8080 \
                  --project $GOOGLE_CLOUD_PROJECT \
                  --allow-unauthenticated \
                  --region us-central1 \
                  --no-traffic

หลังจากเสร็จสิ้น คุณจะได้รับบันทึกที่คล้ายกับกระบวนการติดตั้งใช้งานก่อนหน้า โดยจะแตกต่างกันที่จำนวนการเข้าชมที่แสดง โดยจะแสดงการเข้าชมที่แสดงเป็น 0 เปอร์เซ็นต์

Service [weather-agent] revision [weather-agent-xxxx-xxx] has been deployed and is serving 0 percent of traffic.

จากนั้นไปที่แดชบอร์ด Cloud Run

จากนั้นค้นหาบริการ weather-agent แล้วคลิก

6f0874f1e96cdbd6.png

ไปที่แท็บการแก้ไข แล้วคุณจะเห็นรายการการแก้ไขที่ใช้งานอยู่

de00ac6870ed120b.png

คุณจะเห็นว่าการแก้ไขที่เพิ่งติดตั้งใช้งานใหม่แสดง 0% จากที่นี่ คุณสามารถคลิกปุ่มเคบับ (⋮) แล้วเลือกจัดการการเข้าชม

f35344086aecc5e6.png

ในหน้าต่างที่เพิ่งปรากฏขึ้น คุณจะแก้ไขเปอร์เซ็นต์ของการเข้าชมที่ไปยังการแก้ไขใดก็ได้

525ae793ebeee87f.png

หลังจากรอสักครู่ ระบบจะกำหนดเส้นทางการเข้าชมตามสัดส่วนโดยอิงตามการกำหนดค่าเปอร์เซ็นต์ ด้วยวิธีนี้ เราจึงสามารถย้อนกลับไปใช้การแก้ไขก่อนหน้าได้อย่างง่ายดายหากเกิดปัญหาขึ้นกับการเปิดตัวเวอร์ชันใหม่

11. 🚀 การติดตาม ADK

เอเจนต์ที่สร้างด้วย ADK รองรับการติดตามโดยใช้การฝัง OpenTelemetry อยู่แล้ว เรามี Cloud Trace เพื่อบันทึกการติดตามเหล่านั้นและแสดงภาพ มาดู server.py กันว่าเราเปิดใช้ฟีเจอร์นี้ในบริการที่ติดตั้งใช้งานก่อนหน้านี้ได้อย่างไร

# server.py

...

app_args = {"agents_dir": AGENT_DIR, "web": True, "trace_to_cloud": True}

...

app: FastAPI = get_fast_api_app(**app_args)

...

ในที่นี้ เราจะส่งอาร์กิวเมนต์ trace_to_cloud ไปยัง True หากคุณติดตั้งใช้งานด้วยตัวเลือกอื่นๆ โปรดดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีเปิดใช้การติดตามไปยัง Cloud Trace จากตัวเลือกการติดตั้งใช้งานต่างๆ ได้ในเอกสารประกอบนี้

ลองเข้าถึง UI ของนักพัฒนาเว็บของบริการและแชทกับตัวแทน หลังจากนั้น ให้ไปที่หน้าเครื่องมือสำรวจการติดตาม

ในหน้าเครื่องมือสำรวจการติดตาม คุณจะเห็นว่าเราได้ส่งการติดตามการสนทนากับตัวแทนแล้ว คุณดูได้จากส่วนชื่อช่วง และกรองช่วงที่เฉพาะเจาะจงสำหรับตัวแทนของเรา ( ชื่อคือ agent_run [weather_agent] ) ที่นั่น

63cb96b8d8c43425.png

เมื่อกรองช่วงแล้ว คุณยังตรวจสอบแต่ละการติดตามได้โดยตรงด้วย โดยจะแสดงระยะเวลาโดยละเอียดของการดำเนินการแต่ละอย่างที่ตัวแทนทำ เช่น ดูรูปภาพด้านล่าง

db765dc868c3f8c0.png

ในแต่ละส่วน คุณจะตรวจสอบรายละเอียดในแอตทริบิวต์ได้ดังที่แสดงด้านล่าง

dcb3916cbdf3bda8.png

เพียงเท่านี้ เราก็จะมีข้อมูลการสังเกตการณ์ที่ดีและข้อมูลเกี่ยวกับการโต้ตอบแต่ละครั้งของเอเจนต์กับผู้ใช้เพื่อช่วยแก้ไขข้อบกพร่อง คุณสามารถลองใช้เครื่องมือหรือเวิร์กโฟลว์ต่างๆ ได้

12. 🎯 ความท้าทาย

ลองใช้เวิร์กโฟลว์แบบหลายเอเจนต์หรือแบบเอเจนต์เพื่อดูว่าเวิร์กโฟลว์ทำงานภายใต้ภาระงานอย่างไรและร่องรอยมีลักษณะอย่างไร

13. 🧹 ล้างข้อมูล

โปรดทำตามขั้นตอนต่อไปนี้เพื่อเลี่ยงไม่ให้เกิดการเรียกเก็บเงินกับบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ในโค้ดแล็บนี้

  1. ใน Google Cloud Console ให้ไปที่หน้าจัดการทรัพยากร
  2. ในรายการโปรเจ็กต์ ให้เลือกโปรเจ็กต์ที่ต้องการลบ แล้วคลิกลบ
  3. ในกล่องโต้ตอบ ให้พิมพ์รหัสโปรเจ็กต์ แล้วคลิกปิดเพื่อลบโปรเจ็กต์
  4. หรือคุณจะไปที่ Cloud Run ในคอนโซล เลือกบริการที่คุณเพิ่งติดตั้งใช้งาน แล้วลบก็ได้