GSP1350
總覽
本實驗室著重於使用 Agent Development Kit (ADK) 實作及部署用戶端代理服務,建構可使用 Model Context Protocol (MCP) 伺服器等遠端工具的 AI 代理。其中展示的關鍵架構原則是「關注點分離」,也就是讓各自獨立的推論層 (代理) 和工具層 (MCP 伺服器) 透過安全的 API 通訊。
本實驗室已預先部署 MCP 伺服器,為大型語言模型提供虛構動物園的動物資料。在本實驗室中,您會替虛構動物園打造以 Python 應用程式為基礎的導覽員代理。這個代理會透過 MCP 伺服器存取園內動物的詳細資料,並運用維基百科創造最佳導覽體驗。

最後,您會將導覽員代理部署至 Google Cloud Run,讓動物園的所有遊客都能使用,而不只是在本機執行。
學習內容
在本實驗室,您將瞭解如何執行下列工作:
- 建構適合 ADK 部署的 Python 專案。
- 使用 google-adk 導入會調用工具的代理。
- 將代理連線至遠端 MCP 伺服器,以取用工具組。
- 將 Python 應用程式以無伺服器容器的形式部署至 Cloud Run。
- 使用 IAM 角色設定安全的服務對服務驗證機制。
- 刪除 Cloud 資源,避免產生後續費用。
部署至 Cloud Run 的理由
Cloud Run 是無伺服器平台,非常適合用來託管 ADK 代理。您只需要專心編寫程式碼,不必管理底層基礎架構,營運工作交由 Cloud Run 代勞即可。
這個平台好比快閃店,只有在顧客 (要求) 上門時才會營業及使用資源;沒有顧客時,則會完全關閉,您不需為閒置店面付費。
Cloud Run 的主要特色
可隨處執行容器
- 您只需準備內含應用程式的容器 (Docker 映像檔)。
- Cloud Run 會在 Google 基礎架構上執行容器。
- 不必修補作業系統、設定 VM 或煩惱資源調度事宜。
自動調整資源配置
- 應用程式無人使用時,所有執行個體都不會運行 (閒置時不需付費)。
- 假設收到 1,000 個要求,系統便會視需要啟動足量的執行個體。
預設為無狀態
- 每項要求都可能傳送至不同的執行個體。
- 如需儲存狀態,請使用 Cloud SQL、Firestore 或 Redis 等外部服務。
支援任何語言或框架
- 無論應用程式是以 Python、Go、Node.js、Java 或 .Net 編寫,只要能在 Linux 容器中執行,Cloud Run 都能支援。
用多少付多少
- 按要求次數和運算時間 (最小單位為 100 毫秒) 計費。
- 不必像使用傳統 VM 一樣為閒置資源付費。
設定和需求
瞭解以下事項後,再點選「Start Lab」按鈕
請詳閱以下操作說明。實驗室活動會計時,且中途無法暫停。點選「Start Lab」後就會開始計時,顯示可使用 Google Cloud 資源的時間。
您將在真正的雲端環境完成實作實驗室活動,而不是模擬或示範環境。為此,我們會提供新的暫時憑證,供您在實驗室活動期間登入及存取 Google Cloud。
為了順利完成這個實驗室,請先確認:
- 可以使用標準的網際網路瀏覽器 (Chrome 瀏覽器為佳)。
注意事項:請使用無痕模式 (建議選項) 或私密瀏覽視窗執行此實驗室,這可以防止個人帳戶和學員帳戶之間的衝突,避免個人帳戶產生額外費用。
- 是時候完成實驗室活動了!別忘了,活動一旦開始將無法暫停。
注意事項:務必使用實驗室專用的學員帳戶。如果使用其他 Google Cloud 帳戶,可能會產生額外費用。
啟動 Cloud Shell
Cloud Shell 是搭載多項開發工具的虛擬機器,提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作。Cloud Shell 提供指令列存取權,方便您使用 Google Cloud 資源。
-
點按 Google Cloud 控制台頂端的「啟用 Cloud Shell」圖示
。
-
系統顯示視窗時,請按照下列步驟操作:
- 繼續操作 Cloud Shell 視窗。
- 授權 Cloud Shell 使用您的憑證發出 Google Cloud API 呼叫。
連線建立完成即代表已通過驗證,而且專案已設為您的 Project_ID:。輸出內容中有一行文字,宣告本工作階段的 Project_ID:
Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}
gcloud 是 Google Cloud 的指令列工具,已預先安裝於 Cloud Shell,並支援 Tab 鍵自動完成功能。
- (選用) 您可以執行下列指令來列出使用中的帳戶:
gcloud auth list
- 點按「授權」。
輸出內容:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- (選用) 您可以使用下列指令來列出專案 ID:
gcloud config list project
輸出內容:
[core]
project = {{{project_0.project_id | "PROJECT_ID"}}}
注意:如需 gcloud 的完整說明,請前往 Google Cloud 參閱 gcloud CLI 總覽指南。
工作 1:下載並安裝 ADK,然後建立專案資料夾
在這項工作,您將啟用相關 API 並建立專案資料夾,用來儲存 Python 專案部署作業的原始碼。
啟用 API 並設定環境變數
- 在 Cloud Shell 點選「開啟編輯器」,開啟 Cloud Shell 編輯器並前往主目錄。
- 在 Cloud Shell 編輯器的動作列,依序點選「View」>「Terminal」。
注意:您可能需要拉寬瀏覽器視窗,才能看到「View」選單選項。
執行本實驗室的後續步驟時,請將這個視窗做為 IDE,搭配上方的 Cloud Shell 編輯器和下方的 Cloud Shell 終端機一起使用。
關閉畫面右側的其他教學課程或 Gemini 面板,為程式碼編輯器騰出更多空間。
-
在終端機輸入下列指令,設定專案:
gcloud config set project {{{project_0.project_id | filled in at lab start}}}
預期輸出內容:
終端機應會輸出訊息,確認屬性已更新。
注意:如果 Cloud Shell 逾時或重新啟動,請重新設定專案。
-
執行下列指令,啟用所有必要服務:
gcloud services enable \
run.googleapis.com \
artifactregistry.googleapis.com \
cloudbuild.googleapis.com \
aiplatform.googleapis.com \
compute.googleapis.com
預期輸出內容:
終端機應會輸出訊息,確認作業已順利完成。
點選「Check my progress」,確認目標已達成。
啟用 API
建立專案目錄
-
執行下列指令,在實驗室中建立主要資料夾,用來存放代理的原始碼:
mkdir zoo_guide_agent && cd zoo_guide_agent
現在,您可以建立 requirements.txt 檔案了,該檔案會列出動物園代理所需的 Python 程式庫。
-
執行下列指令,在 zoo_guide_agent 目錄中建立檔案,接著在 Cloud Shell 編輯器啟動檔案,以便編輯:
cloudshell edit requirements.txt
-
將以下內容新增至 requirements.txt 檔案,然後按下 Ctrl+S 鍵儲存變更:
google-adk==1.28.0
langchain==1.2.14
langchain-community==0.4.1
wikipedia
-
在終端機執行下列指令,安裝 Python 套件並更新 PATH:
export PATH=$PATH:~/.local/bin
pip3 install -r requirements.txt --user
-
使用下列指令,為目前的專案、區域和使用者設定變數:
export PROJECT_ID=$(gcloud config get-value project)
export REGION=$(gcloud compute project-info describe \
--format="value(commonInstanceMetadata.items[google-compute-default-region])")
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
export SERVICE_ACCOUNT="${PROJECT_NUMBER}-compute@developer.gserviceaccount.com"
注意:如果 Cloud Shell 逾時或重新啟動,請重新初始化上述變數。
-
執行下列指令,建立並開啟 .env 檔案,以驗證 zoo_guide_agent 目錄中的代理:
cloudshell edit .env
內含 .env 檔案的目錄會在 Cloud Shell 編輯器中開啟。
-
將以下內容新增至 .env 檔案,然後儲存變更:
MODEL="{{{ project_0.startup_script.gemini_flash_model_id | filled in at lab start }}}"
SERVICE_ACCOUNT="${PROJECT_NUMBER}-compute@developer.gserviceaccount.com"
GOOGLE_GENAI_USE_ENTERPRISE=true
GOOGLE_CLOUD_LOCATION=global
連線至安全的 MCP 伺服器端點
在本節中,您將與遠端 MCP 伺服器建立連線。
-
返回 Cloud Shell 終端機執行下列指令,授予 Cloud Run 服務身分呼叫遠端 MCP 伺服器的權限:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT" \
--role="roles/run.invoker"
-
執行下列指令,將 MCP 伺服器網址儲存至環境變數:
echo -e "\nMCP_SERVER_URL=https://zoo-mcp-server-${PROJECT_NUMBER}.${REGION}.run.app/mcp/" >> .env
-
接著執行下列指令,建立 __init__.py 檔案,指示 Python 將 zoo_guide_agent 目錄視為套件:
cloudshell edit __init__.py
-
在開啟的 Cloud Shell 編輯器中,將下列程式碼加到 __init__.py 並儲存變更:
from . import agent
工作 2:建立代理工作流程
在這項工作,您將設定動物園導覽員代理的工作流程。首先,必須匯入相關程式庫來完成初始設定,接著定義動物園代理的功能 (要使用的工具) 和專用代理,然後定義工作流程代理,最後再將這些元素串接起來,建立主要工作流程。
建立主要的 agent.py 檔案
匯入程式庫並執行初始設定
首先要加入的這段程式碼會從 ADK 和 Google Cloud 匯入所有必要程式庫、設定記錄功能,並從 .env 檔案載入環境變數。必須載入這些變數,才能存取模型和伺服器網址。
-
將以下程式碼新增至 agent.py 檔案:
import os
import sys
import logging
import google.cloud.logging
from dotenv import load_dotenv
# Add current directory for workspace utilities
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
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")
定義工具

代理的實用度取決於能使用的工具。在本節中,您將定義代理的所有功能,包括用來儲存資料的自訂函式、連線至安全 MCP 伺服器的 MCP 工具,以及維基百科工具。
-
將下列程式碼新增至 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())
)
三項工具說明
-
add_prompt_to_state:📝 這項工具會記住動物園遊客提出的問題。當遊客詢問「獅子在哪一區?」時,此工具會將問題儲存到代理的記憶中,讓工作流程中的其他代理知道要查找哪些資訊。
運作機制:Python 函式會將遊客的提示詞寫入共用的 tool_context.state 字典。這個工具情境可以視為代理在單次對話中的短期記憶。工作流程中的下一個代理可以讀取前一個代理儲存至狀態的資料。
-
MCPToolset:🦁 這個工具可以將導覽員代理,連線至本實驗室預先部署的動物園 MCP 伺服器。這個伺服器有特殊工具,可查詢園內動物的特定資訊,例如名稱、年齡和圈養區域。
運作機制:此工具會安全地連線至動物園的私人伺服器網址,並透過 get_id_token 自動取得安全「通行證」(服務帳戶 ID 權杖),用來證明身分並取得存取權。
-
LangchainTool:🌍 這項工具為導覽員代理提供一般世界知識。當遊客想知道的資訊未收錄在動物園資料庫中時,例如「獅子在野外吃什麼?」,代理可透過此工具在維基百科查詢答案。
運作機制:這項工具負責轉接,讓代理能夠使用 LangChain 程式庫中預先建構的 WikipediaQueryRun 工具。
參考資源:
定義專用代理

在本節中,您將定義「研究」和「回覆整理」這兩個專用代理。「研究代理」是這項作業的「大腦」,它會從共用的 State 取得使用者的提示詞、確認有哪些功能強大的工具可用 (動物園的 MCP 伺服器工具和維基百科工具),然後決定要使用哪些工具來找出答案。
「回覆整理代理」則負責呈現資訊。這個代理不會使用任何工具尋找新資訊,而是會擷取研究代理收集的原始資料 (透過 State 傳遞),並運用大型語言模型的語言能力,將資料轉換成親切的對話式回覆。
-
將下列程式碼新增至 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 }}
"""
)
定義工作流程代理
工作流程代理好比動物園導覽的「後勤」經理,負責接收研究要求,確保您在步驟 3 中定義的兩個代理按正確順序執行工作:先研究,再整理回覆。這樣一來,回答動物園遊客的問題時,就有一套可預測且可靠的程序能遵循。
運作機制:工作流程代理屬於 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
]
)
整合主要工作流程

主要工作流程由 root_agent 指定,ADK 架構會將這個代理做為所有新對話的起點。這個代理的主要任務是協調整體程序,並擔任初始控管者,管理第一輪對話。
agent.py 檔案現已建構完成!
透過這種建構方式,您將能瞭解每個元件 (工具、作業代理和管理代理) 如何各司其職,共同組成最終的智慧系統。接下來要開始部署了!
工作 3:完成應用程式的部署準備工作
本機環境準備好後,下一步是設定 Google Cloud 專案,以便部署動物園導覽員代理。
您將做最後一次檢查,確保代理的檔案結構與部署指令相容。更重要的是,還須設定必要的 IAM 權限,讓部署的 Cloud Run 服務能代您呼叫 Agent Platform 模型。完成這個步驟即可備妥雲端環境,確保代理順利執行。
-
返回 Cloud Shell 終端機執行下列指令,將變數載入殼層工作階段:
source .env
-
執行下列指令,將「Agent Platform 使用者」角色授予服務帳戶,讓該帳戶有權執行預測及呼叫 Google 模型:
# Grant the "Agent Platform User" role to your service account
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT" \
--role="roles/aiplatform.user"
工作 4:使用 ADK CLI 部署代理
本機程式碼和 Google Cloud 專案準備好後,就可以部署代理了。
在這項工作,您會使用 adk deploy cloud_run 指令。這個工具很方便,會自動完成整個部署工作流程。只要執行這個指令,就能封裝程式碼、建構容器映像檔、將映像檔推送至 Artifact Registry,並在 Cloud Run 上啟動服務,讓使用者透過網路存取。
部署代理
-
執行下列指令來部署代理:
# Run the deployment command
adk deploy cloud_run \
--project=$PROJECT_ID \
--region=$REGION \
--service_name=zoo-tour-guide \
--with_ui \
.
-
如果系統詢問是否要繼續操作,或是否允許未經驗證就叫用 [zoo-tour-guide],請每次都輸入 Y 並按下 Enter 鍵。
注意:這個部署指令可能需要 5 到 10 分鐘才會執行完畢。
-
執行下列指令,修改現有 Cloud Run 服務的設定:
gcloud run services update zoo-tour-guide \
--region=$REGION \
--update-labels=dev-tutorial=codelab-adk \
--set-env-vars="MODEL=$MODEL,MCP_SERVER_URL=$MCP_SERVER_URL,GOOGLE_CLOUD_LOCATION=global"
取得部署後的服務連結
您在部署至 Cloud Run 時使用了 --with_ui 旗標,因此應該會看到 ADK 開發人員 UI。
注意:任何知道網址的人都能存取這個代理,因此請只在測試時使用此方法。
注意:成功部署後,活動追蹤檢查可能需要幾分鐘才會通過。
點選「Check my progress」,確認目標已達成。
部署代理
工作 5:測試已部署的代理
現在代理已於 Cloud Run 上線,在這項工作中,您將測試代理是否部署成功且正常運作。您需使用公開服務網址存取 ADK 的網頁介面,並與代理互動。
-
在網路瀏覽器中,開啟前一個工作輸出的公開 Cloud Run 服務網址,或按住 Ctrl 鍵並點選輸出內容中的網址 (應會在新的瀏覽器分頁中開啟),即可看到 ADK 開發人員 UI。
如果系統顯示通知,詢問您是否允許 Cloud Shell 開啟外部網站,請點選「開啟」加以確認。
-
在 ADK 工具列的右上方,將「詞元串流」切換為「開啟」。
現在您可以與動物園導覽員代理互動了。
- 在提示詞輸入框中輸入下列提示詞,然後按下 Enter 鍵,即可開始新對話:
Hello
請查看結果,代理應會迅速回覆標準問候語:
"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 are the penguins located?
您應該會收到類似以下內容的回覆:

- 另外試試以下提示詞,瞭解代理如何運用不同工具 (MCP 和維基百科) 並整合資訊:
測試一般知識 (僅運用維基百科):
What is the average lifespan of a penguin in the wild?
測試代理整合內外部資料的能力:
What species are the penguins in our zoo, and what do they typically eat in the wild?
詢問獅子相關資訊 (再次測試兩種工具):
Where are the lions and what do they eat in the wild?
詢問北極熊相關資訊 (測試有人詢問動物園可能沒有的動物時,代理如何回應):
Do we have polar bears in this zoo?
代理流程說明
您的系統就像一個智慧型多代理團隊,會按明確程序執行作業,確保使用者從提出問題到獲得最終詳細解答的過程順暢又有效率。
1. 動物園迎賓代理 (迎賓櫃台)
整個流程從迎賓代理開始。
工作:展開對話。這個代理會問候使用者,並詢問他們想瞭解哪種動物。
使用的工具:當使用者回覆時,迎賓代理會使用 add_prompt_to_state 工具完整擷取對方所說的話 (例如「介紹一下獅子」),並儲存至系統記憶。
交接:儲存提示詞後,迎賓代理會立即將控制權交給子代理 tour_guide_workflow。
2. 全方位研究代理 (超級研究員)
這是主要工作流程的第一步,也是整個作業的「大腦」。您不必仰賴龐大的團隊,只要一個技能高超的代理,就能存取所有可用資訊。
工作:分析使用者的問題,並擬定合適的計畫。這個代理會運用強大的語言模型,判斷是否需要:
- 取用動物園記錄的內部資料 (透過 MCP 伺服器)。
- 從網路 (透過 Wikipedia API) 搜尋一般知識。
- 同時運用上述兩種資料來源回答複雜問題。
行動:執行必要工具,收集所有需要的原始資料。舉例來說,如果遊客問「園內的獅子幾歲?牠們在野外吃什麼?」,這個代理就會呼叫 MCP 伺服器,取得年齡資訊,再呼叫維基百科工具來查詢飲食資訊。
3. 回覆整理代理 (資訊呈現者)
全方位研究代理收集所有事實後,就會交由最後一個代理處理。
工作:擔任友善的動物園導覽員,將原始資料 (可能來自一個或兩個來源) 整理成實用回覆。
行動:將所有資訊統整成一則連貫又吸引人的答案。這個代理會按照指令,先提供該動物園的具體資訊,再補充有趣的一般知識。
最終結果:這個代理生成的文字,就是使用者在對話視窗中看到的完整詳細回答。
工作 6:清理作業環境
在這項工作,您將刪除於本實驗室建立的 Cloud 資源,以免產生後續費用。
後續步驟/瞭解詳情
請參閱下列資源,進一步瞭解如何建構代理:
恭喜!
在本實驗室,您學會如何建構 Python 專案,以便透過 ADK 指令列介面部署,也實作了多代理工作流程、連線至遠端 MCP 伺服器來取用工具、整合 Wikipedia API 等外部工具以補充內部資料,以及將代理以無伺服器容器的形式部署至 Cloud Run。
使用手冊上次更新日期:2026 年 7 月 21 日
實驗室上次測試日期:2026 年 7 月 21 日
Copyright 2026 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。