Tạo và triển khai một tác nhân ADK trên Cloud Run

1. Giới thiệu

Phòng thí nghiệm này tập trung vào việc triển khai và triển khai một dịch vụ tác nhân khách hàng. Bạn sẽ dùng Bộ phát triển tác nhân (ADK) để tạo một tác nhân AI sử dụng các công cụ.

Trong lớp học này, chúng ta sẽ xây dựng một tác nhân vườn thú sử dụng wikipedia để trả lời các câu hỏi về động vật.

Từ trái sang phải, một con sư tử, hai con chim cánh cụt, một người đội mũ đi săn, một con voi và một con gấu đứng quay lưng về phía người xem, nhìn lên một tên lửa lớn màu đỏ và trắng đang phóng lên bầu trời xanh có mây trắng. Bạn cũng có thể thấy 2 tên lửa nhỏ hơn phóng lên từ xa. Khung cảnh này được đặt trong một chuồng thú có hàng rào gỗ và vách đá.

Cuối cùng, chúng ta sẽ triển khai tác nhân hướng dẫn du lịch cho Cloud Run của Google, thay vì chỉ chạy cục bộ.

Điều kiện tiên quyết

  • Một dự án trên Google Cloud đã bật tính năng thanh toán.

Kiến thức bạn sẽ học được

  • Cách cấu trúc một dự án Python để triển khai ADK.
  • Cách triển khai một tác nhân sử dụng công cụ bằng google-adk.
  • Cách triển khai một ứng dụng Python dưới dạng vùng chứa không máy chủ vào Cloud Run.
  • Cách định cấu hình phương thức xác thực an toàn giữa các dịch vụ bằng cách sử dụng vai trò IAM.
  • Cách xoá tài nguyên trên Cloud để tránh phát sinh chi phí trong tương lai.

Bạn cần có

  • Tài khoản Google Cloud và dự án trên Google Cloud
  • Một trình duyệt web như Chrome

2. Tại sao nên triển khai lên Cloud Run?

Cloud Run là lựa chọn phù hợp để lưu trữ các tác nhân ADK vì đây là một nền tảng không máy chủ. Điều này có nghĩa là bạn có thể tập trung vào mã của mình thay vì quản lý cơ sở hạ tầng cơ bản. Chúng tôi sẽ xử lý công việc vận hành cho bạn.

Hãy coi đây như một cửa hàng tạm thời: cửa hàng này chỉ mở và sử dụng tài nguyên khi khách hàng (yêu cầu) đến. Khi không có khách hàng, cửa hàng sẽ đóng cửa hoàn toàn và bạn không phải trả tiền cho một cửa hàng trống.

Tính năng chính

Chạy vùng chứa ở mọi nơi:

  • Bạn mang theo một vùng chứa (hình ảnh Docker) có ứng dụng của bạn bên trong.
  • Cloud Run chạy ứng dụng đó trên cơ sở hạ tầng của Google.
  • Không cần vá hệ điều hành, thiết lập máy ảo hoặc lo lắng về việc mở rộng quy mô.

Tự động mở rộng quy mô:

  • Nếu không có người dùng nào sử dụng ứng dụng của bạn → 0 phiên bản chạy (giảm xuống 0 phiên bản để tiết kiệm chi phí).
  • Nếu có 1.000 yêu cầu truy cập vào đó → nó sẽ tạo ra nhiều bản sao nếu cần.

Không trạng thái theo mặc định:

  • Mỗi yêu cầu có thể chuyển đến một phiên bản khác.
  • Nếu cần lưu trữ trạng thái, hãy sử dụng một dịch vụ bên ngoài như Cloud SQL, Firestore hoặc Memorystore.

Hỗ trợ mọi ngôn ngữ hoặc khung:

  • Miễn là chạy trong một vùng chứa Linux, Cloud Run không quan tâm đến việc đó là Python, Go, Node.js, Java hay .Net.

Chỉ thanh toán cho những gì bạn sử dụng:

3. Thiết lập dự án

Tài khoản Google

Nếu chưa có Tài khoản Google cá nhân, bạn phải tạo một Tài khoản Google.

Sử dụng tài khoản cá nhân thay vì tài khoản do nơi làm việc hoặc trường học cấp.

Đăng nhập vào Google Cloud Console

Đăng nhập vào Google Cloud Console bằng Tài khoản Google cá nhân.

Bật thanh toán

Thiết lập tài khoản thanh toán cá nhân

Nếu thiết lập thông tin thanh toán bằng tín dụng Google Cloud, bạn có thể bỏ qua bước này.

Để thiết lập tài khoản thanh toán cá nhân, hãy truy cập vào đây để bật tính năng thanh toán trong Cloud Console.

Một số lưu ý:

  • Việc hoàn thành bài thực hành này sẽ tốn ít hơn 1 USD cho các tài nguyên trên đám mây.
  • Bạn có thể làm theo các bước ở cuối bài thực hành này để xoá tài nguyên nhằm tránh bị tính thêm phí.
  • Người dùng mới đủ điều kiện dùng thử miễn phí 300 USD.

Tạo dự án (không bắt buộc)

Nếu bạn không có dự án hiện tại muốn sử dụng cho lớp học này, hãy tạo một dự án mới tại đây.

4. Mở Trình chỉnh sửa Cloud Shell

  1. Nhấp vào đường liên kết này để chuyển trực tiếp đến Cloud Shell Editor
  2. Nếu được nhắc uỷ quyền vào bất kỳ thời điểm nào trong ngày hôm nay, hãy nhấp vào Uỷ quyền để tiếp tục.Nhấp để uỷ quyền cho Cloud Shell
  3. Nếu thiết bị đầu cuối không xuất hiện ở cuối màn hình, hãy mở thiết bị đầu cuối:
    • Nhấp vào Xem
    • Nhấp vào Terminal (Thiết bị đầu cuối)Mở cửa sổ dòng lệnh mới trong Trình chỉnh sửa Cloud Shell

5. Bật API

Để sử dụng Cloud Run, Artifact Registry, Cloud Build, Vertex AICompute Engine, bạn cần bật các API tương ứng trong dự án của mình trên Google Cloud.

  • Trong thiết bị đầu cuối, hãy bật các API:
    gcloud services enable \
      run.googleapis.com \
      artifactregistry.googleapis.com \
      cloudbuild.googleapis.com \
      aiplatform.googleapis.com \
      compute.googleapis.com
    
    Khi quá trình này hoàn tất, bạn sẽ thấy kết quả như sau:
    Operation "operations/acat.p2-[GUID]" finished successfully.
    

Giới thiệu về các API

  • Cloud Run Admin API (run.googleapis.com) cho phép bạn chạy các dịch vụ phụ trợ và giao diện người dùng, các công việc hàng loạt hoặc trang web trong một môi trường được quản lý hoàn toàn. Dịch vụ này xử lý cơ sở hạ tầng để triển khai và mở rộng quy mô các ứng dụng được triển khai bằng vùng chứa riêng.
  • Artifact Registry API (artifactregistry.googleapis.com) cung cấp một kho lưu trữ riêng tư và an toàn để lưu trữ các hình ảnh vùng chứa. Đây là phiên bản nâng cấp của Container Registry và tích hợp liền mạch với Cloud Run và Cloud Build.
  • Cloud Build API (cloudbuild.googleapis.com) là một nền tảng CI/CD không máy chủ, giúp chạy các bản dựng trên cơ sở hạ tầng của Google Cloud. Công cụ này được dùng để tạo hình ảnh vùng chứa trên đám mây từ Dockerfile.
  • Vertex AI API (aiplatform.googleapis.com) cho phép ứng dụng đã triển khai của bạn giao tiếp với các mô hình Gemini để thực hiện các tác vụ AI cốt lõi. Nền tảng này cung cấp API hợp nhất cho tất cả các dịch vụ AI của Google Cloud.
  • Compute Engine API (compute.googleapis.com) cung cấp các máy ảo bảo mật và có thể tuỳ chỉnh, chạy trên cơ sở hạ tầng của Google. Mặc dù Cloud Run được quản lý, nhưng Compute Engine API thường là một phần phụ thuộc cơ bản cho nhiều tài nguyên mạng và điện toán.

6. Chuẩn bị môi trường phát triển

Tạo thư mục

  1. Trong thiết bị đầu cuối, hãy tạo thư mục dự án và các thư mục con cần thiết:
    cd && mkdir zoo_guide_agent && cd zoo_guide_agent
    
  2. Trong cửa sổ dòng lệnh, hãy chạy lệnh sau để mở thư mục zoo_guide_agent trong trình khám phá Cloud Shell Editor:
    cloudshell open-workspace ~/zoo_guide_agent
    
  3. Bảng điều khiển trình khám phá ở bên trái sẽ làm mới. Lúc này, bạn sẽ thấy thư mục mà mình đã tạo.
    Ảnh chụp màn hình thư mục mới trong bảng điều khiển bên của trình khám phá

Thiết lập dự án

  1. Trong cửa sổ dòng lệnh, hãy thiết lập dự án bằng lệnh sau:
    gcloud config set project [PROJECT_ID]
    
    Ví dụ: gcloud config set project lab-project-id-example Đặt mã dự án trong thiết bị đầu cuối Cloud Shell Editor
  2. Bạn sẽ thấy thông báo sau:
    Updated property [core/project].
    

Yêu cầu về việc cài đặt

  1. Chạy lệnh sau trong dòng lệnh để tạo tệp requirements.txt.
    cloudshell edit requirements.txt
    
  2. Thêm nội dung sau vào tệp requirements.txt vừa tạo
    google-adk==1.14.0
    langchain-community==0.3.27
    wikipedia==1.4.0
    
  3. Trong terminal, hãy tạo và kích hoạt một môi trường ảo bằng uv. Điều này đảm bảo các phần phụ thuộc của dự án không xung đột với Python hệ thống.
    uv venv
    source .venv/bin/activate
    
  4. Cài đặt các gói bắt buộc vào môi trường ảo trong thiết bị đầu cuối.
    uv pip install -r requirements.txt
    

Thiết lập các biến môi trường

  • Dùng lệnh sau trong thiết bị đầu cuối để tạo tệp .env.
    # 1. Set the variables in your terminal first
    PROJECT_ID=$(gcloud config get-value project)
    PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
    SA_NAME=lab2-cr-service
    
    # 2. Create the .env file using those variables
    cat <<EOF > .env
    PROJECT_ID=$PROJECT_ID
    PROJECT_NUMBER=$PROJECT_NUMBER
    SA_NAME=$SA_NAME
    SERVICE_ACCOUNT=${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
    MODEL="gemini-2.5-flash"
    EOF
    

7. Tạo quy trình công việc của tác nhân

Tạo tệp __init__.py

  1. Tạo tệp init.py bằng cách chạy lệnh sau trong terminal:
    cloudshell edit __init__.py
    
    Tệp này cho Python biết rằng thư mục zoo_guide_agent là một gói.
  2. Thêm đoạn mã sau vào tệp __init__.py mới:
    from . import agent
    

Tạo tệp agent.py

  1. Tạo tệp agent.py chính bằng cách dán lệnh sau vào terminal.
    cloudshell edit agent.py
    
  2. Nhập và thiết lập ban đầu: Thêm đoạn mã sau vào tệp agent.py hiện đang trống của bạn:
    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.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")
    
    Khối đầu tiên của tệp agent.py sẽ đưa tất cả các thư viện cần thiết từ ADK và Google Cloud vào. Thao tác này cũng thiết lập tính năng ghi nhật ký và tải các biến môi trường từ tệp .env. Đây là bước quan trọng để truy cập vào mô hình và URL máy chủ của bạn.
  3. Xác định các công cụ: Một tác nhân chỉ hiệu quả khi có thể sử dụng các công cụ. Thêm mã sau vào cuối agent.py để xác định các công cụ:
    # 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 Wikipedia Tool
    wikipedia_tool = LangchainTool(
        tool=WikipediaQueryRun(api_wrapper=WikipediaAPIWrapper())
    )
    
    Giới thiệu về các công cụ
    • add_prompt_to_state 📝: Công cụ này ghi nhớ những gì khách tham quan sở thú hỏi. Khi khách truy cập hỏi "Sư tử ở đâu?", công cụ này sẽ lưu câu hỏi cụ thể đó vào bộ nhớ của nhân viên hỗ trợ để các nhân viên hỗ trợ khác trong quy trình làm việc biết cần nghiên cứu thông tin gì.
      Cách thức: Đây là một hàm Python ghi câu lệnh của khách truy cập vào từ điển tool_context.state dùng chung. Ngữ cảnh công cụ này thể hiện bộ nhớ ngắn hạn của tác nhân cho một cuộc trò chuyện duy nhất. Tác nhân tiếp theo trong quy trình có thể đọc dữ liệu mà một tác nhân đã lưu vào trạng thái.
    • LangchainTool 🌍: Điều này giúp tác nhân hướng dẫn viên du lịch có kiến thức chung về thế giới. Khi khách truy cập đặt câu hỏi không có trong cơ sở dữ liệu của vườn thú, chẳng hạn như "Sư tử ăn gì trong tự nhiên?", công cụ này cho phép nhân viên tìm câu trả lời trên Wikipedia.
      Cách thức: Công cụ này hoạt động như một bộ chuyển đổi, cho phép tác nhân của chúng ta sử dụng công cụ WikipediaQueryRun được tạo sẵn từ thư viện LangChain.
      Một người máy trông thân thiện đang cầm một cuốn sổ tay có hình vẽ động vật và một bong bóng suy nghĩ có hình con sư tử, đang nói chuyện với một người đàn ông và một cậu bé đeo ba lô. Hươu cao cổ và các thành phần khác của vườn thú nằm ở phía sau, với cây cọ bao quanh lối vào.
  4. Xác định các Đặc vụ chuyên trách: Thêm mã sau vào cuối agent.py để xác định các đặc vụ comprehensive_researcherresponse_formatter:
    # 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=[
            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 }
        """
    )
    
    • Nhân viên comprehensive_researcher là "bộ não" của hoạt động này. Công cụ này lấy câu lệnh của người dùng từ State được chia sẻ, kiểm tra xem đó có phải là Công cụ Wikipedia hay không và quyết định sử dụng công cụ nào để tìm câu trả lời.
    • Vai trò của nhân viên hỗ trợ response_formatter là trình bày. Nó lấy dữ liệu thô do tác nhân Researcher thu thập (được truyền qua State) và sử dụng kỹ năng ngôn ngữ của LLM để chuyển đổi dữ liệu đó thành một câu trả lời thân thiện, mang tính trò chuyện.
      Chú robot có đôi mắt màu xanh dương phát sáng đang ngồi trước một màn hình cong lớn, bên trái là dòng chữ MCP ZOO SERVER và bên phải là trang Wikipedia về ZOO. Biểu tượng động vật xuất hiện trên giao diện máy chủ. Bàn có nhiều bàn di chuột màu xanh dương phát sáng. Phông nền cho thấy đường chân trời thành phố qua những ô cửa sổ lớn.
  5. Xác định tác nhân Quy trình làm việc: Thêm khối mã này vào cuối agent.py để xác định tác nhân tuần tự tour_guide_workflow:
    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
        ]
    )
    
    Tác nhân quy trình công việc đóng vai trò là người quản lý "hậu trường" cho chuyến tham quan vườn thú. Nó nhận yêu cầu nghiên cứu và đảm bảo rằng 2 tác nhân mà chúng ta đã xác định ở trên thực hiện công việc của mình theo đúng thứ tự: đầu tiên là nghiên cứu, sau đó là định dạng. Điều này tạo ra một quy trình đáng tin cậy và dễ dự đoán để trả lời câu hỏi của khách truy cập.
    Cách thức: Đây là một SequentialAgent, một loại tác nhân đặc biệt không tự suy nghĩ. Công việc duy nhất của nó là chạy danh sách sub_agents (nhà nghiên cứu và người định dạng) theo một trình tự cố định, tự động truyền bộ nhớ dùng chung từ người này sang người khác.
  6. Tập hợp quy trình làm việc chính: Thêm khối mã cuối cùng này vào cuối agent.py để xác định root_agent:
    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]
    )
    
    Khung ADK sử dụng root_agent làm điểm bắt đầu cho tất cả các cuộc trò chuyện mới. Vai trò chính của nó là điều phối quy trình tổng thể. Nó đóng vai trò là bộ điều khiển ban đầu, quản lý lượt đầu tiên của cuộc trò chuyện.
    Hình minh hoạ 3 robot: một Robot chào hỏi ở bên trái đang viết trên một tờ giấy nhớ có bong bóng suy nghĩ hình con sư tử, một Robot nghiên cứu ở giữa đang ngồi tại bàn làm việc với một chiếc máy tính hiển thị dữ liệu và một mũi tên truy vấn hướng về phía robot này, và một Robot trình bày ở bên phải đang mỉm cười khi cầm một biểu đồ có nhãn Dữ liệu đã phân tích, với một mũi tên hướng về phía biểu đồ này từ Robot nghiên cứu. Hươu cao cổ và voi xuất hiện ở phông nền, còn cây cọ tạo khung cho cảnh này.

Tệp agent.py đầy đủ

Tệp agent.py của bạn hiện đã hoàn tất! Bằng cách xây dựng theo cách này, bạn có thể thấy cách mỗi thành phần (công cụ, tác nhân nhân viên và tác nhân quản lý) có một vai trò cụ thể trong việc tạo ra hệ thống thông minh cuối cùng.

Tệp hoàn chỉnh sẽ có dạng như sau:

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.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")

# 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 Wikipedia Tool
wikipedia_tool = LangchainTool(
    tool=WikipediaQueryRun(api_wrapper=WikipediaAPIWrapper())
)

# 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=[
        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 }
    """
)

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
    ]
)

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]
)

Tiếp theo là triển khai!

8. Chuẩn bị ứng dụng để triển khai

Kiểm tra cấu trúc cuối cùng

Trước khi triển khai, hãy xác minh rằng thư mục dự án của bạn chứa các tệp chính xác.

  • Đảm bảo thư mục zoo_guide_agent của bạn có dạng như sau:
    zoo_guide_agent/
    ├── .env
    ├── __init__.py
    ├── agent.py
    └── requirements.txt
    

Thiết lập quyền IAM

Khi mã cục bộ đã sẵn sàng, bước tiếp theo là thiết lập danh tính mà tác nhân của bạn sẽ sử dụng trên đám mây.

  1. Trong thiết bị đầu cuối, hãy tải các biến vào phiên shell.
    source .env
    
  2. Tạo một tài khoản dịch vụ riêng cho dịch vụ Cloud Run để tài khoản đó có quyền cụ thể riêng. Dán nội dung sau vào terminal:
    gcloud iam service-accounts create ${SA_NAME} \
        --display-name="Service Account for lab 2 "
    
    Bằng cách tạo một danh tính riêng cho ứng dụng cụ thể này, bạn đảm bảo rằng tác nhân chỉ có những quyền chính xác mà tác nhân cần, thay vì sử dụng một tài khoản mặc định có quyền truy cập quá rộng.
  3. Cấp cho tài khoản dịch vụ vai trò Người dùng Vertex AI để cấp cho tài khoản đó quyền gọi các mô hình của 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"
    

9. Triển khai tác nhân bằng ADK CLI

Khi mã cục bộ đã sẵn sàng và dự án của bạn trên Google Cloud đã được chuẩn bị, đã đến lúc triển khai tác nhân. Bạn sẽ sử dụng lệnh adk deploy cloud_run, một công cụ tiện lợi giúp tự động hoá toàn bộ quy trình triển khai. Lệnh duy nhất này sẽ đóng gói mã của bạn, tạo một hình ảnh vùng chứa, đẩy hình ảnh đó lên Artifact Registry và khởi chạy dịch vụ trên Cloud Run, giúp bạn truy cập vào dịch vụ này trên web.

  1. Chạy lệnh sau trong dòng lệnh để triển khai tác nhân.
    # Run the deployment command
    uvx --from google-adk \
    adk deploy cloud_run \
      --project=$PROJECT_ID \
      --region=europe-west1 \
      --service_name=zoo-tour-guide \
      --with_ui \
      . \
      -- \
      --labels=dev-tutorial=codelab-adk \
      --service-account=$SERVICE_ACCOUNT
    
    Lệnh uvx cho phép bạn chạy các công cụ dòng lệnh được xuất bản dưới dạng các gói Python mà không cần cài đặt các công cụ đó trên toàn cầu.
  2. Nếu bạn thấy lời nhắc sau:
    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)?
    
    Nếu có, hãy nhập Y rồi nhấn ENTER.
  3. Nếu bạn thấy lời nhắc sau:
    Allow unauthenticated invocations to [your-service-name] (y/N)?.
    
    Nhập y rồi nhấn ENTER. Điều này cho phép các lệnh gọi chưa được xác thực cho phòng thí nghiệm này để dễ dàng kiểm thử. Sau khi thực thi thành công, lệnh này sẽ cung cấp URL của dịch vụ Cloud Run đã triển khai. (Thẻ này sẽ có dạng như https://zoo-tour-guide-123456789.europe-west1.run.app).
  4. Sao chép URL của dịch vụ Cloud Run đã triển khai cho tác vụ tiếp theo.

10. Kiểm thử nhân viên hỗ trợ đã triển khai

Giờ đây, khi nhân viên hỗ trợ của bạn đang hoạt động trên Cloud Run, bạn sẽ thực hiện một bài kiểm thử để xác nhận rằng quá trình triển khai đã thành công và nhân viên hỗ trợ đang hoạt động như dự kiến. Bạn sẽ sử dụng URL dịch vụ công khai (chẳng hạn như https://zoo-tour-guide-123456789.europe-west1.run.app/) để truy cập vào giao diện web của ADK và tương tác với tác nhân.

  1. Mở URL của dịch vụ Cloud Run công khai trong trình duyệt web. Vì bạn đã dùng --with_ui flag, nên bạn sẽ thấy giao diện người dùng dành cho nhà phát triển ADK.
  2. Bật Token Streaming ở trên cùng bên phải.
    Giờ đây, bạn có thể tương tác với tác nhân Zoo.
  3. Nhập hello rồi nhấn phím Enter để bắt đầu một cuộc trò chuyện mới.
  4. Quan sát kết quả. Trợ lý ảo phải nhanh chóng phản hồi bằng lời chào, chẳng hạn như:
    "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?"
    
  5. Đặt cho nhân viên hỗ trợ những câu hỏi như:
    Where can I find the polar bears in the zoo and what is their diet?
    
    Ảnh chụp màn hình về tác nhân ADK thực hiện một chuỗi hành động: add_prompt_to_state, transfer_to_agent, wikipedia và get_animals_by_species. Câu trả lời đầu tiên là &quot;Tôi không thể cho bạn biết nơi tìm thấy gấu Bắc Cực trong vườn thú này, nhưng tôi có thể cho bạn biết về chế độ ăn của chúng&quot;. Câu trả lời thứ hai là: &quot;Gấu Bắc Cực sống ở Khu trưng bày Bắc Cực trên Đường Bắc Cực. Tôi không thể truy xuất thông tin về chế độ ăn của chúng bằng các công cụ hiện có.&quot; Câu trả lời thứ ba, cũng là câu trả lời toàn diện nhất, cho biết: &quot;Tôi rất vui khi được kể cho bạn nghe về những chú gấu Bắc Cực của chúng tôi! Bạn có thể tìm thấy gấu Bắc Cực của chúng tôi tại Khu trưng bày Bắc Cực trên Đường mòn Bắc Cực. Chúng tôi có 3 chú gấu Bắc Cực ở đây: Snowflake, 7 tuổi. Blizzard, 5 tuổi. Iceberg, 9 tuổi. Về chế độ ăn, gấu Bắc Cực chủ yếu là động vật ăn thịt. Chúng chuyên săn hải cẩu, đặc biệt là hải cẩu vòng. Chúng cũng ăn hải mã, cá voi trắng và một số động vật trên cạn.

Giải thích về luồng tác nhân

Hệ thống của bạn hoạt động như một nhóm gồm nhiều tác nhân thông minh. Quy trình này được quản lý theo một trình tự rõ ràng để đảm bảo luồng thông tin diễn ra suôn sẻ và hiệu quả từ câu hỏi của người dùng đến câu trả lời chi tiết cuối cùng.

1. Nhân viên đón tiếp tại sở thú (Quầy đón tiếp)

Toàn bộ quy trình bắt đầu bằng nhân viên chào hỏi.

  • Công việc của nó: Bắt đầu cuộc trò chuyện. Hướng dẫn của ứng dụng là chào người dùng và hỏi họ muốn tìm hiểu về loài động vật nào.
  • Công cụ của nó: Khi người dùng trả lời, Greeter sẽ sử dụng công cụ add_prompt_to_state để ghi lại chính xác những gì họ nói (ví dụ: cho tôi biết về sư tử") và lưu chúng vào bộ nhớ của hệ thống.
  • Handoff (Bàn giao): Sau khi lưu câu lệnh, câu lệnh này sẽ ngay lập tức chuyển quyền kiểm soát cho tác nhân phụ của nó là tour_guide_workflow.

2. Nhà nghiên cứu toàn diện (Nhà siêu nghiên cứu)

Đây là bước đầu tiên trong quy trình chính và là "bộ não" của hoạt động. Thay vì một nhóm lớn, giờ đây bạn có một nhân viên hỗ trợ duy nhất có kỹ năng cao và có thể truy cập vào tất cả thông tin hiện có.

  • Công việc của nó: Phân tích câu hỏi của người dùng và đưa ra một kế hoạch thông minh. Công cụ này sử dụng khả năng sử dụng công cụ của mô hình ngôn ngữ để quyết định xem có cần:
    • Kiến thức chung trên web (thông qua API Wikipedia).
    • Hoặc cả hai đối với các câu hỏi phức tạp.

3. Trình định dạng phản hồi (Trình bày)

Sau khi Nhà nghiên cứu toàn diện thu thập tất cả thông tin, đây là tác nhân cuối cùng cần chạy.

  • Công việc: Đóng vai trò là giọng nói thân thiện của Hướng dẫn viên tham quan vườn thú. Thao tác này lấy dữ liệu thô (có thể từ một hoặc cả hai nguồn) và tinh chỉnh dữ liệu đó.
  • Hành động của Gemini: Tổng hợp tất cả thông tin thành một câu trả lời duy nhất, mạch lạc và hấp dẫn. Theo hướng dẫn này, trước tiên, mô hình sẽ trình bày thông tin cụ thể về vườn thú, sau đó thêm các thông tin chung thú vị.
  • Kết quả cuối cùng: Văn bản do tác nhân này tạo là câu trả lời đầy đủ và chi tiết mà người dùng thấy trong cửa sổ trò chuyện.

Nếu bạn muốn tìm hiểu thêm về cách tạo Đặc vụ, hãy tham khảo các tài nguyên sau:

  1. Tài liệu về ADK
  2. Tạo công cụ tuỳ chỉnh cho các tác nhân ADK

11. Dọn dẹp môi trường

Để tránh bị tính phí vào tài khoản Google Cloud của bạn cho các tài nguyên được dùng trong hướng dẫn này, hãy xoá dự án chứa các tài nguyên đó hoặc giữ lại dự án rồi xoá từng tài nguyên.

Xoá các dịch vụ và hình ảnh Cloud Run

Nếu muốn giữ lại dự án trên Google Cloud nhưng xoá các tài nguyên cụ thể được tạo trong phòng thí nghiệm này, bạn phải xoá cả dịch vụ đang chạy và hình ảnh vùng chứa được lưu trữ trong sổ đăng ký.

  • Chạy các lệnh sau trong terminal:
    gcloud run services delete zoo-tour-guide --region=europe-west1 --quiet
    gcloud artifacts repositories delete cloud-run-source-deploy --location=europe-west1 --quiet
    

Xoá dự án (Không bắt buộc)

Nếu bạn đã tạo một dự án mới dành riêng cho lớp học này và không có ý định sử dụng lại, thì cách dọn dẹp dễ nhất là xoá toàn bộ dự án. Thao tác này đảm bảo tất cả tài nguyên (bao gồm cả Tài khoản dịch vụ và mọi cấu phần phần mềm ẩn) đều bị xoá hoàn toàn.

  • Trong terminal, hãy chạy lệnh sau (thay [YOUR_PROJECT_ID] bằng mã dự án thực tế của bạn)
    gcloud projects delete $PROJECT_ID
    

12. Xin chúc mừng

Bạn đã tạo và triển khai thành công một ứng dụng AI có nhiều tác nhân lên Google Cloud!

Tóm tắt

Trong phòng thí nghiệm này, bạn đã chuyển từ một thư mục trống sang một dịch vụ AI đang hoạt động và có thể truy cập công khai. Sau đây là những gì bạn đã tạo:

  • Bạn đã tạo một nhóm chuyên trách: Thay vì một AI chung chung, bạn đã tạo một "Nhà nghiên cứu" để tìm thông tin thực tế và một "Người định dạng" để chỉnh sửa câu trả lời.
  • Bạn đã cung cấp cho họ các công cụ: Bạn đã kết nối các tác nhân của mình với thế giới bên ngoài bằng Wikipedia API.
  • Bạn đã hoàn tất: Bạn đã lấy mã Python cục bộ và triển khai mã đó dưới dạng một vùng chứa không máy chủ trên Cloud Run, đồng thời bảo mật mã đó bằng một Tài khoản dịch vụ chuyên dụng.

Nội dung đã đề cập

  • Cách cấu trúc một dự án Python để triển khai bằng ADK.
  • Cách triển khai quy trình làm việc có nhiều tác nhân bằng cách sử dụng [SequentialAgent](https://google.github.io/adk-docs/agents/workflow-agents/sequential-agents/).
  • Cách tích hợp các công cụ bên ngoài như Wikipedia API.
  • Cách triển khai một tác nhân đến Cloud Run bằng lệnh adk deploy.

13. Khảo sát

Kết quả:

Bạn sẽ sử dụng hướng dẫn này như thế nào?

Chỉ đọc qua Đọc và hoàn thành bài tập