สูตรลับ 6 ประการในการทำให้ข้อความเป็น SQL ใน AlloyDB แม่นยำเกือบ 100% - Codelab

1. บทนำ

ใน Codelab นี้ คุณจะได้เรียนรู้วิธีรับผลลัพธ์ที่ดีที่สุดโดยใช้ QueryData API คุณจะได้ทราบวิธีสร้างผลลัพธ์ที่แม่นยำและทำซ้ำได้เมื่อส่งคำขอด้วยภาษาธรรมชาติไปยังฐานข้อมูล คู่มือนี้จะช่วยให้คุณบรรลุเป้าหมายดังกล่าว โดยจะแนะนำสูตรสำเร็จ 6 สูตรในหลายบท ซึ่งจะสำรวจแง่มุมต่างๆ ของภาษาธรรมชาติเป็น SQL (NL2SQL) และการใช้งานจริง

ข้อกำหนดเบื้องต้น

  • ความเข้าใจพื้นฐานเกี่ยวกับ Google Cloud และคอนโซล Google Cloud
  • ทักษะพื้นฐานเกี่ยวกับอินเทอร์เฟซบรรทัดคำสั่งและ Cloud Shell

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

  • วิธีติดตั้งใช้งานคลัสเตอร์และอินสแตนซ์หลักของ AlloyDB
  • วิธีเปิดใช้ QueryData, ฟังก์ชัน AI และมุมมองที่ปลอดภัยแบบพารามิเตอร์
  • วิธีสร้างชุดบริบท QueryData
  • วิธีใช้เทมเพลตและบริบทต่างๆ ใน QueryData API
  • วิธีทำให้เทมเพลต QueryData ยืดหยุ่นมากขึ้นโดยใช้ Facet
  • วิธีแก้ไขความคลุมเครือของข้อมูลด้วยการค้นหาค่าและการจัดทำดัชนีไตรแกรม
  • วิธีใช้ฟังก์ชัน AI สำหรับการค้นหาเชิงความหมายด้วยเทมเพลต
  • วิธีใช้มุมมองที่ปลอดภัยซึ่งกำหนดพารามิเตอร์กับ QueryData API

สิ่งที่คุณต้องมี

  • บัญชี Google Cloud และโปรเจ็กต์ Google Cloud
  • เว็บเบราว์เซอร์ เช่น Chrome ที่รองรับคอนโซล Google Cloud และ Cloud Shell

2. การตั้งค่าและข้อกำหนด

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

  1. ลงชื่อเข้าใช้ คอนโซล Google Cloud หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

โปรดใช้บัญชีส่วนตัวแทนบัญชีงานหรือบัญชีโรงเรียน

  1. สร้างโปรเจ็กต์ใหม่หรือนำโปรเจ็กต์ที่มีอยู่มาใช้ซ้ำ หากต้องการสร้างโปรเจ็กต์ใหม่ในคอนโซล Google Cloud ให้คลิกปุ่มเลือกโปรเจ็กต์ในส่วนหัว ซึ่งจะเปิดหน้าต่างป๊อปอัป

295004821bab6a87.png

ในหน้าต่างเลือกโปรเจ็กต์ ให้คลิกโปรเจ็กต์ใหม่ ซึ่งจะเปิดกล่องโต้ตอบสำหรับโปรเจ็กต์ใหม่

37d264871000675d.png

ในกล่องโต้ตอบ ให้ป้อนชื่อโปรเจ็กต์และเลือกตำแหน่ง

96d86d3d5655cdbe.png

  • ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ Google APIs จะไม่ใช้ชื่อโปรเจ็กต์ และคุณสามารถเปลี่ยนชื่อได้ทุกเมื่อ
  • รหัสโปรเจ็กต์จะไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เปลี่ยนไม่ได้หลังจากตั้งค่าแล้ว) คอนโซล Google Cloud จะสร้างรหัสที่ไม่ซ้ำกันโดยอัตโนมัติ แต่คุณปรับแต่งได้ หากไม่ชอบรหัสที่สร้างขึ้น คุณสามารถสร้างรหัสแบบสุ่มอีกรหัสหนึ่งหรือระบุรหัสของคุณเองเพื่อตรวจสอบว่ามีรหัสดังกล่าวหรือไม่ ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ ซึ่งโดยปกติจะระบุด้วยตัวยึดตำแหน่ง PROJECT_ID
  • โปรดทราบว่ายังมีค่าที่ 3 ซึ่งก็คือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ

เปิดใช้การเรียกเก็บเงิน

ตั้งค่าบัญชีสำหรับการเรียกเก็บเงินส่วนตัว

หากตั้งค่าการเรียกเก็บเงินโดยใช้เครดิต Google Cloud คุณจะข้ามขั้นตอนนี้ได้

หากต้องการตั้งค่าบัญชีสำหรับการเรียกเก็บเงินส่วนตัว ให้ไปที่นี่เพื่อเปิดใช้การเรียกเก็บเงินใน Cloud Console

ข้อควรทราบ

  • การทำ Lab นี้ควรมีค่าใช้จ่ายน้อยกว่า $5 USD ในทรัพยากรระบบคลาวด์
  • คุณสามารถทำตามขั้นตอนที่ส่วนท้ายของแล็บนี้เพื่อลบทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินเพิ่มเติม
  • ผู้ใช้ใหม่มีสิทธิ์ใช้ช่วงทดลองใช้ฟรีมูลค่า$300 USD

เริ่มต้น Cloud Shell

แม้ว่าคุณจะใช้งาน Google Cloud จากระยะไกลในแล็ปท็อปได้ แต่ใน Codelab นี้คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์

จาก คอนโซล Google Cloud ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน

เปิดใช้งาน Cloud Shell

หรือจะกด G แล้วตามด้วย S ก็ได้ ลำดับนี้จะเปิดใช้งาน Cloud Shell หากคุณอยู่ในคอนโซล Google Cloud หรือใช้ลิงก์นี้

การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมจะใช้เวลาเพียงไม่กี่นาที เมื่อเสร็จแล้ว คุณควรเห็นข้อความคล้ายกับตัวอย่างต่อไปนี้

ภาพหน้าจอของเทอร์มินัล Google Cloud Shell ที่แสดงว่าสภาพแวดล้อมเชื่อมต่อแล้ว

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

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

เปิดใช้ API

หากต้องการใช้ AlloyDB, Compute Engine, บริการระบบเครือข่าย และแพลตฟอร์ม Agent ให้เปิดใช้ API ที่เกี่ยวข้องในโปรเจ็กต์ที่อยู่ในระบบคลาวด์ของ Google

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

gcloud config get-value project

คำสั่งควรแสดงรหัสโปรเจ็กต์ Google Cloud

ตั้งค่าตัวแปรสภาพแวดล้อม PROJECT_ID

PROJECT_ID=$(gcloud config get-value project)

เปิดใช้ API ที่จำเป็น

gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       geminidataanalytics.googleapis.com \
                       cloudaicompanion.googleapis.com \
                       aiplatform.googleapis.com \
                       dataplex.googleapis.com

ผลลัพธ์ที่คาดไว้

student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417
Updated property [core/project].
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-14650]
student@cloudshell:~ (test-project-001-402417)$ 
student@cloudshell:~ (test-project-001-402417)$ gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       geminidataanalytics.googleapis.com \
                       cloudaicompanion.googleapis.com \
                       aiplatform.googleapis.com \
                       dataplex.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.

คุณอ่านเกี่ยวกับ API ที่เปิดใช้แต่ละรายการได้ในเอกสารประกอบ

4. ติดตั้งใช้งาน AlloyDB

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

ติดตั้งใช้งาน AlloyDB โดยใช้สคริปต์อัตโนมัติ

แนวทางนี้ใช้สคริปต์อัตโนมัติเพื่อติดตั้งใช้งานคลัสเตอร์ AlloyDB และให้รายละเอียดการกำหนดค่าที่จำเป็นเพื่อเริ่มทำงานกับทรัพยากรที่ติดตั้งใช้งาน

ในเทอร์มินัล Cloud Shell ให้เรียกใช้คำสั่งเพื่อโคลนสคริปต์การติดตั้งใช้งานจากที่เก็บ

REPO_NAME="codelabs"
REPO_URL="https://github.com/GoogleCloudPlatform/$REPO_NAME"
SOURCE_DIR="alloydb-ai-nla"

git clone --no-checkout --filter=blob:none --depth=1 $REPO_URL

cd $REPO_NAME
git sparse-checkout set $SOURCE_DIR
git checkout
cd $SOURCE_DIR

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

./deploy_alloydb.sh

สคริปต์จะใช้เวลา 5-7 นาทีจึงจะเสร็จสมบูรณ์ เอาต์พุตจะแสดงรายละเอียดการติดตั้งใช้งานคลัสเตอร์ โปรดทราบว่ารหัสผ่านของคุณจะแตกต่างกัน ให้บันทึกรหัสผ่านไว้ใช้ในอนาคต

...
<redacted>
...
Creating primary instance: alloydb-aip-01-pr (8 vCPUs for TRIAL cluster)
Operation ID: operation-1765988049916-646282264938a-bddce198-9f248715
Creating instance...done.                                                                                                                                                                                                             
----------------------------------------
Deployment Process Completed
Cluster:  alloydb-aip-01 (TRIAL)
Instance: alloydb-aip-01-pr
Region:   us-central1
Initial Password: JBBoDTgixzYwYpkF (if new cluster)
----------------------------------------
 

ดูคลัสเตอร์และอินสแตนซ์ใหม่ในหน้าคลัสเตอร์ AlloyDB ในคอนโซล Google Cloud

4271eb55bcc9ec84.png

5. เตรียมฐานข้อมูล

สร้างฐานข้อมูล เปิดใช้การผสานรวมแพลตฟอร์ม Agent ของ Gemini Enterprise สร้างออบเจ็กต์ฐานข้อมูล และเพิ่มข้อมูลตัวอย่าง

ให้สิทธิ์ที่จำเป็นแก่ AlloyDB

มอบบทบาท IAM ที่จำเป็นให้กับตัวแทนบริการ AlloyDB โดยทำดังนี้

เปิดแท็บ Cloud Shell ใหม่โดยคลิกเพิ่ม (+)

abc505ac4d41f24e.png

ในแท็บใหม่ ให้เรียกใช้คำสั่งต่อไปนี้

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"

เอาต์พุตคอนโซลที่คาดไว้

student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-11039]
student@cloudshell:~ (test-project-001-402417)$ 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"
Updated IAM policy for project [test-project-001-402417].
bindings:
- members:
  - serviceAccount:service-4470404856@gcp-sa-alloydb.iam.gserviceaccount.com
  role: roles/aiplatform.user
- members:
...
etag: BwYIEbe_Z3U=
version: 1
 

เปิดใช้ Data Access API

เปิดใช้ Data Access API ในคลัสเตอร์ AlloyDB

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

PROJECT_ID=$(gcloud config get-value project)
REGION=us-central1
ADBCLUSTER=alloydb-aip-01
curl -X PATCH \
 -H "Authorization: Bearer $(gcloud auth print-access-token)" \
 -H "Content-Type: application/json" \
 https://alloydb.googleapis.com/v1alpha/projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER/instances/$ADBCLUSTER-pr?updateMask=dataApiAccess \
 -d '{
   "dataApiAccess": "ENABLED",
 }'

อัปเดตแฟล็กฐานข้อมูล

ก่อนที่จะเปิดใช้ฟีเจอร์ที่ระดับอินสแตนซ์ ให้รอจนกว่าขั้นตอน Data Access API จะเสร็จสิ้น ตรวจสอบว่าสถานะอินสแตนซ์แสดงเครื่องหมายถูกสีเขียวตามที่แสดงในรูปภาพต่อไปนี้

6284731b8eff74c.jpeg

หากต้องการใช้ส่วนขยาย AI และการตรวจสอบสิทธิ์ IAM สำหรับเครื่องมือที่ใช้เอเจนต์ คุณต้องเปิดใช้ฟีเจอร์ฐานข้อมูลที่เฉพาะเจาะจงในอินสแตนซ์และเพิ่มตัวเองเป็นผู้ใช้ฐานข้อมูล เปิดใช้ฟีเจอร์ต่อไปนี้

  • alloydb.iam_authentication
  • password.enforce_complexity
  • google_ml_integration.enable_ai_query_engine
  • parameterized_views

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

PROJECT_ID=$(gcloud config get-value project)
REGION=us-central1
ADBCLUSTER=alloydb-aip-01
gcloud beta alloydb instances update $ADBCLUSTER-pr \
   --database-flags password.enforce_complexity=on,alloydb.iam_authentication=on,google_ml_integration.enable_ai_query_engine=on,parameterized_views.enabled=on \
   --region=$REGION \
   --cluster=$ADBCLUSTER \
   --project=$PROJECT_ID \
   --update-mode=FORCE_APPLY

สร้างผู้ใช้ IAM ของ AlloyDB สำหรับบัญชีของคุณโดยทำดังนี้

REGION=us-central1
ADBCLUSTER=alloydb-aip-01
gcloud alloydb users create $(gcloud config get-value account) \
--cluster=$ADBCLUSTER \
--superuser=true \
--region=$REGION \
--type=IAM_BASED

ปิดแท็บโดยเรียกใช้คำสั่งออกในเทอร์มินัล

exit

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

ในบทต่อไปนี้ คุณสามารถเรียกใช้คำสั่ง SQL ทั้งหมดที่ต้องใช้การเชื่อมต่อฐานข้อมูลใน AlloyDB Studio ได้

หากต้องการเปิด AlloyDB Studio ให้ทำตามขั้นตอนต่อไปนี้

  1. ในคอนโซล Google Cloud ให้ไปที่หน้าคลัสเตอร์สำหรับ AlloyDB สำหรับ PostgreSQL
  2. เลือกอินสแตนซ์หลักเพื่อเปิดอินเทอร์เฟซเว็บ

1d7298e7096e7313.png

  1. จากนั้นคลิก AlloyDB Studio ทางด้านซ้าย

a33131c72ad29478.png

  1. เลือกฐานข้อมูล postgres เลือกการตรวจสอบสิทธิ์ IAM แล้วคลิก "ตรวจสอบสิทธิ์"

8ddfb250344ca749.jpeg

การดำเนินการนี้จะเปิดอินเทอร์เฟซ AlloyDB Studio

  1. เลือกแท็บการค้นหาที่ไม่มีชื่อเพื่อเปิดเครื่องมือแก้ไข SQL

6696bc771fab9983.png

ซึ่งจะเปิดเครื่องมือแก้ไขที่คุณสามารถเรียกใช้คำสั่ง SQL ได้ ดังที่แสดงในรูปภาพต่อไปนี้

ae34288e5bf237c7.png

สร้างฐานข้อมูล

สร้างฐานข้อมูลเริ่มต้นอย่างรวดเร็ว

ในเอดิเตอร์ AlloyDB Studio ให้เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างฐานข้อมูล

CREATE DATABASE quickstart_db

ผลลัพธ์ที่คาดไว้

Statement executed successfully

เชื่อมต่อกับ quickstart_db

คลิกเปลี่ยนฐานข้อมูล/ผู้ใช้ใน AlloyDB Studio

6f5c98f5d0b3d550.png

เลือก quickstart_db จากรายการฐานข้อมูล เลือกการตรวจสอบสิทธิ์ IAM แล้วตรวจสอบสิทธิ์

a1940c26c36ff840.jpeg

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

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

ตรวจสอบส่วนขยายที่จำเป็นทั้งหมดเพื่อให้แน่ใจว่าได้เปิดใช้ในฐานข้อมูลและมีเวอร์ชันขั้นต่ำที่ถูกต้อง

ตรวจสอบว่ามีส่วนขยายที่จำเป็นทั้งหมดในฐานข้อมูล

SELECT extname, extversion FROM pg_extension WHERE extname IN ('vector', 'google_ml_integration', 'parameterized_views');

ผลลัพธ์ที่คาดไว้

        extname        |   extversion   
-----------------------+----------------
 google_ml_integration | 1.5.9
 parameterized_views   | 1.0
 vector                | 0.8.2.google-1

หากไม่แสดงแถวทั้งหมดข้างต้น แสดงว่าไม่ได้เปิดใช้ส่วนขยายบางรายการ

ก่อนเปิดใช้ส่วนขยาย เราต้องตรวจสอบว่าได้เปิดใช้ค่าสถานะฐานข้อมูล "google_ml_integration.enable_ai_query_engine" และ "parameterized_views.enabled" ทั้งหมดในอินสแตนซ์แล้ว

ใน AlloyDB Studio ขณะเชื่อมต่อกับ quickstart_db ให้เรียกใช้คำสั่งต่อไปนี้

show google_ml_integration.enable_ai_query_engine;
show parameterized_views.enabled;

หากรายการใดแสดงเป็น "ปิด" ให้ลองทำซ้ำขั้นตอน "อัปเดตค่าสถานะของฐานข้อมูล" แล้วตรวจสอบสถานะโดยใช้คำสั่ง "show..." อีกครั้ง

เปิดใช้ส่วนขยายที่จำเป็น

ใน AlloyDB Studio ขณะเชื่อมต่อกับ quickstart_db ให้เรียกใช้คำสั่งต่อไปนี้

CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS parameterized_views;

ตรวจสอบเวอร์ชันส่วนขยายสำหรับ parameterized_views และ google_ml

ใน AlloyDB Studio ขณะเชื่อมต่อกับ quickstart_db ให้เรียกใช้คำสั่งต่อไปนี้

SELECT extname, extversion FROM pg_extension WHERE extname IN ('vector', 'google_ml_integration', 'parameterized_views');

ผลลัพธ์ที่คาดไว้

        extname        |   extversion   
-----------------------+----------------
 google_ml_integration | 1.5.9
 parameterized_views   | 1.0
 vector                | 0.8.2.google-1

หากเวอร์ชันต่ำกว่าที่กำหนด ให้ลองอัปเดตส่วนขยาย parameterized_views

สำหรับ parameterized_views ให้ลองทำดังนี้

ALTER EXTENSION parameterized_views UPDATE;

ยืนยันเวอร์ชันอีกครั้ง

ใน AlloyDB Studio ขณะเชื่อมต่อกับ quickstart_db ให้เรียกใช้คำสั่งต่อไปนี้

SELECT extname, extversion FROM pg_extension WHERE extname IN ('vector', 'google_ml_integration', 'parameterized_views');

ผลลัพธ์ที่คาดไว้

        extname        |   extversion   
-----------------------+----------------
 google_ml_integration | 1.5.9
 parameterized_views   | 1.0
 vector                | 0.8.2.google-1

6. ข้อมูลตัวอย่าง

ตอนนี้คุณต้องสร้างออบเจ็กต์ในฐานข้อมูลและโหลดข้อมูล คุณจะใช้ชุดข้อมูลบริษัทอสังหาริมทรัพย์สมมติ โดยมีข้อมูลสมมติเกี่ยวกับการขายอสังหาริมทรัพย์และตัวแทน ข้อมูลมีให้ในสคริปต์ SQL real_estate_data.sql ในที่เก็บที่โคลน

สร้างที่เก็บข้อมูลของพื้นที่เก็บข้อมูล

ใช้ Google SDK (gcloud) เพื่อนำเข้าข้อมูลจากที่เก็บที่โคลนไปยังฐานข้อมูล AlloyDB คุณต้องสร้าง Bucket ของ Cloud Storage สำหรับการดำเนินการดังกล่าวและให้สิทธิ์เข้าถึงบัญชีบริการ AlloyDB หรือคุณจะลองทำโดยใช้เว็บคอนโซลก็ได้เสมอตามที่อธิบายไว้ในเอกสารประกอบ

ในเทอร์มินัล Google Cloud Shell ให้เรียกใช้คำสั่งต่อไปนี้

PROJECT_ID=$(gcloud config get-value project)
REGION=us-central1
gcloud storage buckets create gs://$PROJECT_ID-import --project=$PROJECT_ID --location=$REGION
gcloud storage buckets add-iam-policy-binding gs://$PROJECT_ID-import --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" --role=roles/storage.objectViewer

โหลดข้อมูล

SQL Dump ของฐานข้อมูลจะอยู่ในโฟลเดอร์ที่เก็บที่โคลน คำสั่งต่อไปนี้ถือว่าคุณใช้ไดเรกทอรีหน้าแรกเป็นจุดเริ่มต้นเมื่อโคลนที่เก็บในขั้นตอนก่อนหน้าขณะสร้างคลัสเตอร์ AlloyDB

คัดลอกไฟล์การดัมพ์ฐานข้อมูลไปยัง Bucket ของ Cloud Storage โดยใช้คำสั่งต่อไปนี้

REPO_NAME="codelabs"
SOURCE_DIR="alloydb-ai-nla"
cd ~/$REPO_NAME/$SOURCE_DIR
gcloud storage cp ~/$REPO_NAME/$SOURCE_DIR/real_estate_data.sql  gs://$PROJECT_ID-import

นำเข้าชุดข้อมูลไปยัง quickstart_db โดยทำดังนี้

PROJECT_ID=$(gcloud config get-value project)
CLUSTER_NAME=alloydb-aip-01
REGION=us-central1
IAM_USER=$(gcloud config get-value account)
gcloud alloydb clusters import $CLUSTER_NAME  --region=us-central1 --database=quickstart_db --gcs-uri=gs://$PROJECT_ID-import/real_estate_data.sql --project=$PROJECT_ID --sql --user=$IAM_USER

คำสั่งจะโหลดชุดข้อมูลตัวอย่างไปยังฐานข้อมูล quickstart_db

ยืนยันการนำเข้าโดยนับระเบียนในตาราง real_estate.agents โดยใช้ AlloyDB Studio ดังนี้

SELECT COUNT(*) FROM real_estate.agents;

7. เตรียมออนโทโลยีสคีมา

ตั้งค่าชุดบริบท QueryData ระบุข้อมูลเมตาของสคีมา และเรียกใช้ Agent ของ ADK

สร้างข้อมูลเมตา

ข้อมูลเมตาประกอบด้วยความคิดเห็น SQL ที่ใช้กับตารางและคอลัมน์ของฐานข้อมูล ความคิดเห็นเหล่านี้จะแนะนำเครื่องมือ QueryData เมื่อเลือกออบเจ็กต์ฐานข้อมูล

หากคุณได้นําเข้าสคีมาข้อมูลโดยใช้การทิ้ง SQL ที่ให้ไว้ แสดงว่าระบบได้สร้างข้อมูลเมตาทั้งหมดไว้ในสคีมาแล้ว

ต่อไปนี้คือตัวอย่างข้อมูลโค้ดของข้อมูลเมตาที่ใช้กับสคีมา real_estate

COMMENT ON TABLE real_estate.agents IS 'Stores profile, contact, brokerage affiliation, and active status for individual real estate agents.';

COMMENT ON COLUMN real_estate.agents.agent_id IS 'Primary key uniquely identifying each real estate agent in the database.';

...

หากคุณกำลังทำงานกับชุดข้อมูลของคุณเอง คุณสามารถทำตามคำแนะนำที่บันทึกไว้เกี่ยวกับวิธีเพิ่มข้อมูลเมตาสำหรับสคีมา

สร้างบริบทของออนโทโลยีสคีมา

ชุดบริบทประกอบด้วยเทมเพลตการค้นหา แง่มุม และการค้นหาค่าที่จะช่วยโมเดล AI ในการสร้างการค้นหา หากไม่มีบริบทที่ตั้งไว้ AI Agent จะพยายามสร้างคําค้นหาโดยใช้เฉพาะข้อมูลที่มีจากสคีมา public โดยอิงตามชื่อตาราง คอลัมน์ และข้อมูลเมตาเป็นหลัก เพื่อพยายามอนุมานออบเจ็กต์ที่ถูกต้องเพื่อตอบคําขอค้นหาที่เป็นภาษาธรรมชาติ

ชุดบริบท QueryData คือไฟล์ JSON ที่มีเทมเพลตการค้นหา Facet และการค้นหาค่า คุณดูตัวอย่างต่างๆ ได้ในเอกสารประกอบ

โหลดชุดบริบท QueryData ในเว็บคอนโซล

หากต้องการโหลดชุดบริบท ให้เปิด AlloyDB Studio แล้วคุณจะเห็น Context sets และจุด 3 จุดที่แผงด้านซ้ายที่ด้านล่าง

d3578ceee65cd0dd.jpeg

คลิกจุด 3 จุด แล้วเลือก Create context set

ในกล่องโต้ตอบที่เปิดขึ้น ให้ป้อนค่าต่อไปนี้

  • ชื่อ: sixrecipes
  • คำอธิบาย: Real Estate Query Data
  • อัปโหลดไฟล์บริบท: ปล่อยให้ว่างไว้

เมื่อกดปุ่ม Create อาจต้องใช้เวลาสักครู่ในการเริ่มต้นที่เก็บข้อมูลบริบทหากคุณทำเป็นครั้งแรก

ตรวจสอบรหัสชุดบริบท QueryData โดยคลิกจุด 3 จุดทางด้านขวาของชื่อชุดบริบทอีกครั้ง แล้วเลือก Edit context set

6739fb9f54d7f79d.jpeg

รหัสชุดบริบทจะปรากฏที่ด้านบนของแท็บที่เปิดทางด้านขวา

746b38c52a70bb3c.jpeg

บันทึกรหัสนี้ไว้สำหรับขั้นตอนในภายหลัง

เริ่มใช้ AI Agent

หากต้องการโต้ตอบกับแบ็กเอนด์ QueryData เพื่อสร้างและเรียกใช้การค้นหา คุณสามารถใช้อินเทอร์เฟซ AlloyDB Studio ตามที่อธิบายไว้ในเอกสารประกอบ แต่ในแล็บนี้ คุณจะใช้ AI Agent เป็นเครื่องมือหลักในการสื่อสารกับฐานข้อมูล เอเจนต์ AI เป็นสถานการณ์ที่สมจริงมากขึ้นสำหรับภาระงานในอนาคต และเฟรมเวิร์ก ADK ของ Google มีอินเทอร์เฟซเว็บที่ยอดเยี่ยมซึ่งคุณสามารถดูขั้นตอนและการโต้ตอบทั้งหมดระหว่างโมเดล, API และแอปพลิเคชัน

ตรวจสอบการกำหนดค่าแหล่งที่มาของเอเจนต์ใน Cloud Shell โดยทำดังนี้

REPO_NAME="codelabs"
SOURCE_DIR="alloydb-ai-nla"
cd ~/$REPO_NAME/$SOURCE_DIR/data_agent
edit agent.py

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

# List of database tables included in QueryData API requests
TABLE_IDS = [
    "real_estate.municipalities",
    "real_estate.cities",
    "real_estate.agents",
    "real_estate.properties",
    "real_estate.schools",
    "real_estate.school_to_property",
    "real_estate.property_transactions",
    "real_estate.secure_offers",
]

และมีขั้นตอนcall_querydata_apiในการทำงานกับ QueryData API พร้อมชุดเครื่องมือในการทำงานกับทักษะ QueryData API

def call_querydata_api(
    prompt: str,
    target_project_id: str = project_id,
    target_location: str = location,
    target_cluster_id: str = cluster_name,
    target_instance_id: str = instance_name,
    target_database_id: str = database_name,
    target_context_set_id: str = context_set_id,
    target_table_ids: list[str] = TABLE_IDS,
) -> dict:
    """Calls the Gemini Data Analytics QueryData API to translate natural ...
<Redacted>
...

# ADK File-Based Skill

database_query_skill = load_skill_from_dir(
    pathlib.Path(__file__).parent / "skills" / "database-query-skill"
)

skill_toolset = SkillToolset(
    skills=[database_query_skill]
)

นี่คือเอเจนต์รูทพร้อมพรอมต์และเครื่องมือที่พร้อมใช้งาน

# Agent configuration

root_agent = Agent(
    model=MODEL_ID,
    name='root_agent',
    description='A helpful assistant for analyst requests.',
    instruction=f"""
    Answer user questions to the best of your knowledge using provided tools.
    Do not try to generate non-existent data but use the grounded data from the database.
    When you answer questions about database contents, real estate properties, or sales activity:
    1. Refer to database-query-skill for instructions on querying data using QueryData API.
    2. Use `call_querydata_api` to submit the natural language prompt to the QueryData API.
       CRITICAL: Call `call_querydata_api` EXACTLY ONCE per user request. Do NOT make retries, follow-up calls, or rephrased calls to `call_querydata_api`, even if the result contains zero rows or empty data.
    3. Immediately parse the JSON response from that first `call_querydata_api` call.
    4. Format your final response to the user containing:
       - The generated SQL query (formatted in a Markdown SQL code block).
       - The query results formatted as a Markdown table (constructed from `queryResult.columns` and `queryResult.rows`).
       - The natural language answer (`naturalLanguageAnswer`).
    """,
    tools=[call_querydata_api, skill_toolset],
)

ตรวจสอบ data_agent/SKILL.md เพื่อทำความเข้าใจวิธีการของระบบสำหรับเอเจนต์

REPO_NAME="codelabs"
SOURCE_DIR="alloydb-ai-nla"
cd ~/$REPO_NAME/$SOURCE_DIR/data_agent
edit SKILL.md

ก่อนเริ่มเอเจนต์ คุณต้องเตรียมไฟล์ .env ที่มีพารามิเตอร์สำหรับคำขอ Agent และ QueryData API

ส่งออกรหัสชุดบริบทไปยังตัวแปรสภาพแวดล้อม

export QUERYDATA_CONTEXTSET=<context set id from the Create Context Set chapter>

สร้างไฟล์การกำหนดค่าสภาพแวดล้อมรันไทม์ (.env) ในไดเรกทอรี data_agent โดยทำดังนี้

PROJECT_ID=$(gcloud config get-value project)
REGION=us-central1
REPO_NAME="codelabs"
SOURCE_DIR="alloydb-ai-nla"
cd ~/$REPO_NAME/$SOURCE_DIR/data_agent
echo "GOOGLE_GENAI_USE_ENTERPRISE=true" > .env
echo "GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project -q)" >> .env
echo "GOOGLE_CLOUD_LOCATION=global" >> .env
echo "QUERYDATA_CONTEXTSET=$QUERYDATA_CONTEXTSET" >> .env
echo "ALLOYDB_CLUSTER=alloydb-aip-01" >> .env
echo "ALLOYDB_INSTANCE=alloydb-aip-01-pr" >> .env
echo "ALLOYDB_DATABASE=quickstart_db" >> .env
echo "ALLOYDB_LOCATION=$REGION" >> .env

ติดตั้งการอ้างอิงและเริ่มบริการเว็บของ Agent โดยใช้คำสั่งต่อไปนี้

cd ~/$REPO_NAME/$SOURCE_DIR/
uv sync

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

uv run adk web --allow_origins 'regex:https://.*\.cloudshell\.dev'

คุณควรเห็นเอาต์พุตดังต่อไปนี้พร้อมกับปลายทาง http://127.0.0.1:8000

INFO:     Started server process [83608]
INFO:     Waiting for application startup.

+-----------------------------------------------------------------------------+
| ADK Web Server started                                                      |
|                                                                             |
| For local testing, access at http://127.0.0.1:8000.                         |
+-----------------------------------------------------------------------------+

INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

4aa60270e31efe37.jpeg

คลิก URL ของเว็บเซิร์ฟเวอร์ที่สร้างขึ้น (เช่น http://127.0.0.1:8000) ใน Cloud Shell เพื่อเปิดอินเทอร์เฟซของเอเจนต์ หากไม่ได้ผล ให้คลิกตัวอย่างเว็บ -> แสดงตัวอย่างบนพอร์ต 8000 ใน Cloud Shell เพื่อเปิดอินเทอร์เฟซของตัวแทน

ตรวจสอบว่าได้เลือก data_agent ในเมนูแบบเลื่อนลงด้านซ้ายบน

ad695db289666da3.jpeg

สร้างและเรียกใช้การค้นหา

มาเรียกใช้การค้นหา Q1 กัน

เรียกใช้พรอมต์ภาษาธรรมชาตินี้ในอินเทอร์เฟซแชทของเอเจนต์เพื่อประเมินประสิทธิภาพ QueryData พื้นฐานโดยไม่ต้องใช้เทมเพลตหรือแง่มุมที่กำหนดเอง

How many properties are currently for sale in San Diego?

แล้วกดปุ่มลูกศร

77773a81de6360a2.jpeg

โดยจะเริ่มเวิร์กโฟลว์ของ Agent เมื่อเลือกทักษะที่เหมาะสมและใช้ทักษะและฟังก์ชันนั้นเพื่อส่งคำขอไปยังปลายทาง API และรับคำค้นหาและผลลัพธ์ที่สร้างขึ้นกลับมา

de9b3e4854b9a506.jpeg

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

605dcf936ba38cb8.jpeg

ส่งคำค้นหาติดตามผล (คำถามที่ 2)

List agents who sold a property for over $1000000.

คุณจะเห็นว่าเอเจนต์จะไปที่ทักษะ QueryData API โดยตรง เนื่องจากได้เขียนทักษะที่มีอยู่ลงในหน่วยความจำแล้ว และไม่จำเป็นต้องผ่านขั้นตอนการค้นพบอีก

SQL ที่สร้างขึ้นจะมีลักษณะคล้ายกับคำสั่งต่อไปนี้

SELECT DISTINCT "a"."agent_id", "a"."firstname", "a"."lastname", "a"."email", "a"."brokerage" 
FROM "real_estate"."agents" AS "a" 
INNER JOIN "real_estate"."property_transactions" AS "t" ON "a"."agent_id" = "t"."seller_agent_id" 
WHERE "t"."sale_price" > 1000000 AND "a"."agent_id" IS NOT NULL 
ORDER BY "a"."lastname" ASC NULLS LAST;

ลองใช้คำค้นหาอื่น (Q3)

What is the average price of a single-family home with a garage in San Diego?

QueryData จะสร้างคําค้นหามาตรฐานที่มีชุดบริบทว่างเปล่า แต่โดยทั่วไปแล้วงานทางธุรกิจมักต้องใช้ตรรกะทางธุรกิจที่เฉพาะเจาะจงและลักษณะการทํางานที่แน่นอน

8. เพิ่มความแม่นยำและความเกี่ยวข้องกับธุรกิจด้วยการแทรกการตีความ

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

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

ลองใช้พรอมต์ภาษาธรรมชาติ (Q4) ต่อไปนี้ในเอเจนต์

Single level Del Mar houses

เครื่องมือจะแสดงคำค้นหาทั่วไป แต่อาจมีเงื่อนไขเพิ่มเติมบางอย่าง เช่น is_single_family = TRUE

SELECT p."property_id", p."address_street", p."price", p."bedrooms", p."bathrooms", p."listing_status", p."is_single_family", p."num_stories", c."city_name" 
FROM "real_estate"."properties" AS p 
JOIN "real_estate"."cities" AS c ON p."city_id" = c."city_id" 
WHERE c."city_name" ILIKE 'Del Mar' AND p."num_stories" = 1 AND p."is_single_family" = TRUE 
ORDER BY p."property_id" ASC NULLS LAST;

เราจะได้รับแถวที่แสดงผล 1 แถวเป็นผลลัพธ์

Natural Language Answer
The database contains one single-level, single-family house in Del Mar:

Address: 999 Main Ave (Postal Code: 90024)
Price: $3,800,000.00
Bedrooms: 4
Bathrooms: 3.5
Listing Status: Active
Features: Single-family home (1 story), has a garage, and no condo fees.

ทดสอบพรอมต์อื่น (คำถามที่ 5)

Del Mar houses close to good schools

โดยจะใช้คอลัมน์ proximity_miles และ school_ranking เพื่อจัดเรียงพร็อพเพอร์ตี้ แต่จะไม่ประเมินน้ำหนักและความสําคัญของเมตริกแต่ละรายการ

SELECT "p"."property_id", "p"."address_street", "p"."price", "p"."bedrooms", "p"."bathrooms", "s"."school_name", "s"."school_ranking", "sp"."proximity_miles" 
FROM "real_estate"."properties" AS "p" 
INNER JOIN "real_estate"."cities" AS "c" ON "p"."city_id" = "c"."city_id" 
INNER JOIN "real_estate"."school_to_property" AS "sp" ON "p"."property_id" = "sp"."property_id" 
INNER JOIN "real_estate"."schools" AS "s" ON "sp"."school_id" = "s"."school_id" 
WHERE "c"."city_name" = 'Del Mar' AND "sp"."proximity_miles" IS NOT NULL AND "s"."school_ranking" IS NOT NULL 
ORDER BY "sp"."proximity_miles" ASC NULLS LAST, "s"."school_ranking" ASC NULLS LAST;

สร้างเทมเพลตจากคำค้นหาตัวอย่าง

ตรรกะทางธุรกิจกำหนดให้ทำดังนี้

  • อยู่ภายใน 2 ไมล์
  • การจัดอันดับโรงเรียนที่ 5 หรือต่ำกว่า
  • การจัดลำดับแบบถ่วงน้ำหนัก: การจัดอันดับโรงเรียน 80% + ความใกล้เคียง 20% (คะแนน = 0.8 * school_ranking + 0.2 * proximity_miles)

สูตรการจัดอันดับแบบถ่วงน้ำหนักมีดังนี้

‬‭‬‭‬‭‬‭‬Score = 0.8 * school_ranking + 0.2 * proximity_miles

ดาวน์โหลดไฟล์บริบท sixrecipe_context1_1.json จาก Cloud Shell โดยใช้อินเทอร์เฟซบรรทัดคำสั่งใน Cloud Shell ดังนี้

cloudshell download ~/codelabs/alloydb-ai-nla/sixrecipe_context1_1.json

หรือใช้รายการในเมนู Download จากเมนู Cloud Shell

c0d781806d966dcb.jpeg

อัปโหลด sixrecipe_context1_1.json ลงในชุดบริบท sixrecipe โดยใช้ AlloyDB Studio เพื่อกำหนดโครงสร้างมาตรฐานนี้ คลิกจุด 3 จุดทางด้านขวาของsixrecipesบริบท แล้วใช้ "แก้ไขชุดบริบท" เพื่ออัปโหลดไฟล์ใหม่ ซึ่งจะแทนที่บริบทว่างเปล่าเก่าด้วยบริบทใหม่ได้อย่างมีประสิทธิภาพ

เทมเพลตจะกำหนดกฎเทมเพลต SQL ที่ชัดเจนสำหรับกฎระยะใกล้ของโรงเรียนที่ดี ดังนี้

{
  "facets": [],
  "templates": [
    {
      "nl_query": "Riverside houses close to good schools.",
      "sql": "SELECT \"p\".\"address_street\", \"p\".\"address_postal_code\", \"s\".\"school_name\", \"stp\".\"proximity_miles\" FROM \"real_estate\".\"properties\" AS \"p\" JOIN \"real_estate\".\"cities\" AS \"c\" ON \"p\".\"city_id\" = \"c\".\"city_id\" JOIN \"real_estate\".\"school_to_property\" AS \"stp\" ON \"p\".\"property_id\" = \"stp\".\"property_id\" JOIN \"real_estate\".\"schools\" AS \"s\" ON \"stp\".\"school_id\" = \"s\".\"school_id\" WHERE \"c\".\"city_name\" = 'Riverside' AND \"s\".\"school_ranking\" <= 5 AND \"stp\".\"proximity_miles\" <= 2 ORDER BY 0.8 * \"s\".\"school_ranking\" + 0.2 * \"stp\".\"proximity_miles\"",
      "intent": "Houses in Riverside close to good schools (within 2 miles of schools with a rank of at least 5).",
      "manifest": "A given city houses close to good schools.",
      "parameterized": {
        "parameterized_intent": "Houses in $1 close to good schools (within 2 miles of schools with a rank of at least 5).",
        "parameterized_sql": "SELECT \"p\".\"address_street\", \"p\".\"address_postal_code\", \"s\".\"school_name\", \"stp\".\"proximity_miles\" FROM \"real_estate\".\"properties\" AS \"p\" JOIN \"real_estate\".\"cities\" AS \"c\" ON \"p\".\"city_id\" = \"c\".\"city_id\" JOIN \"real_estate\".\"school_to_property\" AS \"stp\" ON \"p\".\"property_id\" = \"stp\".\"property_id\" JOIN \"real_estate\".\"schools\" AS \"s\" ON \"stp\".\"school_id\" = \"s\".\"school_id\" WHERE \"c\".\"city_name\" = $1 AND \"s\".\"school_ranking\" <= 5 AND \"stp\".\"proximity_miles\" <= 2 ORDER BY 0.8 * \"s\".\"school_ranking\" + 0.2 * \"stp\".\"proximity_miles\""
      }
    }
  ]
}

เรียกใช้พรอมต์อีกครั้ง

Del Mar houses close to good schools

ตอนนี้คำค้นหาที่ได้จะตรงกับตรรกะทางธุรกิจที่กำหนดไว้ในเทมเพลต

SELECT "p"."address_street", "p"."address_postal_code", "s"."school_name", "stp"."proximity_miles" 
FROM "real_estate"."properties" AS "p" 
JOIN "real_estate"."cities" AS "c" ON "p"."city_id" = "c"."city_id" 
JOIN "real_estate"."school_to_property" AS "stp" ON "p"."property_id" = "stp"."property_id" 
JOIN "real_estate"."schools" AS "s" ON "stp"."school_id" = "s"."school_id" 
WHERE "c"."city_name" = 'Del Mar' AND "s"."school_ranking" <= 5 AND "stp"."proximity_miles" <= 2 
ORDER BY 0.8 * "s"."school_ranking" + 0.2 * "stp"."proximity_miles"

นอกเหนือจากคำสั่ง SQL ที่สร้างขึ้นแล้ว ระบบจะสร้างเจตนาต่อไปนี้ด้วย

intentExplanation: "Houses in Del Mar close to good schools (within 2 miles of schools with a rank of at least 5)."

คุณดูเจตนาได้ที่แผงด้านซ้ายของอินเทอร์เฟซเว็บ ADK ดังที่แสดงที่นี่

bfb9d6bc718f57cf.jpeg

ผลลัพธ์แสดงที่พัก 2 แห่งที่จัดเรียงตามคะแนนของเรา

Query Results
address_street        address_postal_code        school_name        proximity_miles
200 Coast Blvd        92014        Del Mar Heights Elementary        0.50
100 Del Mar Heights Rd        92014        Del Mar Heights Elementary        1.00
Answer
Based on the data, here are the properties in Del Mar located within 2 miles of a top-rated school (ranking of 5 or better):

200 Coast Blvd (92014)

School: Del Mar Heights Elementary
Proximity: 0.50 miles
100 Del Mar Heights Rd (92014)

School: Del Mar Heights Elementary
Proximity: 1.00 miles

ในบทถัดไป คุณจะขยายขอบเขตของเทมเพลต

แทรกการตีความโดยการบันทึกและตีความคำถามหลายข้อ

คุณสามารถขยายขอบเขตของเทมเพลตเพื่อให้ใช้ได้ไม่เพียงแค่ "ใกล้โรงเรียนดีๆ" แต่ยังเพิ่มเงื่อนไขอื่นๆ ลงในไฟล์ Manifest เพื่อใช้กับ "บ้านสำหรับครอบครัวที่มีเด็ก" เป็นต้น

ดาวน์โหลดไฟล์บริบทที่อัปเดตแล้ว

cloudshell download ~/codelabs/alloydb-ai-nla/sixrecipe_context1_2.json

อัปโหลดไฟล์ sixrecipe_context1_2.json ที่อัปเดตแล้วไปยังชุดบริบท

ในไฟล์ชุดบริบทใหม่ เราจะแทนที่ไฟล์ Manifest จาก "manifest": "A given city houses close to good schools." เป็นไฟล์ Manifest "manifest": "A given city houses close to good schools, or are great for families with kids." ซึ่งจะขยายการใช้งานเทมเพลตนี้ให้ใช้ได้มากกว่า 1 กรณี

ส่งคำค้นหานี้ (Q6)

Houses in Waterloo great for families with kids.

เอเจนต์ใช้ไฟล์ Manifest ของเทมเพลตที่อัปเดตแล้วเพื่อใช้ตรรกะการค้นหาที่ได้มาตรฐาน ซึ่งจะแสดงผลการค้นหาเดียวกันกับด้านบน โดยมีจุดประสงค์ดังนี้

intentExplanation
:
"Houses in Waterloo close to good schools (within 2 miles of schools with a rank of at least 5)."

9. ใช้เทมเพลตแบบเจียระไนเพื่อให้ได้ความแม่นยำสูงในขณะที่ยังคงความยืดหยุ่น

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

แทนที่จะสร้างเทมเพลตสําหรับการค้นหาหรือเงื่อนไขแต่ละรายการ เราสามารถเตรียมส่วนย่อยที่จะนําไปใช้กับเทมเพลตที่มีอยู่เพื่อเพิ่มมิติข้อมูลลงในการค้นหาได้

กำหนด Facet สำหรับพร็อพเพอร์ตี้ที่มีแอตทริบิวต์ต่อไปนี้

  • บ้านเดี่ยว
  • สถานะข้อมูลที่ใช้งานอยู่
  • ห้องนอน 3-4 ห้องและห้องน้ำอย่างน้อย 2 ห้อง
  • สถานที่ตั้งในเขตเทศบาลที่มีอัตราการเกิดอาชญากรรมต่ำกว่า 500 ต่อประชากร 100,000 คน

ดาวน์โหลดไฟล์บริบทแบบเจียระไน

cloudshell download ~/codelabs/alloydb-ai-nla/sixrecipe_context2_1.json

อัปโหลด sixrecipe_context2_1.json ไปยังชุดบริบท sixrecipes ใน AlloyDB Studio เพื่อกำหนดค่าแง่มุม

  "facets": [
    {
      "sql_snippet": "real_estate.properties.is_single_family = TRUE AND real_estate.properties.listing_status = 'Active' AND real_estate.properties.bedrooms BETWEEN 3 AND 4 AND real_estate.properties.bathrooms >= 2.0 AND 500 > (SELECT m.crime_rate_per_100k FROM real_estate.cities c JOIN real_estate.municipalities m ON c.municipality_id = m.municipality_id AND c.city_id = real_estate.properties.city_id)",
      "intent": "for a starter family (active single-family home listings with 3 to 4 bedrooms, 2+ bathrooms, and a crime rate under 500 per 100,000 residents)",
      "manifest": "for a starter family",
      "parameterized": {
        "parameterized_intent": "for a starter family (active single-family home listings with 3 to 4 bedrooms, 2+ bathrooms, and a crime rate under 500 per 100,000 residents)",
        "parameterized_sql_snippet": "real_estate.properties.is_single_family = TRUE AND real_estate.properties.listing_status = 'Active' AND real_estate.properties.bedrooms BETWEEN 3 AND 4 AND real_estate.properties.bathrooms >= 2.0 AND 500 > (SELECT m.crime_rate_per_100k FROM real_estate.cities c JOIN real_estate.municipalities m ON c.municipality_id = m.municipality_id AND c.city_id = real_estate.properties.city_id)"
      }
    }
  ]

เรียกใช้การค้นหาด้วยภาษาธรรมชาติ (NL) นี้ (Q7)

Del Mar houses close to good schools for a starter family.

เครื่องมือจะต่อท้ายเงื่อนไขของกลุ่มโดยตรงกับการค้นหาฐาน

SELECT "p"."address_street", "p"."address_postal_code", "s"."school_name", "stp"."proximity_miles" 
FROM "real_estate"."properties" AS "p" 
JOIN "real_estate"."cities" AS "c" ON "p"."city_id" = "c"."city_id" 
JOIN "real_estate"."school_to_property" AS "stp" ON "p"."property_id" = "stp"."property_id" 
JOIN "real_estate"."schools" AS "s" ON "stp"."school_id" = "s"."school_id" 
WHERE "c"."city_name" = 'Del Mar' 
  AND "s"."school_ranking" <= 5 
  AND "stp"."proximity_miles" <= 2 
  AND "p"."is_single_family" = TRUE 
  AND "p"."listing_status" = 'Active' 
  AND "p"."bedrooms" BETWEEN 3 AND 4 
  AND "p"."bathrooms" >= 2.0 
  AND 500 > (
    SELECT m.crime_rate_per_100k 
    FROM real_estate.cities c 
    JOIN real_estate.municipalities m ON c.municipality_id = m.municipality_id 
    AND c.city_id = p.city_id
  ) 
ORDER BY 0.8 * "s"."school_ranking" + 0.2 * "stp"."proximity_miles"

ผลลัพธ์ที่ได้มีดังนี้

Query Results
address_street        address_postal_code        school_name        proximity_miles
200 Coast Blvd        92014        Del Mar Heights Elementary        0.50
Natural Language Answer
Based on your criteria, there is an active listing for a single-family house in Del Mar that fits your needs:

Address: 200 Coast Blvd, Del Mar, 92014
Nearby School: Del Mar Heights Elementary (ranked within the top 5)
Proximity to School: 0.50 miles

การเพิ่มแง่มุมอื่นๆ

จะเกิดอะไรขึ้นหากเราต้องการเพิ่มมิติข้อมูลอีก 1 รายการตามรูปแบบใหม่ที่เพิ่งเกิดขึ้น เช่น มุมมองหน้าต่างสำหรับพร็อพเพอร์ตี้

เพิ่มการจับคู่ความหมายของวิวทะเลภายในคำจำกัดความของแง่มุม

    {
      "sql_snippet": "((real_estate.properties.description_embedding <=> google_ml.embedding('gemini-embedding-001', 'unobstructed, panoramic, ocean vista, vast Pacific, breathtaking, commanding view, deep blue horizon, massive, sweeping view')::vector) < 0.4)",
      "intent": "with ocean view",
      "manifest": "with ocean view",
      "parameterized": {
        "parameterized_intent": "with ocean view",
        "parameterized_sql_snippet": "((real_estate.properties.description_embedding <=> google_ml.embedding('gemini-embedding-001', 'unobstructed, panoramic, ocean vista, vast Pacific, breathtaking, commanding view, deep blue horizon, massive, sweeping view')::vector) < 0.4)"
      }

ค่า 0.4 ในคำจำกัดความของแง่มุมข้างต้นคือเกณฑ์ที่ปรับเทียบโดยการทดลอง ดาวน์โหลดไฟล์บริบทแบบหลายแง่มุม

cloudshell download ~/codelabs/alloydb-ai-nla/sixrecipe_context2_2.json

อัปโหลด sixrecipe_context2_2.json ไปยังชุดบริบทแล้วเรียกใช้พรอมต์นี้ (Q8)

Ocean view Del Mar homes near good schools.

เอาต์พุตประกอบด้วยเงื่อนไขมาตรฐานที่รวมกับการจับคู่ความคล้ายคลึงของเวกเตอร์ผ่าน google_ml.embedding

SELECT "p"."address_street", "p"."address_postal_code", "s"."school_name", "stp"."proximity_miles" 
FROM "real_estate"."properties" AS "p" 
JOIN "real_estate"."cities" AS "c" ON "p"."city_id" = "c"."city_id" 
JOIN "real_estate"."school_to_property" AS "stp" ON "p"."property_id" = "stp"."property_id" 
JOIN "real_estate"."schools" AS "s" ON "stp"."school_id" = "s"."school_id" 
WHERE "c"."city_name" = 'Del Mar' AND "s"."school_ranking" <= 5 AND "stp"."proximity_miles" <= 2 
AND (((p.description_embedding <=> google_ml.embedding('gemini-embedding-001', 'unobstructed, panoramic, ocean vista, vast Pacific, breathtaking, commanding view, deep blue horizon, massive, sweeping view')::vector) <= 0.4)) 
ORDER BY 0.8 * "s"."school_ranking" + 0.2 * "stp"."proximity_miles";

และคําค้นหาจะแสดงผลพร็อพเพอร์ตี้ 1 รายการ

Query Results
address_street        address_postal_code        school_name        proximity_miles
100 Del Mar Heights Rd        92014        Del Mar Heights Elementary        1.00
Answer
The ocean-view home in Del Mar near a top-ranked school is located at 100 Del Mar Heights Rd (92014).

It is situated just 1.00 mile away from Del Mar Heights Elementary, which is one of the area's highly-ranked schools (ranking of 5 or better).

ยืนยันผลลัพธ์โดยตรวจสอบคำอธิบายของพร็อพเพอร์ตี้ใน AlloyDB Studio และเรียกใช้การค้นหาต่อไปนี้

select description from real_estate.properties where address_postal_code='92014' and description is not null;

โดยจะแสดงคำอธิบายที่มีข้อความ "ปรากฏการณ์ทางทะเลที่งดงาม"

Well-located 2-bedroom condo with excellent proximity to coastal shopping and dining. The balcony provides a magnificent marine spectacle against an azure backdrop. Under contract, high monthly HOA fee.

10. การแยกความกำกวมของข้อมูลส่วนตัวโดยใช้การค้นหาค่า

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

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

ความคลุมเครือในคำค้นหา

ในชีวิตจริง การค้นหาอาจยากยิ่งขึ้นเนื่องจากมีการสะกดชื่อและสถานที่ต่างๆ ผิด เรียกใช้พรอมต์นี้ (Q9) ซึ่งมีคำที่สะกดผิดและคำที่คลุมเครือ

Westwod's sold properties in the last 1 month.

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

SELECT "p"."property_id", "p"."address_street", "p"."address_postal_code", "p"."price" AS "listing_price", "p"."bedrooms", "p"."bathrooms", "p"."listing_status", "pt"."sale_date", "pt"."sale_price", "c"."city_name" FROM "real_estate"."properties" AS "p" INNER JOIN "real_estate"."property_transactions" AS "pt" ON "p"."property_id" = "pt"."property_id" INNER JOIN "real_estate"."cities" AS "c" ON "p"."city_id" = "c"."city_id" WHERE ("c"."city_name" ILIKE '%Westwood%' OR "c"."city_name" ILIKE '%Westwod%') AND "pt"."sale_date" >= '2025-09-01'::date AND "pt"."sale_date" <= '2025-09-30'::date ORDER BY "pt"."sale_date" DESC NULLS LAST, "pt"."sale_price" DESC NULLS LAST

โดยได้แก้ไขชื่อและสันนิษฐานว่าคำถามนี้เกี่ยวกับสถานที่ตั้งของที่พักที่พยายามจับคู่ที่พักในเมืองเวสต์วูด

เปิดใช้ส่วนขยาย pg_trgm ใน AlloyDB Studio เพื่อรองรับการเปรียบเทียบสตริงแบบคร่าวๆ โดยทำดังนี้

CREATE EXTENSION IF NOT EXISTS pg_trgm;

หลังจากนั้นเราจะใช้ส่วนขยายเพื่อเพิ่มการค้นหามูลค่าลงในชุดบริบท QueryData ได้

รายการการค้นหาค่าที่เราต้องการใช้มีดังนี้

"value_searches": [
    {
      "conceptType": "Municipality name",
      "query": "/* Requires extension: pg_trgm */ WITH TrigramMetrics AS (SELECT T.municipality_name AS original_value, (T.municipality_name % $value::text) AS normalized_dist FROM real_estate.municipalities T WHERE T.municipality_name % $value::text) SELECT original_value AS value, 'real_estate.municipalities.municipality_name' AS columns, 'Name of the municipality' AS concept_type, normalized_dist AS distance, ''::text AS context FROM TrigramMetrics",
      "description": "Trigram match for municipality name"
    },
    {
      "conceptType": "City name",
      "query": "/* Requires extension: pg_trgm */ WITH TrigramMetrics AS (SELECT T.city_name AS original_value, (T.city_name % $value::text) AS normalized_dist FROM real_estate.cities T WHERE T.city_name % $value::text) SELECT original_value AS value, 'real_estate.cities.city_name' AS columns, 'Name of the city' AS concept_type, normalized_dist AS distance, ''::text AS context FROM TrigramMetrics",
      "description": "Trigram match for city name"
    },
    {
      "conceptType": "Brokerage name",
      "query": "/* Requires extension: pg_trgm */ WITH TrigramMetrics AS (SELECT T.brokerage AS original_value, (T.brokerage % $value::text) AS normalized_dist FROM real_estate.agents T WHERE T.brokerage % $value::text) SELECT original_value AS value, 'real_estate.agents.brokerage' AS columns, 'Name of the brokerage' AS concept_type, normalized_dist AS distance, ''::text AS context FROM TrigramMetrics",
      "description": "Trigram match for brokerage name"
    }
  ]

ดาวน์โหลดไฟล์บริบทการค้นหาค่า

cloudshell download ~/codelabs/alloydb-ai-nla/sixrecipe_context3_1.json

อัปโหลด sixrecipe_context3_1.json ไปยังชุดบริบท QueryData sixrecipes แล้วบันทึก

เรียกใช้พรอมต์อีกครั้ง (คำถามที่ 9)

Westwod's sold properties in the last 1 month.

ระบบแสดงคำตอบที่ชี้แจงเนื่องจากในการค้นหาค่า ระบบพบเอนทิตี 3 รายการที่มีค่าคล้ายกัน ดังนี้

The database requires some clarification to provide the exact information you need:

The search term 'Westwod' (Westwood) is ambiguous because it can refer to:

A municipality name (e.g., the municipality of Westwood)
A city name (e.g., the city of Westwood)
A brokerage name (e.g., properties sold by agents affiliated with the Westwood brokerage)
Could you please clarify which of these you are referring to?

การติดตามจะให้เบาะแสว่าเหตุใดจึงเลือกเส้นทางนั้น

88c52932dcbef8f9.jpeg

ข้อความทั้งหมดมีดังนี้

"[NOT_ENOUGH_INFO] The search term 'Westwod' is ambiguous because it can refer to a municipality name, a city name, or a brokerage name. Could you please clarify if you are referring to properties sold within the municipality of Westwood, the city of Westwood, or properties sold by agents affiliated with the Westwood brokerage?"

การขจัดความคลุมเครือออกจากคำค้นหา

ปรับแต่งพรอมต์อินพุต (Q10):

Westwood city location properties sold in September 2025.

ตอนนี้เรามีคำค้นหาและผลลัพธ์แล้ว

Generated SQL
SELECT "p"."property_id", "p"."address_street", "p"."address_postal_code", "p"."price", "pt"."sale_date", "pt"."sale_price" 
FROM "real_estate"."properties" AS "p" 
INNER JOIN "real_estate"."cities" AS "c" ON "p"."city_id" = "c"."city_id" 
INNER JOIN "real_estate"."property_transactions" AS "pt" ON "p"."property_id" = "pt"."property_id" 
WHERE "c"."city_name" = 'Westwood' 
  AND "pt"."sale_date" >= '2025-09-01'::date 
  AND "pt"."sale_date" <= '2025-09-30'::date 
ORDER BY "pt"."sale_date" ASC NULLS LAST

Query Results
property_id        address_street        address_postal_code        price        sale_date        sale_price
32        999 Main St        99999        3800000.00        2025-09-12        1000000.00

11. การค้นหาเชิงความหมายและฟังก์ชัน AI

ฟังก์ชัน AlloyDB AI ช่วยให้กรองเชิงความหมายในข้อมูลที่ไม่มีโครงสร้างได้ ใช้ฟังก์ชันต่างๆ เช่น ai.if และ google_ml.embedding โดยตรงในการค้นหา SQL ควบคู่ไปกับโอเปอเรเตอร์ฐานข้อมูลมาตรฐาน

เทมเพลตที่มีโอเปอเรเตอร์ ILIKE

ในขั้นตอนแรก ให้อัปโหลดไฟล์บริบทใหม่ที่มีตัวดำเนินการ ILIKE

ดาวน์โหลดไฟล์บริบทเทมเพลต ILIKE โดยทำดังนี้

cloudshell download ~/codelabs/alloydb-ai-nla/sixrecipe_context4_1.json

อัปโหลด sixrecipe_context4_1.json ไปยังชุดบริบทเพื่อประเมินการจับคู่รูปแบบ ILIKE มาตรฐานสำหรับบ้านที่ "พร้อมเข้าอยู่"

    {
      "nl_query": "Move-in ready houses",
      "sql": "SELECT \"p\".\"address_street\", \"p\".\"address_postal_code\" FROM \"real_estate\".\"properties\" AS \"p\" WHERE \"p\".listing_status = 'Active' AND \"p\".\"description\" IS NOT NULL AND (\"p\".description ILIKE '%turnkey%' OR \"p\".description ILIKE '%move-in%')",
      "intent": "Move-in ready houses",
      "manifest": "Move-in ready houses",
      "parameterized": {
        "parameterized_intent": "Move-in ready houses",
        "parameterized_sql": "SELECT \"p\".\"address_street\", \"p\".\"address_postal_code\" FROM \"real_estate\".\"properties\" AS \"p\" WHERE \"p\".listing_status = 'Active' AND \"p\".\"description\" IS NOT NULL AND (\"p\".description ILIKE '%turnkey%' OR \"p\".description ILIKE '%move-in%')"
      }
    }

ส่งคำค้นหานี้ (Q11)

List move-in ready houses.

คำค้นหาที่ได้

SELECT "p"."address_street", "p"."address_postal_code" 
FROM "real_estate"."properties" AS "p" 
WHERE "p".listing_status = 'Active' 
  AND "p"."description" IS NOT NULL 
  AND ("p".description ILIKE '%turnkey%' OR "p".description ILIKE '%move-in%')

โดยจะแสดงผลระเบียนที่ตรงกัน 1 รายการ

Query Results
address_street        address_postal_code
40 Main St, Unit 8        N2H 2G8

เทมเพลตที่มีฟังก์ชัน AI.IF

ดาวน์โหลดไฟล์บริบทเทมเพลต AI.IF

cloudshell download ~/codelabs/alloydb-ai-nla/sixrecipe_context4_2.json

อัปโหลด sixrecipe_context4_2.json ไปยังชุดบริบทเพื่อประเมินฟังก์ชันการกรองเชิงความหมาย ai.if

    {
      "nl_query": "List Move-in ready houses",
      "sql": "SELECT \"p\".\"address_street\", \"p\".\"address_postal_code\" FROM \"real_estate\".\"properties\" AS \"p\" WHERE \"p\".listing_status = 'Active' AND \"p\".\"description\" IS NOT NULL AND ai.if('Does this description represent a move-in ready house? Description: ' || \"p\".\"description\")",
      "intent": "List Move-in ready houses",
      "manifest": "List Move-in ready houses",
      "parameterized": {
        "parameterized_intent": "List Move-in ready houses",
        "parameterized_sql": "SELECT \"p\".\"address_street\", \"p\".\"address_postal_code\" FROM \"real_estate\".\"properties\" AS \"p\" WHERE \"p\".listing_status = 'Active' AND \"p\".\"description\" IS NOT NULL AND ai.if('Does this description represent a move-in ready house? Description: ' || \"p\".\"description\")"
      }
    }

พูดพรอมต์ซ้ำ (Q12):

List move-in ready houses.

SQL ที่สร้างขึ้น:

SELECT "p"."address_street", "p"."address_postal_code" 
FROM "real_estate"."properties" AS "p" 
WHERE "p".listing_status = 'Active' 
  AND "p"."description" IS NOT NULL 
  AND ai.if('Does this description represent a move-in ready house? Description: ' || "p"."description")

ซึ่งจะทำให้เราได้พร็อพเพอร์ตี้เดียวกันในผลลัพธ์

Query Results
Address Street        Address Postal Code
40 Main St, Unit 8        N2H 2G8
Natural Language Answer
The move-in ready home currently available is located at:

Address: 40 Main St, Unit 8
Postal Code: N2H 2G8

ดาวน์โหลดไฟล์บริบทการค้นหาสำหรับการฝัง

cloudshell download ~/codelabs/alloydb-ai-nla/sixrecipe_context4_3.json

อัปโหลด sixrecipe_context4_3.json ไปยังชุดบริบทเพื่อประเมินการค้นหาเวกเตอร์เชิงความหมายโดยใช้ google_ml.embedding และค้นหาบ้านที่มีเครื่องใช้ในครัวใหม่

อัปเดตชุดบริบทโดยใช้ไฟล์ sixrecipe_context4_3.json พร้อมแง่มุมเพิ่มเติมโดยใช้การค้นหาเวกเตอร์ของ AlloyDB

    {
      "sql_snippet": "((real_estate.properties.description_embedding <=> google_ml.embedding('gemini-embedding-001', 'Upgraded kitchen appliances')::vector) < 0.4)",
      "intent": "with upgraded kitchen appliances",
      "manifest": "with upgraded kitchen appliances",
      "parameterized": {
        "parameterized_intent": "with upgraded kitchen appliances",
        "parameterized_sql_snippet": "((real_estate.properties.description_embedding <=> google_ml.embedding('gemini-embedding-001', 'Upgraded kitchen appliances')::vector) < 0.4)"
      }
    }

ค่า 0.4 ในคำจำกัดความของแง่มุมข้างต้นคือเกณฑ์ที่ปรับเทียบโดยการทดลอง

เรียกใช้การค้นหานี้ (Q13)

List move-in ready houses with upgraded kitchen appliances.

SQL ที่สร้างขึ้น:

SELECT "p"."address_street", "p"."address_postal_code" FROM "real_estate"."properties" AS "p" WHERE "p"."listing_status" = 'Active' AND "p"."description" IS NOT NULL AND ai.if('Does this description represent a Move-in ready house? Description: ' || "p"."description") AND ((("p"."description_embedding" <=> google_ml.embedding('gemini-embedding-001', 'Upgraded kitchen appliances')::vector) < 0.4))

นี่คือผลการค้นหาและคำแนะนำภาษาธรรมชาติ

Query Results
Address        Postal Code
40 Main St, Unit 8        N2H 2G8
Natural Language Answer
The move-in ready house with upgraded kitchen appliances is located at:

Address: 40 Main St, Unit 8
Postal Code: N2H 2G8

12. ความปลอดภัยและความเป็นส่วนตัว

ทุกครั้งที่ QueryData API สร้างคําค้นหา จะมีความเสี่ยงด้านความเป็นส่วนตัวที่คําค้นหาที่สร้างขึ้นอาจเปิดเผยข้อมูลของผู้ใช้รายอื่น มุมมองที่ปลอดภัยแบบพารามิเตอร์ (PSV) จะบังคับใช้ขอบเขตการรักษาความปลอดภัยระดับแถวระหว่างการสร้าง NL2SQL

สร้างมุมมองที่ปลอดภัยซึ่งมีพารามิเตอร์

เรามีตาราง real_estate.offers ที่มีข้อมูลเกี่ยวกับข้อเสนอสำหรับดีลอสังหาริมทรัพย์ทั้งหมด เราต้องการให้ตัวแทนเห็นเฉพาะดีลของตัวเอง แต่ไม่เห็นดีลของตัวแทนคนอื่นๆ เราสร้าง PSV ที่มีความสามารถในการกรองแถวตาม agent_id

สร้างมุมมองที่ปลอดภัยซึ่งมีพารามิเตอร์สำหรับตารางข้อเสนอใน AlloyDB Studio โดยทำดังนี้

CREATE VIEW real_estate.secure_offers
  WITH (security_barrier) AS
SELECT offer_id, property_id, buyer_agent_id,
    seller_agent_id, offer_amount, offer_date,
    offer_status, offer_expiration_date,
    contingencies
FROM real_estate.offers
WHERE buyer_agent_id = $@agent_id;

ตรวจสอบคำจำกัดความของมุมมองความปลอดภัยที่กำหนดพารามิเตอร์

SELECT definition
FROM parameterized_views.all_parameterized_views
WHERE schemaname = 'real_estate' AND viewname = 'secure_offers';

แล้วตาราง real_estate.offers ล่ะ

จำกัดการเข้าถึงข้อมูล QueryData โดยใช้มุมมองที่ปลอดภัยแบบพารามิเตอร์ของ AlloyDB

ใน agent.py ระบบจะลงทะเบียนมุมมองความปลอดภัยที่มีพารามิเตอร์ real_estate.secure_offers ใน TABLE_IDS แทนที่จะเป็น real_estate.offers

ซอร์สโค้ดของ agent.py

 List of database tables included in QueryData API requests
TABLE_IDS = [
    "real_estate.municipalities",
    "real_estate.cities",
    "real_estate.agents",
    "real_estate.properties",
    "real_estate.schools",
    "real_estate.school_to_property",
    "real_estate.property_transactions",
    "real_estate.secure_offers",
]

และส่งบริบทของรันไทม์เซสชันสำหรับ Agent ที่มี agent_id=1

            "parameterized_secure_view_parameters": {
                "parameters": {
                    "key": "agent_id",
                    "value": "1"
                }
            }
        },

ด้วยเหตุนี้ คำขอ QueryData API ทุกรายการจะส่งพารามิเตอร์ดังกล่าว และเมื่อรวมมุมมองที่ปลอดภัยไว้ในคำขอ ระบบจะใช้การกรองโดยแสดงเฉพาะผลลัพธ์สำหรับตัวแทนรายนั้นๆ

เรียกใช้การค้นหานี้ (Q14)

List the offer id and listing price in 2025 where the offer was within 5% of the final selling price.

SQL ที่สร้างขึ้น:

SELECT "o"."offer_id", "p"."price" AS "listing_price" 
FROM "real_estate"."secure_offers" AS "o" 
INNER JOIN "real_estate"."properties" AS "p" ON "o"."property_id" = "p"."property_id" 
INNER JOIN "real_estate"."property_transactions" AS "t" ON "o"."property_id" = "t"."property_id" 
WHERE "o"."offer_date" >= '2025-01-01' 
  AND "o"."offer_date" <= '2025-12-31' 
  AND "o"."offer_amount" IS NOT NULL 
  AND "t"."sale_price" IS NOT NULL 
  AND "p"."price" IS NOT NULL 
  AND ABS("o"."offer_amount" - "t"."sale_price") <= (0.05 * "t"."sale_price") 
ORDER BY "o"."offer_id" ASC NULLS LAST

การค้นหาในมุมมองจะกรองผลลัพธ์ตามพารามิเตอร์เซสชันของตัวแทนที่ใช้งานอยู่ ซึ่งจะช่วยปกป้องข้อมูลบันทึกที่ไม่ได้รับอนุญาตและแสดงเฉพาะ 2 บันทึก

Query Results
Offer ID        Listing Price
7        $750,000.00
8        $510,000.00
Natural Language Answer
Here are the offers from 2025 where the offer amount was within 5% of the final selling price:

Offer ID 7: Listing Price of $750,000.00
Offer ID 8: Listing Price of $510,000.00

หากคุณเรียกใช้การค้นหาต่อไปนี้กับตาราง real_estate.offers ฐานใน AlloyDB Studio

SELECT "o"."offer_id", "p"."price" AS "listing_price" 
FROM "real_estate"."offers" AS "o" 
INNER JOIN "real_estate"."properties" AS "p" ON "o"."property_id" = "p"."property_id" 
INNER JOIN "real_estate"."property_transactions" AS "t" ON "o"."property_id" = "t"."property_id" 
WHERE "o"."offer_date" >= '2025-01-01' 
  AND "o"."offer_date" <= '2025-12-31' 
  AND "o"."offer_amount" IS NOT NULL 
  AND "t"."sale_price" IS NOT NULL 
  AND "p"."price" IS NOT NULL 
  AND ABS("o"."offer_amount" - "t"."sale_price") <= (0.05 * "t"."sale_price") 
ORDER BY "o"."offer_id" ASC NULLS LAST

โดยจะแสดงระเบียนมากกว่า 2 รายการ ซึ่งแสดงข้อมูลของตัวแทนทั้งหมด

ห้องทดลองของเราก็มีเพียงเท่านี้ คุณได้เรียนรู้วิธีใช้ QueryData API, ฟังก์ชัน AI และมุมมองที่ปลอดภัยแบบพารามิเตอร์ของ AlloyDB แล้ว

13. ล้างสภาพแวดล้อม

ทำลายอินสแตนซ์และคลัสเตอร์ AlloyDB เมื่อคุณทำแล็บเสร็จแล้ว

ลบคลัสเตอร์ AlloyDB และอินสแตนซ์ทั้งหมด

คลัสเตอร์จะถูกทำลายด้วยตัวเลือก force ซึ่งจะลบอินสแตนซ์ทั้งหมดที่เป็นของคลัสเตอร์ด้วย

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

gcloud config set project <YOUR_PROJECT_ID>
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export PROJECT_ID=$(gcloud config get-value project)

ลบคลัสเตอร์

gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force

เอาต์พุตคอนโซลที่คาดไว้

student@cloudshell:~ (test-project-001-402417)$ gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force
All of the cluster data will be lost when the cluster is deleted.

Do you want to continue (Y/n)?  Y

Operation ID: operation-1697820178429-6082890a0b570-4a72f7e4-4c5df36f
Deleting cluster...done.   

ลบข้อมูลสำรองของ AlloyDB

ลบข้อมูลสำรอง AlloyDB ทั้งหมดสำหรับคลัสเตอร์

for i in $(gcloud alloydb backups list \
  --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" \
  --format="value(name)" \
  --sort-by=~createTime) ; do \
  gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done

เอาต์พุตคอนโซลที่คาดไว้

student@cloudshell:~ (test-project-001-402417)$ for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done
Operation ID: operation-1697826266108-60829fb7b5258-7f99dc0b-99f3c35f
Deleting backup...done.                                                                                                                                                                                                                                                            

ลบที่เก็บข้อมูล Cloud Storage

ลบที่เก็บข้อมูลนำเข้าของ Cloud Storage เพื่อป้องกันการเรียกเก็บเงินค่าพื้นที่เก็บข้อมูลอย่างต่อเนื่อง โดยทำดังนี้

gcloud storage rm -r gs://${PROJECT_ID}-import 

14. ขอแสดงความยินดี

ขอแสดงความยินดีที่ทำ Codelab เสร็จสมบูรณ์

สิ่งที่เราได้พูดถึงไปแล้ว

  • วิธีติดตั้งใช้งานคลัสเตอร์และอินสแตนซ์หลักของ AlloyDB
  • วิธีเปิดใช้ QueryData, ฟังก์ชัน AI และมุมมองที่ปลอดภัยแบบกำหนดพารามิเตอร์สำหรับ AlloyDB
  • วิธีสร้างชุดบริบท QueryData
  • วิธีใช้เทมเพลตและบริบทต่างๆ ใน QueryData API
  • วิธีทำให้เทมเพลต QueryData ยืดหยุ่นมากขึ้นโดยใช้ Facet
  • วิธีแก้ไขความคลุมเครือของข้อมูลด้วยการค้นหาค่าและการจัดทำดัชนีไตรแกรม
  • วิธีใช้ฟังก์ชัน AI สำหรับการค้นหาเชิงความหมายด้วยเทมเพลต
  • วิธีใช้มุมมองที่ปลอดภัยซึ่งกำหนดพารามิเตอร์ด้วย QueryData API

แบบสำรวจ

เอาต์พุต:

คุณจะใช้บทแนะนำนี้อย่างไร

อ่านอย่างเดียว อ่านและทำแบบฝึกหัดให้เสร็จ