สร้างซัพพลายเชนอัตโนมัติด้วย Gemini 3 Flash และ AlloyDB AI

1. ภาพรวม

ยุคของ "แชทบอทที่อ่านได้" กำลังจะสิ้นสุดลง เรากำลังก้าวเข้าสู่ยุคของAgentic Vision

ใน Codelab นี้ เราจะใช้วิศวกรรม AI เชิงกำหนด ซึ่งเป็นแนวทางปฏิบัติในการสร้างระบบ AI ที่ไม่คาดเดา โมเดล AI มาตรฐานมักจะ "เกิดอาการหลอนของ AI" (คาดเดา) เมื่อได้รับคำสั่งให้นับรายการในรูปภาพที่ซับซ้อน ในซัพพลายเชน การคาดเดาเป็นสิ่งที่อันตราย หาก AI คาดเดาว่าคุณมีสินค้า 12 รายการ แต่จริงๆ แล้วคุณมี 15 รายการ ก็จะทำให้เกิดข้อผิดพลาดที่ทำให้เสียค่าใช้จ่าย

เราจะสร้างเอเจนต์ซัพพลายเชนอัตโนมัติโดยใช้ลูปคิด ดำเนินการ สังเกตใหม่ใน Gemini 3 Flash ไม่เพียงแค่ดู แต่ยังตรวจสอบด้วย

สถาปัตยกรรมที่กำหนดได้

เราจะเริ่มต้นด้วยระบบที่ "ตาบอด" และ "ความจำเสื่อม" คุณจะต้อง "ปลุก" ประสาทสัมผัสของอุปกรณ์ทีละอย่างด้วยตนเอง

17191a91a9c54146.png

  1. The Eyes (Vision Agent): เราเปิดใช้ Gemini 3 Flash ด้วยการดำเนินการโค้ด โมเดลจะเขียนโค้ด Python (OpenCV) เพื่อนับพิกเซลอย่างแน่นอนแทนที่จะคาดเดาโทเค็นเพื่อเดาตัวเลข
  2. หน่วยความจำ (ตัวแทนซัพพลายเออร์): เราเปิดใช้ AlloyDB AI ด้วย ScaNN (Scalable Nearest Neighbors) ซึ่งจะช่วยให้ตัวแทนเรียกซัพพลายเออร์ที่แน่นอนสำหรับชิ้นส่วนจากตัวเลือกนับล้านได้ในเวลาไม่กี่มิลลิวินาที
  3. แฮนด์เชค (โปรโตคอล A2A): เราเปิดใช้การสื่อสารจาก Agent ไปยัง Agent โดยใช้ agent_card.json ที่ได้มาตรฐาน ซึ่งช่วยให้ Vision Agent สามารถสั่งซื้อสต็อกจาก Supplier Agent ได้โดยอัตโนมัติ

สิ่งที่คุณจะสร้าง

  • Vision Agent ที่ทำการ "คำนวณภาพ" ในฟีดกล้อง
  • เอเจนต์ซัพพลายเออร์ที่ขับเคลื่อนโดย AlloyDB ScaNN สำหรับการค้นหาเวกเตอร์ความเร็วสูง
  • ส่วนหน้าของ Control Tower ที่มีการอัปเดต WebSocket แบบเรียลไทม์เพื่อแสดงภาพลูปอัตโนมัติ

สิ่งที่คุณจะได้เรียนรู้

  • วิธีตั้งค่า AlloyDB ด้วยการฝังเวกเตอร์และดัชนี ScaNN
  • วิธีเปิดใช้ Agentic Vision ด้วย gemini-3-flash-preview โดยใช้ Gemini API
  • วิธีติดตั้งใช้งานการค้นหาเวกเตอร์โดยใช้โอเปอเรเตอร์ <=> (ระยะทางโคไซน์) ใน AlloyDB
  • วิธีเชื่อมต่อเอเจนต์กับ AlloyDB โดยใช้ AlloyDB Python Connector
  • วิธีใช้โปรโตคอล A2A เพื่อการค้นหา Agent แบบไดนามิก

ข้อกำหนด

  • เบราว์เซอร์ เช่น Chrome หรือ Firefox
  • โปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงิน
  • คีย์ Gemini API (ระดับฟรีพร้อมให้บริการที่ Google AI Studio) สำหรับ Vision Agent

2. ก่อนเริ่มต้น

สร้างโปรเจ็กต์

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

รูปภาพปุ่มเปิดใช้งาน Cloud Shell

  1. เมื่อเชื่อมต่อกับ Cloud Shell แล้ว ให้ตรวจสอบว่าคุณได้รับการตรวจสอบสิทธิ์แล้วและตั้งค่าโปรเจ็กต์เป็นรหัสโปรเจ็กต์โดยใช้คำสั่งต่อไปนี้
gcloud auth list

ตั้งค่าฐานข้อมูล [AlloyDB]

ก่อนอื่น เรามาจัดสรรฐานข้อมูลกันก่อน ซึ่งขั้นตอนนี้จะใช้เวลาประมาณ 15 นาที ดังนั้นเราจะเริ่มขั้นตอนนี้ก่อน

  1. คลิกปุ่มด้านล่างเพื่อเปิดเครื่องมือตั้งค่า AlloyDB ใน Cloud Shell

  1. เรียกใช้การตั้งค่าโดยทำดังนี้
Sh run.sh
  1. ใช้ตัวอย่างเว็บ (ไอคอนดวงตา 👁️ → แสดงตัวอย่างบนพอร์ต 8080) เพื่อเปิด UI การตั้งค่า
  2. ป้อนรหัสโปรเจ็กต์ เลือกภูมิภาค (เช่น us-central1) และสร้างรหัสผ่านฐานข้อมูล

⚠️ บันทึกรหัสผ่านนี้ไว้ คุณจะต้องใช้รหัสผ่านนี้เมื่อสคริปต์การตั้งค่าขอ

  1. คลิกเริ่มการติดตั้งใช้งาน แล้วรอประมาณ 15 นาทีเพื่อให้คลัสเตอร์ได้รับการจัดสรร

รับโค้ด

ขณะที่ AlloyDB จัดสรร (หรือเมื่อจัดสรรเสร็จแล้ว) ให้เปิดที่เก็บ Codelab ใน Cloud Shell โดยทำดังนี้

⚠️ สำคัญ: เมื่อคลิกปุ่ม คุณจะเห็นกล่องโต้ตอบความปลอดภัย เลือกช่อง "เชื่อถือที่เก็บ" แล้วคลิก "ยืนยัน"

หรือจะโคลนด้วยตนเองก็ได้

git clone https://github.com/MohitBhimrajka/visual-commerce-gemini-3-alloydb.git

cd visual-commerce-gemini-3-alloydb

ตั้งค่าโปรเจ็กต์

ในเทอร์มินัล Cloud Shell นี้ ให้ยืนยันว่าได้ตั้งค่าโปรเจ็กต์แล้ว

gcloud config set project <YOUR_PROJECT_ID>

เปิดใช้ IP สาธารณะใน AlloyDB

เมื่อการจัดสรร AlloyDB เสร็จสมบูรณ์แล้ว ให้เปิดใช้ IP สาธารณะเพื่อให้ตัวเชื่อมต่อ Python เชื่อมต่อจาก Cloud Shell ได้

  1. ไปที่ AlloyDB Console
  2. คลิกคลัสเตอร์ → คลิกอินสแตนซ์หลัก
  3. คลิก "แก้ไข"
  4. เลื่อนไปที่การเชื่อมต่อ IP สาธารณะ แล้วเลือก "เปิดใช้ IP สาธารณะ"
  5. คลิกอัปเดตอินสแตนซ์

💡 หมายเหตุ: AlloyDB Python Connector จะจัดการการตรวจสอบสิทธิ์และการเข้ารหัส คุณจึงไม่จำเป็นต้องเพิ่มเครือข่ายภายนอกที่ได้รับอนุญาต

ให้สิทธิ์ Vertex AI

บัญชีบริการ AlloyDB ต้องมีสิทธิ์เข้าถึง Vertex AI เพื่อสร้างการฝัง เรียกใช้คำสั่งนี้ในหน้าต่าง Cloud Shell เดียวกัน

PROJECT_ID=$(gcloud config get-value project)


gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"

เรียกใช้สคริปต์การตั้งค่า

ตอนนี้ให้เรียกใช้สคริปต์การตั้งค่า ซึ่งจะตรวจหาอินสแตนซ์ AlloyDB โดยอัตโนมัติ

sh setup.sh

สิ่งที่สคริปต์ทำ

  • ตรวจสอบความถูกต้องของ gcloud CLI, การตรวจสอบสิทธิ์, โปรเจ็กต์ และ Python 3
  • ตรวจสอบและเปิดใช้ API ที่จำเป็น (AlloyDB, Vertex AI, Compute, Service Networking)
  • พรอมต์สำหรับคีย์ Gemini API
  • ตรวจหาอินสแตนซ์ AlloyDB โดยอัตโนมัติ และดึงชื่อภูมิภาค คลัสเตอร์ และอินสแตนซ์
  • ขอรหัสผ่านฐานข้อมูล
  • สร้างไฟล์การกำหนดค่า .env
  • ติดตั้งการอ้างอิง Python

3. การตั้งค่าฐานข้อมูล

หัวใจสำคัญของแอปพลิเคชันของเราคือ AlloyDB สำหรับ PostgreSQL เราจะใช้ความสามารถด้านเวกเตอร์ที่มีประสิทธิภาพและดัชนี ScaNN เพื่อเปิดใช้การค้นหาเชิงความหมายแบบเกือบเรียลไทม์ ซึ่งจะช่วยให้เอเจนต์ของเราค้นหาการจับคู่พื้นที่โฆษณาในบันทึกหลายพันรายการได้ในระดับมิลลิวินาที

ในส่วนนี้ คุณจะได้จัดสรรสคีมา ข้อมูลเริ่มต้น และสร้างการฝัง ทั้งหมดนี้ทำได้จาก AlloyDB Studio

เชื่อมต่อกับ AlloyDB Studio

  1. ไปที่อินสแตนซ์ AlloyDB ใน AlloyDB Console
  2. คลิก AlloyDB Studio ในการนำทางด้านซ้าย
  3. ตรวจสอบสิทธิ์ด้วย
  4. ชื่อผู้ใช้: postgres
  5. ฐานข้อมูล: postgres
  6. รหัสผ่าน: รหัสผ่านที่คุณตั้งค่าระหว่างการสร้างคลัสเตอร์

เปิดใช้ส่วนขยาย

AlloyDB มีส่วนขยายในตัวสำหรับเวกเตอร์และ AI เรียกใช้ SQL ต่อไปนี้ใน AlloyDB Studio

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS alloydb_scann CASCADE;
  • google_ml_integration: เปิดใช้ฟังก์ชัน ai.embedding() เพื่อเรียกใช้ Vertex AI จาก SQL โดยตรง
  • เวกเตอร์: จัดเก็บและค้นหาการฝังเวกเตอร์ 768 มิติ
  • alloydb_scann: เปิดใช้ดัชนี ScaNN ของ Google เพื่อการค้นหาเวกเตอร์ที่รวดเร็วเป็นพิเศษ

สร้างตารางสินค้าคงคลัง

DROP TABLE IF EXISTS inventory;

CREATE TABLE inventory (
    id SERIAL PRIMARY KEY,
    part_name TEXT NOT NULL,
    supplier_name TEXT NOT NULL,
    description TEXT,
    stock_level INT DEFAULT 0,
    part_embedding vector(768)
);

คอลัมน์ part_embedding จะจัดเก็บเวกเตอร์ 768 มิติจาก text-embedding-005 ซึ่งเป็นสิ่งที่ขับเคลื่อนการค้นหาเชิงความหมาย

แทรกข้อมูลตัวอย่าง

แทรกสินค้าคงคลังในคลังสินค้า 20 รายการ

INSERT INTO inventory (part_name, supplier_name, description, stock_level) VALUES
('Cardboard Shipping Box Large', 'Packaging Solutions Inc', 'Heavy-duty corrugated cardboard shipping container, 24x18x12 inches', 250),
('Warehouse Storage Container', 'Industrial Supply Co', 'Stackable plastic storage bin with snap-lock lid, blue', 180),
('Product Shipping Boxes', 'Acme Packaging', 'Medium corrugated boxes for warehouse storage, 18x14x10 inches', 320),
('Industrial Widget X-9', 'Acme Corp', 'Heavy-duty industrial coupling for pneumatic systems', 50),
('Precision Bolt M4', 'Global Fasteners Inc', 'Stainless steel M4 allen bolt, 20mm length, grade A2-70', 200),
('Hexagonal Nut M6', 'Metro Supply Co', 'Galvanized steel hex nut M6, DIN 934 standard', 150),
('Phillips Head Screw 3x20', 'Acme Corp', 'Zinc-plated Phillips head wood screw, 3mm x 20mm', 500),
('Wooden Dowel 10mm', 'Craft Materials Ltd', 'Hardwood birch dowel rod, 10mm diameter x 300mm length', 80),
('Rubber Gasket Small', 'SealTech Industries', 'Buna-N rubber gasket, 25mm OD x 15mm ID, oil resistant', 120),
('Spring Tension 5kg', 'Mechanical Parts Co', 'Stainless steel compression spring, 5kg load capacity', 60),
('Bearing 6204', 'Bearings Direct', 'Deep groove ball bearing 6204-2RS, 20x47x14mm sealed', 45),
('Warehouse Shelf Boxes', 'Storage Systems Ltd', 'Standardized warehouse inventory boxes, corrugated, bulk pack', 400),
('Inventory Container Units', 'Supply Chain Pros', 'Modular stackable storage units for warehouse racking', 95),
('Aluminum Extrusion Bar', 'MetalWorks International', 'T-slot aluminum extrusion 20x20mm profile, 1 meter length', 110),
('Cable Tie Pack 200mm', 'ElectroParts Depot', 'Nylon cable ties, 200mm x 4.8mm, UV resistant black, pack of 100', 600),
('Hydraulic Hose 1/2 inch', 'FluidPower Systems', 'High-pressure hydraulic hose, 1/2 inch ID, 3000 PSI rated', 35),
('Safety Goggles Clear', 'WorkSafe Equipment Co', 'ANSI Z87.1 rated clear safety goggles, anti-fog coating', 275),
('Packing Tape Industrial', 'Packaging Solutions Inc', 'Heavy-duty polypropylene packing tape, 48mm x 100m, clear', 450),
('Stainless Steel Sheet 1mm', 'MetalWorks International', '304 stainless steel sheet, 1mm thickness, 300x300mm', 70),
('Silicone Sealant Tube', 'SealTech Industries', 'Industrial-grade RTV silicone sealant, 300ml cartridge, grey', 190);

ให้สิทธิ์การฝัง

GRANT EXECUTE ON FUNCTION embedding TO postgres;

สร้างการฝังเวกเตอร์

ซึ่งใช้ฟังก์ชัน ai.embedding() ในตัวของ AlloyDB เพื่อเรียกใช้โมเดล text-embedding-005 ของ Vertex AI จาก SQL โดยตรง โดยไม่ต้องใช้โค้ด Python

UPDATE inventory
SET part_embedding = ai.embedding(
    'text-embedding-005',
    part_name || '. ' || description
)::vector
WHERE part_embedding IS NULL;

ซึ่งจะสร้างเวกเตอร์ 768 มิติที่บันทึกความหมายเชิงความหมายของชื่อและคำอธิบายของชิ้นส่วนแต่ละรายการ ดัชนี ScaNN จะใช้ข้อมูลเหล่านี้เพื่อการค้นหาความคล้ายกันที่รวดเร็ว [การดำเนินการนี้จะใช้เวลาประมาณ 3-5 นาที]

สร้างดัชนี ScaNN

SET scann.allow_blocked_operations = true;

CREATE INDEX IF NOT EXISTS idx_inventory_scann
ON inventory USING scann (part_embedding cosine)
WITH (num_leaves=5, quantizer='sq8');

ยืนยันว่าทุกอย่างทำงานได้

SELECT part_name, supplier_name, stock_level,
       (part_embedding IS NOT NULL) as has_embedding
FROM inventory
ORDER BY id;

คุณควรเห็น 20 แถว ซึ่งทั้งหมดมี has_embedding = true

4. ทำความเข้าใจสถาปัตยกรรม

ก่อนที่จะทำการเปลี่ยนแปลงโค้ด เรามาทำความเข้าใจวิธีการสร้างระบบกันก่อน สถาปัตยกรรมเป็นไปตามรูปแบบ "การตื่นรู้" ที่ค่อยๆ พัฒนา ดังนี้

สแต็กของ Agent

Vision Agent (agents/vision-agent/)

  • agent.py - ตรรกะหลักของ Gemini 3 Flash ส่งรูปภาพไปยังโมเดลโดยเปิดใช้การดำเนินการโค้ดเพื่อให้เขียน Python (OpenCV) เพื่อนับรายการได้อย่างแน่นอน
  • agent_executor.py — เชื่อมต่อคำขอโปรโตคอล A2A กับตรรกะของ Agent
  • main.py - เซิร์ฟเวอร์ Uvicorn A2A ที่แสดง /.well-known/agent-card.json และจัดการคำขอ

ตัวแทนซัพพลายเออร์ (agents/supplier-agent/)

  • inventory.py — เชื่อมต่อกับ AlloyDB ผ่านตัวเชื่อมต่อ Python ของ AlloyDB (ไม่จำเป็นต้องใช้พร็อกซีการตรวจสอบสิทธิ์) มีฟังก์ชัน find_supplier() ที่ทำการค้นหาเวกเตอร์ ScaNN
  • agent_executor.py — เชื่อมต่อโปรโตคอล A2A กับตรรกะการค้นหาสินค้าคงคลัง
  • main.py — เซิร์ฟเวอร์ A2A ของ Uvicorn ที่มีบัตรตัวแทนและปลายทางด้านสุขภาพ

Control Tower (ฟรอนท์เอนด์/)

  • app.py - เซิร์ฟเวอร์ FastAPI + WebSocket ที่ค้นหาเอเจนต์ผ่าน A2A, จัดการไปป์ไลน์วิชัน → ค้นหา → สั่งซื้อ และสตรีมข้อมูลอัปเดตแบบเรียลไทม์ไปยังเบราว์เซอร์

โฟลว์ A2A

  • Control Tower จะอ่าน /.well-known/agent-card.json จากแต่ละเอเจนต์
  • ค้นพบความสามารถ (ทักษะ ปลายทาง) โดยไม่มี URL ที่ฮาร์ดโค้ด
  • ส่งรูปภาพไปยัง Vision Agent → รับจำนวนรายการ + คำอธิบาย
  • ส่งคำอธิบายเป็นคำค้นหาการฝังไปยัง Agent ของซัพพลายเออร์ → รับการจับคู่บางส่วน
  • สั่งซื้อโดยอัตโนมัติ

การเชื่อมต่อ AlloyDB

Supplier Agent ใช้ AlloyDB Python Connector แทนพร็อกซีการตรวจสอบสิทธิ์แบบเดิม

from google.cloud.alloydbconnector import Connector

connector = Connector()
conn = connector.connect(
    inst_uri,       # Full instance URI
    "pg8000",       # Driver
    user="postgres",
    password=DB_PASS,
    ip_type="PUBLIC",  # Cloud Shell uses Public IP
)

ซึ่งจะจัดการการตรวจสอบสิทธิ์ IAM, SSL/TLS และการกำหนดเส้นทางการเชื่อมต่อโดยอัตโนมัติ เมื่อทำให้ใช้งานได้ใน Cloud Run ในภายหลัง เพียงเปลี่ยน ip_type เป็น "PRIVATE" สำหรับการเข้าถึง VPC

5. ขั้นตอนที่ 1: หน่วยความจำ (ตัวแทนซัพพลายเออร์)

Supplier Agent จดจำชิ้นส่วนหลายล้านชิ้นโดยใช้ AlloyDB ScaNN ปัจจุบัน Gemini มาพร้อมกับคำค้นหาตัวยึดตำแหน่ง ซึ่งเป็นคำค้นหาที่แสดงผลแถวแรกที่พบ ไม่ว่าคุณจะค้นหาอะไรก็ตาม

การตรวจสอบ: ผู้สูญเสียความทรงจำ

หากคุณค้นหา Supplier Agent ในตอนนี้ ระบบจะแสดงผลลัพธ์แบบสุ่ม โดยไม่มีแนวคิดเรื่องความคล้ายคลึงกัน เรามาแก้ปัญหานั้นกันดีกว่า

เริ่มการทำงานของ Supplier Agent

เซิร์ฟเวอร์ A2A (main.py) จะมอบสิทธิ์ให้กับ agent_executor.py ซึ่งเชื่อมโยงโปรโตคอลกับตรรกะทางธุรกิจใน inventory.py

pkill -f uvicorn #Kill all uvicorn processes

ขั้นตอนที่ 1: ไปที่ไดเรกทอรีตัวแทน

cd agents/supplier-agent

ขั้นตอนที่ 2: ติดตั้งการขึ้นต่อกัน

pip install -r requirements.txt

ขั้นตอนที่ 3: เริ่มเซิร์ฟเวอร์ของ Agent

uvicorn main:app --host 0.0.0.0 --port 8082 > /dev/null 2>&1 &

> /dev/null 2>&1 & จะเรียกใช้เซิร์ฟเวอร์ในเบื้องหลังและระงับเอาต์พุตเพื่อไม่ให้ขัดจังหวะเทอร์มินัล

ขั้นตอนที่ 4: ยืนยันว่า Agent ทำงานอยู่ (รอ 2-3 วินาทีหลังจากเริ่ม)

curl http://localhost:8082/.well-known/agent-card.json

เอาต์พุตที่คาดไว้: JSON ที่มีการกำหนดค่า Agent (ควรแสดงผลโดยไม่มีข้อผิดพลาด)

วิธีแก้ไข: การใช้ตัวดำเนินการ <=>

เปิด agents/supplier-agent/inventory.py และค้นหาฟังก์ชัน find_supplier() ที่บรรทัดประมาณ 60-70 คุณจะเห็นตัวยึดตำแหน่งดังนี้

# TODO: Replace this placeholder query with ScaNN vector search

sql = "SELECT part_name, supplier_name FROM inventory LIMIT 1;"
cursor.execute(sql)

แทนที่ 2 บรรทัดดังกล่าวด้วย

sql = """
SELECT part_name, supplier_name,
       part_embedding <=> %s::vector as distance
FROM inventory
ORDER BY part_embedding <=> %s::vector
LIMIT 1;
"""
cursor.execute(sql, (embedding_str, embedding_str))

การดำเนินการนี้จะทำสิ่งต่อไปนี้

  • <=> คือตัวดำเนินการระยะทางโคไซน์ใน PostgreSQL
  • ORDER BY part_embedding <=> %s::vector จะค้นหารายการที่ตรงกันมากที่สุด (ระยะทางต่ำสุด = ความหมายเชิงความหมายที่ใกล้เคียงที่สุด)
  • %s::vector จะแคสต์อาร์เรย์การฝังไปยังประเภทเวกเตอร์ของ PostgreSQL
  • ดัชนี ScaNN จะเร่งการค้นหานี้โดยอัตโนมัติ

ขั้นตอนที่ 4: บันทึกไฟล์ (Ctrl+S หรือ Cmd+S)

ตอนนี้เอเจนต์จะใช้การค้นหาเชิงความหมายแทนการแสดงผลลัพธ์แบบสุ่ม

การยืนยัน

ทดสอบการค้นพบ A2A และพื้นที่โฆษณา

curl http://localhost:8082/.well-known/agent-card.json

44500cdeeca3cee8.png

python3 -c "
from inventory import find_supplier
import json
vec = [0.1]*768
r = find_supplier(vec)
if r:
    result = {'part': r[0], 'supplier': r[1]}
    if len(r) > 2:
        result['distance'] = float(r[2]) if r[2] else None
    print(json.dumps(result))
else:
    print('No result found')
"

คาดการณ์: agent-card.json จะแสดงการ์ดตัวแทน ข้อมูลโค้ด Python จะแสดงชิ้นส่วนและซัพพลายเออร์จากข้อมูลเริ่มต้น

6. ขั้นตอนที่ 2: ดวงตา (Vision Agent)

ในขณะที่เข้าถึงฐานข้อมูลได้ เรามาปลุกดวงตาด้วย Gemini 3 Flash กัน Vision Agent จะดำเนินการ "คณิตศาสตร์ภาพ" ผ่านการรันโค้ด

การตรวจสอบ: อาการหลอน

หากคุณถามโมเดลหลายรูปแบบมาตรฐานว่า "มีกล่องกี่กล่องในรูปภาพที่รกนี้" โมเดลจะประมวลผลรูปภาพเป็นสแนปชอตแบบคงที่และคาดเดา

  • โมเดลตอบว่า "ฉันเห็นกล่องประมาณ 12 กล่อง"
  • ความเป็นจริง: มีกล่อง 15 กล่อง
  • ผลลัพธ์: ซัพพลายเชนล้มเหลว

วิธีแก้ไข: การปลุกวงจรการคิด-การกระทำ-การสังเกต

เราเปิดใช้การเรียกใช้โค้ดและ ThinkingConfig เพื่อให้โมเดลเขียน Python (OpenCV) เพื่อนับได้อย่างแน่นอน

  1. เปิด agents/vision-agent/agent.py
  2. ค้นหาส่วน GenerateContentConfig (ประมาณบรรทัดที่ 68-78)
  3. ยกเลิกการแสดงความคิดเห็นทั้งบล็อก thinking_config=types.ThinkingConfig(...) และ tools=[types.Tool(code_execution=...)].
  4. ไคลเอ็นต์ได้รับการกำหนดค่าให้ใช้ GEMINI_API_KEY จากสภาพแวดล้อมแล้ว

ไฟล์: agents/vision-agent/agent.py

config = types.GenerateContentConfig(
    temperature=0,
    # CODELAB STEP 1: Uncomment to enable reasoning
    thinking_config=types.ThinkingConfig(
        thinking_level="MINIMAL",  # Valid: "MINIMAL", "LOW", "MEDIUM", "HIGH"
        include_thoughts=False    # Set to True for debugging
    ),
    # CODELAB STEP 2: Uncomment to enable code execution
    tools=[types.Tool(code_execution=types.ToolCodeExecution)]
)

เหตุใดจึงต้องมี thinking_level="MINIMAL"

สำหรับงานนี้ (การนับรายการผ่านการดำเนินการโค้ด) "MINIMAL" จะให้การให้เหตุผลที่เพียงพอในการวางแผนสคริปต์และยืนยันจำนวน การใช้ "สูง" จะเพิ่มเวลาในการตอบสนอง 2-3 เท่าโดยไม่ปรับปรุงความแม่นยำสำหรับงานที่กำหนด การเพิ่มประสิทธิภาพด้านต้นทุนและประสิทธิภาพ - จับคู่ความลึกของการให้เหตุผลกับความซับซ้อนของงาน

การเพิ่มประสิทธิภาพด้านต้นทุนและประสิทธิภาพเป็นทักษะสำคัญสำหรับวิศวกรรม AI ในการผลิต โดยต้องจับคู่ความลึกของการให้เหตุผลกับความซับซ้อนของงาน

เริ่ม Vision Agent

🔄 ตรวจสอบเส้นทาง: หากคุณยังอยู่ใน agents/supplier-agent/ ให้กลับไปที่รูทของที่เก็บด้วย cd ../..

ขั้นตอนที่ 1: ไปที่ไดเรกทอรีเอเจนต์ Vision

cd agents/vision-agent

ขั้นตอนที่ 2: ติดตั้งการขึ้นต่อกัน

pip install -r requirements.txt

ขั้นตอนที่ 3: เริ่มเซิร์ฟเวอร์ของ Vision Agent

uvicorn main:app --host 0.0.0.0 --port 8081 > /dev/null 2>&1 &

> /dev/null 2>&1 & จะเรียกใช้เซิร์ฟเวอร์ในเบื้องหลังและระงับเอาต์พุตเพื่อไม่ให้ขัดจังหวะเทอร์มินัล

การยืนยัน

ทดสอบการค้นพบ A2A:

curl http://localhost:8081/.well-known/agent-card.json

คาดการณ์: JSON ที่มีชื่อและทักษะของเอเจนต์ คุณจะทดสอบการนับด้วยวิชันซิสเต็มจริงด้วย UI ของ Control Tower ในขั้นตอนที่ 8

dc9bc53007336472.png

7. ขั้นตอนที่ 3: การแฮนด์เชค (บัตรตัวแทน A2A)

เอเจนต์ของเราเห็นปัญหา (Vision) และรู้จักซัพพลายเออร์ (Memory) โปรโตคอล A2A ช่วยให้การค้นหาแบบไดนามิกเป็นไปได้ โดยฟรอนท์เอนด์จะเรียนรู้วิธีสื่อสารกับ Agent แต่ละรายด้วยการอ่านการ์ดของ Agent

A2A กับ REST API แบบเดิม

มุมมอง

REST แบบดั้งเดิม

โปรโตคอล A2A

การค้นหาอุปกรณ์ปลายทาง

URL ที่ฮาร์ดโค้ดในการกำหนดค่า

แบบไดนามิกผ่าน /.well-known/agent-card.json

คำอธิบายความสามารถ

เอกสารประกอบ API (สำหรับมนุษย์)

ทักษะ (เครื่องอ่านได้)

การผสานรวม

รหัสที่กำหนดเองต่อบริการ

การจับคู่ความหมาย: "ฉันต้องการค้นหาสินค้าคงคลัง" → ค้นพบทักษะ

เพิ่ม Agent ใหม่แล้ว

อัปเดตการกำหนดค่าของไคลเอ็นต์ทั้งหมด

ไม่ต้องกำหนดค่าใดๆ - ค้นพบโดยอัตโนมัติ

ประโยชน์ในโลกแห่งความเป็นจริง: ในไมโครเซอร์วิสแบบดั้งเดิม หากคุณเพิ่ม "ตัวแทนด้านลอจิสติกส์" รายที่ 3 คุณจะต้องอัปเดตรหัสของ Control Tower ด้วย URL และสัญญา API เมื่อใช้ A2A Control Tower จะค้นพบอุปกรณ์โดยอัตโนมัติและเข้าใจความสามารถของอุปกรณ์ผ่านคำอธิบายทักษะภาษาธรรมชาติ

ด้วยเหตุนี้ A2A จึงเปิดใช้การสร้าง Agent แบบเสียบและเล่น ซึ่งเป็นรูปแบบสถาปัตยกรรมสำหรับระบบอัตโนมัติ

สร้างการ์ดตัวแทน

🔄 ตรวจสอบเส้นทาง: หากคุณยังอยู่ใน agents/vision-agent/ ให้กลับไปที่รูทของที่เก็บด้วย cd ../.. ก่อน

การ์ดตัวแทนรวมอยู่ใน agents/supplier-agent/agent_card.json แล้ว เปิดและตรวจสอบ

{
  "name": "Acme Supplier Agent",
  "description": "Autonomous fulfillment for industrial parts via AlloyDB ScaNN.",
  "version": "1.0.0",
  "skills": [{
    "id": "search_inventory",
    "name": "Search Inventory",
    "description": "Searches the warehouse database for semantic matches using AlloyDB ScaNN vector search.",
    "tags": ["inventory", "search", "alloydb"],
    "examples": ["Find stock for Industrial Widget X-9", "Who supplies ball bearings?"]
  }]
}

คุณปรับแต่งชื่อ คำอธิบาย หรือตัวอย่างให้ตรงกับ Use Case ของคุณได้

รีสตาร์ท Supplier Agent เพื่อโหลดการ์ด

ขั้นตอนที่ 1: หยุดตัวแทนที่กำลังทำงาน

pkill -f "uvicorn main:app.*8082"

ขั้นตอนที่ 2: ไปที่ไดเรกทอรีตัวแทน

cd agents/supplier-agent

ขั้นตอนที่ 3: เริ่ม Agent อีกครั้ง

uvicorn main:app --host 0.0.0.0 --port 8082 > /dev/null 2>&1 &

> /dev/null 2>&1 & จะเรียกใช้เซิร์ฟเวอร์ในเบื้องหลังและระงับเอาต์พุตเพื่อไม่ให้ขัดจังหวะเทอร์มินัล

ขั้นตอนที่ 4: ยืนยันการ์ด Agent ใหม่ (รอ 2-3 วินาทีหลังจากเริ่ม)

curl http://localhost:8082/.well-known/agent-card.json

เอาต์พุตที่คาดไว้: JSON ที่มีชื่อ คำอธิบาย และทักษะที่คุณกรอก

dd352ca2e7e6109a.png

8. ขั้นตอนที่ 4: Control Tower

เรียกใช้ส่วนหน้าของ Control Tower ด้วย FastAPI + WebSockets โดยจะค้นหาเอเจนต์ผ่าน A2A และจัดระเบียบวงจรทั้งหมดด้วยการอัปเดตแบบเรียลไทม์

เริ่มบริการทั้งหมด

วิธีที่ง่ายที่สุดในการเริ่มต้นใช้งานบริการทั้งหมด

ตรวจสอบว่าคุณอยู่ในรูทของที่เก็บ

pwd  # Should end with: visual-commerce-gemini-3-alloydb

จากนั้นให้ทำดังนี้

sh run.sh

คำสั่งเดียวนี้จะเริ่ม

  • Vision Agent บนพอร์ต 8081
  • Supplier Agent บนพอร์ต 8082
  • Control Tower บนพอร์ต 8080

รอประมาณ 10 วินาทีเพื่อให้บริการทั้งหมดเริ่มต้น

ทดสอบระบบ

เข้าถึง Control Tower

  1. คลิกปุ่มตัวอย่างเว็บ (ไอคอนดวงตา 👁️) ในแถบเครื่องมือของ Cloud Shell
  2. เลือก "แสดงตัวอย่างบนพอร์ต 8080"
  3. แดชบอร์ด Control Tower จะเปิดขึ้นในแท็บใหม่

ลองใช้เดโม:

  1. ด้านขวาบน: สถานะการเชื่อมต่อ (จุดสีเขียว "สด"), สวิตช์โหมด DEMO/AUTO และตัวควบคุมเสียง
  2. ตรงกลาง: Canvas เวิร์กโฟลว์หลักที่มีการอัปโหลดรูปภาพและการแสดงภาพการวิเคราะห์
  3. แผงด้านข้าง (ปรากฏระหว่างการวิเคราะห์): ไทม์ไลน์เวิร์กโฟลว์ (ซ้าย), การติดตามความคืบหน้า และโปรแกรมดูโค้ด (ขวา)

ตัวเลือกที่ 1: คู่มือเริ่มต้นฉบับย่อ (แนะนำ)

  1. ในหน้าแรก คุณจะเห็นส่วน "เริ่มต้นอย่างรวดเร็ว" พร้อมรูปภาพตัวอย่าง
  2. คลิกรูปภาพตัวอย่างเพื่อเริ่มการวิเคราะห์โดยอัตโนมัติ
  3. ดูเวิร์กโฟลว์อัตโนมัติ (~30-45 วินาที)

ตัวเลือกที่ 2: อัปโหลดเอง

  1. ลากและวางรูปภาพคลังสินค้า/ชั้นวาง (PNG, JPG, สูงสุด 10 MB) หรือคลิกเพื่อเรียกดู
  2. คลิก "เริ่มเวิร์กโฟลว์อัตโนมัติ"
  3. สังเกตไปป์ไลน์ 4 ขั้นตอน

สิ่งที่เกิดขึ้น

  1. การค้นพบ Agent: โมดอลโปรโตคอล A2A จะแสดงการ์ด Vision Agent และ Supplier Agent พร้อมทักษะและปลายทาง
  2. การวิเคราะห์ภาพ: Gemini 3 Flash สร้างและเรียกใช้โค้ด Python (OpenCV) เพื่อนับรายการ แถบความคืบหน้าจะแสดงขั้นตอนย่อย กรอบล้อมรอบซ้อนทับบนรายการที่ตรวจพบ ป้ายผลการค้นหาแสดง "✓ ยืนยันด้วยรหัส" หรือ "~ โดยประมาณ"
  3. การจับคู่ซัพพลายเออร์: ภาพเคลื่อนไหวการค้นหาเวกเตอร์ ScaNN ของ AlloyDB แสดงคำค้นหา (เช่น "กล่องโลหะอุตสาหกรรม") การ์ดผลลัพธ์แสดงชิ้นส่วนที่ตรงกัน ซัพพลายเออร์ และคะแนนความน่าเชื่อถือ
  4. ส่งคำสั่งซื้อแล้ว: บัตรใบเสร็จที่มีรหัสคำสั่งซื้อ จำนวน และรายละเอียด

เคล็ดลับ: เปิดโหมด DEMO ไว้ (ด้านขวาบน) เพื่อหยุดชั่วคราวในแต่ละขั้นตอนสำหรับการนำเสนอ ในโหมดอัตโนมัติ เวิร์กโฟลว์จะทำงานอย่างต่อเนื่อง

1a031c4fd407a183.png

เกิดอะไรขึ้น

Control Tower ใช้โปรโตคอล A2A เพื่อค้นหาทั้ง 2 เอเจนต์ผ่าน /.well-known/agent-card.json, จัดการการวิเคราะห์วิชันซิสเต็ม (Gemini 3 Flash พร้อมการดำเนินการโค้ด), ทำการค้นหาเวกเตอร์ (AlloyDB ScaNN) และสั่งซื้ออัตโนมัติ ทั้งหมดนี้มีการอัปเดต WebSocket แบบเรียลไทม์ เอเจนต์แต่ละรายจะแสดงความสามารถของตนผ่านมาตรฐาน A2A ซึ่งช่วยให้สามารถเสียบและใช้งานได้ทันทีโดยไม่ต้องใช้ SDK ที่กำหนดเอง ดูข้อมูลเพิ่มเติม: โปรโตคอล A2A

การแก้ปัญหา

ข้อผิดพลาดเกี่ยวกับเส้นทาง:

  • "ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว" เมื่อเรียกใช้คำสั่ง: คุณไม่ได้อยู่ในรูทของที่เก็บ
# Check where you are
pwd

# If you're lost, navigate to home and back to repo
cd
cd visual-commerce-gemini-3-alloydb

ข้อผิดพลาดของบริการ:

  • "มีการใช้อีเมลนี้แล้ว": กระบวนการจากการเรียกใช้ครั้งก่อนยังคงทำงานอยู่
# Kill all services and restart
pkill -f uvicorn
sh run.sh  # Or manually restart individual agents
  • บริการไม่เริ่มต้น: ตรวจสอบว่ามีการใช้พอร์ตอยู่หรือไม่
# Check which processes are using the ports
lsof -i :8080  # Control Tower
lsof -i :8081  # Vision Agent
lsof -i :8082  # Supplier Agent
  • "ปฏิเสธการเชื่อมต่อ" กับ AlloyDB: ตรวจสอบว่าได้เปิดใช้ IP สาธารณะในอินสแตนซ์ AlloyDB แล้ว

9. 🎁 โบนัส: ทำให้ใช้งานได้กับ Cloud Run

ไม่บังคับ - ทุกอย่างจะทำงานในเครื่อง แต่หากต้องการแชร์ผลงานด้วย URL สาธารณะ ให้ทำดังนี้

# From repo root
sh deploy/deploy.sh

สิ่งที่จะเกิดขึ้น

  1. อ่านการกำหนดค่า .env
  2. ขอชื่อของคุณ (แสดงในแอปที่ใช้งาน)
  3. ติดตั้งใช้งานทั้ง 3 บริการเป็นคอนเทนเนอร์ Cloud Run เดียว
  4. มอบบทบาท IAM สำหรับการเข้าถึง AlloyDB
  5. แสดง URL ที่แชร์ได้

ผู้เข้าชมที่เปิด URL จะเห็นป๊อปอัปต่อไปนี้

10. ล้างข้อมูล

หากไม่ต้องการให้มีการเรียกเก็บเงิน ให้ทำลายทรัพยากรทั้งหมดด้วยสคริปต์การล้างข้อมูลอัตโนมัติ

# From repo root
sh deploy/cleanup.sh

การดำเนินการนี้จะนำรายการต่อไปนี้ออกอย่างปลอดภัย

  • คลัสเตอร์ AlloyDB (ตัวขับเคลื่อนต้นทุนหลัก)
  • บริการ Cloud Run (หากมีการติดตั้งใช้งาน)
  • บัญชีบริการที่เชื่อมโยง

สคริปต์จะแจ้งให้ยืนยันก่อนลบ

11. ข้อมูลอ้างอิงและข้อมูลเพิ่มเติม

การกล่าวอ้างทางเทคนิคทั้งหมดในโค้ดแล็บนี้ได้รับการยืนยันจากเอกสารประกอบอย่างเป็นทางการของ Google Cloud และ Google AI

เอกสารประกอบอย่างเป็นทางการ

Gemini 3 Flash:

AlloyDB AI และ ScaNN:

MCP Toolbox สำหรับฐานข้อมูล (แนวทางอื่น):

ข้อมูลราคา:

การกล่าวอ้างประสิทธิภาพที่ได้รับการยืนยัน

ฟีเจอร์

อ้างสิทธิ์

แหล่งที่มา

ScaNN เทียบกับ HNSW (กรองแล้ว)

เร็วกว่า 10 เท่า

บล็อกของ Google Cloud (ได้รับการยืนยัน)

ScaNN เทียบกับ HNSW (มาตรฐาน)

เร็วกว่า 4 เท่า

บล็อกของ Google Cloud (ได้รับการยืนยัน)

หน่วยความจำที่ใช้ของ ScaNN

เล็กกว่า 3-4 เท่า

บล็อกของ Google Cloud (ได้รับการยืนยัน)

เวลาบิลด์ดัชนี ScaNN

เร็วกว่า 8 เท่า

บล็อกของ Google Cloud (ได้รับการยืนยัน)

โค้ดหมดเวลาการดำเนินการ

สูงสุด 30 วินาที

เอกสารประกอบของ Google Cloud (ได้รับการยืนยัน)

I/O ของไฟล์การเรียกใช้โค้ด

ไม่รองรับ

เอกสารประกอบของ Google Cloud (ได้รับการยืนยัน)

ลักษณะการทำงานเมื่ออุณหภูมิ=0

เอาต์พุตที่แน่นอน

ยืนยันโดยชุมชน

แหล่งข้อมูลเพิ่มเติม

โปรโตคอล Agent-to-Agent (A2A):

  • A2A ทำให้การค้นพบและการสื่อสารของเอเจนต์เป็นมาตรฐาน
  • การ์ดตัวแทนที่แสดงใน /.well-known/agent-card.json
  • มาตรฐานใหม่สำหรับการทำงานร่วมกันของเอเจนต์อัตโนมัติ

การวิจัย ScaNN:

  • อิงตามการวิจัยของ Google เป็นเวลา 12 ปี
  • ขับเคลื่อน Google Search และ YouTube ที่มีผู้ใช้หลายพันล้านคน
  • เปิดตัวเวอร์ชันสำหรับผู้ใช้ทั่วไป: ตุลาคม 2024
  • ดัชนีเวกเตอร์ PostgreSQL แรกที่เหมาะสำหรับเวกเตอร์ตั้งแต่ล้านถึงพันล้านรายการ

12. โหมดท้าทาย: ยกระดับทักษะการทำงานแบบ Agent

คุณได้สร้างซัพพลายเชนอัตโนมัติที่ใช้งานได้แล้ว พร้อมจะก้าวไปอีกขั้นหรือยัง โดยการท้าทายเหล่านี้จะนำรูปแบบที่คุณได้เรียนรู้ไปใช้กับปัญหาใหม่ๆ

ชาเลนจ์ที่ 1: การค้นหาตามรูปภาพ (การฝังแบบหลายรูปแบบ)

โฟลว์ปัจจุบัน: Vision Agent นับสินค้า → สร้างคำค้นหาข้อความ → Supplier Agent ฝังข้อความ → ค้นหา AlloyDB

ความท้าทาย: ข้ามข้อความทั้งหมดโดยส่งรูปภาพที่ครอบตัดแล้วไปยังตัวแทนซัพพลายเออร์โดยตรง

คำแนะนำ:

  1. การดำเนินการโค้ดของ Vision Agent สามารถครอบตัดรายการแต่ละรายการจากรูปภาพชั้นวางได้
  2. โมเดล multimodalembedding@001 ของ Vertex AI สามารถฝังรูปภาพได้โดยตรง
  3. แก้ไข inventory.py เพื่อยอมรับไบต์รูปภาพแทนข้อความ
  4. อัปเดตคำอธิบายทักษะ A2A เพื่อระบุว่า "ยอมรับ: image/jpeg หรือ text"

เหตุผลที่เรื่องนี้สำคัญ: การค้นหาภาพมีความแม่นยำมากขึ้นสำหรับชิ้นส่วนที่มีลักษณะซับซ้อน (สีที่แตกต่างกัน ความเสียหาย ความแตกต่างของบรรจุภัณฑ์)

ความท้าทายที่ 2: การสังเกตการณ์ - ความน่าเชื่อถือผ่านความโปร่งใส

สถานะปัจจุบัน: ระบบทำงานได้ แต่คุณไม่เห็น "เบื้องหลัง"

ภารกิจ: ตรวจสอบบันทึกการค้นหาของ AlloyDB เพื่อพิสูจน์ว่าการค้นหาเวกเตอร์กำลังดำเนินการอยู่

ขั้นตอน

  • ระบบจะเปิดใช้ข้อมูลเชิงลึกของการค้นหาใน AlloyDB โดยค่าเริ่มต้น หากต้องการยืนยัน ให้เรียกใช้คำสั่งต่อไปนี้
gcloud alloydb instances describe INSTANCE_NAME \
  --cluster=CLUSTER_NAME \
  --region=us-central1 \
  --format="value(queryInsightsConfig.queryPlansPerMinute)"
  • เรียกใช้การค้นหาซัพพลายเออร์ผ่าน UI
  • ดู SQL จริงที่ดำเนินการ
gcloud logging read \
  'resource.type="alloydb.googleapis.com/Instance" AND textPayload:"ORDER BY part_embedding"' \
  --limit 5 \
  --format=json

เอาต์พุตที่คาดไว้: คุณจะเห็นส่วน ORDER BY part_embedding <=> $1::vector LIMIT 1 ที่แน่นอนพร้อมเวลาในการดำเนินการ

เหตุใดเรื่องนี้จึงสำคัญ: ความสามารถในการสังเกตช่วยสร้างความน่าเชื่อถือ เมื่อผู้มีส่วนเกี่ยวข้องถามว่า "เอเจนต์นี้ตัดสินใจอย่างไร" คุณสามารถแสดงแผนการค้นหาให้พวกเขาดูได้ ไม่ใช่แค่เอาต์พุต

ความท้าทายที่ 3: การจัดองค์ประกอบแบบหลายเอเจนต์

ความท้าทาย: เพิ่มเอเจนต์ที่ 3 (ตัวแทนด้านลอจิสติกส์) ที่คำนวณค่าจัดส่งตามสถานที่ตั้งของคลังสินค้าและน้ำหนักของสินค้า

สถาปัตยกรรม:

  • เอาต์พุตของ Vision Agent: จำนวนรายการ
  • ผลลัพธ์ของตัวแทนซัพพลายเออร์: สถานที่ตั้งของซัพพลายเออร์
  • ตัวแทนด้านโลจิสติกส์ (ใหม่) ข้อมูลนำเข้า: ปลายทาง น้ำหนัก → ข้อมูลนำออก: ค่าจัดส่ง + เวลาถึงโดยประมาณ

เคล็ดลับ: โปรโตคอล A2A ทำให้การดำเนินการนี้ง่ายมาก เพียงสร้างการ์ดเอเจนต์ใหม่ที่มีทักษะ calculate_shipping Control Tower จะค้นพบโดยอัตโนมัติ

รูปแบบที่คุณกำลังเรียนรู้: นี่คือหัวใจสำคัญของสถาปัตยกรรมที่มุ่งเน้นเอเจนต์ ซึ่งเป็นระบบที่ซับซ้อนที่สร้างขึ้นจากผู้เชี่ยวชาญขนาดเล็กที่ประกอบกันได้

13. บทสรุป

คุณย้ายจาก Generative AI ไปยัง Agentic AI เรียบร้อยแล้ว

สิ่งที่เราสร้างขึ้น

  • วิสัยทัศน์: เราแทนที่ "การคาดเดา" ด้วยการเรียกใช้โค้ด (Gemini 3 Flash ผ่านคีย์ API)
  • หน่วยความจำ: เราแทนที่ "การค้นหาที่ช้า" ด้วย AlloyDB ScaNN (ผ่าน GCP)
  • การดำเนินการ: เราแทนที่ "การผสานรวม API" ด้วยโปรโตคอล A2A

ข้อดีของสถาปัตยกรรมแบบไฮบริด

Codelab นี้แสดงให้เห็นถึงแนวทางแบบไฮบริดดังนี้

  • Vision Agent: ใช้ Gemini API (คีย์ API) - มีระดับฟรีแบบง่าย ไม่ต้องมีการเรียกเก็บเงินของ GCP
  • เอเจนต์ซัพพลายเออร์: ใช้ GCP (Vertex AI + AlloyDB) - ระดับองค์กร พร้อมสำหรับการปฏิบัติตามข้อกำหนด

นี่คือสถาปัตยกรรมของเศรษฐกิจอัตโนมัติ รหัสนี้เป็นของคุณ

ขั้นตอนถัดไป