1. ภาพรวม
ในส่วนที่ 1 เราได้แปลงไฟล์ PDF ที่ไม่มีโครงสร้างและไม่เป็นระเบียบให้เป็นตารางที่มีโครงสร้าง สะอาด และอัจฉริยะใน BigQuery โดยใช้แคตตาล็อกความรู้และ DataScan ตอนนี้เรามีคลังข้อมูลที่แข็งแกร่งแล้ว ในส่วนที่ 2 เราได้ตั้งค่า AlloyDB เป็นแกนหลักของธุรกรรมและรวมตาราง BigQuery เข้าไว้ด้วยกัน ซึ่งเป็นการสร้างเลเยอร์ข้อมูลแบบรวมโดยไม่ต้องทำซ้ำแม้แต่ไบต์เดียว
วันนี้เราจะสร้างสมอง เรากำลังสร้างแอปพลิเคชันแบบหลาย Agent ซึ่งก็คือ "FroyoOS Store Manager" ที่อยู่เหนือเลเยอร์ข้อมูลนี้เพื่อตอบคำถาม ตรวจสอบสารก่อภูมิแพ้ และประมวลผลคำสั่งซื้อแบบเรียลไทม์
ความท้าทาย: แยก AI ออกจากเอเจนต์
เมื่อสร้าง AI Agent ที่ต้องพูดคุยกับฐานข้อมูล รูปแบบที่ไม่ควรใช้ที่พบบ่อยที่สุดคือการบังคับให้ข้อมูลและตรรกะ AI เข้าไปในแอปพลิเคชัน Python โดยตรง ซึ่งจะทำให้แอปของคุณเปราะบาง ไม่ปลอดภัย และดูแลรักษายากอย่างยิ่งเมื่อสถาปัตยกรรมข้อมูลเติบโตขึ้น
เราจึงใช้ Model Context Protocol (MCP) Toolbox เพื่อแก้ปัญหานี้ MCP Toolbox ทำหน้าที่เป็นเลเยอร์การแยกข้อมูลแบบรวมของเรา เรากำหนดการดำเนินการฐานข้อมูลอย่างชัดเจนในไฟล์ tools.yaml แบบง่าย เราติดตั้งใช้งานกล่องเครื่องมือนี้เป็นปลายทางแบบ Serverless ที่ปลอดภัยใน Google Cloud Run เอเจนต์ AI ของเราจะเชื่อมต่อกับปลายทางนี้และพูดว่า "เรียกใช้เครื่องมือ ‘place_order’"
พลังของ HTAP
ก่อนที่เราจะเริ่มสร้างเอเจนต์ มาพูดถึงเหตุผลที่ชื่อของโพสต์นี้ระบุ HTAP (การประมวลผลแบบผสมระหว่างธุรกรรมและการวิเคราะห์) โดยเฉพาะกันก่อน
ในสถาปัตยกรรมแบบเดิม หาก AI Agent จำเป็นต้องประมวลผลคำสั่งซื้อของผู้ใช้แบบเรียลไทม์ (ภาระงาน OLTP ที่เกี่ยวข้องกับการทำธุรกรรม) และตรวจสอบเพื่อเปรียบเทียบการจับคู่ส่วนผสมที่ซับซ้อนหลายพันรายการ (ภาระงาน OLAP เชิงวิเคราะห์) แอปพลิเคชัน Python จะต้องจัดการการเชื่อมต่อกับฐานข้อมูล 2 ฐานข้อมูลที่แตกต่างกันโดยสิ้นเชิง ซึ่งทำให้เกิดเวลาในการตอบสนองที่สูงมาก ค่าใช้จ่ายด้านความปลอดภัย และการจัดการสถานะที่ไม่เสถียร
เราเปลี่ยน AlloyDB ให้เป็น HTAP ที่ทรงพลังด้วยการรวมคลังข้อมูล BigQuery เข้ากับ PostgreSQL โดยตรง ด้วยสถาปัตยกรรม HTAP นี้ AI Agent ของเราในปัจจุบันจึงต้องสื่อสารกับปลายทางฐานข้อมูลเพียงรายการเดียวเท่านั้น โดยสามารถแทรกธุรกรรมที่ใช้งานจริงลงในตาราง live_orders และเรียกใช้การสแกนเชิงวิเคราะห์ที่ซับซ้อนกับชุดข้อมูล froyo_data ของ BigQuery ที่ผสานรวมได้ในเวลาเดียวกันโดยไม่ต้องทำซ้ำข้อมูลแม้แต่ไบต์เดียว มาดูกันว่าเราจะแสดงเครื่องมือนี้ต่อ AI ได้อย่างไร
มาเริ่มสร้างกันเลย

สิ่งที่คุณจะได้เรียนรู้
- วิธีตั้งค่าคลัสเตอร์ อินสแตนซ์ และเครือข่าย AlloyDB ได้ด้วยการคลิกปุ่ม
- วิธีตั้งค่าส่วนขยายเพื่อเตรียมพร้อมสำหรับการรวมระบบ
- วิธีตั้งค่าการรวมศูนย์จาก BigQuery ไปยัง AlloyDB
- ทดสอบ
ข้อกำหนด
2. ก่อนเริ่มต้น
สร้างโปรเจ็กต์
- ในคอนโซล Google Cloud ให้เลือกหรือสร้างโปรเจ็กต์ Google Cloud ในหน้าตัวเลือกโปรเจ็กต์
- ตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ที่อยู่ในระบบคลาวด์แล้ว ดูวิธีตรวจสอบว่าโปรเจ็กต์เปิดใช้การเรียกเก็บเงินหรือไม่
- คุณจะใช้ Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานใน Google Cloud คลิกเปิดใช้งาน Cloud Shell ที่ด้านบนของคอนโซล Google Cloud

- เมื่อเชื่อมต่อกับ Cloud Shell แล้ว ให้ตรวจสอบว่าคุณได้รับการตรวจสอบสิทธิ์แล้วและตั้งค่าโปรเจ็กต์เป็นรหัสโปรเจ็กต์โดยใช้คำสั่งต่อไปนี้
gcloud auth list
- เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคำสั่ง gcloud รู้จักโปรเจ็กต์ของคุณ
gcloud config list project
- หากต้องการตรวจสอบสิทธิ์
gcloud auth login
- หากไม่ได้ตั้งค่าโปรเจ็กต์ ให้ใช้คำสั่งต่อไปนี้เพื่อตั้งค่า
export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project <YOUR_PROJECT_ID>
- เปิดใช้ API ที่จำเป็น: เรียกใช้คำสั่งนี้เพื่อเปิดใช้ API ที่จำเป็นทั้งหมด
gcloud services enable \
alloydb.googleapis.com \
bigquery.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
iam.googleapis.com \
secretmanager.googleapis.com \
compute.googleapis.com \
servicenetworking.googleapis.com
ข้อควรระวังและการแก้ปัญหา
กลุ่มอาการ"โปรเจ็กต์ผี" | คุณเรียกใช้ |
แผงกั้น การเรียกเก็บเงิน | คุณเปิดใช้โปรเจ็กต์แล้ว แต่ลืมบัญชีสำหรับการเรียกเก็บเงิน AlloyDB เป็นเครื่องมือที่มีประสิทธิภาพสูง จึงจะไม่เริ่มทำงานหาก "ถังน้ำมัน" (การเรียกเก็บเงิน) ว่างเปล่า |
ความล่าช้าการเผยแพร่ API | คุณคลิก "เปิดใช้ API" แต่บรรทัดคำสั่งยังคงแสดง |
คำถามที่พบบ่อยเกี่ยวกับโควต้า | หากใช้บัญชีทดลองใช้ใหม่ คุณอาจพบโควต้าระดับภูมิภาคสำหรับอินสแตนซ์ AlloyDB หาก |
3. การเตรียมข้อมูล
ตรวจสอบว่า Structured Data ที่เราดึงมาจาก PDF ที่ไม่มีโครงสร้างพร้อมใช้งานใน BigQuery และได้สร้างและทดสอบการรวมข้อมูล BigQuery กับ AlloyDB แล้ว หากยังไม่ได้ทำตามขั้นตอนเหล่านั้น ตอนนี้เป็นเวลาที่เหมาะสมที่จะไปทำตามขั้นตอนง่ายๆ เหล่านั้นจากที่นี่และที่นี่ สำหรับส่วนที่ 1 และ 2 ตามลำดับ
หมายเหตุ
หากคุณกำลังลองใช้ Codelab นี้ คุณไม่ควรทำตามขั้นตอนการล้างข้อมูลของส่วนที่ 2 (ขั้นตอนการลบคลัสเตอร์และอินสแตนซ์) เนื่องจากเราต้องใช้การจัดการเป็นกลุ่ม AlloyDB สำหรับระบบที่เป็น Agent ที่แสดงที่นี่
นอกจากข้อมูลที่เราสร้างไว้แล้วในส่วนที่ 2 เรายังต้องสร้างตารางเพิ่มเติมอีก 1 ตารางในอินสแตนซ์ AlloyDB ไปที่ AlloyDB Studio โดยใช้ลิงก์ต่อไปนี้
https://console.cloud.google.com/alloydb/locations/us-central1/clusters/my-alloydb-cluster/studio
เปลี่ยนชื่อคลัสเตอร์ในลิงก์ด้านบนหากคุณใช้คลัสเตอร์อื่น
ใน AlloyDB Studio ให้เรียกใช้คำสั่งต่อไปนี้ในแท็บเครื่องมือแก้ไขคำสั่งใหม่
CREATE TABLE live_orders (
order_id SERIAL PRIMARY KEY,
customer_name VARCHAR(100),
product_id VARCHAR(100),
quantity INT,
order_status VARCHAR(50) DEFAULT 'Pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
ซึ่งควรสร้างตาราง live_orders ในฐานข้อมูล
4. การกำหนด Abstraction (The tools.yaml)
ก่อนอื่น เราจะจดทะเบียนการดำเนินการฐานข้อมูลอย่างเป็นทางการ เราสร้างไฟล์ tools.yaml ที่กำหนดวิธีที่ Agent โต้ตอบกับ AlloyDB ซึ่งมีทั้งข้อมูลธุรกรรมและข้อมูลวิเคราะห์ (ข้อมูลวิเคราะห์จากการรวม BigQuery)
- ไปที่เทอร์มินัล Cloud Shell สลับไปที่โหมดเอดิเตอร์
- สร้างโฟลเดอร์ใหม่ในไดเรกทอรีราก: "froyo-agent"
- สร้างไฟล์ tools.yaml ภายในโฟลเดอร์ แล้ววางเนื้อหาต่อไปนี้ (แทนที่ด้วยค่าของคุณเองสำหรับโปรเจ็กต์ คลัสเตอร์ อินสแตนซ์ และรหัสผ่าน)
# tools.yaml
sources:
alloydb-source:
kind: "alloydb-postgres"
project: "*******"
region: "us-central1"
cluster: "my-alloydb-cluster"
instance: "my-primary-inst"
database: "postgres"
user: "postgres"
password: "*******"
ipType: "private"
tools:
check_allergens:
kind: postgres-sql
source: alloydb-source
description: Queries the federated BigQuery tables to find allergens for a product.
statement: |
SELECT a.allergen_name
FROM consistsof c
INNER JOIN product p ON c.product_id = p.product_id
INNER JOIN ingredient i ON c.ingredient_id = i.ingredient_name
INNER JOIN containsallergen a ON i.ingredient_id = a.ingredient_id
WHERE UPPER(p.product_name) LIKE UPPER($1)
parameters:
- name: product_name
type: string
description: The name of the product to check. (e.g., '%Midnight%')
place_order:
kind: postgres-sql
source: alloydb-source
description: Inserts a new live transaction into the native AlloyDB orders table.
statement: |
INSERT INTO live_orders (customer_name, product_id, quantity)
VALUES ($1, (SELECT product_id FROM product WHERE product_name ILIKE '%' || $2 || '%' LIMIT 1), $3) RETURNING order_id;
parameters:
- name: customer_name
type: string
description: The name of the customer placing the order.
- name: product_name
type: string
description: The name of the product being ordered.
- name: quantity
type: integer
description: The quantity of the product being ordered.
toolsets:
alloydb_tools:
- check_allergens
- place_order
เราจำกัดความสามารถของตัวแทนไว้ที่ 2 เครื่องมือ ได้แก่ ตรวจสอบสารก่อภูมิแพ้และสั่งซื้อ
5. การติดตั้งใช้งานกล่องเครื่องมือใน Cloud Run
เราจึงทำให้แอปพลิเคชันของเราใช้เครื่องมือนี้ได้โดยการติดตั้งใช้งานอย่างปลอดภัยโดยใช้ gcloud CLI ซึ่งจะเป็นการสร้างปลายทางเลเยอร์แอบสแตรกชัน
- สลับไปที่เทอร์มินัล Cloud Shell แล้วไปที่ไดเรกทอรีการทำงานโดยเรียกใช้คำสั่งต่อไปนี้
cd froyo-agent
- บันทึก tools.yaml ใน Secret ชื่อ "tools-froyo" โดยทำดังนี้
gcloud secrets create tools-froyo --data-file=tools.yaml
- ติดตั้งใช้งานคอนเทนเนอร์ MCP Toolbox ใน Cloud Run
export IMAGE=us-central1-docker.pkg.dev/database-toolbox/toolbox/toolbox:latest
gcloud run deploy toolbox-froyo \
--image $IMAGE \
--service-account toolbox-identity \
--region us-central1 \
--set-secrets "/app/tools.yaml=tools-froyo:latest" \
--args="--config=/app/tools.yaml","--address=0.0.0.0","--port=8080" \
--network easy-alloydb-vpc \
--subnet easy-alloydb-subnet \
--allow-unauthenticated \
--vpc-egress private-ranges-only
คุณต้องแทนที่ค่า "เครือข่าย" และ "เครือข่ายย่อย" หากใช้ค่าที่แตกต่างจากที่เรากำหนดค่าไว้ใน Codelab ส่วนที่ 2
- จด URL ของ Cloud Run ที่ได้ (เช่น https://toolbox-froyo-xxx.run.app)
6. แบ็กเอนด์ที่เป็น Agent (app.py)
เมื่อไม่มีการดึงข้อมูลจากฐานข้อมูล โค้ด Python ของเราจึงมุ่งเน้นไปที่การจัดระเบียบและการให้เหตุผลได้อย่างเต็มที่
เราใช้ Agent Development Kit (ADK) ร่วมกับ Flask ADK มีหน่วยความจำเซสชันระดับองค์กร (InMemorySessionService) ซึ่งหมายความว่าเอเจนต์ของเราจะจดจำบริบทของการสนทนาได้ โดยจะผสานรวมกับ ToolboxSyncClient โดยตรงเพื่อดึงเครื่องมือจาก Cloud Run ได้อย่างราบรื่น
นี่คือ app.py
https://github.com/AbiramiSukumaran/froyo-data/blob/main/app.py
แอป Flask ของ Python อย่างง่ายจะเชื่อมต่อ Agent ของ ADK กับเครื่องมือที่เรากำหนดไว้ในกล่องเครื่องมือ ซึ่งจะโต้ตอบกับ AlloyDB (และข้อมูลที่รวมกันของ BigQuery ด้วย) และตอบกลับผู้ใช้
7. UI และการเรียกใช้แอป
เราได้สร้าง UI ที่สวยงามแบบ Glassmorphism (templates/index.html) ซึ่งมีแถบด้านข้างแคตตาล็อกสินค้าแบบเรียลไทม์และอินเทอร์เฟซแชทแบบอินเทอร์แอกทีฟ เพื่อมอบประสบการณ์การใช้งานที่เหมาะสมแก่ผู้จัดการร้านค้า
คุณดูไฟล์ index.html ในไฟล์ repo ได้ที่นี่
https://github.com/AbiramiSukumaran/froyo-data/blob/main/templates/index.html
ก่อนเรียกใช้แอปพลิเคชัน โปรดตรวจสอบว่าคุณได้ติดตั้งการอ้างอิงโดยการสร้างไฟล์ requirements.txt ที่มีเนื้อหาต่อไปนี้
Flask>=3.0.0
google-genai>=0.1.0
mcp>=1.0.0
google-adk
toolbox-core
toolbox-langchain
python-dotenv
และไฟล์ .env มีข้อมูลดังนี้
GOOGLE_API_KEY=***
MCP_TOOLBOX_SERVER_URL=***
จากเทอร์มินัล Cloud Shell ให้เรียกใช้คำสั่งต่อไปนี้ทีละคำสั่ง โดยตรวจสอบว่าคุณอยู่ในโฟลเดอร์โปรเจ็กต์
ติดตั้งการอ้างอิงด้วยคำสั่งต่อไปนี้
pip install -r requirements.txt
การเรียกใช้ไฟล์ Python
python app.py
คลิกลิงก์ที่ปรากฏในเทอร์มินัลหรือเปิด http://localhost:8080

8. การทดสอบขั้นสุดยอด
มาคลิกผลิตภัณฑ์จากแคตตาล็อกเพื่อถามตัวแทนกัน
Does Midnight Swirl have any allergens?
คุณควรเห็นคำตอบต่อไปนี้

เบื้องหลัง:
- Agent ADK จะได้รับพรอมต์และตัดสินใจใช้เครื่องมือ check_allergens
- โดยจะเรียกใช้ MCP Toolbox ใน Cloud Run อย่างปลอดภัย
- กล่องเครื่องมือจะเรียกใช้การค้นหาใน AlloyDB ซึ่งจะรวมเข้ากับ BigQuery ทันทีเพื่อสแกนความสัมพันธ์ที่ซับซ้อนที่เราสร้างขึ้นในส่วนที่ 1
- ฐานข้อมูลจะแสดงผล "ถั่วเหลือง" ซึ่ง Agent จะสรุปอย่างเรียบร้อยใน UI
จากนั้นเราจะพูดว่า
Order 2 Midnight Swirls for Alice.

Agent จะส่งสตริง "Midnight Swirl" ไปยังกล่องเครื่องมือ SQL พื้นฐานจะแปลงสตริงเป็นรหัสจำนวนเต็มแบบไดนามิกผ่าน BigQuery, แทรกคำสั่งซื้อที่ใช้งานจริงลงใน AlloyDB และยืนยันธุรกรรม
ที่เก็บโค้ด
9. ล้างข้อมูล
เมื่อแล็บนี้เสร็จสิ้นแล้ว อย่าลืมลบคลัสเตอร์และอินสแตนซ์ AlloyDB
ซึ่งควรล้างข้อมูลคลัสเตอร์พร้อมกับอินสแตนซ์
10. ขอแสดงความยินดีที่คุณมีตัวแทน
ลองนึกถึงสิ่งที่เราเพิ่งทำสำเร็จ
ระบบแบบเป็น Agent ที่เราออกแบบมาอย่างดีจะโต้ตอบกับ MCP Toolbox สำหรับฐานข้อมูลเท่านั้น ซึ่งเบื้องหลังนี้จะจัดการการเรียกใช้เครื่องมือและข้อมูลไปยังตรรกะ AI ของแอปพลิเคชันของเรา เพื่อให้ขั้นตอนการทำงานเป็นไปอย่างง่ายดาย
- แอปธุรกรรมของเรา (ที่ทำงานใน AlloyDB) สามารถจัดการเซสชันของผู้ใช้ที่เกิดขึ้นพร้อมกันได้อย่างรวดเร็ว
- เมื่อต้องการข้อมูลวิเคราะห์จำนวนมากหรือบริบทในอดีต (เช่น รายละเอียดซัพพลายเออร์หรือการแมปส่วนผสมที่ซับซ้อน) ระบบจะค้นหาสคีมาข้อมูล froyo_dataschema ของ BigQuery
- Zero ETL ไม่มีการหยุดทำงานของไปป์ไลน์ข้อมูล ไม่มีฐานข้อมูลที่ไม่ได้ซิงค์ เราจัดเก็บเพียงครั้งเดียว (ใน BQ) และประมวลผลในที่ที่เราต้องการ
ตอนนี้เรามีรากฐานของเอเจนต์และข้อมูลทั้งเชิงวิเคราะห์และเชิงธุรกรรมแล้ว มาดูส่วนถัดไปกัน
ขั้นตอนถัดไป
Agent ของเราทำงานได้อย่างสมบูรณ์แบบ... ในเส้นทางที่ราบรื่น ในส่วนที่ 4 เราจะสร้างไปป์ไลน์การประเมิน Agent เพื่อทดสอบความถูกต้อง การเชื่อมต่อแหล่งข้อมูล และประสิทธิภาพของระบบ Agentic AI อย่างเข้มงวด แล้วเจอกัน!