สร้างและติดตั้งใช้งานเอเจนต์ ADK ที่ใช้เซิร์ฟเวอร์ MCP ใน Cloud Run

1. บทนำ

แล็บนี้มุ่งเน้นที่การติดตั้งใช้งานและการติดตั้งบริการตัวแทนไคลเอ็นต์ คุณจะใช้ Agent Development Kit (ADK) เพื่อสร้าง AI Agent ที่ใช้เครื่องมือระยะไกล เช่น เซิร์ฟเวอร์ MCP ที่สร้างในแล็บ 1 หลักการออกแบบที่สำคัญซึ่งแสดงให้เห็นคือการแยกความกังวล โดยมีเลเยอร์การให้เหตุผลที่แตกต่างกัน (Agent) ซึ่งสื่อสารกับเลเยอร์เครื่องมือที่แตกต่างกัน (เซิร์ฟเวอร์ MCP) ผ่าน API ที่ปลอดภัย

ใน Lab 1 คุณได้สร้างเซิร์ฟเวอร์ MCP ที่ให้ข้อมูลเกี่ยวกับสัตว์ในสวนสัตว์สมมติแก่ LLM เช่น เมื่อใช้ Antigravity CLI (agy) ใน Lab นี้ เราจะสร้าง Agent ไกด์นำเที่ยวสำหรับสวนสัตว์สมมติ Agent จะใช้เซิร์ฟเวอร์ MCP เดียวกันจากแล็บ 1 เพื่อเข้าถึงรายละเอียดเกี่ยวกับสัตว์ในสวนสัตว์ และใช้ Wikipedia เพื่อสร้างประสบการณ์ไกด์นำเที่ยวที่ดีที่สุด

f8d4423edbfe993d.png

สุดท้าย เราจะติดตั้งใช้งานเอเจนต์ไกด์นำเที่ยวใน Google Cloud Run เพื่อให้ผู้เข้าชมสวนสัตว์ทุกคนเข้าถึงได้แทนที่จะเรียกใช้ในเครื่องเท่านั้น

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

  • เซิร์ฟเวอร์ MCP ที่ทำงานใน Cloud Run หรือ URL ของบริการที่เชื่อมโยง
  • โปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงิน
  • เครื่องมือ CLI ที่ติดตั้ง: gcloud, uv, agy

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

  • วิธีจัดโครงสร้างโปรเจ็กต์ Python สำหรับการติดตั้งใช้งาน ADK
  • วิธีใช้เอเจนต์ที่ใช้เครื่องมือด้วย google-adk
  • วิธีเชื่อมต่อเอเจนต์กับเซิร์ฟเวอร์ MCP ระยะไกลสำหรับชุดเครื่องมือ
  • วิธีติดตั้งใช้งานแอปพลิเคชัน Python เป็นคอนเทนเนอร์แบบ Serverless ใน Cloud Run
  • วิธีกำหนดค่าการตรวจสอบสิทธิ์แบบบริการต่อบริการที่ปลอดภัยโดยใช้บทบาท IAM
  • วิธีลบทรัพยากร Cloud เพื่อหลีกเลี่ยงค่าใช้จ่ายในอนาคต

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

  • บัญชี Google Cloud และโปรเจ็กต์ Google Cloud
  • เว็บเบราว์เซอร์ เช่น Chrome

2. เหตุผลที่ควรติดตั้งใช้งานใน Cloud Run

Cloud Run เป็นตัวเลือกที่ยอดเยี่ยมสำหรับการโฮสต์ Agent ADK เนื่องจากเป็นแพลตฟอร์มแบบ Serverless ซึ่งหมายความว่าคุณสามารถมุ่งเน้นไปที่โค้ดได้โดยไม่ต้องจัดการโครงสร้างพื้นฐานเบื้องหลัง เราจะจัดการงานด้านการปฏิบัติการให้คุณ

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

ฟีเจอร์หลัก

เรียกใช้คอนเทนเนอร์ได้ทุกที่

  • คุณนำคอนเทนเนอร์ (อิมเมจ Docker) ที่มีแอปของคุณอยู่ภายในมา
  • Cloud Run จะเรียกใช้ในโครงสร้างพื้นฐานของ Google
  • ไม่ต้องกังวลเรื่องการแพตช์ระบบปฏิบัติการ การตั้งค่า VM หรือการปรับขนาด

การปรับขนาดอัตโนมัติ

  • หากไม่มีผู้ใช้แอป → จะไม่มีอินสแตนซ์ที่ทำงาน (ลดขนาดลงเหลือ 0 อินสแตนซ์ ซึ่งประหยัดค่าใช้จ่าย)
  • หากมีคำขอ 1,000 รายการเข้ามา ระบบจะสร้างสำเนาตามจำนวนที่จำเป็น

ไม่เก็บสถานะโดยค่าเริ่มต้น:

  • คำขอแต่ละรายการอาจไปที่อินสแตนซ์อื่น
  • หากต้องการจัดเก็บสถานะ ให้ใช้บริการภายนอก เช่น Cloud SQL, Firestore หรือ Memorystore

รองรับภาษาหรือเฟรมเวิร์กใดก็ได้

  • Cloud Run ไม่สนใจว่าจะเป็น Python, Go, Node.js, Java หรือ .Net ตราบใดที่ทำงานในคอนเทนเนอร์ Linux

จ่ายเงินตามการใช้งานจริง:

3. ก่อนเริ่มต้น

การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง

  1. ลงชื่อเข้าใช้ คอนโซล Google Cloud แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

fbef9caa1602edd0.pnga99b7ace416376c4.png5e3ff691252acf41.png

  • ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ คุณอัปเดตข้อมูลนี้ได้ทุกเมื่อ
  • รหัสโปรเจ็กต์จะไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เปลี่ยนไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณอาจสร้างรหัสแบบสุ่มอีกรหัสหนึ่งได้ หรือคุณอาจลองใช้ชื่อของคุณเองและดูว่าพร้อมใช้งานหรือไม่ โดยจะเปลี่ยนแปลงไม่ได้หลังจากขั้นตอนนี้ และจะยังคงอยู่ตลอดระยะเวลาของโปรเจ็กต์
  • โปรดทราบว่ามีค่าที่ 3 คือหมายเลขโปรเจ็กต์ ซึ่ง API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
  1. จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้จะมีค่าใช้จ่ายไม่มาก หรืออาจไม่มีเลย หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD

เริ่มต้น Cloud Shell

  1. ไปที่ Cloud Shell Editor
  2. หากเทอร์มินัลไม่ปรากฏที่ด้านล่างของหน้าจอ ให้เปิดโดยทำดังนี้
    • คลิก Terminal
    • คลิก Terminal ใหม่
    d32c46fffa0a30a5.png
  3. ในเทอร์มินัล ให้ตั้งค่าโปรเจ็กต์ด้วยคำสั่งนี้ หากคุณทําแล็บ 1 เสร็จแล้ว ให้ตรวจสอบว่าคุณใช้รหัสโปรเจ็กต์เดียวกัน
    gcloud config set project [YOUR-PROJECT-ID]
    
    หากจำรหัสโปรเจ็กต์ไม่ได้ คุณสามารถแสดงรหัสโปรเจ็กต์ทั้งหมดได้โดยใช้คำสั่งต่อไปนี้
    gcloud projects list | awk '/PROJECT_ID/{print $2}'
    
  4. หากได้รับแจ้งให้ให้สิทธิ์ ให้คลิกให้สิทธิ์เพื่อดำเนินการต่อ

6356559df3eccdda.png

  1. คุณควรเห็นข้อความต่อไปนี้
    Updated property [core/project].
    
    หากเห็น WARNING และระบบขอให้คุณ Do you want to continue (Y/n)? แสดงว่าคุณอาจป้อนรหัสโปรเจ็กต์ไม่ถูกต้อง กด n กด Enter แล้วลองเรียกใช้คำสั่ง gcloud config set project อีกครั้ง

4. ตั้งค่าสภาพแวดล้อม

เปิดใช้ API และตั้งค่าตัวแปรสภาพแวดล้อม

เปิดใช้บริการที่จำเป็นทั้งหมด

gcloud services enable \
    run.googleapis.com \
    artifactregistry.googleapis.com \
    cloudbuild.googleapis.com \
    aiplatform.googleapis.com

ผลลัพธ์ที่คาดหวัง

Operation "operations/acat.p2-[GUID]" finished successfully.

สร้างไดเรกทอรีโปรเจ็กต์

คำสั่งนี้จะสร้างโฟลเดอร์หลักสำหรับห้องทดลองสำหรับซอร์สโค้ดของเอเจนต์

cd && mkdir zoo_guide_agent && cd zoo_guide_agent

สร้างไฟล์ requirements.txt ไฟล์นี้แสดงรายการไลบรารี Python ที่เอเจนต์ของคุณต้องการ คำสั่งต่อไปนี้จะสร้างและป้อนข้อมูลในไฟล์

cloudshell edit requirements.txt
google-adk==1.14.0
langchain-community==0.3.27
wikipedia==1.4.0

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

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
export SA_NAME=lab2-cr-service
export SERVICE_ACCOUNT="${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"
gcloud iam service-accounts create ${SA_NAME} \
    --display-name="Service Account for lab 2 "

สร้างและเปิดไฟล์ .env เพื่อตรวจสอบสิทธิ์ตัวแทนในไดเรกทอรี zoo_guide_agent

cloudshell edit .env

คำสั่งแก้ไข cloudshell จะเปิดไฟล์ .env ในโปรแกรมแก้ไขเหนือเทอร์มินัล ป้อนข้อมูลต่อไปนี้ในไฟล์ .env แล้วกลับไปที่เทอร์มินัล

MODEL="gemini-3.5-flash"
GOOGLE_GENAI_USE_ENTERPRISE=true
GOOGLE_CLOUD_LOCATION=global

การเพิ่ม URL ของเซิร์ฟเวอร์ MCP หากทำแล็บ 1 เสร็จแล้ว ให้ทำตามขั้นตอนต่อไปนี้เพื่อใช้เซิร์ฟเวอร์ MCP ที่คุณสร้างขึ้นในแล็บ 1

ให้สิทธิ์บัญชีบริการของ Agent ในการใช้ Gemini บนแพลตฟอร์ม Agent ของ Gemini Enterprise และเรียกใช้เซิร์ฟเวอร์ MCP ระยะไกล

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT" \
  --role="roles/aiplatform.user"
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT" \
  --role="roles/run.invoker"

บันทึก URL ของเซิร์ฟเวอร์ MCP จาก Lab 1 ลงในตัวแปรสภาพแวดล้อม

echo -e "\nMCP_SERVER_URL=https://zoo-mcp-server-${PROJECT_NUMBER}.us-west1.run.app/mcp" >> .env

หากคุณใช้ลิงก์เซิร์ฟเวอร์ MCP สาธารณะ ให้เรียกใช้คำสั่งต่อไปนี้และแทนที่ PROJECT_NUMBER ด้วยสิ่งที่ได้รับ

echo -e "\nMCP_SERVER_URL=https://zoo-mcp-server-${PROJECT_NUMBER}.us-west1.run.app/mcp" >> .env

5. สร้างเวิร์กโฟลว์ของ Agent

สร้างไฟล์ init.py

สร้างไฟล์ init.py ไฟล์นี้จะบอก Python ว่าไดเรกทอรี zoo_guide_agent เป็นแพ็กเกจ

cloudshell edit __init__.py

คำสั่งก่อนหน้าจะเปิดเครื่องมือแก้ไขโค้ด เพิ่มโค้ดต่อไปนี้ลงใน __init__.py

from . import agent

สร้างไฟล์ main agent.py

สร้างไฟล์ agent.py หลัก คำสั่งนี้จะสร้างไฟล์ Python และวางโค้ดที่สมบูรณ์สำหรับระบบแบบหลาย Agent

cloudshell edit agent.py

การนำเข้าและการตั้งค่าเริ่มต้น

บล็อกแรกนี้จะนำเข้าไลบรารีที่จำเป็นทั้งหมดจาก ADK และ Google Cloud นอกจากนี้ ยังตั้งค่าการบันทึกและโหลดตัวแปรสภาพแวดล้อมจากไฟล์ .env ซึ่งมีความสำคัญต่อการเข้าถึง URL ของโมเดลและเซิร์ฟเวอร์

เพิ่มโค้ดต่อไปนี้ลงในไฟล์ agent.py

import os
import logging
import google.cloud.logging
from dotenv import load_dotenv

from google.adk import Agent
from google.adk.agents import SequentialAgent
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset, StreamableHTTPConnectionParams
from google.adk.tools.tool_context import ToolContext
from google.adk.tools.langchain_tool import LangchainTool

from langchain_community.tools import WikipediaQueryRun
from langchain_community.utilities import WikipediaAPIWrapper

import google.auth
import google.auth.transport.requests
import google.oauth2.id_token

# --- Setup Logging and Environment ---

cloud_logging_client = google.cloud.logging.Client()
cloud_logging_client.setup_logging()

load_dotenv()

model_name = os.getenv("MODEL")

การกำหนดเครื่องมือ (ความสามารถของเอเจนต์)

3eb9c6772576b906.jpeg

Agent จะทำงานได้ดีเพียงใดก็ขึ้นอยู่กับเครื่องมือที่ใช้ได้ ในส่วนนี้ เราจะกำหนดความสามารถทั้งหมดที่ Agent ของเราจะมี ซึ่งรวมถึงฟังก์ชันที่กำหนดเองเพื่อบันทึกข้อมูล เครื่องมือ MCP ที่เชื่อมต่อกับเซิร์ฟเวอร์ MCP ที่ปลอดภัยของเรา รวมถึงเครื่องมือ Wikipedia

เพิ่มโค้ดต่อไปนี้ที่ด้านล่างของ agent.py

# Greet user and save their prompt

def add_prompt_to_state(
    tool_context: ToolContext, prompt: str
) -> dict[str, str]:
    """Saves the user's initial prompt to the state."""
    tool_context.state["PROMPT"] = prompt
    logging.info(f"[State updated] Added to PROMPT: {prompt}")
    return {"status": "success"}


# Configuring the MCP Tool to connect to the Zoo MCP server

mcp_server_url = os.getenv("MCP_SERVER_URL")
if not mcp_server_url:
    raise ValueError("The environment variable MCP_SERVER_URL is not set.")

def get_id_token():
    """Get an ID token to authenticate with the MCP server."""
    target_url = os.getenv("MCP_SERVER_URL")
    audience = target_url.split('/mcp/')[0]
    request = google.auth.transport.requests.Request()
    id_token = google.oauth2.id_token.fetch_id_token(request, audience)
    return id_token

"""
# Use this code if you are using the public MCP Server and comment out the code below defining mcp_tools
mcp_tools = MCPToolset(
    connection_params=StreamableHTTPConnectionParams(
        url=mcp_server_url
    )
)
"""

mcp_tools = MCPToolset(
            connection_params=StreamableHTTPConnectionParams(
                url=mcp_server_url,
                headers={
                    "Authorization": f"Bearer {get_id_token()}",
                },
            ),
        )

# Configuring the Wikipedia Tool
wikipedia_tool = LangchainTool(
    tool=WikipediaQueryRun(api_wrapper=WikipediaAPIWrapper())
)

คำอธิบายเครื่องมือทั้ง 3

  1. add_prompt_to_state 📝

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

วิธี: เป็นฟังก์ชัน Python ที่เขียนพรอมต์ของผู้เข้าชมลงในพจนานุกรม tool_context.state ที่แชร์ บริบทของเครื่องมือนี้แสดงถึงหน่วยความจำระยะสั้นของ Agent สำหรับการสนทนาครั้งเดียว Agent ตัวถัดไปในเวิร์กโฟลว์จะอ่านข้อมูลที่ Agent ตัวหนึ่งบันทึกลงในสถานะได้

  1. MCPToolset 🦁

ใช้เพื่อเชื่อมต่อ Agent ไกด์นำเที่ยวกับเซิร์ฟเวอร์ MCP ของสวนสัตว์ที่สร้างขึ้นใน Lab 1 เซิร์ฟเวอร์นี้มีเครื่องมือพิเศษสำหรับค้นหาข้อมูลเฉพาะเกี่ยวกับสัตว์ เช่น ชื่อ อายุ และกรง

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

  1. LangchainTool 🌍

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

วิธี: ทำหน้าที่เป็นตัวดัดแปลงที่ช่วยให้เอเจนต์ของเราใช้เครื่องมือ WikipediaQueryRun ที่สร้างไว้ล่วงหน้าจากไลบรารี LangChain ได้

แหล่งข้อมูล

การกำหนด Agent ผู้เชี่ยวชาญ

b8a9504b21920969.jpeg

จากนั้นเราจะกำหนดตัวแทนนักวิจัยและตัวแทนจัดรูปแบบคำตอบ เอเจนต์นักวิจัยคือ "สมอง" ของการดำเนินการของเรา เอเจนต์นี้จะรับพรอมต์ของผู้ใช้จาก State ที่แชร์ ตรวจสอบเครื่องมือที่มีประสิทธิภาพ (เครื่องมือ MCP Server ของ Zoo และเครื่องมือ Wikipedia) และตัดสินใจว่าจะใช้เครื่องมือใดเพื่อค้นหาคำตอบ

บทบาทของ Agent จัดรูปแบบการตอบกลับคือการนำเสนอ โดยไม่ได้ใช้เครื่องมือใดๆ ในการค้นหาข้อมูลใหม่ แต่จะใช้ข้อมูลดิบที่รวบรวมโดย Agent นักวิจัย (ส่งผ่านทางสถานะ) และใช้ทักษะด้านภาษาของ LLM เพื่อเปลี่ยนข้อมูลดังกล่าวให้เป็นการตอบกลับแบบสนทนาที่เป็นมิตร

เพิ่มโค้ดต่อไปนี้ที่ด้านล่างของ agent.py

# 1. Researcher Agent
comprehensive_researcher = Agent(
    name="comprehensive_researcher",
    model=model_name,
    description="The primary researcher that can access both internal zoo data and external knowledge from Wikipedia.",
    instruction="""
    You are a helpful research assistant. Your goal is to fully answer the user's PROMPT.
    You have access to two tools:
    1. A tool for getting specific data about animals AT OUR ZOO (names, ages, locations).
    2. A tool for searching Wikipedia for general knowledge (facts, lifespan, diet, habitat).

    First, analyze the user's PROMPT.
    - If the prompt can be answered by only one tool, use that tool.
    - If the prompt is complex and requires information from both the zoo's database AND Wikipedia,
      you MUST use both tools to gather all necessary information.
    - Synthesize the results from the tool(s) you use into preliminary data outputs.

    PROMPT:
    {{ PROMPT }}
    """,
    tools=[
        mcp_tools,
        wikipedia_tool
    ],
    output_key="RESEARCH_DATA" # A key to store the combined findings
)

# 2. Response Formatter Agent
response_formatter = Agent(
    name="response_formatter",
    model=model_name,
    description="Synthesizes all information into a friendly, readable response.",
    instruction="""
    You are the friendly voice of the Zoo Tour Guide. Your task is to take the
    RESEARCH_DATA and present it to the user in a complete and helpful answer.

    - First, present the specific information from the zoo (like names, ages, and where to find them).
    - Then, add the interesting general facts from the research.
    - If some information is missing, just present the information you have.
    - Be conversational and engaging.

    RESEARCH_DATA:
    {{ RESEARCH_DATA }}
    """
)

Agent เวิร์กโฟลว์

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

วิธีการ: เป็นSequentialAgent ซึ่งเป็น Agent ประเภทพิเศษที่ไม่คิดเอง หน้าที่เดียวของมันคือการเรียกใช้รายการ sub_agents (นักวิจัยและผู้จัดรูปแบบ) ตามลำดับที่กำหนด โดยส่งหน่วยความจำที่ใช้ร่วมกันจากหนึ่งไปยังอีกหนึ่งโดยอัตโนมัติ

เพิ่มโค้ดบล็อกนี้ที่ด้านล่างของ agent.py

tour_guide_workflow = SequentialAgent(
    name="tour_guide_workflow",
    description="The main workflow for handling a user's request about an animal.",
    sub_agents=[
        comprehensive_researcher, # Step 1: Gather all data
        response_formatter,       # Step 2: Format the final response
    ]
)

ประกอบเวิร์กโฟลว์หลัก 1000b9d20f4e134b.jpeg

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

เพิ่มโค้ดบล็อกสุดท้ายนี้ที่ด้านล่างของ agent.py

root_agent = Agent(
    name="greeter",
    model=model_name,
    description="The main entry point for the Zoo Tour Guide.",
    instruction="""
    - Let the user know you will help them learn about the animals we have in the zoo.
    - When the user responds, use the 'add_prompt_to_state' tool to save their response.
    After using the tool, transfer control to the 'tour_guide_workflow' agent.
    """,
    tools=[add_prompt_to_state],
    sub_agents=[tour_guide_workflow]
)

ตอนนี้ไฟล์ agent.py ของคุณเสร็จสมบูรณ์แล้ว การสร้างในลักษณะนี้จะช่วยให้คุณเห็นว่าคอมโพเนนต์แต่ละอย่าง ไม่ว่าจะเป็นเครื่องมือ เอเจนต์ของ Worker และเอเจนต์ของ Manager มีบทบาทเฉพาะในการสร้างระบบอัจฉริยะขั้นสุดท้ายอย่างไร ขั้นตอนต่อไปคือการติดตั้งใช้งาน

6. ติดตั้งใช้งาน Agent โดยใช้ ADK CLI

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

ทำให้ใช้งานได้

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

# Run the deployment command
uvx --from google-adk==1.14.0 \
adk deploy cloud_run \
  --project=$PROJECT_ID \
  --region=us-west1 \
  --service_name=zoo-tour-guide \
  --with_ui \
  . \
  -- \
  --labels=dev-tutorial=codelab-adk \
  --service-account=$SERVICE_ACCOUNT

ยอมรับพรอมต์

ระบบอาจแจ้งให้คุณดำเนินการต่อไปนี้

Deploying from source requires an Artifact Registry Docker repository to store built containers. A repository named [cloud-run-source-deploy] in region 
[us-west1] will be created.

Do you want to continue (Y/n)?

พิมพ์ Y แล้วกด Enter

ระบบอาจแจ้งให้คุณดำเนินการต่อไปนี้

Allow unauthenticated invocations to [your-service-name] (y/N)?.

สำหรับ Lab นี้ เราต้องการอนุญาตการเรียกใช้ที่ไม่ผ่านการตรวจสอบสิทธิ์เพื่อให้ทดสอบได้ง่าย ให้พิมพ์ y แล้วกด Enter

เมื่อดำเนินการสำเร็จแล้ว คำสั่งจะแสดง URL ของบริการ Cloud Run ที่ใช้งาน (จะมีลักษณะคล้ายกับ https://zoo-tour-guide-123456789.us-west1.run.app) คัดลอก URL นี้สำหรับงานถัดไป

7. ทดสอบ Agent ที่ทำให้ใช้งานได้

ตอนนี้เอเจนต์ของคุณใช้งานได้แล้วใน Cloud Run คุณจะทำการทดสอบเพื่อยืนยันว่าการติดตั้งใช้งานสำเร็จและเอเจนต์ทำงานได้ตามที่คาดไว้ คุณจะใช้ URL ของบริการสาธารณะ (เช่น https://zoo-tour-guide-123456789.us-west1.run.app/) เพื่อเข้าถึงอินเทอร์เฟซเว็บของ ADK และโต้ตอบกับตัวแทน

เปิด URL ของบริการ Cloud Run สาธารณะในเว็บเบราว์เซอร์ เนื่องจากคุณใช้ --with_ui flag คุณจึงควรเห็น UI ของนักพัฒนาแอป ADK

เปิดToken Streamingที่ด้านขวาบน

ตอนนี้คุณโต้ตอบกับตัวแทนของสวนสัตว์ได้แล้ว

พิมพ์ hello แล้วกด Enter เพื่อเริ่มการสนทนาใหม่

สังเกตผลลัพธ์ เอเจนต์ควรตอบกลับอย่างรวดเร็วด้วยคำทักทาย

"Hello! I'm your Zoo Tour Guide. I can help you learn about the amazing animals we have here. What would you like to know or explore today?"

ถามคำถามต่อไปนี้กับตัวแทน

Where can I find the polar bears in the zoo and what is their diet?

3244d2f6c3b03088.png e135694253b1be41.png

คำอธิบายโฟลว์ของ Agent

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

1. เจ้าหน้าที่ต้อนรับของสวนสัตว์ (เคาน์เตอร์ต้อนรับ)

กระบวนการทั้งหมดเริ่มต้นด้วยตัวแทนต้อนรับ

หน้าที่: เริ่มการสนทนา คำสั่งของฟังก์ชันนี้คือการทักทายผู้ใช้และถามว่าต้องการเรียนรู้เกี่ยวกับสัตว์ชนิดใด

เครื่องมือ: เมื่อผู้ใช้ตอบกลับ ผู้ทักทายจะใช้เครื่องมือ add_prompt_to_state เพื่อบันทึกคำพูดที่แน่นอนของผู้ใช้ (เช่น "เล่าเรื่องสิงโตให้ฟังหน่อย") และบันทึกไว้ในหน่วยความจำของระบบ

การส่งต่อ: หลังจากบันทึกพรอมต์แล้ว ระบบจะส่งต่อการควบคุมไปยัง Agent ย่อย ซึ่งก็คือ tour_guide_workflow ทันที

2. นักวิจัยที่ครอบคลุม (นักวิจัยขั้นสุดยอด)

ซึ่งเป็นขั้นตอนแรกในเวิร์กโฟลว์หลักและเป็น "หัวใจ" ของการดำเนินการ ตอนนี้คุณมีเอเจนต์ที่มีทักษะสูงเพียงคนเดียวที่สามารถเข้าถึงข้อมูลทั้งหมดที่มีอยู่ แทนที่จะมีทีมขนาดใหญ่

หน้าที่: วิเคราะห์คำถามของผู้ใช้และวางแผนอย่างชาญฉลาด โดยจะใช้ความสามารถในการใช้เครื่องมืออันทรงพลังของโมเดลภาษาเพื่อตัดสินใจว่าจำเป็นต้องทำสิ่งต่อไปนี้หรือไม่

  • ข้อมูลภายในจากบันทึกของสวนสัตว์ (ผ่านเซิร์ฟเวอร์ MCP)
  • ความรู้ทั่วไปจากเว็บ (ผ่าน Wikipedia API)
  • หรือสำหรับคำถามที่ซับซ้อน ให้ใช้ทั้ง 2 อย่าง

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

3. ตัวจัดรูปแบบคำตอบ (ผู้นำเสนอ)

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

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

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

ผลลัพธ์สุดท้าย: ข้อความที่ Agent นี้สร้างขึ้นคือคำตอบที่สมบูรณ์และละเอียดซึ่งผู้ใช้จะเห็นในหน้าต่างแชท

หากสนใจดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างเอเจนต์ โปรดดูแหล่งข้อมูลต่อไปนี้

  1. เอกสาร ADK
  2. การสร้างเครื่องมือที่กำหนดเองสำหรับ Agent ของ ADK

8. ล้างสภาพแวดล้อม

gcloud run services delete zoo-tour-guide --region=us-west1 --quiet
gcloud artifacts repositories delete cloud-run-source-deploy --location=us-west1 --quiet

9. ขอแสดงความยินดี

ขอแสดงความยินดีที่ทำ Codelab เสร็จสมบูรณ์

สิ่งที่เราได้พูดถึง

  • วิธีจัดโครงสร้างโปรเจ็กต์ Python เพื่อการติดตั้งใช้งานด้วยอินเทอร์เฟซบรรทัดคำสั่ง ADK
  • วิธีใช้เวิร์กโฟลว์แบบหลาย Agent โดยใช้ SequentialAgent และ ParallelAgent
  • วิธีเชื่อมต่อกับเซิร์ฟเวอร์ MCP ระยะไกลโดยใช้ MCPToolset เพื่อใช้เครื่องมือของเซิร์ฟเวอร์
  • วิธีเพิ่มข้อมูลภายในโดยการผสานรวมเครื่องมือภายนอก เช่น Wikipedia API
  • วิธีติดตั้งใช้งาน Agent เป็นคอนเทนเนอร์แบบ Serverless ใน Cloud Run โดยใช้คำสั่ง adk deploy

แบบสำรวจ

คุณจะใช้บทแนะนำนี้อย่างไร

อ่านอย่างเดียว อ่านและทำแบบฝึกหัด