База данных как инструмент: Agentic RAG с ADK, MCP Toolbox и Cloud SQL.

1. Введение

Полезность ИИ-агентов зависит от качества данных, к которым они имеют доступ. Большая часть реальных данных хранится в базах данных, а подключение агентов к базам данных обычно подразумевает написание кода для управления соединениями, логики запросов и встраивания конвейеров обработки данных в код агента. Каждый агент, которому необходим доступ к базе данных, повторяет эту работу, и каждое изменение запроса требует повторного развертывания агента.

В этом практическом занятии показан другой подход. Вы объявляете инструменты для работы с базой данных в файле YAML — стандартные SQL-запросы, поиск векторного сходства, даже автоматическое создание векторных представлений — а MCP Toolbox for Databases обрабатывает все операции с базой данных как MCP-сервер. Код вашего агента остается минимальным: загружаете инструменты, а Gemini решает, какой из них вызвать.

Что вы построите

Интеллектуальный помощник для поиска работы на платформе "TechJobs" — агент ADK на базе Gemini, который помогает разработчикам просматривать объявления о вакансиях в сфере технологий, используя стандартные фильтры (роль, технологический стек), и находить вакансии на основе описаний на естественном языке, например: "Я хочу удаленную работу над чат-ботами с искусственным интеллектом". Агент считывает и записывает данные в базу данных Cloud SQL PostgreSQL полностью через MCP Toolbox for Databases, который обрабатывает весь доступ к базе данных, включая автоматическую генерацию векторных представлений для векторного поиска. В итоге и Toolbox, и агент работают на платформе Cloud Run.

eb6de681c40990c1.jpeg

Что вы узнаете

  • Как протокол MCP (Model Context Protocol) стандартизирует доступ к инструментам для агентов ИИ, и как MCP Toolbox for Databases применяет это к операциям с базами данных.
  • Настройте MCP Toolbox for Databases в качестве промежуточного программного обеспечения между агентом ADK и Cloud SQL PostgreSQL.
  • Инструменты базы данных определяются декларативно в файле tools.yaml — в вашем агенте не используется код базы данных.
  • Создайте агент ADK, который загружает инструменты с работающего сервера Toolbox, используя ToolboxToolset
  • Создавайте векторные представления данных с помощью встроенной функции embedding() Cloud SQL и включайте семантический поиск с помощью pgvector
  • Используйте функцию valueFromParam для автоматического приема вектора при операциях записи.
  • Разверните сервер Toolbox и агент ADK в Cloud Run.

Предварительные требования

  • Учетная запись Google Cloud с пробной платной учетной записью.
  • Базовые знания Python и SQL.
  • Опыт работы с ADK, MCP Toolbox или pgvector не требуется.

2. Настройте свою среду.

На этом этапе подготавливается среда Cloud Shell, настраивается проект Google Cloud и клонируется репозиторий ссылок.

Открытая облачная оболочка

Откройте Cloud Shell в браузере. Cloud Shell предоставляет предварительно настроенную среду со всеми необходимыми инструментами для выполнения этого практического задания. При появлении запроса нажмите «Авторизовать».

Затем нажмите « Вид » -> « Терминал », чтобы открыть терминал. Ваш интерфейс должен выглядеть примерно так.

86307fac5da2f077.png

Это будет наш основной интерфейс: IDE сверху, терминал снизу.

Настройте рабочую директорию.

Создайте свою рабочую директорию. Весь код, написанный вами в этом практическом занятии, будет находиться здесь:

mkdir -p ~/build-agent-adk-toolbox-cloudsql
cloudshell workspace ~/build-agent-adk-toolbox-cloudsql && cd ~/build-agent-adk-toolbox-cloudsql

Настройте свой проект в Google Cloud.

Создайте файл .env с переменными location:

# For Vertex AI / Gemini API calls
echo "GOOGLE_CLOUD_LOCATION=global" > .env
# For Cloud SQL, Cloud Run, Artifact Registry
echo "REGION=us-central1" >> .env

Загрузите скрипт установки проекта в свою рабочую директорию:

curl -sL https://raw.githubusercontent.com/alphinside/cloud-trial-project-setup/main/setup_verify_trial_project.sh -o setup_verify_trial_project.sh

Запустите скрипт. Он проверит вашу учетную запись для оплаты пробной версии, создаст новый проект (или проверит существующий), сохранит идентификатор вашего проекта в файл .env в текущем каталоге и установит активный проект в gcloud .

bash setup_verify_trial_project.sh && source .env

Сценарий будет:

  1. Убедитесь, что у вас есть активный пробный аккаунт для оплаты.
  2. Проверьте наличие существующего проекта в .env (если таковой имеется).
  3. Создайте новый проект или используйте существующий.
  4. Свяжите пробный аккаунт с вашим проектом.
  5. Сохраните идентификатор проекта в файл .env
  6. Установите этот проект в качестве активного проекта gcloud

Убедитесь, что проект настроен правильно, проверив желтый текст рядом с вашим рабочим каталогом в командной строке терминала Cloud Shell. Там должен отображаться идентификатор вашего проекта.

dcba35ce1389f313.png

Если ваша сессия Cloud Shell сбросится в любой момент во время выполнения этого практического задания, вернитесь в свой рабочий каталог и повторно запустите команду bash setup_verify_trial_project.sh && source .env чтобы восстановить конфигурацию проекта. Убедитесь, что желтый текст с идентификатором проекта снова появился в командной строке терминала.

gcloud services enable \
  aiplatform.googleapis.com \
  sqladmin.googleapis.com \
  compute.googleapis.com \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  artifactregistry.googleapis.com
  • API Vertex AI ( aiplatform.googleapis.com ) — ваш агент использует модели Gemini, а Toolbox использует API встраивания для векторного поиска.
  • Cloud SQL Admin API ( sqladmin.googleapis.com ) — позволяет создавать и управлять экземпляром PostgreSQL.
  • API Compute Engine ( compute.googleapis.com ) — необходим для создания экземпляров Cloud SQL.
  • Cloud Run, Cloud Build, Artifact Registry — используются на этапе развертывания, который будет рассмотрен далее в этом практическом занятии.

3. Создайте экземпляр базы данных.

На этом шаге в фоновом режиме выполняется настройка создания экземпляра Cloud SQL — инициализация происходит параллельно с продолжением обучения.

Начать создание экземпляра

Добавьте пароль к базе данных в файл .env и перезагрузите её:

echo "DB_PASSWORD=techjobs-pwd-2025" >> .env
source .env

Начните создание экземпляра Cloud SQL. Этот процесс выполняется в фоновом режиме, поэтому вы можете продолжать работу:

gcloud sql instances create jobs-instance \
  --database-version=POSTGRES_17 \
  --tier=db-custom-1-3840 \
  --edition=ENTERPRISE \
  --region=$REGION \
  --root-password=$DB_PASSWORD \
  --enable-google-ml-integration \
  --database-flags cloudsql.enable_google_ml_integration=on \
  --quiet &
  • db-custom-1-3840 — это самый маленький выделенный уровень Cloud SQL (1 vCPU, 3,75 ГБ ОЗУ) в версии ENTERPRISE . Подробнее можно прочитать здесь . Для интеграции Vertex AI ML требуется выделенное ядро ​​— уровни с общим ядром ( db-f1-micro , db-g1-small ) его не поддерживают.
  • --root-password устанавливает пароль для пользователя postgres по умолчанию.
  • --enable-google-ml-integration включает встроенную интеграцию Cloud SQL с Vertex AI, которая позволяет вызывать модели встраивания непосредственно из SQL с помощью функции embedding() .
  • Символ & запускает команду в фоновом режиме.

Эта процедура будет выполняться в фоновом режиме, затем давайте загрузим исполняемый файл MCP Toolbox. Это можно сделать в том же терминале.

Загрузите исполняемый файл Toolbox.

В этом руководстве мы будем использовать MCP Toolbox, к счастью, он поставляется с предварительно собранным бинарным файлом, готовым к использованию в среде Linux. Давайте загрузим его в фоновом режиме, так как это займет довольно много времени.

cd ~/build-agent-adk-toolbox-cloudsql
curl -O https://storage.googleapis.com/genai-toolbox/v0.27.0/linux/amd64/toolbox &

Пусть этот процесс выполняется в текущей вкладке (мы уже запустили его в фоновом режиме, однако вывод всё равно будет отображаться). Давайте откроем новую вкладку терминала в Cloud Shell (нажмём значок «+»), чтобы лучше сосредоточиться.

b01e3fbd89f17332.png

Снова перейдите в свою рабочую директорию и активируйте проект, используя предыдущий скрипт настройки.

cd ~/build-agent-adk-toolbox-cloudsql
bash setup_verify_trial_project.sh && source .env

На этом этапе настраивается проект Python, устанавливаются зависимости и создается структура каталога агента ADK.

4. Инициализация проекта агента.

Настройте проект Python.

uv — это быстрый пакет Python и менеджер проектов, написанный на Rust ( документация uv ). В этом практическом занятии он используется для повышения скорости и простоты.

Инициализируйте проект Python и добавьте необходимые зависимости:

uv init
uv add google-adk==1.25.0 toolbox-adk==0.6.0
  • google-adk — комплект разработки агентов от Google, включая SDK Gemini.
  • toolbox-adk — интеграция ADK для MCP Toolbox for Databases.

Создайте структуру каталогов агента.

ADK ожидает определенную структуру папок: каталог, названный в честь вашего агента и содержащий файлы __init__.py , agent.py и .env . Для этого предусмотрена встроенная команда, позволяющая быстро установить структуру:

uv run adk create jobs_agent \
    --model gemini-2.5-flash \
    --project ${GOOGLE_CLOUD_PROJECT} \
    --region ${GOOGLE_CLOUD_LOCATION}

Теперь ваша директория должна выглядеть примерно так:

build-agent-adk-toolbox-cloudsql/
├── jobs_agent/
│   ├── __init__.py
│   ├── agent.py
│   └── .env
├── pyproject.toml
├── .env              (project setup — already exists)
└── .venv/

5. Формирование базы данных вакансий.

На этом этапе записываются исходные данные, ожидается завершение подготовки экземпляра Cloud SQL, и таблица jobs загружается 15 объявлениями о вакансиях и их описаниями.

Напишите SQL-запрос с начальным значением.

Мы создадим в редакторе Cloud Shell файл с именем seed.sql , содержащий список вакансий. Это создаст таблицу jobs с поддержкой pgvector и добавит 15 вакансий в технологических компаниях.

Сначала создайте файл seed.sql , используя следующую команду:

cloudshell edit seed.sql

Затем скопируйте эти скрипты в файл.

-- seed.sql
-- DISCLAIMER: These job listings are entirely fictional and created for tutorial
-- purposes only. Company names are used for illustrative context — the positions,
-- salaries, and descriptions do not reflect real openings.

CREATE EXTENSION IF NOT EXISTS google_ml_integration;
CREATE EXTENSION IF NOT EXISTS vector;

CREATE TABLE IF NOT EXISTS jobs (
    id SERIAL PRIMARY KEY,
    title VARCHAR NOT NULL,
    company VARCHAR NOT NULL,
    role VARCHAR NOT NULL,
    tech_stack VARCHAR NOT NULL,
    salary_range VARCHAR NOT NULL,
    location VARCHAR NOT NULL,
    openings INTEGER NOT NULL,
    description TEXT NOT NULL,
    description_embedding vector(3072)
);

INSERT INTO jobs (title, company, role, tech_stack, salary_range, location, openings, description) VALUES
('Senior Backend Engineer', 'Stripe', 'Backend', 'Go, PostgreSQL, gRPC, Kubernetes', '$180-250K/year', 'San Francisco, Hybrid', 3,
 'Design and build high-throughput microservices powering payment infrastructure for millions of businesses. Optimize Go services for sub-100ms latency at scale, work with PostgreSQL and Redis for data persistence, and deploy on Kubernetes clusters handling billions of API calls.'),

('Machine Learning Engineer', 'Spotify', 'Data/AI', 'Python, TensorFlow, BigQuery, Vertex AI', '$170-230K/year', 'Stockholm, Remote', 2,
 'Build and deploy ML models for music recommendation and personalization systems serving hundreds of millions of listeners. Design feature pipelines in BigQuery, train models using distributed computing, and serve predictions through real-time APIs processing thousands of requests per second.'),

('Frontend Engineer', 'Vercel', 'Frontend', 'React, TypeScript, Next.js', '$140-190K/year', 'Remote', 4,
 'Build developer-facing dashboard interfaces and deployment tools used by millions of developers worldwide. Create responsive, accessible React components for project management, analytics, and real-time deployment monitoring with a focus on developer experience.'),

('DevOps Engineer', 'Datadog', 'DevOps', 'Terraform, GCP, Docker, Kubernetes, ArgoCD', '$160-220K/year', 'New York, Hybrid', 2,
 'Manage cloud infrastructure powering an observability platform used by thousands of engineering teams. Automate deployment pipelines with ArgoCD, manage multi-cloud Kubernetes clusters, and implement infrastructure-as-code with Terraform across production environments.'),

('Mobile Engineer (Android)', 'Grab', 'Mobile', 'Kotlin, Jetpack Compose, GraphQL', '$120-170K/year', 'Singapore, Hybrid', 3,
 'Develop features for a super-app serving millions of users across Southeast Asia. Build modern Android UIs with Jetpack Compose, integrate GraphQL APIs, and optimize app performance for diverse device capabilities and network conditions.'),

('Data Engineer', 'Airbnb', 'Data', 'Python, Apache Spark, Airflow, BigQuery', '$160-210K/year', 'San Francisco, Hybrid', 2,
 'Build data pipelines that process booking, search, and pricing data for a global travel marketplace. Design ETL workflows with Apache Spark and Airflow, maintain data warehouses in BigQuery, and ensure data quality for analytics and machine learning teams.'),

('Full Stack Engineer', 'Revolut', 'Full Stack', 'TypeScript, Node.js, React, PostgreSQL', '$130-180K/year', 'London, Remote', 5,
 'Build the next generation of financial products making banking accessible to millions of users across 35 countries. Develop real-time trading interfaces with React and WebSockets, build Node.js APIs handling market data streams, and design PostgreSQL schemas for financial transactions.'),

('Site Reliability Engineer', 'Cloudflare', 'SRE', 'Go, Prometheus, Grafana, GCP, Terraform', '$170-230K/year', 'Austin, Hybrid', 2,
 'Ensure 99.99% uptime for a global network handling millions of requests per second. Define SLOs, build monitoring dashboards with Prometheus and Grafana, manage incident response, and automate infrastructure scaling across 300+ data centers worldwide.'),

('Cloud Architect', 'Google Cloud', 'Cloud', 'GCP, Terraform, Kubernetes, Python', '$200-280K/year', 'Seattle, Hybrid', 1,
 'Help enterprises modernize their infrastructure on Google Cloud. Design multi-region architectures, lead migration projects from on-premises to GKE, and build reference implementations using Terraform and Cloud Foundation Toolkit.'),

('Backend Engineer (Payments)', 'Square', 'Backend', 'Java, Spring Boot, PostgreSQL, Kafka', '$160-220K/year', 'San Francisco, Hybrid', 3,
 'Build payment processing systems handling millions of transactions for businesses of all sizes. Design event-driven architectures using Kafka, implement idempotent payment flows with Spring Boot, and ensure PCI-DSS compliance across all services.'),

('AI Engineer', 'Hugging Face', 'Data/AI', 'Python, LangChain, Vertex AI, FastAPI, PostgreSQL', '$150-210K/year', 'Paris, Remote', 2,
 'Build AI-powered tools for the largest open-source ML community. Develop RAG pipelines that index and search model documentation, create conversational agents using LangChain, and deploy AI services with FastAPI on cloud infrastructure.'),

('Platform Engineer', 'Coinbase', 'Platform', 'Rust, Kubernetes, AWS, Terraform', '$180-250K/year', 'Remote', 0,
 'Build the infrastructure platform for a leading cryptocurrency exchange. Develop high-performance matching engines in Rust, manage Kubernetes clusters for microservices, and design CI/CD pipelines that enable rapid feature deployment with zero downtime.'),

('QA Automation Engineer', 'Shopify', 'QA', 'Python, Selenium, Cypress, Jenkins', '$110-160K/year', 'Toronto, Hybrid', 3,
 'Design and maintain automated test suites for a commerce platform powering millions of merchants. Build end-to-end test frameworks with Cypress and Selenium, integrate tests into Jenkins CI pipelines, and establish quality gates that prevent regressions in checkout and payment flows.'),

('Security Engineer', 'CrowdStrike', 'Security', 'Python, SIEM, Kubernetes, Penetration Testing', '$170-240K/year', 'Austin, On-site', 1,
 'Protect enterprise customers from cyber threats on a leading endpoint security platform. Conduct penetration testing, design security monitoring with SIEM tools, implement zero-trust networking in Kubernetes environments, and lead incident response for security events.'),

('Product Engineer', 'GitLab', 'Full Stack', 'Go, React, PostgreSQL, Redis, GCP', '$140-200K/year', 'Remote', 4,
 'Own features end-to-end for an all-in-one DevSecOps platform used by millions of developers. Build Go microservices for CI/CD pipelines, create React frontends for code review and project management, and collaborate with product managers to iterate on user-facing features using data-driven development.');

Скрипт установки устанавливает два расширения PostgreSQL:

  • google_ml_integration — предоставляет SQL-функцию embedding() , которая вызывает модели встраивания Vertex AI непосредственно из SQL. Это расширение на уровне базы данных, которое делает функции машинного обучения доступными внутри jobs_db . Флаг уровня экземпляра ( --enable-google-ml-integration ), который вы устанавливаете при создании экземпляра, позволяет виртуальной машине Cloud SQL обращаться к Vertex AI — расширение делает SQL-функции доступными в этой конкретной базе данных.
  • vector ( pgvector ) — добавляет vector тип данных и операторы расстояния для хранения и запроса векторных представлений.

Столбец description_embedding имеет vector(3072) — это столбец pgvector , хранящий 3072-мерные векторы. Сейчас он равен NULL; вы сгенерируете и заполните эмбеддинги на следующем шаге, используя функцию embedding() .

Завершите настройку базы данных.

Создание экземпляра Cloud SQL, начатое на предыдущем шаге, может еще не завершиться. Убедитесь, что экземпляр готов:

gcloud sql instances describe jobs-instance --format="value(state)"

Вы должны увидеть следующий результат.

RUNNABLE

34f5b48006b4cb3a.png

Далее предоставьте учетной записи службы экземпляра Cloud SQL разрешение на вызов Vertex AI. Это необходимо для встроенной функции embedding() которую вы будете использовать на следующем шаге:

SERVICE_ACCOUNT=$(gcloud sql instances describe jobs-instance --format="value(serviceAccountEmailAddress)")

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

После этого создайте отдельную базу данных для объявлений о вакансиях:

gcloud sql databases create jobs_db --instance=jobs-instance

Вы должны увидеть сообщение, подтверждающее создание базы данных:

Creating Cloud SQL database...done.                                                                         
Created database [jobs_db].
instance: jobs-instance
name: jobs_db
project: workshop-xxxxxxx

Подключитесь и заполните базу данных.

Запустите прокси-сервер аутентификации Cloud SQL ( cloud-sql-proxy предустановлен в Cloud Shell). Это обеспечит безопасное, аутентифицированное соединение между Cloud Shell и вашим экземпляром Cloud SQL:

d72e56478b517b5c.jpeg

cloud-sql-proxy ${GOOGLE_CLOUD_PROJECT}:${REGION}:jobs-instance --port 5432 &

После запуска прокси-сервера в терминале вы должны увидеть следующий вывод:

... Authorizing with Application Default Credentials
... [workshop-xxxxxx:your-location:jobs-instance] Listening on 127.0.0.1:5432
... The proxy has started successfully and is ready for new connections!

Сейчас в терминале непрерывно отображается лог прокси-сервера Cloud SQL. Давайте откроем новую вкладку терминала в Cloud Shell (нажмем значок «+»), чтобы лучше сосредоточиться.

b01e3fbd89f17332.png

Снова перейдите в свою рабочую директорию и активируйте проект, используя предыдущий скрипт настройки.

cd ~/build-agent-adk-toolbox-cloudsql
bash setup_verify_trial_project.sh && source .env

Затем запустите скрипт инициализации.

psql "host=127.0.0.1 port=5432 dbname=jobs_db user=postgres password=$DB_PASSWORD" -f seed.sql

В терминале вы увидите примерно такой вывод.

CREATE EXTENSION
CREATE EXTENSION
CREATE TABLE
INSERT 0 15

Давайте проверим данные.

psql "host=127.0.0.1 port=5432 dbname=jobs_db user=postgres password=$DB_PASSWORD" \
  -c "SELECT title, company, role, openings FROM jobs ORDER BY role, title;"

Вы должны увидеть 15 вакансий по различным должностям:

             title              |    company     |   role    | openings
---------------------------------+----------------+-----------+----------
 Senior Backend Engineer         | Stripe         | Backend   |        3
 Backend Engineer (Payments)     | Square         | Backend   |        3
 Cloud Architect                 | Google Cloud   | Cloud     |        1
 ...
(15 rows)

Создание векторных представлений для описаний вакансий

В таблице jobs столбец description_embedding в данный момент имеет значение NULL. Встроенное расширение google_ml_integration в Cloud SQL предоставляет функцию embedding() , которая вызывает Vertex AI непосредственно из SQL — без необходимости использования скрипта Python или внешнего SDK.

Запустите генерацию векторных представлений в фоновом режиме. Это вызовет Vertex AI для генерации 3072-мерного вектора с использованием модели gemini-embedding-001 для каждого из 15 описаний вакансий:

psql "host=127.0.0.1 port=5432 dbname=jobs_db user=postgres password=$DB_PASSWORD" \
  -c "UPDATE jobs SET description_embedding = embedding('gemini-embedding-001', description)::vector;" &

Вот что делает этот скрипт:

  • embedding('gemini-embedding-001', description) — вызывает модель встраивания Gemini от Vertex AI напрямую из SQL, передавая текст description каждого задания. Это расширение google_ml_integration которое вы установили в скрипте инициализации.
  • ::vector — преобразует возвращаемый массив чисел с плавающей запятой в vector тип pgvector, чтобы его можно было хранить и запрашивать с помощью операторов расстояния.
  • UPDATE применяется ко всем 15 строкам, генерируя одно 3072-мерное векторное представление для каждого описания вакансии.
  • Символ & запускает команду в фоновом режиме, поэтому вы можете продолжать работу, пока Vertex AI обрабатывает эмбеддинги.

Как и в случае с предыдущими фоновыми процессами, текущий терминал выведет лог этого процесса. Давайте откроем новую вкладку терминала в Cloud Shell (нажмите значок «+»), чтобы сосредоточиться на главном.

b01e3fbd89f17332.png

Снова перейдите в свою рабочую директорию и активируйте проект, используя предыдущий скрипт настройки.

cd ~/build-agent-adk-toolbox-cloudsql
bash setup_verify_trial_project.sh && source .env

Затем мы можем перейти к следующему этапу.

6. Настройка MCP Toolbox для баз данных.

На этом шаге представлен MCP Toolbox for Databases, настроено подключение к вашему экземпляру Cloud SQL и определены два стандартных инструмента для выполнения SQL-запросов.

Что такое MCP и зачем использовать Toolbox?

e7b9be2e1c98b4db.png

MCP (Model Context Protocol) — это открытый протокол, стандартизирующий способы обнаружения внешних инструментов и взаимодействия с ними у агентов искусственного интеллекта. Он определяет модель «клиент-сервер»: агент размещает MCP-клиент, а инструменты предоставляются MCP-серверами. Любой MCP-совместимый клиент может использовать любой MCP-совместимый сервер — агенту не требуется собственный код интеграции для каждого инструмента.

d5baa77423f0f465.png

MCP Toolbox for Databases — это сервер MCP с открытым исходным кодом, созданный специально для доступа к базам данных. Без него вам пришлось бы писать функции на Python, которые открывают соединения с базами данных, управляют пулами соединений, формируют параметризованные запросы для предотвращения SQL-инъекций, обрабатывают ошибки и встраивают весь этот код в ваш агент. Каждый агент, которому необходим доступ к базе данных, повторяет эту работу. Изменение запроса означает повторное развертывание агента.

С помощью Toolbox вы пишете YAML-файл. Каждый инструмент соответствует параметризованному SQL-запросу. Toolbox обрабатывает пулы соединений, параметризованные запросы, аутентификацию и мониторинг. Инструменты независимы от агента — обновить запрос можно, отредактировав tools.yaml и перезапустив Toolbox, без изменения кода агента. Те же инструменты работают с ADK, LangGraph, LlamaIndex или любой совместимой с MCP платформой.

Напишите конфигурацию инструментов

Теперь нам нужно создать файл tools.yaml в редакторе Cloud Shell, чтобы настроить конфигурацию наших инструментов.

cloudshell edit tools.yaml

Файл использует многодокументный YAML — каждый блок, разделённый символами --- представляет собой отдельный ресурс. Каждый ресурс имеет kind , который определяет его назначение ( sources для подключений к базам данных, tools для действий, вызываемых агентом), и type , указывающий на бэкэнд ( cloud-sql-postgres для источника, postgres-sql для инструментов на основе SQL). Инструмент ссылается на свой источник по name , благодаря чему Toolbox знает, к какому пулу подключений следует обращаться. Переменные среды используют синтаксис ${VAR_NAME} и разрешаются при запуске.

Теперь давайте сначала скопируем следующие скрипты в файл tools.yaml

# tools.yaml

# --- Data Source ---
kind: sources
name: jobs-db
type: cloud-sql-postgres
project: ${GOOGLE_CLOUD_PROJECT}
region: ${REGION}
instance: jobs-instance
database: jobs_db
user: postgres
password: ${DB_PASSWORD}

---

Данный скрипт определяет следующий ресурс:

  • Source ( jobs-db ) — указывает Toolbox, как подключиться к вашему экземпляру Cloud SQL PostgreSQL. Тип cloud-sql-postgres использует внутренний коннектор Cloud SQL, автоматически обрабатывая аутентификацию и безопасные соединения. Заполнители ${GOOGLE_CLOUD_PROJECT} , ${REGION} и ${DB_PASSWORD} определяются из переменных среды при запуске.

Далее добавьте следующий скрипт под символом --- в файл tools.yaml.

# --- Tool 1: Search jobs by role and/or tech stack ---
kind: tools
name: search-jobs
type: postgres-sql
source: jobs-db
description: >-
  Search for job listings by role category and/or tech stack.
  Use this tool when the developer wants to browse listings
  by role (e.g., Backend, Frontend, Data) or find jobs
  using a specific technology. Both parameters accept an
  empty string to match all values.
statement: |
  SELECT title, company, role, tech_stack, salary_range, location, openings
  FROM jobs
  WHERE ($1 = '' OR LOWER(role) = LOWER($1))
  AND ($2 = '' OR LOWER(tech_stack) LIKE '%' || LOWER($2) || '%')
  ORDER BY title
  LIMIT 10
parameters:
  - name: role
    type: string
    description: "The role category to filter by (e.g., 'Backend', 'Frontend', 'Data/AI', 'DevOps'). Use empty string for all roles."
  - name: tech_stack
    type: string
    description: "A technology to search for in the tech stack (partial match, e.g., 'Python', 'Kubernetes'). Use empty string for all tech stacks."

---

# --- Tool 2: Get full details for a specific job ---
kind: tools
name: get-job-details
type: postgres-sql
source: jobs-db
description: >-
  Get full details for a specific job listing including its description,
  salary range, location, and number of openings. Use this tool when the
  developer asks about a particular job by title or company.
statement: |
  SELECT title, company, role, tech_stack, salary_range, location, openings, description
  FROM jobs
  WHERE LOWER(title) LIKE '%' || LOWER($1) || '%'
  OR LOWER(company) LIKE '%' || LOWER($1) || '%'
parameters:
  - name: search_term
    type: string
    description: "The job title or company name to look up (partial match supported)."

---

Данный скрипт определяет следующий ресурс:

  • Инструменты 1 и 2 ( search-jobs , get-job-details ) — стандартные инструменты для выполнения SQL-запросов. Каждый из них сопоставляет имя инструмента (то, что видит агент) с параметризованным SQL-запросом (то, что выполняет база данных). В параметрах используются позиционные заполнители $1 и $2 . Toolbox выполняет их как подготовленные запросы, что предотвращает SQL-инъекции.

Продолжим, добавив следующий скрипт под символом --- в файл tools.yaml.

# --- Embedding Model ---
kind: embeddingModels
name: gemini-embedding
type: gemini
model: gemini-embedding-001
dimension: 3072

---

Данный скрипт определяет следующий ресурс:

  • Модель встраивания ( gemini-embedding ) — настраивает Toolbox для вызова модели gemini-embedding-001 для генерации 3072-мерных текстовых встраиваний. Toolbox использует учетные данные приложения по умолчанию (ADC) для аутентификации — ключ API не требуется в Cloud Shell или Cloud Run. Обратите внимание, что это dimension настроенное здесь, должно совпадать с ранее настроенным для заполнения базы данных.

Продолжим, добавив следующий скрипт под символом --- в файл tools.yaml.

# --- Tool 3: Semantic search by description ---
kind: tools
name: search-jobs-by-description
type: postgres-sql
source: jobs-db
description: >-
  Find jobs that match a natural language description of what the developer
  is looking for. Use this tool when the developer describes their ideal job
  using interests, work style, career goals, or project type rather than a
  specific role or tech stack. Examples: "I want to work on AI chatbots,"
  "a remote job at a fintech startup," "something involving infrastructure
  and reliability."
statement: |
  SELECT title, company, role, tech_stack, salary_range, location, description
  FROM jobs
  WHERE description_embedding IS NOT NULL
  ORDER BY description_embedding <=> $1
  LIMIT 5
parameters:
  - name: search_query
    type: string
    description: "A natural language description of the kind of job the developer is looking for."
    embeddedBy: gemini-embedding

---

Данный скрипт определяет следующий ресурс:

  • Инструмент 3 ( search-jobs-by-description ) — инструмент векторного поиска. Параметр search_query имеет embeddedBy: gemini-embedding , который указывает Toolbox перехватить исходный текст, отправить его в модель встраивания и использовать полученный вектор в SQL-запросе. Оператор <=> — это косинусное расстояние pgvector — меньшие значения означают больше похожих описаний.

Наконец, добавьте последний инструмент под символом --- в файл tools.yaml.

# --- Tool 4: Add a new job listing with automatic embedding ---
kind: tools
name: add-job
type: postgres-sql
source: jobs-db
description: >-
  Add a new job listing to the platform. Use this tool when a user asks
  to post a job that is not currently listed.
statement: |
  INSERT INTO jobs (title, company, role, tech_stack, salary_range, location, openings, description, description_embedding)
  VALUES ($1, $2, $3, $4, $5, $6, CAST($7 AS INTEGER), $8, $9)
  RETURNING title, company
parameters:
  - name: title
    type: string
    description: "The job title (e.g., 'Senior Backend Engineer')."
  - name: company
    type: string
    description: "The company name (e.g., 'Stripe', 'Spotify')."
  - name: role
    type: string
    description: "The role category (e.g., 'Backend', 'Frontend', 'Data/AI', 'DevOps')."
  - name: tech_stack
    type: string
    description: "Comma-separated list of technologies (e.g., 'Python, FastAPI, GCP')."
  - name: salary_range
    type: string
    description: "The salary range (e.g., '$150-200K/year')."
  - name: location
    type: string
    description: "Work location and arrangement (e.g., 'Remote')."
  - name: openings
    type: string
    description: "The number of open positions."
  - name: description
    type: string
    description: "A short description of the job (2-3 sentences)."
  - name: description_vector
    type: string
    description: "Auto-generated embedding vector for the job description."
    valueFromParam: description
    embeddedBy: gemini-embedding

Данный скрипт определяет следующий ресурс:

  • Инструмент 4 ( add-job ) — демонстрирует загрузку вектора. Параметр description_vector имеет два специальных поля:
  • valueFromParam: description — Toolbox копирует значение из параметра description в этот параметр. LLM никогда не видит этот параметр.
  • embeddedBy: gemini-embedding — Инструментарий встраивает скопированный текст в вектор перед передачей его в SQL-запрос.

В результате: один вызов инструмента сохраняет как исходный текст описания, так и его векторное представление, при этом агент ничего не знает о векторных представлениях.

Многодокументный формат YAML разделяет каждый ресурс символом --- . Каждый документ содержит поля kind , name и type , определяющие его назначение. В итоге, мы уже настроили все следующие параметры:

  • Определите исходную базу данных
  • Определите инструменты ( инструмент 1 и 2 ) для выполнения запросов к базе данных со стандартным фильтром.
  • Определить модель встраивания
  • Определите инструмент для выполнения векторного поиска ( инструмент 3 ) в базе данных.
  • Определите инструмент для загрузки векторных данных ( инструмент 4) в базу данных.

Проверьте векторные представления.

Перед запуском Toolbox убедитесь, что генерация фоновых эмбеддингов завершена. Проверьте, что все задания теперь имеют эмбеддинги:

psql "host=127.0.0.1 port=5432 dbname=jobs_db user=postgres password=$DB_PASSWORD" \
  -c "SELECT title, (description_embedding IS NOT NULL) AS has_embedding FROM jobs ORDER BY title;"

В столбце has_embedding для каждой строки должно отображаться значение t (true). В противном случае вы можете подождать, пока завершится весь процесс создания векторных представлений строк.

           title            | has_embedding 
-----------------------------+---------------
 AI Engineer                 | t
 Backend Engineer (Payments) | t
 Cloud Architect             | t
 Data Engineer               | t
 DevOps Engineer             | t
 Frontend Engineer           | t
 Full Stack Engineer         | t

Запустите сервер Toolbox.

На этапе установки мы уже загрузили исполняемый toolbox . Убедитесь, что этот бинарный файл существует и успешно загружен; если нет, загрузите его и дождитесь завершения загрузки.

cd ~/build-agent-adk-toolbox-cloudsql
if [ ! -f toolbox ]; then
  curl -O https://storage.googleapis.com/genai-toolbox/v0.27.0/linux/amd64/toolbox
fi
chmod +x toolbox

Экспортируйте необходимые переменные среды и запустите Toolbox. Переменные GOOGLE_CLOUD_LOCATION и GOOGLE_GENAI_USE_VERTEXAI необходимы, поскольку конфигурация включает модель встраивания — GOOGLE_GENAI_USE_VERTEXAI указывает SDK Gemini использовать маршрутизацию через Vertex AI (вместо пользовательского API Gemini), а GOOGLE_CLOUD_LOCATION указывает, какую региональную конечную точку использовать.

export GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT
export GOOGLE_CLOUD_LOCATION=$GOOGLE_CLOUD_LOCATION
export GOOGLE_GENAI_USE_VERTEXAI=true
export DB_PASSWORD=$DB_PASSWORD
export REGION=$REGION
./toolbox --tools-file tools.yaml &

Вы должны увидеть сообщение, подтверждающее готовность сервера, как показано ниже:

... INFO "Initialized 0 authServices: " 
... INFO "Initialized 1 embeddingModels: gemini-embedding" 
... INFO "Initialized 4 tools: add-job, search-jobs, get-job-details, search-jobs-by-description" 
...
... INFO "Server ready to serve!"

Как и на предыдущем шаге, это запустит ещё один процесс и будет выводить результаты. Давайте откроем новую вкладку терминала в Cloud Shell (нажмите значок «+»), чтобы сосредоточиться на главном.

b01e3fbd89f17332.png

Снова перейдите в свою рабочую директорию и активируйте проект, используя предыдущий скрипт настройки.

cd ~/build-agent-adk-toolbox-cloudsql
bash setup_verify_trial_project.sh && source .env

Проверьте инструменты

Для получения списка всех зарегистрированных инструментов выполните запрос к API Toolbox:

curl -s http://localhost:5000/api/toolset | python3 -m json.tool

Вы должны увидеть инструменты с их описаниями и параметрами. Как показано ниже.

...
       
"search-jobs-by-description": {
            "description": "Find jobs that match a natural language description of what the developer is looking for. Use this tool when the developer describes their ideal job using interests, work style, career goals, or project type rather than a specific role or tech stack. Examples: \"I want to work on AI chatbots,\" \"a remote job at a fintech startup,\" \"something involving infrastructure and reliability.\"",
            "parameters": [
                {
                    "name": "search_query",
                    "type": "string",
                    "required": true,
                    "description": "A natural language description of the kind of job the developer is looking for.",
                    "authSources": []
                }
            ],
            "authRequired": []
        }
...

Протестируйте инструмент search-jobs напрямую:

curl -s -X POST http://localhost:5000/api/tool/search-jobs/invoke \
  -H "Content-Type: application/json" \
  -d '{"role": "Backend", "tech_stack": ""}' | jq '.result | fromjson'

В ответе должны содержаться две задачи по разработке бэкэнда, взятые из ваших исходных данных.

[
  {
    "title": "Backend Engineer (Payments)",
    "company": "Square",
    "role": "Backend",
    "tech_stack": "Java, Spring Boot, PostgreSQL, Kafka",
    "salary_range": "$160-220K/year",
    "location": "San Francisco, Hybrid",
    "openings": 3
  },
  {
    "title": "Senior Backend Engineer",
    "company": "Stripe",
    "role": "Backend",
    "tech_stack": "Go, PostgreSQL, gRPC, Kubernetes",
    "salary_range": "$180-250K/year",
    "location": "San Francisco, Hybrid",
    "openings": 3
  }
]

7. Создайте агент ADK.

На этом этапе агент ADK подключается к работающему серверу Toolbox и тестируются все четыре инструмента — стандартные запросы, семантический поиск и векторная обработка данных. Код агента минимален: вся логика работы с базой данных находится в файле tools.yaml .

Настройте среду агента.

ADK считывает GOOGLE_GENAI_USE_VERTEXAI , GOOGLE_CLOUD_PROJECT и GOOGLE_CLOUD_LOCATION из среды командной оболочки, которую вы уже установили на предыдущем шаге. Единственная переменная, специфичная для агента, — это TOOLBOX_URL ; добавьте её в файл .env агента:

echo -e "\nTOOLBOX_URL=http://127.0.0.1:5000" >> jobs_agent/.env

Обновите модуль агента.

Откройте jobs_agent/agent.py в редакторе Cloud Shell.

cloudshell edit jobs_agent/agent.py

и перезапишите содержимое следующим кодом:

# jobs_agent/agent.py
import os

from google.adk.agents import LlmAgent
from toolbox_adk import ToolboxToolset

TOOLBOX_URL = os.environ.get("TOOLBOX_URL", "http://127.0.0.1:5000")

toolbox = ToolboxToolset(TOOLBOX_URL)

root_agent = LlmAgent(
    name="jobs_agent",
    model="gemini-2.5-flash",
    instruction="""You are a helpful assistant at "TechJobs," a tech job listing platform.

Your job:
- Help developers browse job listings by role or tech stack.
- Provide full details about specific positions, including salary range and number of openings.
- Recommend jobs based on natural language descriptions of what the developer is looking for.
- Add new job listings to the platform when asked.

When a developer asks about a specific job by title or company, use the get-job-details tool.
When a developer asks for a specific role category or tech stack, use the search-jobs tool.
When a developer describes what kind of job they want — by interest area, work style,
career goals, or project type — use the search-jobs-by-description tool for semantic search.
When in doubt between search-jobs and search-jobs-by-description, prefer
search-jobs-by-description — it searches job descriptions and finds more relevant matches.

If a position has no openings (openings is 0), let the developer know
and suggest similar alternatives from the search results.

Be conversational, knowledgeable, and concise.""",
    tools=[toolbox],
)

Обратите внимание, что здесь нет кода, отвечающего за работу с базой данных — ToolboxToolset подключается к серверу Toolbox при запуске и загружает все доступные инструменты. Агент вызывает инструменты по имени; Toolbox преобразует эти вызовы в SQL-запросы к Cloud SQL.

По умолчанию переменная среды TOOLBOX_URL имеет значение http://127.0.0.1:5000 для локальной разработки. При последующем развертывании в Cloud Run вы переопределяете это значение URL-адресом Cloud Run службы Toolbox — никаких изменений в коде не требуется.

В настоящее время в инструкции упоминаются только два стандартных инструмента ( search-jobs и get-job-details ). Вы расширите ее на следующем шаге, добавив инструменты семантического поиска и обработки данных.

Проверьте агента

Запустите пользовательский интерфейс разработчика ADK:

cd ~/build-agent-adk-toolbox-cloudsql
uv run adk web

Откройте URL-адрес, отображаемый в терминале (обычно http://localhost:8000 ), используя функцию веб-предварительного просмотра Cloud Shell или щелкнув по URL-адресу в терминале с зажатой клавишей Ctrl . Выберите jobs_agent из выпадающего списка агентов в верхнем левом углу.

Тестирование стандартных запросов

Попробуйте выполнить следующие действия, чтобы проверить работу стандартных инструментов SQL:

What backend engineering jobs do you have?
Any jobs using Kubernetes?
Tell me about the Cloud Architect position

93ac33e7f73aa0b9.png240c53376042a916.png

Попробуйте использовать описания на естественном языке, которые не привязаны к конкретной роли или набору технологий:

I want a remote job where I can work on AI and machine learning
Find me something in fintech with good work-life balance
I'm interested in infrastructure and reliability engineering

Агент попытается выбрать подходящий инструмент в зависимости от типа запроса: для структурированных фильтров используется search-jobs , для описаний на естественном языке search-jobs-by-description .

b0ea629f5c9b4c26.png

Тестовое поглощение вектора

Попросите агента добавить новое задание:

Add a new job: 'Robotics Software Engineer' at Boston Dynamics, role Robotics, tech stack: Python, C++, ROS, Computer Vision, salary $160-230K/year, location Waltham MA, Hybrid, 2 openings. Description: Design and implement autonomous navigation and manipulation algorithms for next-generation robots. Work on perception pipelines using computer vision and lidar, develop motion planning software in C++ and Python, and test systems on real hardware in warehouse and logistics environments.

c601a7a9bc0a705b.png

Теперь попробуйте это найти:

Find me jobs involving autonomous systems and working with physical hardware

Встраивание было сгенерировано автоматически во время операции INSERT — отдельный шаг не потребовался.

5a3d8e6f523dc18b.png

Теперь у вас уже есть полностью работоспособное приложение Agentic RAG, использующее ADK, MCP Toolbox и CloudSQL. Поздравляем! Давайте перейдем к следующему шагу — развертыванию этих приложений в Cloud Run!

Теперь давайте остановим пользовательский интерфейс разработчика, завершив процесс, дважды нажав Ctrl+C, прежде чем продолжить.

8. Развертывание в облаке.

Агент и Toolbox работают локально. На этом этапе оба приложения развертываются как службы Cloud Run, поэтому они доступны через интернет. Служба Toolbox работает как сервер MCP в Cloud Run, а служба агента подключается к ней.

Подготовьте набор инструментов к развертыванию.

Создайте каталог развертывания для службы Toolbox:

cd ~/build-agent-adk-toolbox-cloudsql
mkdir -p deploy-toolbox
cp toolbox tools.yaml deploy-toolbox/

Создайте Dockerfile для Toolbox. Откройте deploy-toolbox/Dockerfile в редакторе Cloud Shell:

cloudshell edit deploy-toolbox/Dockerfile

И скопируйте в него следующий скрипт.

# deploy-toolbox/Dockerfile
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY toolbox tools.yaml ./
RUN chmod +x toolbox
EXPOSE 8080
CMD ["./toolbox", "--tools-file", "tools.yaml", "--address", "0.0.0.0", "--port", "8080"]

Двоичный файл Toolbox и tools.yaml упакованы в минимальный образ Debian. Cloud Run перенаправляет трафик на порт 8080.

Разверните службу Toolbox.

cd ~/build-agent-adk-toolbox-cloudsql
gcloud run deploy toolbox-service \
  --source deploy-toolbox/ \
  --region $REGION \
  --set-env-vars "DB_PASSWORD=$DB_PASSWORD,GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT,REGION=$REGION,GOOGLE_CLOUD_LOCATION=$GOOGLE_CLOUD_LOCATION,GOOGLE_GENAI_USE_VERTEXAI=true" \
  --allow-unauthenticated \
  --quiet

Эта команда отправляет исходный код в Cloud Build, создает образ контейнера, загружает его в Artifact Registry и развертывает в Cloud Run. Это займет несколько минут — давайте откроем новую вкладку терминала в Cloud Shell (нажмите значок «+»), чтобы сосредоточиться.

b01e3fbd89f17332.png

Снова перейдите в свою рабочую директорию и активируйте проект, используя предыдущий скрипт настройки.

cd ~/build-agent-adk-toolbox-cloudsql
bash setup_verify_trial_project.sh && source .env

Подготовьте агента к развертыванию.

Пока выполняется сборка Toolbox, настройте файлы развертывания агента.

Создайте Dockerfile в корневой директории проекта. Откройте Dockerfile в редакторе Cloud Shell:

cloudshell edit Dockerfile

Затем скопируйте следующее содержимое.

# Dockerfile
FROM ghcr.io/astral-sh/uv:python3.12-trixie-slim
WORKDIR /app
COPY pyproject.toml ./
COPY uv.lock ./
RUN uv sync --no-dev
COPY jobs_agent/ jobs_agent/
EXPOSE 8080
CMD ["uv", "run", "adk", "web", "--host", "0.0.0.0", "--port", "8080"]

В этом Dockerfile в качестве базового образа используется ghcr.io/astral-sh/uv , который включает в себя предустановленные Python и uv — нет необходимости устанавливать uv отдельно через pip .

Создайте файл .dockerignore , чтобы исключить ненужные файлы из образа контейнера:

cloudshell edit .dockerignore

Затем скопируйте в него следующий скрипт.

# .dockerignore
.venv/
__pycache__/
*.pyc
.env
jobs_agent/.env
toolbox
tools.yaml
seed.sql
deploy-toolbox/

Разверните службу агента.

Дождитесь завершения развертывания Toolbox. Получите его URL-адрес Cloud Run, используя следующую команду.

TOOLBOX_URL=$(gcloud run services describe toolbox-service \
  --region=$REGION \
  --format='value(status.url)')
echo "Toolbox URL: $TOOLBOX_URL"

Вы увидите примерно такой результат.

Toolbox URL: https://toolbox-service-xxxxxx-xx.a.run.app

Теперь давайте проверим, работает ли развернутый Toolbox:

curl -s "$TOOLBOX_URL/api/toolset" | python3 -m json.tool | head -5

Если результат соответствует приведенному примеру, значит, развертывание уже прошло успешно.

{
    "serverVersion": "0.27.0+binary.linux.amd64.c5524d3",
    "tools": {
        "add-job": {
            "description": "Add a new job listing to the platform. Use this tool when a user asks to post a job that is not currently listed.",

Далее развернем агента, передав URL-адрес Toolbox в качестве переменной среды:

cd ~/build-agent-adk-toolbox-cloudsql
gcloud run deploy jobs-agent \
  --source . \
  --region $REGION \
  --set-env-vars "TOOLBOX_URL=$TOOLBOX_URL,GOOGLE_CLOUD_PROJECT=$GOOGLE_CLOUD_PROJECT,GOOGLE_CLOUD_LOCATION=$GOOGLE_CLOUD_LOCATION,GOOGLE_GENAI_USE_VERTEXAI=TRUE" \
  --allow-unauthenticated \
  --quiet

Код агента считывает TOOLBOX_URL из среды (вы настроили это ранее). Локально он указывает на http://127.0.0.1:5000 ; в Cloud Run он указывает на URL-адрес службы Toolbox. Никаких изменений в коде не требуется.

Протестируйте развернутого агента.

Получите URL-адрес Cloud Run агента:

AGENT_URL=$(gcloud run services describe jobs-agent \
  --region=$REGION \
  --format='value(status.url)')
echo "Agent URL: $AGENT_URL"

Откройте URL-адрес в браузере. Загрузится пользовательский интерфейс разработчика ADK — тот же интерфейс, который вы использовали локально, теперь работающий в Cloud Run.

Выберите jobs_agent из выпадающего списка и проведите тест:

What backend engineering jobs do you have?
I want a remote job working on AI and machine learning

Оба запроса выполняются через развернутые сервисы: агент в Cloud Run вызывает Toolbox в Cloud Run, который, в свою очередь, запрашивает данные из Cloud SQL.

9. Поздравления / Уборка

Вы создали и развернули интеллектуальный помощник для поиска работы, который использует MCP Toolbox for Databases для связи агента ADK и Cloud SQL PostgreSQL — как со стандартными SQL-запросами, так и с семантическим векторным поиском.

Что вы узнали

  • Как MCP стандартизирует доступ к инструментам для агентов ИИ и как MCP Toolbox for Databases применяет это конкретно к операциям с базами данных — заменяя пользовательский код базы данных декларативной конфигурацией YAML.
  • Как настроить Cloud SQL PostgreSQL в качестве источника данных Toolbox, используя тип источника cloud-sql-postgres
  • Как определить стандартные инструменты для выполнения SQL-запросов с параметризованными операторами, предотвращающими SQL-инъекции.
  • Как включить векторный поиск с помощью pgvector и gemini-embedding-001 , используя параметр embeddedBy для автоматического встраивания запроса.
  • Как valueFromParam обеспечивает автоматическое загрузку векторов: LLM предоставляет текстовое описание, а Toolbox незаметно копирует, встраивает и сохраняет вектор вместе с текстом.
  • Как ToolboxToolset из ADK загружает инструменты с работающего сервера Toolbox, сводя к минимуму код агента и обеспечивая полную независимость логики от базы данных.
  • Как развернуть сервер Toolbox MCP и агент ADK в Cloud Run в качестве отдельных сервисов.

Уборка

Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, созданные в этом практическом задании, вы можете либо удалить отдельные ресурсы, либо удалить весь проект.

Самый простой способ навести порядок — удалить проект. Это удалит все ресурсы, связанные с проектом.

gcloud projects delete $GOOGLE_CLOUD_PROJECT

Вариант 2: Удаление отдельных ресурсов

Если вы хотите сохранить проект, но удалить только ресурсы, созданные в этом практическом задании:

gcloud run services delete jobs-agent --region=$REGION --quiet
gcloud run services delete toolbox-service --region=$REGION --quiet
gcloud sql instances delete jobs-instance --quiet
gcloud artifacts repositories delete cloud-run-source-deploy --location=$REGION --quiet 2>/dev/null