پایگاه داده به عنوان یک ابزار: Agentic RAG با ADK، جعبه ابزار MCP و Cloud SQL

۱. مقدمه

عامل‌های هوش مصنوعی فقط به اندازه داده‌هایی که می‌توانند به آنها دسترسی داشته باشند، مفید هستند. بیشتر داده‌های دنیای واقعی در پایگاه‌های داده قرار دارند - و اتصال عامل‌ها به پایگاه‌های داده معمولاً به معنای نوشتن مدیریت اتصال، منطق پرس‌وجو و تعبیه خطوط لوله در داخل کد عامل شماست. هر عاملی که به دسترسی به پایگاه داده نیاز دارد، این کار را تکرار می‌کند و هر تغییر پرس‌وجو نیاز به استقرار مجدد عامل دارد.

این آزمایشگاه کد رویکرد متفاوتی را نشان می‌دهد. شما ابزارهای پایگاه داده خود را در یک فایل YAML تعریف می‌کنید - کوئری‌های استاندارد SQL، جستجوی شباهت برداری، حتی تولید خودکار جاسازی - و MCP Toolbox for Databases تمام عملیات پایگاه داده را به عنوان یک سرور MCP مدیریت می‌کند. کد عامل شما مینیمال باقی می‌ماند: ابزارها را بارگذاری کنید، بگذارید Gemini تصمیم بگیرد کدام یک را فراخوانی کند.

آنچه خواهید ساخت

یک دستیار هوشمند برای تابلوی مشاغل برای "TechJobs" - یک عامل ADK که توسط Gemini پشتیبانی می‌شود و به توسعه‌دهندگان کمک می‌کند تا با استفاده از فیلترهای استاندارد (نقش، پشته فناوری) فهرست مشاغل فنی را مرور کنند و از طریق توضیحات زبان طبیعی مانند "من یک کار از راه دور با کار بر روی ربات‌های چت هوش مصنوعی می‌خواهم" مشاغل را کشف کنند. این عامل از طریق MCP Toolbox for Databases، که تمام دسترسی به پایگاه داده - از جمله تولید خودکار جاسازی برای جستجوی برداری - را مدیریت می‌کند، از یک پایگاه داده Cloud SQL PostgreSQL می‌خواند و در آن می‌نویسد. در نهایت، هم Toolbox و هم عامل بر روی Cloud Run اجرا می‌شوند.

eb6de681c40990c1.jpeg

آنچه یاد خواهید گرفت

  • چگونه MCP (پروتکل زمینه مدل) دسترسی به ابزار را برای عوامل هوش مصنوعی استاندارد می‌کند، و چگونه MCP Toolbox for Databases این را در عملیات پایگاه داده اعمال می‌کند
  • جعبه ابزار MCP برای پایگاه‌های داده را به عنوان میان‌افزار بین یک عامل ADK و Cloud SQL PostgreSQL تنظیم کنید.
  • ابزارهای پایگاه داده را به صورت اعلانی در tools.yaml تعریف کنید - هیچ کد پایگاه داده‌ای در عامل شما وجود ندارد
  • با استفاده از ToolboxToolset یک عامل ADK بسازید که ابزارها را از یک سرور Toolbox در حال اجرا بارگیری کند.
  • با استفاده از embedding() داخلی Cloud SQL، جاسازی‌های برداری ایجاد کنید و جستجوی معنایی را با pgvector فعال کنید.
  • از ویژگی valueFromParam برای دریافت خودکار بردار در عملیات نوشتن استفاده کنید
  • سرور Toolbox و ADK agent را روی Cloud Run مستقر کنید.

پیش‌نیازها

  • یک حساب Google Cloud با یک حساب پرداخت آزمایشی
  • آشنایی اولیه با پایتون و SQL
  • هیچ تجربه قبلی با ADK، MCP Toolbox یا pgvector لازم نیست

۲. محیط خود را آماده کنید

این مرحله محیط Cloud Shell شما را آماده می‌کند، پروژه Google Cloud شما را پیکربندی می‌کند و مخزن مرجع را کلون می‌کند.

پوسته ابری را باز کنید

Cloud Shell را در مرورگر خود باز کنید. Cloud Shell یک محیط از پیش پیکربندی شده با تمام ابزارهای مورد نیاز برای این آزمایشگاه کد را فراهم می‌کند. در صورت درخواست، روی تأیید (Authorize) کلیک کنید.

سپس روی « مشاهده » -> « ترمینال » کلیک کنید تا ترمینال باز شود. رابط کاربری شما باید شبیه به این باشد.

۸۶۳۰۷fac5da2f077.png

این رابط اصلی ما خواهد بود، IDE در بالا، ترمینال در پایین

دایرکتوری کاری خود را تنظیم کنید

دایرکتوری کاری خود را ایجاد کنید. تمام کدهایی که در این آزمایشگاه کد می‌نویسید، در اینجا قرار دارند:

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

پروژه گوگل کلود خود را راه‌اندازی کنید

فایل .env را با متغیرهای مکان ایجاد کنید:

# 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
  • رابط برنامه‌نویسی کاربردی هوش مصنوعی ورتکس ( aiplatform.googleapis.com ) — عامل شما از مدل‌های Gemini استفاده می‌کند و تول‌باکس از رابط برنامه‌نویسی کاربردی جاسازی برای جستجوی برداری استفاده می‌کند.
  • رابط برنامه‌نویسی کاربردی مدیریت SQL ابری ( sqladmin.googleapis.com ) - شما یک نمونه PostgreSQL را تهیه و مدیریت می‌کنید.
  • رابط برنامه‌نویسی کاربردی موتور محاسبات (compute Engine API ) ( compute.googleapis.com ) — برای ایجاد نمونه‌های Cloud SQL مورد نیاز است.
  • Cloud Run، Cloud Build، Artifact Registry - که در مرحله استقرار بعداً در این آزمایشگاه کد استفاده می‌شود

۳. ایجاد نمونه پایگاه داده

این مرحله، ایجاد نمونه 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 GB RAM) در نسخه 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 را دانلود کنیم. می‌توانید این کار را در همان ترمینال انجام دهید.

دانلود فایل باینری جعبه ابزار

ما در این آموزش از MCP Toolbox استفاده خواهیم کرد، خوشبختانه این ابزار با یک فایل باینری از پیش ساخته شده ارائه می‌شود که آماده استفاده در محیط لینوکس است. بیایید آن را در پس‌زمینه دانلود کنیم زیرا مدتی طول می‌کشد.

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

این مرحله پروژه پایتون را راه‌اندازی می‌کند، وابستگی‌ها را نصب می‌کند و دایرکتوری عامل ADK را چارچوب‌بندی می‌کند.

۴. پروژه عامل را مقداردهی اولیه کنید

پروژه پایتون را تنظیم کنید

uv یک پکیج سریع پایتون و مدیر پروژه است که با Rust نوشته شده است ( مستندات uv ). این codelab از آن برای سرعت و سادگی استفاده می‌کند.

یک پروژه پایتون را راه‌اندازی کنید و وابستگی‌های مورد نیاز را اضافه کنید:

uv init
uv add google-adk==1.25.0 toolbox-adk==0.6.0
  • google-adk — کیت توسعه عامل گوگل، شامل Gemini SDK
  • toolbox-adk — یکپارچه‌سازی ADK برای جعبه ابزار MCP برای پایگاه‌های داده.

ساختار دایرکتوری عامل را ایجاد کنید

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/

۵. پایگاه داده فهرست مشاغل را راه‌اندازی کنید

این مرحله داده‌های اولیه را می‌نویسد، منتظر می‌ماند تا نمونه Cloud SQL آماده‌سازی را تمام کند و جدول jobs را با ۱۵ لیست شغل و توضیحات جاسازی‌شده آنها بارگذاری می‌کند.

SQL اولیه را بنویسید

ما فایلی به نام seed.sql در ویرایشگر Cloud Shell با محتوای فهرست مشاغل ایجاد خواهیم کرد. این کار جدول 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.');

اسکریپت seed دو افزونه PostgreSQL را نصب می‌کند:

  • google_ml_integration — تابع embedding() SQL را فراهم می‌کند که مدل‌های تعبیه هوش مصنوعی Vertex را مستقیماً از 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

سپس، اسکریپت seed را اجرا کنید

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;"

شما باید ۱۵ لیست شغلی را در چندین نقش مشاهده کنید:

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

ایجاد جاسازی برای شرح شغل‌ها

ستون description_embedding در جدول jobs در حال حاضر NULL است. افزونه google_ml_integration داخلی Cloud SQL یک تابع embedding() ارائه می‌دهد که Vertex AI را مستقیماً از SQL فراخوانی می‌کند - بدون نیاز به اسکریپت پایتون یا 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) — مدل embedding Gemini مربوط به Vertex AI را مستقیماً از SQL فراخوانی می‌کند و متن description هر کار را ارسال می‌کند. این افزونه google_ml_integration است که شما در اسکریپت seed نصب کرده‌اید.
  • ::vector — آرایه اعشاری برگشتی را به نوع vector pgvector تبدیل می‌کند تا بتوان آن را ذخیره و با عملگرهای فاصله پرس‌وجو کرد.
  • UPDATE در هر ۱۵ ردیف اجرا می‌شود و به ازای هر شرح شغل، یک جاسازی ۳۰۷۲ بعدی ایجاد می‌کند.
  • & دستور را در پس‌زمینه اجرا می‌کند تا بتوانید در حالی که Vertex AI در حال پردازش جاسازی‌ها است، به کار خود ادامه دهید.

مانند اجرای قبلی فرآیند در پس‌زمینه، ترمینال فعلی گزارش فرآیند را نمایش می‌دهد. بیایید یک تب ترمینال جدید در Cloud Shell باز کنیم (روی آیکون + کلیک کنیم) تا بتوانیم بیشتر تمرکز کنیم.

b01e3fbd89f17332.png

دوباره به دایرکتوری کاری خود بروید و پروژه را با استفاده از اسکریپت راه‌اندازی قبلی فعال کنید.

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

سپس، می‌توانیم به فرآیند بعدی ادامه دهیم

۶. پیکربندی جعبه ابزار MCP برای پایگاه‌های داده

این مرحله جعبه ابزار MCP برای پایگاه‌های داده را معرفی می‌کند، آن را برای اتصال به نمونه Cloud SQL شما پیکربندی می‌کند و دو ابزار استاندارد پرس‌وجوی SQL را تعریف می‌کند.

MCP چیست و چرا از جعبه ابزار استفاده کنیم؟

e7b9be2e1c98b4db.png

MCP (پروتکل زمینه مدل) یک پروتکل باز است که نحوه کشف و تعامل عامل‌های هوش مصنوعی با ابزارهای خارجی را استاندارد می‌کند. این پروتکل یک مدل کلاینت-سرور را تعریف می‌کند: عامل میزبان یک کلاینت MCP است و ابزارها توسط سرورهای MCP در معرض دید قرار می‌گیرند. هر کلاینت سازگار با MCP می‌تواند از هر سرور سازگار با MCP استفاده کند - عامل برای هر ابزار به کد یکپارچه‌سازی سفارشی نیاز ندارد.

d5baa77423f0f465.png

جعبه ابزار MCP برای پایگاه‌های داده، یک سرور MCP متن‌باز است که به‌طور خاص برای دسترسی به پایگاه داده ساخته شده است. بدون آن، شما باید توابع پایتونی بنویسید که اتصالات پایگاه داده را باز می‌کنند، مجموعه‌های اتصال را مدیریت می‌کنند، کوئری‌های پارامتری برای جلوگیری از تزریق 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 که backend را مشخص می‌کند ( 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}

---

این اسکریپت منبع زیر را تعریف می‌کند:

  • منبع ( jobs-db ) — به جعبه ابزار می‌گوید که چگونه به نمونه 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)."

---

این اسکریپت منبع زیر را تعریف می‌کند:

  • ابزارهای ۱ و ۲ ( search-jobs ، get-job-details ) — ابزارهای استاندارد پرس‌وجوی SQL. هر کدام نام یک ابزار (آنچه عامل می‌بیند) را به یک عبارت SQL پارامتری (آنچه پایگاه داده اجرا می‌کند) نگاشت می‌کنند. پارامترها از متغیرهای موقعیتی $1 و $2 استفاده می‌کنند. جعبه ابزار این‌ها را به عنوان عبارات آماده اجرا می‌کند که از تزریق SQL جلوگیری می‌کند.

بیایید ادامه دهیم، اسکریپت زیر را زیر نماد --- در فایل tools.yaml اضافه کنید.

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

---

این اسکریپت منبع زیر را تعریف می‌کند:

  • مدل جاسازی ( gemini-embedding ) — Toolbox را طوری پیکربندی می‌کند که مدل gemini-embedding-001 مربوط به Gemini را برای تولید جاسازی‌های متنی 3072 بعدی فراخوانی کند. Toolbox از Application Default Credentials (ADC) برای احراز هویت استفاده می‌کند — هیچ کلید API در Cloud Shell یا Cloud Run مورد نیاز نیست. توجه داشته باشید که این dimension پیکربندی شده در اینجا باید با بُعدی که قبلاً برای seed کردن پایگاه داده پیکربندی کرده‌ایم، یکسان باشد.

بیایید ادامه دهیم، اسکریپت زیر را زیر نماد --- در فایل 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

---

این اسکریپت منبع زیر را تعریف می‌کند:

  • ابزار ۳ ( 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

این اسکریپت منبع زیر را تعریف می‌کند:

  • ابزار ۴ ( add-job ) — دریافت بردار را نشان می‌دهد. پارامتر description_vector دو فیلد ویژه دارد:
  • valueFromParam: description — جعبه ابزار مقدار پارامتر description را در این پارامتر کپی می‌کند. LLM هرگز این پارامتر را نمی‌بیند.
  • embeddedBy: gemini-embedding — جعبه ابزار، متن کپی شده را قبل از ارسال به SQL، در یک بردار جاسازی می‌کند.

نتیجه: یک فراخوانی ابزار، هم متن توصیف خام و هم جاسازی برداری آن را ذخیره می‌کند، بدون اینکه عامل چیزی در مورد جاسازی‌ها بداند.

قالب YAML چند سندی، هر منبع را با --- از هم جدا می‌کند. هر سند دارای فیلدهای kind ، name و type است که ماهیت آن را تعریف می‌کنند. به طور خلاصه، ما قبلاً همه موارد زیر را پیکربندی کرده‌ایم:

  • تعریف پایگاه داده منبع
  • تعریف ابزارها ( ابزار ۱ و ۲ ) برای پرس و جو از پایگاه داده با فیلتر استاندارد
  • تعریف مدل جاسازی
  • تعریف ابزاری برای جستجوی برداری ( ابزار ۳ ) در پایگاه داده
  • تعریف ابزاری برای انجام دریافت داده‌های برداری ( ابزار ۴) به پایگاه داده

جاسازی‌ها را تأیید کنید

قبل از شروع 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 به Gemini SDK می‌گوید که از طریق 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 جعبه ابزار کوئری بگیرید:

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

۷. عامل ADK را بسازید

این مرحله، عامل ADK را به سرور Toolbox در حال اجرا متصل می‌کند و هر چهار ابزار - پرس‌وجوهای استاندارد، جستجوی معنایی و دریافت بردار - را آزمایش می‌کند. کد عامل حداقل است: تمام منطق پایگاه داده در tools.yaml قرار دارد.

پیکربندی محیط عامل

ADK GOOGLE_GENAI_USE_VERTEXAI ، GOOGLE_CLOUD_PROJECT و GOOGLE_CLOUD_LOCATION را از محیط shell می‌خواند، که شما در مرحله قبل تنظیم کرده‌اید. تنها متغیر مختص agent، TOOLBOX_URL است - آن را به فایل .env مربوط به agent اضافه کنید:

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 مستقر می‌شوید، این را با Cloud Run URL سرویس Toolbox جایگزین می‌کنید - نیازی به تغییر کد نیست.

این دستورالعمل در حال حاضر فقط به دو ابزار استاندارد ( search-jobs و get-job-details ) اشاره می‌کند. در مرحله بعدی، زمانی که ابزارهای جستجوی معنایی و جذب داده را اضافه می‌کنید، آن را گسترش خواهید داد.

عامل را آزمایش کنید

رابط کاربری ADK dev را شروع کنید:

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

آدرس اینترنتی (URL) نمایش داده شده در ترمینال (معمولاً http://localhost:8000 ) را با استفاده از ویژگی پیش‌نمایش وب Cloud Shell یا با نگه داشتن کلید ctrl + کلیک روی آدرس اینترنتی نمایش داده شده در ترمینال باز کنید. از منوی کشویی agent در گوشه بالا سمت چپ، 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 قبل از ادامه، متوقف کنیم.

۸. استقرار در Cloud Run

عامل و جعبه ابزار به صورت محلی کار می‌کنند. این مرحله هر دو را به عنوان سرویس‌های Cloud Run مستقر می‌کند تا از طریق اینترنت قابل دسترسی باشند. سرویس جعبه ابزار به عنوان یک سرور MCP در Cloud Run اجرا می‌شود و سرویس عامل به آن متصل می‌شود.

جعبه ابزار را برای استقرار آماده کنید

یک دایرکتوری استقرار برای سرویس Toolbox ایجاد کنید:

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

فایل Dockerfile را برای جعبه ابزار ایجاد کنید. 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 در یک تصویر مینیمال دبیان بسته‌بندی شده‌اند. Cloud Run ترافیک را به پورت ۸۰۸۰ هدایت می‌کند.

سرویس جعبه ابزار را مستقر کنید

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

این داکرفایل از ghcr.io/astral-sh/uv به عنوان ایمیج پایه استفاده می‌کند که شامل پایتون و uv از پیش نصب شده است - نیازی به نصب جداگانه uv از طریق pip نیست.

یک فایل .dockerignore ایجاد کنید تا فایل‌های غیرضروری از تصویر کانتینر حذف شوند:

cloudshell edit .dockerignore

سپس اسکریپت زیر را در آن کپی کنید

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

سرویس عامل را مستقر کنید

صبر کنید تا نصب Toolbox کامل شود. با استفاده از دستور زیر، آدرس 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

سپس، بیایید بررسی کنیم که جعبه ابزار مستقر شده کار می‌کند:

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 جعبه ابزار را به عنوان یک متغیر محیطی ارسال کنیم:

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 اشاره می‌کند. نیازی به تغییر کد نیست.

عامل مستقر شده را آزمایش کنید

آدرس اینترنتی Cloud Run مربوط به عامل را بازیابی کنید:

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

URL را در مرورگر خود باز کنید. رابط کاربری ADK dev بارگذاری می‌شود - همان رابط کاربری که به صورت محلی استفاده می‌کردید، اکنون روی 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 را پرس‌وجو می‌کند.

۹. تبریک / تمیزکاری

شما یک دستیار هوشمند برای تابلوی اعلانات شغلی ساخته و مستقر کرده‌اید که از 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 از سرور Toolbox در ADK، به حداقل رساندن کد عامل و جداسازی کامل منطق پایگاه داده
  • نحوه استقرار سرور Toolbox MCP و عامل ADK در Cloud Run به عنوان سرویس‌های جداگانه

تمیز کردن

برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع ایجاد شده در این codelab، می‌توانید منابع را به صورت جداگانه یا کل پروژه را حذف کنید.

ساده‌ترین راه برای پاکسازی، حذف پروژه است. این کار تمام منابع مرتبط با پروژه را حذف می‌کند.

gcloud projects delete $GOOGLE_CLOUD_PROJECT

گزینه ۲: حذف منابع تکی

اگر می‌خواهید پروژه را نگه دارید اما فقط منابع ایجاد شده در این codelab را حذف کنید:

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