1. บทนำ

Codelab นี้มีคำแนะนำในการติดตั้งใช้งาน AlloyDB และใช้ประโยชน์จากการผสานรวม AI สำหรับการค้นหาเชิงความหมายโดยใช้การฝังแบบหลายรูปแบบ ห้องทดลองนี้เป็นส่วนหนึ่งของคอลเล็กชันห้องทดลองที่มุ่งเน้นฟีเจอร์ AlloyDB AI ดูข้อมูลเพิ่มเติมได้ที่หน้า AlloyDB AI ในเอกสารประกอบ
ข้อกำหนดเบื้องต้น
- ความเข้าใจพื้นฐานเกี่ยวกับ Google Cloud และคอนโซล
- ทักษะพื้นฐานในอินเทอร์เฟซบรรทัดคำสั่งและ Cloud Shell
สิ่งที่คุณจะได้เรียนรู้
- วิธีติดตั้งใช้งาน AlloyDB สำหรับ Postgres
- วิธีใช้ AlloyDB Studio
- วิธีใช้การค้นหาเวกเตอร์แบบหลายโมดัล
- วิธีเปิดใช้โอเปอเรเตอร์ AI ของ AlloyDB
- วิธีใช้โอเปอเรเตอร์ AlloyDB AI ที่แตกต่างกันสำหรับการค้นหาแบบหลายรูปแบบ
- วิธีใช้ AlloyDB AI เพื่อรวมผลการค้นหาข้อความและรูปภาพ
สิ่งที่คุณต้องมี
- บัญชี Google Cloud และโปรเจ็กต์ Google Cloud
- เว็บเบราว์เซอร์ เช่น Chrome ที่รองรับ คอนโซล Google Cloud และ Cloud Shell
2. การตั้งค่าและข้อกำหนด
การตั้งค่าโปรเจ็กต์
- ลงชื่อเข้าใช้ คอนโซล Google Cloud หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี
ใช้บัญชีส่วนตัวแทนบัญชีงานหรือบัญชีโรงเรียน
- สร้างโปรเจ็กต์ใหม่หรือนำโปรเจ็กต์ที่มีอยู่มาใช้ซ้ำ หากต้องการสร้างโปรเจ็กต์ใหม่ในคอนโซล Google Cloud ให้คลิกปุ่มเลือกโปรเจ็กต์ในส่วนหัว ซึ่งจะเปิดหน้าต่างป๊อปอัป

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

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

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

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

เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานบน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานทั้งหมดใน Codelab นี้ได้ภายในเบราว์เซอร์ คุณไม่จำเป็นต้องติดตั้งอะไร
3. ก่อนเริ่มต้น
เปิดใช้ API
หากต้องการใช้ AlloyDB, Compute Engine, บริการระบบเครือข่าย และ Vertex AI คุณต้องเปิดใช้ API ที่เกี่ยวข้องในโปรเจ็กต์ที่อยู่ในระบบคลาวด์ของ Google
ตรวจสอบว่าได้ตั้งค่ารหัสโปรเจ็กต์แล้วใน Cloud Shell ในเทอร์มินัล รหัสโปรเจ็กต์ควรแสดงในวงเล็บใน Command Prompt ดังนี้
student@cloudshell:~ (test-project-001-402417)$
หากไม่เห็นรหัสโปรเจ็กต์ ให้รีเฟรชแท็บเบราว์เซอร์และตรวจสอบสิทธิ์อีกครั้งใน Cloud Shell
ตั้งค่าตัวแปรสภาพแวดล้อม PROJECT_ID:
PROJECT_ID=$(gcloud config get-value project)
เปิดใช้บริการที่จำเป็นทั้งหมด
gcloud services enable alloydb.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
aiplatform.googleapis.com \
discoveryengine.googleapis.com \
secretmanager.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 \
aiplatform.googleapis.com \
discoveryengine.googleapis.com \
secretmanager.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.
4. ติดตั้งใช้งาน AlloyDB
สร้างคลัสเตอร์และอินสแตนซ์หลักของ AlloyDB ขั้นตอนต่อไปนี้อธิบายวิธีสร้างคลัสเตอร์และอินสแตนซ์ AlloyDB โดยใช้ Google Cloud SDK หากต้องการใช้แนวทางของคอนโซล คุณสามารถดูเอกสารประกอบได้ที่นี่
ก่อนสร้างคลัสเตอร์ AlloyDB เราต้องมีช่วง IP ส่วนตัวที่พร้อมใช้งานใน VPC เพื่อให้อินสแตนซ์ AlloyDB ในอนาคตใช้ หากเราไม่มี เราจะต้องสร้างขึ้น กำหนดให้ใช้โดยบริการภายในของ Google หลังจากนั้นเราจะสร้างคลัสเตอร์และอินสแตนซ์ได้
สร้างช่วง IP ส่วนตัว
เราต้องกำหนดค่าการกำหนดค่าการเข้าถึงบริการส่วนตัวใน VPC สำหรับ AlloyDB สมมติว่าเรามีเครือข่าย VPC "เริ่มต้น" ในโปรเจ็กต์และจะใช้สำหรับการดำเนินการทั้งหมด
สร้างช่วง IP ส่วนตัว
gcloud compute addresses create psa-range \
--global \
--purpose=VPC_PEERING \
--prefix-length=24 \
--description="VPC private service access" \
--network=default
สร้างการเชื่อมต่อส่วนตัวโดยใช้ช่วง IP ที่จัดสรร
gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=psa-range \
--network=default
เอาต์พุตของคอนโซลที่คาดไว้
student@cloudshell:~ (test-project-402417)$ gcloud compute addresses create psa-range \
--global \
--purpose=VPC_PEERING \
--prefix-length=24 \
--description="VPC private service access" \
--network=default
Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/global/addresses/psa-range].
student@cloudshell:~ (test-project-402417)$ gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=psa-range \
--network=default
Operation "operations/pssn.p24-4470404856-595e209f-19b7-4669-8a71-cbd45de8ba66" finished successfully.
student@cloudshell:~ (test-project-402417)$
สร้างคลัสเตอร์ AlloyDB
ในส่วนนี้ เราจะสร้างคลัสเตอร์ AlloyDB ในภูมิภาค us-central1
กำหนดรหัสผ่านสำหรับผู้ใช้ postgres คุณกำหนดรหัสผ่านเองหรือใช้ฟังก์ชันแบบสุ่มเพื่อสร้างรหัสผ่านก็ได้
export PGPASSWORD=`openssl rand -hex 12`
เอาต์พุตของคอนโซลที่คาดไว้
student@cloudshell:~ (test-project-402417)$ export PGPASSWORD=`openssl rand -hex 12`
จดรหัสผ่าน PostgreSQL ไว้ใช้ในอนาคต
echo $PGPASSWORD
คุณจะต้องใช้รหัสผ่านดังกล่าวในอนาคตเพื่อเชื่อมต่อกับอินสแตนซ์ในฐานะผู้ใช้ postgres ฉันขอแนะนำให้จดไว้หรือคัดลอกไปวางไว้ที่ใดที่หนึ่งเพื่อใช้ในภายหลัง
เอาต์พุตของคอนโซลที่คาดไว้
student@cloudshell:~ (test-project-402417)$ echo $PGPASSWORD bbefbfde7601985b0dee5723 (Note: Yours will be different!)
สร้างคลัสเตอร์ช่วงทดลองใช้ฟรี
หากยังไม่เคยใช้ AlloyDB คุณสามารถสร้างคลัสเตอร์ทดลองใช้ฟรีได้โดยทำดังนี้
กำหนดชื่อภูมิภาคและคลัสเตอร์ AlloyDB เราจะใช้ภูมิภาค us-central1 และ alloydb-aip-01 เป็นชื่อคลัสเตอร์
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
เรียกใช้คำสั่งเพื่อสร้างคลัสเตอร์
gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION \
--subscription-type=TRIAL
เอาต์พุตของคอนโซลที่คาดไว้
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION \
--subscription-type=TRIAL
Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4
Creating cluster...done.
สร้างอินสแตนซ์หลักของ AlloyDB สำหรับคลัสเตอร์ในเซสชัน Cloud Shell เดียวกัน หากการเชื่อมต่อถูกตัด คุณจะต้องกำหนดตัวแปรสภาพแวดล้อมของภูมิภาคและชื่อคลัสเตอร์อีกครั้ง
gcloud alloydb instances create $ADBCLUSTER-pr \
--instance-type=PRIMARY \
--cpu-count=8 \
--region=$REGION \
--cluster=$ADBCLUSTER
เอาต์พุตของคอนโซลที่คาดไว้
student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \
--instance-type=PRIMARY \
--cpu-count=8 \
--region=$REGION \
--availability-type ZONAL \
--cluster=$ADBCLUSTER
Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721
Creating instance...done.
สร้างคลัสเตอร์ AlloyDB Standard
หากไม่ใช่คลัสเตอร์ AlloyDB แรกในโปรเจ็กต์ ให้สร้างคลัสเตอร์มาตรฐานต่อไป หากสร้างคลัสเตอร์ทดลองใช้ฟรีในขั้นตอนก่อนหน้าแล้ว ให้ข้ามขั้นตอนนี้
กำหนดชื่อภูมิภาคและคลัสเตอร์ AlloyDB เราจะใช้ภูมิภาค us-central1 และ alloydb-aip-01 เป็นชื่อคลัสเตอร์
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
เรียกใช้คำสั่งเพื่อสร้างคลัสเตอร์
gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION
เอาต์พุตของคอนโซลที่คาดไว้
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION
Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4
Creating cluster...done.
สร้างอินสแตนซ์หลักของ AlloyDB สำหรับคลัสเตอร์ในเซสชัน Cloud Shell เดียวกัน หากการเชื่อมต่อถูกตัด คุณจะต้องกำหนดตัวแปรสภาพแวดล้อมของภูมิภาคและชื่อคลัสเตอร์อีกครั้ง
gcloud alloydb instances create $ADBCLUSTER-pr \
--instance-type=PRIMARY \
--cpu-count=2 \
--region=$REGION \
--cluster=$ADBCLUSTER
เอาต์พุตของคอนโซลที่คาดไว้
student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \
--instance-type=PRIMARY \
--cpu-count=2 \
--region=$REGION \
--availability-type ZONAL \
--cluster=$ADBCLUSTER
Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721
Creating instance...done.
5. เตรียมฐานข้อมูล
เราต้องสร้างฐานข้อมูล เปิดใช้การผสานรวม Vertex AI สร้างออบเจ็กต์ฐานข้อมูล และนำเข้าข้อมูล
ให้สิทธิ์ที่จำเป็นแก่ AlloyDB
เพิ่มสิทธิ์ Vertex AI ให้กับตัวแทนบริการของ AlloyDB
เปิดแท็บ Cloud Shell อีกแท็บโดยใช้เครื่องหมาย "+" ที่ด้านบน

ในแท็บ 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"
เอาต์พุตของคอนโซลที่คาดไว้
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
ปิดแท็บโดยใช้คำสั่งดำเนินการ "exit" ในแท็บ
exit
เชื่อมต่อกับ AlloyDB Studio
ในบทต่อไปนี้ คุณจะเรียกใช้คำสั่ง SQL ทั้งหมดที่ต้องเชื่อมต่อกับฐานข้อมูลใน AlloyDB Studio ได้
ในแท็บใหม่ ให้ไปที่หน้าคลัสเตอร์ใน AlloyDB สำหรับ Postgres
เปิดอินเทอร์เฟซคอนโซลเว็บสำหรับคลัสเตอร์ AlloyDB โดยคลิกอินสแตนซ์หลัก

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

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

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

ซึ่งจะเปิดอินเทอร์เฟซที่คุณเรียกใช้คำสั่ง SQL ได้

สร้างฐานข้อมูล
เริ่มต้นใช้งานฐานข้อมูลอย่างรวดเร็ว
เรียกใช้คำสั่งต่อไปนี้ในโปรแกรมแก้ไข AlloyDB Studio
สร้างฐานข้อมูล
CREATE DATABASE quickstart_db
ผลลัพธ์ที่คาดไว้
Statement executed successfully
เชื่อมต่อกับ quickstart_db
เชื่อมต่อกับสตูดิโออีกครั้งโดยใช้ปุ่มเพื่อสลับผู้ใช้/ฐานข้อมูล

เลือกฐานข้อมูล quickstart_db ใหม่จากรายการแบบเลื่อนลง แล้วใช้ผู้ใช้และรหัสผ่านเดียวกันกับก่อนหน้านี้

ระบบจะเปิดการเชื่อมต่อใหม่ที่คุณสามารถทำงานกับออบเจ็กต์จากฐานข้อมูล quickstart_db ได้
6. ข้อมูลตัวอย่าง
ตอนนี้เราต้องสร้างออบเจ็กต์ในฐานข้อมูลและโหลดข้อมูล เราจะใช้ร้านค้า "Cymbal" สมมติที่มีข้อมูลสมมติ
ก่อนนำเข้าข้อมูล เราต้องเปิดใช้ส่วนขยายที่รองรับประเภทข้อมูลและดัชนี เราต้องการส่วนขยาย 2 รายการ ได้แก่ ส่วนขยายที่รองรับประเภทข้อมูลเวกเตอร์ และส่วนขยายที่รองรับดัชนี ScaNN ของ AlloyDB
ใน AlloyDB Studio ให้เชื่อมต่อกับ quickstart_db แล้วเรียกใช้คำสั่งต่อไปนี้
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
ระบบจะจัดเตรียมและวางชุดข้อมูลเป็นไฟล์ SQL ซึ่งโหลดไปยังฐานข้อมูลได้โดยใช้อินเทอร์เฟซการนำเข้า เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters import $ADBCLUSTER --region=$REGION --database=quickstart_db --gcs-uri='gs://sample-data-and-media/ecomm-retail/ecom_generic_vectors.sql' --user=postgres --sql
คำสั่งนี้ใช้ AlloyDB SDK และสร้างผู้ใช้ชื่อ agentspace_user จากนั้นจะนำเข้าข้อมูลตัวอย่างจากที่เก็บข้อมูล GCS ไปยังฐานข้อมูลโดยตรง ซึ่งจะสร้างออบเจ็กต์ที่จำเป็นทั้งหมดและแทรกข้อมูล
หลังจากนำเข้าแล้ว เราจะตรวจสอบตารางใน AlloyDB Studio ได้ ตารางอยู่ในสคีมา ecomm ดังนี้

และยืนยันจำนวนแถวในตารางใดตารางหนึ่ง
select count(*) from ecomm.products;

เรานำเข้าข้อมูลตัวอย่างเรียบร้อยแล้วและดำเนินการตามขั้นตอนถัดไปได้
7. การค้นหาเชิงความหมายโดยใช้การฝังข้อความ
ในบทนี้ เราจะลองใช้การค้นหาเชิงความหมายโดยใช้การฝังข้อความและเปรียบเทียบกับการค้นหาข้อความและการค้นหาแบบเต็มข้อความของ Postgres แบบดั้งเดิม
มาลองค้นหาแบบคลาสสิกโดยใช้ SQL ของ PostgreSQL มาตรฐานที่มีโอเปอเรเตอร์ LIKE กันก่อน
ใน AlloyDB Studio ให้เชื่อมต่อกับ quickstart_db แล้วลองค้นหาเสื้อกันฝนโดยใช้คำค้นหาต่อไปนี้
SET session.my_search_var='%wet%conditions%jacket%';
SELECT
name,
product_description,
retail_price, replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url
FROM
ecomm.products
WHERE
name ILIKE current_setting('session.my_search_var')
OR product_description ILIKE current_setting('session.my_search_var')
LIMIT
10;
คำค้นหาจะไม่แสดงแถวใดๆ เนื่องจากต้องมีคำที่ตรงกันทุกประการ เช่น สภาพอากาศเปียกและเสื้อแจ็กเก็ตอยู่ในชื่อสินค้าหรือคำอธิบาย และ "เสื้อแจ็กเก็ตสำหรับสภาพอากาศเปียก" ไม่เหมือนกับ "เสื้อแจ็กเก็ตสำหรับสภาพอากาศฝนตก"
เราจะพยายามรวมรูปแบบที่เป็นไปได้ทั้งหมดในการค้นหา ลองใส่คำเพียง 2 คำ เช่น
SELECT
name,
product_description,
retail_price,
replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url
FROM
ecomm.products
WHERE
name ILIKE '%wet%jacket%'
OR name ILIKE '%jacket%wet%'
OR name ILIKE '%jacket%'
OR name ILIKE '%%wet%'
OR product_description ILIKE '%wet%jacket%'
OR product_description ILIKE '%jacket%wet%'
OR product_description ILIKE '%jacket%'
OR product_description ILIKE '%wet%'
LIMIT
10;
ซึ่งจะแสดงผลหลายแถว แต่ไม่ใช่ทั้งหมดที่ตรงกับคำขอเสื้อแจ็กเก็ตของเราอย่างสมบูรณ์ และจัดเรียงตามความเกี่ยวข้องได้ยาก และหากเราเพิ่มเงื่อนไขอื่นๆ เช่น "สำหรับผู้ชาย" และอื่นๆ ก็จะเพิ่มความซับซ้อนของคําค้นหาอย่างมาก หรือเราอาจลองการค้นหาข้อความแบบเต็ม แต่ก็ยังคงมีข้อจำกัดที่เกี่ยวข้องกับคำที่ตรงกันมากหรือน้อย และความเกี่ยวข้องของการตอบกลับ
ตอนนี้เราสามารถทำการค้นหาที่คล้ายกันโดยใช้การฝังได้แล้ว เราได้คำนวณการฝังล่วงหน้าสำหรับผลิตภัณฑ์ของเราโดยใช้โมเดลต่างๆ แล้ว เราจะใช้โมเดล gemini-embedding-001 ล่าสุดของ Google เราได้จัดเก็บไว้ในคอลัมน์ "product_embedding" ของตาราง ecomm.products หากเราเรียกใช้การค้นหาสำหรับเงื่อนไขการค้นหา "เสื้อกันฝนสำหรับผู้ชาย" โดยใช้การค้นหาต่อไปนี้
SELECT
name,
product_description,
retail_price,
replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
product_embedding <=> embedding ('gemini-embedding-001','wet conditions jacket for men')::vector AS distance
FROM
ecomm.products
ORDER BY distance
LIMIT
10;
โดยจะแสดงไม่เพียงแค่เสื้อแจ็กเก็ตสำหรับสภาพอากาศเปียกเท่านั้น แต่ยังจัดเรียงผลการค้นหาทั้งหมดโดยนำผลการค้นหาที่เกี่ยวข้องมากที่สุดไว้ด้านบนด้วย
การค้นหาที่มีการฝังจะแสดงผลลัพธ์ใน 90-150 มิลลิวินาที โดยใช้เวลาส่วนหนึ่งในการรับข้อมูลจากโมเดลการฝังในระบบคลาวด์ หากเราดูที่แผนการดำเนินการ คำขอไปยังโมเดลจะรวมอยู่ในเวลาการวางแผน ส่วนของคำค้นหาที่ทำการค้นหาเองนั้นค่อนข้างสั้น ใช้เวลาไม่ถึง 7 มิลลิวินาทีในการค้นหาในเรคคอร์ด 29,000 รายการโดยใช้ดัชนี ScaNN ของ AlloyDB
เอาต์พุตของแผนการดำเนินการมีดังนี้
Limit (cost=2709.20..2718.82 rows=10 width=490) (actual time=6.966..7.049 rows=10 loops=1)
-> Index Scan using embedding_scann on products (cost=2709.20..30736.40 rows=29120 width=490) (actual time=6.964..7.046 rows=10 loops=1)
Order By: (product_embedding <=> '[-0.0020264734,-0.016582033,0.027258193
...
-0.0051468653,-0.012440448]'::vector)
Limit: 10
เวลาในการวางแผน: 136.579 มิลลิวินาที
เวลาดำเนินการ: 6.791 มิลลิวินาที
(6 แถว)
นั่นคือการค้นหาการฝังข้อความโดยใช้โมเดลการฝังข้อความเท่านั้น แต่เราก็มีรูปภาพสำหรับผลิตภัณฑ์ของเราด้วย และเราสามารถใช้รูปภาพนั้นกับการค้นหาได้ ในบทถัดไป เราจะแสดงให้เห็นว่าโมเดลมัลติโมดัลใช้รูปภาพในการค้นหาอย่างไร
8. การใช้การค้นหาหลายรูปแบบ
แม้ว่าการค้นหาเชิงความหมายแบบข้อความจะมีประโยชน์ แต่การอธิบายรายละเอียดที่ซับซ้อนอาจเป็นเรื่องยาก การค้นหาแบบหลายรูปแบบของ AlloyDB มีข้อได้เปรียบด้วยการช่วยให้ค้นพบผลิตภัณฑ์ผ่านอินพุตรูปภาพ ซึ่งจะมีประโยชน์อย่างยิ่งเมื่อการแสดงภาพช่วยอธิบายจุดประสงค์ในการค้นหาได้มีประสิทธิภาพมากกว่าคำอธิบายที่เป็นข้อความเพียงอย่างเดียว เช่น "หารูปเสื้อโค้ทแบบในรูปภาพให้หน่อย"
กลับไปดูตัวอย่างเสื้อแจ็กเก็ตกัน หากมีรูปภาพเสื้อแจ็กเก็ตที่คล้ายกับที่ต้องการค้นหา ก็สามารถส่งรูปภาพนั้นไปยังโมเดลการฝังแบบมัลติโมดัลของ Google แล้วเปรียบเทียบกับเวกเตอร์การฝังของรูปภาพผลิตภัณฑ์ ในตาราง เราได้คำนวณการฝังสำหรับรูปภาพของผลิตภัณฑ์ในคอลัมน์ product_image_embedding แล้ว และคุณจะเห็นโมเดลที่ใช้ในคอลัมน์ product_image_embedding_model
สำหรับการค้นหา เราสามารถใช้ฟังก์ชัน image_embedding เพื่อรับการฝังสำหรับรูปภาพและเปรียบเทียบกับการฝังที่คำนวณไว้ล่วงหน้า หากต้องการเปิดใช้ฟังก์ชันนี้ เราต้องตรวจสอบว่าเราใช้ส่วนขยาย google_ml_integration เวอร์ชันที่ถูกต้อง
มาตรวจสอบเวอร์ชันส่วนขยายปัจจุบันกัน ใน AlloyDB Studio ให้ดำเนินการ
SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
หากเวอร์ชันต่ำกว่า 1.5.2 ให้ทำตามขั้นตอนต่อไปนี้
CALL google_ml.upgrade_to_preview_version();
และตรวจสอบเวอร์ชันของส่วนขยายอีกครั้ง ซึ่งควรเป็น 1.5.3
SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
นอกจากนี้ เรายังต้องเปิดใช้ฟีเจอร์เครื่องมือค้นหา AI ในฐานข้อมูลด้วย โดยสามารถทำได้ด้วยการอัปเดตตามแฟล็กอินสแตนซ์สำหรับฐานข้อมูลทั้งหมดในอินสแตนซ์ หรือด้วยการเปิดใช้เฉพาะสำหรับฐานข้อมูลของเรา เรียกใช้คำสั่งต่อไปนี้ใน AlloyDB Studio เพื่อเปิดใช้สำหรับฐานข้อมูล quickstart_db
ALTER DATABASE quickstart_db SET google_ml_integration.enable_ai_query_engine = 'on';
ตอนนี้เราค้นหาด้วยรูปภาพได้แล้ว นี่คือรูปภาพตัวอย่างของฉันสำหรับการค้นหา แต่คุณจะใช้รูปภาพที่กำหนดเองก็ได้ คุณเพียงแค่อัปโหลดไปยังพื้นที่เก็บข้อมูลของ Google หรือแหล่งข้อมูลอื่นๆ ที่พร้อมให้บริการแบบสาธารณะ แล้ววาง URI ลงในคำค้นหา

และอัปโหลดไปยัง gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png
ค้นหารูปภาพด้วยรูปภาพ
ก่อนอื่น เราจะลองค้นหาด้วยรูปภาพเพียงอย่างเดียว
SELECT
name,
product_description,
retail_price,
replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
product_image_embedding <=> google_ml.image_embedding (model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector AS distance
FROM
ecomm.products
ORDER BY distance
LIMIT
4;
และเราพบเสื้อแจ็กเก็ตอุ่นๆ ในสินค้าคงคลัง หากต้องการดูรูปภาพ คุณสามารถดาวน์โหลดได้โดยใช้ Cloud SDK (gcloud storage cp) โดยระบุคอลัมน์ public_url แล้วเปิดด้วยเครื่องมือที่ใช้กับรูปภาพ
|
|
|
|
การค้นหารูปภาพจะแสดงรายการที่คล้ายกับรูปภาพที่เราให้ไว้เพื่อเปรียบเทียบ ดังที่ได้กล่าวไปแล้ว คุณสามารถลองอัปโหลดรูปภาพของคุณเองไปยังที่เก็บข้อมูลสาธารณะและดูว่าระบบจะค้นหาเสื้อผ้าประเภทต่างๆ ได้หรือไม่
เราใช้โมเดล "multimodalembedding@001" ของ Google สำหรับการค้นหารูปภาพ ฟังก์ชัน image_embedding จะส่งรูปภาพไปยัง Vertex AI แปลงเป็นเวกเตอร์ และส่งกลับมาเพื่อเปรียบเทียบกับเวกเตอร์รูปภาพที่จัดเก็บไว้ในฐานข้อมูล
นอกจากนี้ เรายังตรวจสอบได้โดยใช้ "EXPLAIN ANALYZE" เพื่อดูว่าดัชนี ScaNN ของ AlloyDB ทำงานได้เร็วเพียงใด
เอาต์พุตสำหรับแผนการดำเนินการมีดังนี้
Limit (cost=971.70..975.55 rows=4 width=490) (actual time=2.453..2.477 rows=4 loops=1)
-> Index Scan using product_image_embedding_scann on products (cost=971.70..28998.90 rows=29120 width=490) (actual time=2.451..2.475 rows=4 loops=1)
Order By: (product_image_embedding <=> '[0.02119865,0.034206174,0.030682731,
...
,-0.010307034,-0.010053742]'::vector)
Limit: 4
เวลาในการวางแผน: 913.322 มิลลิวินาที
เวลาดำเนินการ: 2.517 มิลลิวินาที
(6 แถว)
และอีกครั้งเช่นเดียวกับในตัวอย่างก่อนหน้า เราจะเห็นว่าเวลาส่วนใหญ่ใช้ไปกับการแปลงรูปภาพเป็น Embedding โดยใช้ปลายทางระบบคลาวด์ และการค้นหาเวกเตอร์เองใช้เวลาเพียง 2.5 มิลลิวินาที
ค้นหารูปภาพด้วยข้อความ
นอกจากนี้ การใช้หลายรูปแบบยังช่วยให้เราส่งคำอธิบายที่เป็นข้อความของเสื้อแจ็กเก็ตที่เราพยายามค้นหาไปยังโมเดลได้โดยใช้ google_ml.text_embedding สำหรับโมเดลเดียวกัน และเปรียบเทียบกับการฝังรูปภาพเพื่อดูว่าโมเดลแสดงรูปภาพใด
SELECT
name,
product_description,
retail_price,
replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
product_image_embedding <=> google_ml.text_embedding (model_id => 'multimodalembedding@001',content => 'puffy jacket for men, grey or dark colour')::vector AS distance
FROM
ecomm.products
ORDER BY distance
LIMIT
4;
และเราก็ได้เสื้อกันหนาวแบบพองๆ สีเทาหรือสีเข้มมา
|
|
|
|
เราได้เสื้อแจ็กเก็ตที่แตกต่างออกไปเล็กน้อย แต่ระบบก็เลือกเสื้อแจ็กเก็ตได้อย่างถูกต้องตามคำอธิบายของเราเมื่อค้นหาผ่านการฝังรูปภาพ
มาลองอีกวิธีในการค้นหาในคำอธิบายโดยใช้การฝังสำหรับรูปภาพที่ค้นหา
การค้นหาข้อความจากรูปภาพ
เราพยายามค้นหารูปภาพโดยส่งผ่านการฝังสำหรับรูปภาพของเราและเปรียบเทียบกับการฝังรูปภาพที่คำนวณไว้ล่วงหน้าสำหรับผลิตภัณฑ์ของเรา นอกจากนี้ เรายังพยายามค้นหารูปภาพโดยส่งการฝังสำหรับคำขอข้อความและค้นหาในการฝังเดียวกันสำหรับรูปภาพผลิตภัณฑ์ มาลองใช้การฝังสำหรับรูปภาพและเปรียบเทียบกับการฝังข้อความสำหรับคำอธิบายผลิตภัณฑ์กันเลย การฝังเหล่านี้จะจัดเก็บไว้ในคอลัมน์ product_description_embedding และใช้โมเดล multimodalembedding@001 เดียวกัน
คำค้นหาของเรามีดังนี้
SELECT
name,
product_description,
retail_price,
replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
product_description_embedding <=> google_ml.image_embedding (model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector AS distance
FROM
ecomm.products
ORDER BY distance
LIMIT
4;
และที่นี่เราได้เสื้อแจ็กเก็ตที่มีสีเทาหรือสีเข้ม ซึ่งบางตัวก็เหมือนหรือใกล้เคียงกับตัวเลือกที่เราเลือกด้วยวิธีอื่นๆ ที่เราใช้ค้นหา
|
|
|
|
โดยอิงตามการฝังสำหรับรูปภาพ ระบบจะเปรียบเทียบกับการฝังที่คำนวณแล้วสำหรับคำอธิบายข้อความและแสดงชุดผลิตภัณฑ์ที่ถูกต้อง
การค้นหาแบบผสมระหว่างข้อความและรูปภาพ
นอกจากนี้ คุณยังทดลองรวมการฝังข้อความและรูปภาพเข้าด้วยกันได้ด้วย เช่น การใช้การผสานอันดับซึ่งกันและกัน ต่อไปนี้คือตัวอย่างคำค้นหาดังกล่าว ซึ่งเราได้รวมการค้นหา 2 รายการเข้าด้วยกันโดยกำหนดคะแนนให้กับแต่ละอันดับและจัดเรียงผลลัพธ์ตามคะแนนรวม
WITH image_search AS (
SELECT id,
RANK () OVER (ORDER BY product_image_embedding <=>google_ml.image_embedding(model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector) AS rank
FROM ecomm.products
ORDER BY product_image_embedding <=>google_ml.image_embedding(model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector LIMIT 5
),
text_search AS (
SELECT id,
RANK () OVER (ORDER BY product_description_embedding <=>google_ml.text_embedding(model_id => 'multimodalembedding@001',content => 'puffy jacket for men, grey or dark colour'
)::vector) AS rank
FROM ecomm.products
ORDER BY product_description_embedding <=>google_ml.text_embedding(model_id => 'multimodalembedding@001',content => 'puffy jacket for men, grey or dark colour'
)::vector LIMIT 5
),
rrf_score AS (
SELECT
COALESCE(image_search.id, text_search.id) AS id,
COALESCE(1.0 / (60 + image_search.rank), 0.0) + COALESCE(1.0 / (60 + text_search.rank), 0.0) AS rrf_score
FROM image_search FULL OUTER JOIN text_search ON image_search.id = text_search.id
ORDER BY rrf_score DESC
)
SELECT
ep.name,
ep.product_description,
ep.retail_price,
replace(ep.product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url
FROM ecomm.products ep, rrf_score
WHERE
ep.id=rrf_score.id
ORDER by rrf_score DESC
LIMIT 4;
คุณลองเล่นกับพารามิเตอร์ต่างๆ ในคำค้นหาและดูว่าปรับปรุงผลการค้นหาได้หรือไม่ นอกจากนี้ คุณยังใช้โอเปอเรเตอร์ AI อื่นๆ เพื่อจัดอันดับผลลัพธ์ได้ตามที่อธิบายไว้ในเอกสารประกอบ
ห้องทดลองจึงสิ้นสุดลง ขอแนะนำให้ลบทรัพยากรที่ไม่ได้ใช้เพื่อป้องกันการเรียกเก็บเงินที่ไม่คาดคิด
9. ล้างสภาพแวดล้อม
ทำลายอินสแตนซ์และคลัสเตอร์ AlloyDB เมื่อคุณทำแล็บเสร็จแล้ว
ลบคลัสเตอร์ 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.
10. ขอแสดงความยินดี
ขอแสดงความยินดีที่ทำ Codelab นี้เสร็จสมบูรณ์ คุณได้เรียนรู้วิธีใช้การค้นหาแบบหลายรูปแบบใน AlloyDB โดยใช้ฟังก์ชันการฝังสำหรับข้อความและรูปภาพแล้ว คุณสามารถลองทดสอบการค้นหาแบบมัลติโมดัลและปรับปรุงด้วยฟังก์ชัน google_ml.rank โดยใช้ Codelab สำหรับโอเปอเรเตอร์ AI ของ AlloyDB
เส้นทางการเรียนรู้ของ Google Cloud
แล็บนี้เป็นส่วนหนึ่งของเส้นทางการเรียนรู้ AI พร้อมใช้งานจริงด้วย Google Cloud
- สำรวจหลักสูตรทั้งหมดเพื่อเชื่อมช่องว่างจากต้นแบบไปสู่การผลิต
- แชร์ความคืบหน้าของคุณด้วยแฮชแท็ก
#ProductionReadyAI
สิ่งที่เราได้พูดถึง
- วิธีติดตั้งใช้งาน AlloyDB สำหรับ Postgres
- วิธีใช้ AlloyDB Studio
- วิธีใช้การค้นหาเวกเตอร์แบบหลายโมดัล
- วิธีเปิดใช้โอเปอเรเตอร์ AI ของ AlloyDB
- วิธีใช้โอเปอเรเตอร์ AlloyDB AI ที่แตกต่างกันสำหรับการค้นหาแบบหลายรูปแบบ
- วิธีใช้ AlloyDB AI เพื่อรวมผลการค้นหาข้อความและรูปภาพ
11. แบบสำรวจ
เอาต์พุต:










