使用 MCP Toolbox for AlloyDB 和 ADK 构建多智能体应用

1. 概览

智能体 是一种自主程序,它与 AI 模型对话,以使用其拥有的工具和上下文执行基于目标的操作,并且能够根据事实做出自主决策!

如果您的应用有多个智能体自主协作,并根据需要共同完成更大的目标,并且每个智能体都独立了解并负责特定的关注领域,那么您的应用就成为多智能体系统

智能体开发套件 (ADK)

智能体开发套件 (ADK) 是一个灵活的模块化框架,用于开发和部署 AI 智能体。ADK 支持通过将多个不同的智能体实例组合成多智能体系统 (MAS) 来构建复杂的应用。

在 ADK 中,多智能体系统是一种应用,其中不同的智能体(通常形成层次结构)协作或协调以实现更大的目标。以这种方式构建应用具有显著优势,包括增强的模块化、专业化、可重用性、可维护性,以及使用专用工作流智能体定义结构化控制流的能力。

多智能体系统注意事项

首先,务必正确理解和推理每个智能体的专业化。——“您知道为什么需要针对特定内容使用特定的子代理吗?”,请先解决这个问题。

其次,如何将它们与根智能体结合起来,以路由和理解每个响应。

第三,您可以在本文档中找到多种智能体路由类型。请确保哪种类型适合您应用的流程。此外,您的多智能体系统的流控制还需要哪些不同的上下文和状态。

构建内容

让我们使用 MCP Toolbox for AlloyDB 和 ADK 构建一个多智能体系统来处理厨房改造。

  1. 改造提案智能体
  2. 许可和合规性检查智能体
  3. 订单状态检查(使用 MCP Toolbox for Databases 的工具)

改造提案智能体,用于生成厨房改造提案文档。

许可和合规性智能体,用于处理许可和合规性相关任务。

订单状态检查智能体,用于通过处理我们在 AlloyDB 中设置的订单管理数据库来检查材料的订单状态。但对于此数据库部分,我们将使用 MCP Toolbox for AlloyDB 来实现订单的状态检索逻辑。

2. MCP

MCP 是 Model Context Protocol 的缩写,是由 Anthropic 开发的开放标准,为 AI 智能体提供了一种与外部工具、服务和数据连接的一致方式。它本质上充当 AI 应用的通用标准,使它们能够与不同的数据源和工具无缝交互。

  1. 它使用客户端-服务器模型,其中 AI 应用(主机)运行 MCP 客户端,该客户端与 MCP 服务器通信。
  2. 当 AI 智能体需要访问特定工具或数据时,它会向 MCP 客户端发送结构化请求,MCP 客户端会将该请求转发给相应的 MCP 服务器。
  3. 允许 AI 模型访问外部数据和工具,而无需为每个集成编写自定义代码。
  4. 简化了基于大语言模型 (LLM) 构建智能体和复杂工作流的过程。

MCP Toolbox for Databases

Google 的 MCP Toolbox for Databases 是一个面向数据库的开源 MCP 服务器。它的设计考虑了企业级和生产质量。通过处理连接池、身份验证等复杂性,它可以帮助您更轻松、更快速、更安全地开发工具。

让您的智能体访问数据库中的数据!如何实现?

简化开发: 在不到 10 行代码中将工具集成到智能体,在多个智能体或框架之间重复使用工具,并更轻松地部署新版本的工具。

提升性能: 采用连接池、身份验证等最佳实践。

增强安全性: 集成身份验证,以便更安全地访问您的数据

端到端可观测性: 开箱即用的指标和跟踪,内置 OpenTelemetry 支持。

必须指出,这早于 MCP!

MCP Toolbox for Databases 位于智能体应用的编排框架和数据库之间,提供了一个用于修改、分发或调用工具的控制平面。它通过提供一个集中存储和更新工具的位置来简化工具的管理,使您能够在智能体和应用之间共享工具,并在无需重新部署应用的情况下更新这些工具。

9a9018b8596bd34e.png

我们将有一个根智能体,根据要求编排这些智能体。

要求

  • 一个浏览器,例如 ChromeFirefox
  • 启用了结算功能的 Google Cloud 项目。

3. 准备工作

创建项目

  1. Google Cloud 控制台的项目选择器页面上,选择或创建一个 Google Cloud 项目
  2. 确保您的云项目已启用结算功能。了解如何 检查项目是否已启用结算功能
  3. 点击此 链接 以激活 Cloud Shell。您可以点击 Cloud Shell 中的相应按钮,在 Cloud Shell 终端(用于运行云命令)和编辑器(用于构建项目)之间切换。
  4. 连接到 Cloud Shell 后,您可以使用以下命令检查自己是否已通过身份验证,以及项目是否已设置为您的项目 ID:
gcloud auth list
  1. 在 Cloud Shell 中运行以下命令,以确认 gcloud 命令了解您的项目。
gcloud config list project
  1. 如果项目未设置,请使用以下命令进行设置:
gcloud config set project <YOUR_PROJECT_ID>
  1. 运行以下命令以启用以下 API:
gcloud services enable artifactregistry.googleapis.com \cloudbuild.googleapis.com \run.googleapis.com \aiplatform.googleapis.com \alloydb.googleapis.com
  1. 确保安装了 Python 3.9+
  2. 如需了解 gcloud 命令和用法,请参阅 文档

4. ADK 设置

  1. 创建并激活虚拟环境(推荐)

在 Cloud Shell 终端中,创建虚拟环境:

python -m venv .venv

激活虚拟环境:

source .venv/bin/activate
  1. 安装 ADK
pip install google-adk

5. 项目结构

  1. 在 Cloud Shell 终端中,依次运行以下命令以创建根文件夹和项目文件夹:
mkdir agentic-apps
cd agentic-apps
mkdir renovation-agent
  1. 前往 Cloud Shell 编辑器,通过创建文件(最初为空)来创建以下项目结构:
renovation-agent/
        __init__.py
        agent.py
        .env

6. 源代码

  1. 前往 init.py 并使用以下内容进行更新:
from . import agent
  1. 前往 agent.py 并使用以下路径中的以下内容更新该文件:
https://github.com/AbiramiSukumaran/renovation-agent-adk-mcp-toolbox/blob/main/agent.py

在 agent.py 中,我们导入必要的依赖项,从 .env 文件检索配置参数,并定义 root_agent,该 root_agent 使用 1 个工具来调用工具箱工具。

  1. 前往 requirements.txt 并使用以下内容进行更新:
https://github.com/AbiramiSukumaran/renovation-agent-adk-mcp-toolbox/blob/main/requirements.txt

7. 数据库设置

在 ordering_agent 使用的其中一个工具(名为“check_status”)中,我们访问 AlloyDB 订单数据库以获取订单状态。在本部分中,我们将设置 AlloyDB 数据库集群和实例。

创建集群和实例

  1. 在 Cloud 控制台中导航到 AlloyDB 页面。 在 Cloud 控制台中查找大多数页面的简单方法是使用控制台的搜索栏搜索它们。
  2. 从该页面中选择创建集群

f76ff480c8c889aa.png

  1. 您会看到如下所示的页面。使用以下值创建 集群和实例 (确保值匹配,以防您从仓库克隆应用代码):
  • 集群 ID:“vector-cluster
  • 密码:“alloydb
  • 与 PostgreSQL 16 兼容 / 建议使用最新版本
  • 区域"us-central1"
  • 网络:“default

538dba58908162fb.png

  1. 选择默认网络后,您会看到如下所示的页面。

选择设置连接
7939bbb6802a91bf.png

  1. 在此处,选择“使用自动分配的 IP 范围”,然后点击“继续”。查看信息后,选择“创建连接”。768ff5210e79676f.png

6. 重要提示:请务必将实例 ID (您可以在配置集群 / 实例时找到)更改为

vector-instance 。如果您无法更改它,请记住在所有后续引用中使用您的实例 ID

  1. 为了准备设置 Toolbox,让我们在 AlloyDB 实例中启用公共 IP 连接,以便新工具可以访问数据库。
  2. 前往“公共 IP 连接”部分,选中“启用公共 IP”复选框 ,然后输入 Cloud Shell 机器的 IP 地址。
  3. 如需获取 Cloud Shell 机器的 IP,请前往 Cloud Shell 终端并输入 ifconfig。从结果中找到 eth0 inet 地址,并将最后 2 位数字替换为 0.0,掩码大小为“/16”。例如,它看起来像“XX.XX.0.0/16”,其中 XX 是数字。
  4. 将此 IP 粘贴到“修改实例”页面的“授权的外部网络”的“网络”文本框中。

e4d1045e1255e40f.png

  1. 设置网络后,您可以继续创建集群。点击“创建集群”以完成集群的设置,如下所示:

e06623e55195e16e.png

请注意,创建集群大约需要 10 分钟。成功创建后,您应该会看到一个页面,其中显示了您刚刚创建的集群的概览。

数据注入

现在,该添加一个包含店铺数据的表了。前往 AlloyDB,选择主集群,然后选择 AlloyDB Studio:

847e35f1bf8a8bd8.png

您可能需要等待实例创建完成。 完成后,使用您在创建集群时创建的凭据登录 AlloyDB。 使用以下数据向 PostgreSQL 进行身份验证:

  • 用户名:“postgres
  • 数据库:“postgres
  • 密码:“alloydb

成功通过 AlloyDB Studio 身份验证后,在编辑器中输入 SQL 命令。 您可以使用最后一个窗口右侧的加号添加多个编辑器窗口。

91a86d9469d499c4.png

您将在编辑器窗口中输入 AlloyDB 的命令,并根据需要使用“运行”“格式”和“清除”选项。

创建表

您可以在 AlloyDB Studio 中使用以下 DDL 语句创建表:

-- Table DDL for Procurement Material Order Status

CREATE TABLE material_order_status (
    order_id VARCHAR(50) PRIMARY KEY,
    material_name VARCHAR(100) NOT NULL,
    supplier_name VARCHAR(100) NOT NULL,
    order_date DATE NOT NULL,
    estimated_delivery_date DATE,
    actual_delivery_date DATE,
    quantity_ordered INT NOT NULL,
    quantity_received INT,
    unit_price DECIMAL(10, 2) NOT NULL,
    total_amount DECIMAL(12, 2),
    order_status VARCHAR(50) NOT NULL, -- e.g., "Ordered", "Shipped", "Delivered", "Cancelled"
    delivery_address VARCHAR(255),
    contact_person VARCHAR(100),
    contact_phone VARCHAR(20),
    tracking_number VARCHAR(100),
    notes TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    quality_check_passed BOOLEAN,  -- Indicates if the material passed quality control
    quality_check_notes TEXT,        -- Notes from the quality control check
    priority VARCHAR(20),            -- e.g., "High", "Medium", "Low"
    project_id VARCHAR(50),          -- Link to a specific project
    receiver_name VARCHAR(100),        -- Name of the person who received the delivery
    return_reason TEXT,               -- Reason for returning material if applicable
    po_number VARCHAR(50)             -- Purchase order number
);

插入记录

将上述 database_script.sql 脚本中的 insert 查询语句复制到编辑器。

点击运行

现在数据集已准备就绪,让我们设置 MCP Toolbox for Databases,使其充当 AlloyDB 中所有订单数据库交互的控制平面!

8. MCP Toolbox for Databases 设置

Toolbox 位于应用的编排框架和数据库之间,提供了一个用于修改、分发或调用工具的控制平面。它通过提供一个集中存储和更新工具的位置来简化工具的管理,使您能够在智能体和应用之间共享工具,并在无需重新部署应用 的情况下更新这些工具。

您可以看到,MCP Toolbox for Databases 支持的数据库之一是 AlloyDB,由于我们已在上一部分中预配了该数据库,因此让我们继续设置 Toolbox。

  1. 前往 Cloud Shell 终端,确保您的项目已选中并显示在终端的提示中。在 Cloud Shell 终端中运行以下命令,以进入您的项目目录:
cd adk-renovation-agent
  1. 运行以下命令,在新文件夹中下载并安装 Toolbox:
# see releases page for other versions
export VERSION=0.7.0
curl -O https://storage.googleapis.com/mcp-toolbox-for-databases/v$VERSION/linux/amd64/toolbox
chmod +x toolbox
  1. 前往 Cloud Shell Editor(用于代码修改模式),然后在项目根文件夹中,添加一个名为“tools.yaml”的文件
sources:
    alloydb-orders:
        kind: "alloydb-postgres"
        project: "<<YOUR_PROJECT_ID>>"
        region: "us-central1"
        cluster: "<<YOUR_ALLOYDB_CLUSTER>>"
        instance: "<<YOUR_ALLOYDB_INSTANCE>>"
        database: "<<YOUR_ALLOYDB_DATABASE>>"
        user: "<<YOUR_ALLOYDB_USER>>"
        password: "<<YOUR_ALLOYDB_PASSWORD>>"

tools:
  get-order-data:
    kind: postgres-sql
    source: alloydb-orders
    description: Get the status of an order based on the material description.
    parameters:
      - name: description
        type: string
        description: A description of the material to search for its order status.
    statement: |
      select order_status from material_order_status where lower(material_name) like lower($1) 
      LIMIT 1;

在查询部分(请参阅上面的“statement”参数),我们只是在材料名称与用户的搜索文本匹配时检索字段 order_status 的值。

让我们了解 tools.yaml

来源 表示工具可以与之交互的不同数据源。来源表示工具可以与之交互的数据源。您可以在 tools.yaml 文件的 sources 部分中将来源定义为映射。通常,来源配置将包含与数据库连接和交互所需的任何信息。

工具 定义了智能体可以执行的操作,例如读取和写入来源。工具表示智能体可以执行的操作,例如运行 SQL 语句。您可以在 tools.yaml 文件的 tools 部分中将工具定义为映射。通常,工具需要一个来源才能执行操作。

如需详细了解如何配置 tools.yaml,请参阅此 文档

让我们运行 MCP Toolbox for Databases 服务器

运行以下命令(从 mcp-toolbox 文件夹)以启动服务器:

./toolbox --tools-file "tools.yaml"

现在,如果您在云端以网页预览模式打开服务器,您应该能够看到 Toolbox 服务器已启动并运行,其中包含名为 get-order-data 的新工具。

MCP Toolbox 服务器默认在端口 5000 上运行。让我们使用 Cloud Shell 对此进行测试。

点击 Cloud Shell 中的“网页预览”,如下所示:

f990712162e8e924.png

点击“更改端口”,将端口设置为 5000,如下所示,然后点击“更改并预览”。

d1b9de0c46ecef8a.png

这应该会显示以下输出:

2fdcdac326034d41.png

MCP Toolkit for Databases 介绍了一个 Python SDK,供您验证和测试工具,相关文档在此处 here。我们将跳过该部分,直接进入下一部分中的智能体开发套件 (ADK),该部分将使用这些工具。

让我们将 Toolbox 部署到 Cloud Run

首先,我们可以从 MCP Toolbox 服务器开始,并将其托管在 Cloud Run 上。然后,这将为我们提供一个公共端点,我们可以将其与其他任何应用和/或智能体应用集成。有关在 Cloud Run 上托管此服务器的说明,请参阅此处。我们现在将介绍关键步骤。

  1. 启动新的 Cloud Shell 终端或使用现有的 Cloud Shell 终端。前往包含 Toolbox 二进制文件和 tools.yaml 的项目文件夹,在本例中为 adk-renovation-agent
  2. 将 PROJECT_ID 变量设置为指向您的 Google Cloud 项目 ID。
export PROJECT_ID="<<YOUR_GOOGLE_CLOUD_PROJECT_ID>>"
  1. 启用这些 Google Cloud 服务
gcloud services enable run.googleapis.com \
                       cloudbuild.googleapis.com \
                       artifactregistry.googleapis.com \
                       iam.googleapis.com \
                       secretmanager.googleapis.com
  1. 让我们创建一个单独的服务账号,该账号将充当我们将部署在 Google Cloud Run 上的 Toolbox 服务的身份。
gcloud iam service-accounts create toolbox-identity
  1. 我们还确保此服务账号具有正确的角色,即能够访问 Secret Manager 并与 AlloyDB 通信
gcloud projects add-iam-policy-binding $PROJECT_ID \
   --member serviceAccount:toolbox-identity@$PROJECT_ID.iam.gserviceaccount.com \
   --role roles/secretmanager.secretAccessor

gcloud projects add-iam-policy-binding $PROJECT_ID \
   --member serviceAccount:toolbox-identity@$PROJECT_ID.iam.gserviceaccount.com \
   --role roles/alloydb.client

gcloud projects add-iam-policy-binding $PROJECT_ID \
   --member serviceAccount:toolbox-identity@$PROJECT_ID.iam.gserviceaccount.com \
   --role roles/serviceusage.serviceUsageConsumer
  1. 我们将以密文形式上传 tools.yaml 文件:
gcloud secrets create tools --data-file=tools.yaml

如果您已有密文并且想要更新 密文版本,请执行以下操作:

gcloud secrets versions add tools --data-file=tools.yaml

为要用于 Cloud Run 的容器映像设置环境变量:

export IMAGE=us-central1-docker.pkg.dev/database-toolbox/toolbox/toolbox:latest
  1. 熟悉的部署命令的最后一步:
gcloud run deploy toolbox \
--image $IMAGE \
--service-account toolbox-identity \
--region us-central1 \
--set-secrets "/app/tools.yaml=tools:latest" \
--args="--tools-file=/app/tools.yaml","--address=0.0.0.0","--port=8080" \
--allow-unauthenticated

这应该会开始将 Toolbox 服务器与我们配置的 tools.yaml 部署到 Cloud Run 的过程。成功部署后,您应该会看到类似于以下内容的消息:

Deploying container to Cloud Run service [toolbox] in project [YOUR_PROJECT_ID] region [us-central1]
OK Deploying new service... Done.                                                                                                                                                                                     
  OK Creating Revision...                                                                                                                                                                                             
  OK Routing traffic...                                                                                                                                                                                               
  OK Setting IAM Policy...                                                                                                                                                                                            
Done.                                                                                                                                                                                                                 
Service [toolbox] revision [toolbox-00001-zsk] has been deployed and is serving 100 percent of traffic.
Service URL: https://toolbox-<SOME_ID>.us-central1.run.app

您已一切就绪,可以在智能体应用中使用新部署的工具了!

让我们将 Toolbox 工具连接到智能体!

我们已经为智能体应用创建了来源。让我们更新该来源,以包含我们刚刚在 Cloud Run 中部署的新 MCP Toolbox for Databases 工具。

  1. 观察 您的 requirements.txt 文件,其中包含代码库中的来源:

我们在 requirements.txt 中添加了 MCP Toolbox for Databases 的依赖项

https://github.com/AbiramiSukumaran/renovation-agent-adk-mcp-toolbox/blob/main/requirements.txt

  1. 观察 您的 agent.py 文件,其中包含代码库中的代码:

我们添加了调用 Toolbox 端点以提取特定订购材料的订单数据的工具。

https://github.com/AbiramiSukumaran/renovation-agent-adk-mcp-toolbox/blob/main/agent.py

9. 模型设置

智能体理解用户请求和生成响应的能力由大语言模型 (LLM) 提供支持。智能体需要对此外部 LLM 服务进行安全调用,这需要身份验证凭据。如果没有有效的身份验证,LLM 服务将拒绝智能体的请求,并且智能体将无法正常运行。

  1. Google AI Studio 获取一个 API 密钥。
  2. 在设置 .env 文件的下一步中,将 <<your API KEY>> 替换为您的实际 API 密钥值。

10. ENV 变量设置

  1. 为模板 .env 文件中的参数设置值。在我的示例中,.env 包含以下变量:
GOOGLE_GENAI_USE_VERTEXAI=FALSE
GOOGLE_API_KEY=<<your API KEY>>
GOOGLE_CLOUD_LOCATION=us-central1 <<or your region>>
GOOGLE_CLOUD_PROJECT=<<your project id>>
PROJECT_ID=<<your project id>>
GOOGLE_CLOUD_REGION=us-central1 <<or your region>>

将占位符替换为您的值。

11. 运行智能体

  1. 使用终端,前往智能体项目的父级目录:
cd renovation-agent
  1. 安装依赖项:
pip install -r requirements.txt
  1. 您可以在 Cloud Shell 终端中运行以下命令来执行智能体:
adk run .
  1. 您可以运行以下命令,在 ADK 预配的网页界面中运行它:
adk web
  1. 使用以下提示进行测试:
user>> 

Hello. Check order status for Cement Bags.

12. 结果

3e74f6f757e2db2c.png

13. 清理

为避免系统因本博文中使用的资源向您的 Google Cloud 账号收取费用,请按照以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 管理资源 页面。
  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关停 以删除项目。

14. 恭喜

恭喜!您已使用 ADK 和 MCP Toolbox for Databases 成功创建了多智能体应用!如需了解详情,请参阅产品文档: 智能体开发套件MCP Toolbox for Databases