ใช้เซิร์ฟเวอร์ MCP ใน Cloud Run กับตัวแทน ADK

1. บทนำ

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

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

f8d4423edbfe993d.png

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

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

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

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

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

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

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

2. เหตุผลในการติดตั้งใช้งานใน Cloud Run

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

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

ฟีเจอร์หลัก

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

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

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

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

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

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

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

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

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

  • เรียกเก็บเงินต่อคำขอ + เวลาในการประมวลผล (ต่ำสุด 100 มิลลิวินาที)
  • คุณไม่ต้องจ่ายค่าทรัพยากรที่ไม่ได้ใช้งานเหมือนกับ VM แบบเดิม

3. การตั้งค่าและข้อกำหนด

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

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

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.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

หากเทอร์มินัลไม่ปรากฏที่ด้านล่างของหน้าจอ ให้เปิดโดยทำดังนี้

  • คลิก Terminal
  • คลิกเทอร์มินัลใหม่

d32c46fffa0a30a5.png

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

gcloud config set project [YOUR-PROJECT-ID]

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

gcloud projects list | awk '/PROJECT_ID/{print $2}'

4. หากได้รับแจ้งให้ให้สิทธิ์ ให้คลิกให้สิทธิ์เพื่อดำเนินการต่อ

6356559df3eccdda.png

5. คุณควรเห็นข้อความต่อไปนี้

Updated property [core/project].
If you see a `WARNING` and are asked `Do you want to continue (Y/n)?`,

then you have likely entered the project ID incorrectly. Press `n`,

press `Enter`, and try to run the `gcloud config set project` command again.

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

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

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

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

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

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

กำหนดค่าภูมิภาคเริ่มต้นเพื่อใช้โมเดลการฝังของ Vertex AI อ่านเพิ่มเติมเกี่ยวกับสถานที่ที่ Vertex AI พร้อมให้บริการ ในตัวอย่างนี้ เราใช้ภูมิภาค europe-west1

gcloud config set compute/region europe-west1

5. ดาวน์โหลดและติดตั้ง ADK แล้วสร้างโฟลเดอร์โปรเจ็กต์

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

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

cd && mkdir zoo_guide_agent && cd zoo_guide_agent

สร้างสภาพแวดล้อมเสมือน

python3 -m venv .venv

เปิดใช้งานสภาพแวดล้อมเสมือน

source .venv/bin/activate

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

cloudshell edit requirements.txt
google-adk==1.12.0
langchain-community
wikipedia

คุณควรเรียกใช้คำสั่งจากไดเรกทอรีโปรเจ็กต์หลัก zoo_guide_agent

pip install -r requirements.txt

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

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_REGION=$(gcloud config get-value compute/region)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
export SERVICE_ACCOUNT="${PROJECT_NUMBER}-compute@developer.gserviceaccount.com"

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

cloudshell edit .env

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

MODEL="gemini-2.5-flash"
SERVICE_ACCOUNT="${PROJECT_NUMBER}-compute@developer.gserviceaccount.com"

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

  1. ให้สิทธิ์ข้อมูลประจำตัวของบริการ Cloud Run ในการเรียกเซิร์ฟเวอร์ MCP ระยะไกล
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT" \
  --role="roles/run.invoker"
  1. บันทึก URL ของเซิร์ฟเวอร์ MCP จาก Lab 1 ลงในตัวแปรสภาพแวดล้อม
echo -e "\nMCP_SERVER_URL=https://zoo-mcp-server-${PROJECT_NUMBER}.europe-west1.run.app/mcp/" >> .env

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

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

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

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

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

cloudshell edit __init__.py

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

from . import agent

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

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

cloudshell edit agent.py

ขั้นตอนที่ 1: การนำเข้าและการตั้งค่าเริ่มต้น

บล็อกแรกนี้จะนำเข้าไลบรารีที่จำเป็นทั้งหมดจาก 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")

ขั้นตอนที่ 2: การกำหนดเครื่องมือ (ความสามารถของเอเจนต์)

3eb9c6772576b906.jpeg

ประสิทธิภาพของเอเจนต์ขึ้นอยู่กับเครื่องมือที่ใช้ได้ ในส่วนนี้ เราจะกำหนดความสามารถทั้งหมดที่เอเจนต์ของเราจะมี ซึ่งรวมถึงฟังก์ชันที่กำหนดเองเพื่อบันทึกข้อมูล เครื่องมือ 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 ที่แชร์ บริบทของเครื่องมือนี้แสดงถึงหน่วยความจำระยะสั้นของเอเจนต์สำหรับการสนทนาครั้งเดียว ตัวแทนรายหนึ่งบันทึกข้อมูลลงในสถานะได้ และตัวแทนรายถัดไปในเวิร์กโฟลว์จะอ่านข้อมูลนั้นได้

  1. MCPToolset 🦁

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

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

  1. LangchainTool 🌍

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

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

แหล่งข้อมูล

ขั้นตอนที่ 3: กำหนดตัวแทนผู้เชี่ยวชาญ

b8a9504b21920969.jpeg

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

บทบาทของตัวแทนจัดรูปแบบการตอบกลับคือการนำเสนอ โดยไม่ได้ใช้เครื่องมือใดๆ เพื่อค้นหาข้อมูลใหม่ แต่จะใช้ข้อมูลดิบที่รวบรวมโดยตัวแทน Researcher (ส่งผ่านทาง State) และใช้ทักษะด้านภาษาของ 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 }}
    """
)

ขั้นตอนที่ 4: เวิร์กโฟลว์เอเจนต์

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

วิธีการ: เป็นSequentialAgent ซึ่งเป็นเอเจนต์ประเภทพิเศษที่ไม่คิดเอง หน้าที่ของมันมีเพียงการเรียกใช้รายการของ 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

เอเจนต์นี้ได้รับการกำหนดให้เป็น 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 ของคุณเสร็จสมบูรณ์แล้ว การสร้างในลักษณะนี้จะช่วยให้คุณเห็นว่าคอมโพเนนต์แต่ละอย่าง ไม่ว่าจะเป็นเครื่องมือ เอเจนต์ของผู้ปฏิบัติงาน และเอเจนต์ของผู้จัดการ มีบทบาทเฉพาะในการสร้างระบบอัจฉริยะขั้นสุดท้ายอย่างไร ขั้นตอนถัดไปคือการติดตั้งใช้งาน

7. เตรียมแอปพลิเคชันสำหรับการนำไปใช้งาน

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

โหลดตัวแปรลงในเซสชันเชลล์โดยเรียกใช้คำสั่ง source

source .env

มอบบทบาทผู้ใช้ Vertex AI ให้กับบัญชีบริการ ซึ่งจะให้สิทธิ์ในการคาดการณ์และเรียกใช้โมเดลของ Google

# Grant the "Vertex AI User" role to your service account
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT" \
  --role="roles/aiplatform.user"

8. ติดตั้งใช้งานเอเจนต์โดยใช้ ADK CLI

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

สร้างไฟล์ .gcloudignore

เราต้องการสร้างไฟล์ .gcloudignore เพื่อลดเวลาในการติดตั้งใช้งาน เรียกใช้คำสั่งต่อไปนี้เพื่อดำเนินการดังกล่าว คำสั่งต่อไปนี้เพื่อทำให้ Agent ใช้งานได้

cloudshell edit .gcloudignore

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

.venv/

ติดตั้งใช้งาน

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

# Run the deployment command
adk deploy cloud_run \
  --project=$PROJECT_ID \
  --region=europe-west1 \
  --service_name=zoo-tour-guide \
  --with_ui \
  .
gcloud run services update zoo-tour-guide \
  --region=europe-west1 \
  --update-labels=dev-tutorial=codelab-adk

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

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

Deploying from source requires an Artifact Registry Docker repository to store built containers. A repository named [cloud-run-source-deploy] in region 
[europe-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.europe-west1.run.app) คัดลอก URL นี้สำหรับงานถัดไป

9. ทดสอบ Agent ที่ติดตั้งใช้งาน

เมื่อตัวแทนพร้อมใช้งานใน Cloud Run แล้ว คุณจะทำการทดสอบเพื่อยืนยันว่าการติดตั้งใช้งานสำเร็จและตัวแทนทำงานได้ตามที่คาดไว้ คุณจะใช้ URL ของบริการสาธารณะ (เช่น https://zoo-tour-guide-123456789.europe-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?"

3244d2f6c3b03088.png e135694253b1be41.png

คำอธิบายโฟลว์ของเอเจนต์

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

1. The Zoo Greeter (The Welcome Desk)

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

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

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

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

2. นักวิจัยที่รอบรู้ (นักวิจัยขั้นสูง)

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

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

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

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

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

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

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

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

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

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

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

10. ล้างข้อมูลในสภาพแวดล้อม

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

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

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

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

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

12. แบบสำรวจ

เอาต์พุต:

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

อ่านอย่างเดียว อ่านและทำแบบฝึกหัดให้เสร็จ