1. ภาพรวม
ในสภาพแวดล้อมการค้าปลีกที่รวดเร็วในปัจจุบัน การให้บริการลูกค้าที่ยอดเยี่ยมพร้อมทั้งมอบประสบการณ์การช็อปปิ้งที่ปรับเปลี่ยนในแบบของผู้ใช้จึงเป็นสิ่งสำคัญอย่างยิ่ง เราจะพาคุณไปพบกับการเดินทางด้านเทคนิคผ่านการสร้างแอปพลิเคชันแชทที่ขับเคลื่อนด้วยความรู้ ซึ่งออกแบบมาเพื่อตอบคำถามของลูกค้า แนะนำการค้นพบผลิตภัณฑ์ และปรับแต่งผลการค้นหา โซลูชันนวัตกรรมนี้รวมความสามารถของ AlloyDB สำหรับการจัดเก็บข้อมูล เครื่องมือวิเคราะห์ภายในสำหรับการทำความเข้าใจตามบริบท Gemini (โมเดลภาษาขนาดใหญ่) สำหรับการตรวจสอบความเกี่ยวข้อง และ Agent Builder ของ Google สำหรับการเริ่มต้นใช้งานผู้ช่วยสนทนาอัจฉริยะอย่างรวดเร็ว
ความท้าทาย: ลูกค้าค้าปลีกในปัจจุบันคาดหวังว่าจะได้รับคำตอบทันทีและคำแนะนำผลิตภัณฑ์ที่สอดคล้องกับความต้องการเฉพาะของตน วิธีการค้นหาแบบเดิมๆ มักไม่สามารถให้การปรับเปลี่ยนในแบบของคุณในระดับนี้ได้
โซลูชัน: แอปพลิเคชันแชทที่ขับเคลื่อนด้วยความรู้ของเราจะรับมือกับความท้าทายนี้โดยตรง โดยใช้ประโยชน์จากฐานความรู้ที่ได้จากข้อมูลการค้าปลีกเพื่อทำความเข้าใจความตั้งใจของลูกค้า ตอบสนองอย่างชาญฉลาด และแสดงผลลัพธ์ที่เกี่ยวข้องอย่างยิ่ง
สิ่งที่คุณจะสร้าง
ในแล็บนี้ (ส่วนที่ 1) คุณจะได้ทำสิ่งต่อไปนี้
- สร้างอินสแตนซ์ AlloyDB และโหลดชุดข้อมูลอีคอมเมิร์ซ
- เปิดใช้ส่วนขยายโมเดล pgvector และ Generative AI ใน AlloyDB
- สร้างการฝังจากรายละเอียดผลิตภัณฑ์
- ทำการค้นหาความคล้ายคลึงกันของโคไซน์แบบเรียลไทม์สำหรับข้อความค้นหาของผู้ใช้
- ติดตั้งใช้งานโซลูชันในฟังก์ชัน Cloud Run แบบ Serverless
ส่วนที่ 2 ของแล็บจะครอบคลุมขั้นตอนการสร้าง Agent
ข้อกำหนด
2. สถาปัตยกรรม
การไหลเวียนของข้อมูล: มาดูรายละเอียดวิธีที่ข้อมูลไหลเวียนผ่านระบบของเรากัน
การส่งผ่านข้อมูล
ขั้นตอนแรกของเราคือการนำเข้าข้อมูลค้าปลีก (สินค้าคงคลัง คำอธิบายผลิตภัณฑ์ การโต้ตอบของลูกค้า) ไปยัง AlloyDB
เครื่องมือวิเคราะห์:
เราจะใช้ AlloyDB เป็นเครื่องมือวิเคราะห์เพื่อดำเนินการต่อไปนี้
- การแยกบริบท: เครื่องมือจะวิเคราะห์ข้อมูลที่จัดเก็บไว้ใน AlloyDB เพื่อทำความเข้าใจความสัมพันธ์ระหว่างผลิตภัณฑ์ หมวดหมู่ พฤติกรรมของลูกค้า ฯลฯ ตามความเหมาะสม
- การฝังการสร้าง: ระบบจะสร้างการฝัง (การแสดงข้อความในรูปแบบคณิตศาสตร์) สำหรับทั้งคำค้นหาของผู้ใช้และข้อมูลที่จัดเก็บไว้ใน AlloyDB
- การค้นหาเวกเตอร์: เครื่องมือจะทำการค้นหาความคล้ายคลึงโดยเปรียบเทียบการฝังคำค้นหากับการฝังของรายละเอียดผลิตภัณฑ์ รีวิว และข้อมูลอื่นๆ ที่เกี่ยวข้อง ซึ่งจะระบุ "เพื่อนบ้านที่ใกล้ที่สุด" 25 รายการที่เกี่ยวข้องมากที่สุด
การตรวจสอบ Gemini:
ระบบจะส่งคำตอบที่เป็นไปได้เหล่านี้ไปยัง Gemini เพื่อประเมิน Gemini จะพิจารณาว่าข้อมูลดังกล่าวเกี่ยวข้องและปลอดภัยที่จะแชร์กับผู้ใช้จริงหรือไม่
การสร้างคำตอบ:
การตอบกลับที่ตรวจสอบแล้วจะจัดโครงสร้างเป็นอาร์เรย์ JSON และระบบทั้งหมดจะรวมอยู่ในฟังก์ชัน Cloud Run แบบไร้เซิร์ฟเวอร์ที่เรียกใช้จาก Agent Builder
การโต้ตอบแบบสนทนา:
Agent Builder จะแสดงคำตอบต่อผู้ใช้ในรูปแบบภาษาที่เป็นธรรมชาติ ซึ่งช่วยให้เกิดการสนทนาไปมา ส่วนนี้จะกล่าวถึงในแล็บติดตามผล
3. ก่อนเริ่มต้น
สร้างโปรเจ็กต์
- ในคอนโซล Google Cloud ให้เลือกหรือสร้างโปรเจ็กต์ Google Cloud ในหน้าตัวเลือกโปรเจ็กต์
- ตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ Cloud แล้ว ดูวิธีตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินในโปรเจ็กต์แล้วหรือไม่
- คุณจะใช้ Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานใน Google Cloud และโหลด bq ไว้ล่วงหน้า คลิกเปิดใช้งาน Cloud Shell ที่ด้านบนของคอนโซล Google Cloud

- เมื่อเชื่อมต่อกับ Cloud Shell แล้ว ให้ตรวจสอบว่าคุณได้รับการตรวจสอบสิทธิ์แล้วและตั้งค่าโปรเจ็กต์เป็นรหัสโปรเจ็กต์โดยใช้คำสั่งต่อไปนี้
gcloud auth list
- เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคำสั่ง gcloud รู้จักโปรเจ็กต์ของคุณ
gcloud config list project
- หากไม่ได้ตั้งค่าโปรเจ็กต์ ให้ใช้คำสั่งต่อไปนี้เพื่อตั้งค่า
gcloud config set project <YOUR_PROJECT_ID>
- เปิดใช้ API ที่จำเป็น
gcloud services enable alloydb.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
cloudfunctions.googleapis.com \
aiplatform.googleapis.com
คุณสามารถใช้คอนโซลแทนคำสั่ง gcloud ได้โดยค้นหาแต่ละผลิตภัณฑ์หรือใช้ลิงก์นี้
หากพลาด API ใดไป คุณก็เปิดใช้ได้เสมอในระหว่างการติดตั้งใช้งาน
โปรดดูคำสั่งและการใช้งาน gcloud ในเอกสารประกอบ
4. การตั้งค่าฐานข้อมูล
ในแล็บนี้ เราจะใช้ AlloyDB เป็นฐานข้อมูลเพื่อจัดเก็บข้อมูลการค้าปลีก โดยจะใช้คลัสเตอร์เพื่อเก็บทรัพยากรทั้งหมด เช่น ฐานข้อมูลและบันทึก แต่ละคลัสเตอร์มีอินสแตนซ์หลักที่ให้จุดเข้าถึงข้อมูล ตารางจะเก็บข้อมูลจริง
มาสร้างคลัสเตอร์ อินสแตนซ์ และตาราง AlloyDB ที่จะโหลดชุดข้อมูลอีคอมเมิร์ซกัน
สร้างคลัสเตอร์และอินสแตนซ์
- ไปที่หน้า AlloyDB ใน Cloud Console วิธีง่ายๆ ในการค้นหาหน้าส่วนใหญ่ใน Cloud Console คือการค้นหาโดยใช้แถบค้นหาของคอนโซล
- เลือกสร้างคลัสเตอร์จากหน้านั้น

- คุณจะเห็นหน้าจอคล้ายกับหน้าจอด้านล่าง สร้างคลัสเตอร์และอินสแตนซ์ด้วยค่าต่อไปนี้
- รหัสคลัสเตอร์: "
shopping-cluster" - รหัสผ่าน: "
alloydb" - รองรับ PostgreSQL 15
- ภูมิภาค: "
us-central1" - การสร้างเครือข่าย: "
default"

- เมื่อเลือกเครือข่ายเริ่มต้น คุณจะเห็นหน้าจอคล้ายกับหน้าจอด้านล่าง เลือกตั้งค่าการเชื่อมต่อ

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

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

อย่าลืมเปลี่ยนรหัสอินสแตนซ์เป็น "shopping-instance"
โปรดทราบว่าการสร้างคลัสเตอร์จะใช้เวลาประมาณ 10 นาที เมื่อดำเนินการสำเร็จแล้ว คุณควรเห็นหน้าจอที่มีลักษณะคล้ายกับหน้าจอนี้

5. การนำเข้าข้อมูล
ตอนนี้ได้เวลาเพิ่มตารางที่มีข้อมูลเกี่ยวกับร้านค้าแล้ว ไปที่ AlloyDB เลือกคลัสเตอร์หลัก แล้วเลือก AlloyDB Studio โดยทำดังนี้

คุณอาจต้องรอให้อินสแตนซ์สร้างเสร็จเรียบร้อย เมื่อพร้อมแล้ว ให้ลงชื่อเข้าใช้ AlloyDB โดยใช้ข้อมูลเข้าสู่ระบบที่คุณสร้างขึ้นเมื่อสร้างคลัสเตอร์ ใช้ข้อมูลต่อไปนี้เพื่อตรวจสอบสิทธิ์ใน PostgreSQL
- ชื่อผู้ใช้ : "
postgres" - ฐานข้อมูล : "
postgres" - รหัสผ่าน : "
alloydb"
เมื่อตรวจสอบสิทธิ์ใน AlloyDB Studio สำเร็จแล้ว ให้ป้อนคำสั่ง SQL ในเอดิเตอร์ คุณเพิ่มหน้าต่างเอดิเตอร์หลายหน้าต่างได้โดยใช้เครื่องหมายบวกทางด้านขวาของหน้าต่างสุดท้าย

คุณจะป้อนคำสั่งสำหรับ AlloyDB ในหน้าต่างเอดิเตอร์โดยใช้ตัวเลือกเรียกใช้ จัดรูปแบบ และล้างตามที่จำเป็น
เปิดใช้ส่วนขยาย
ในการสร้างแอปนี้ เราจะใช้ส่วนขยาย pgvector และ google_ml_integration ส่วนขยาย pgvector ช่วยให้คุณจัดเก็บและค้นหาการฝังเวกเตอร์ได้ ส่วนขยาย google_ml_integration มีฟังก์ชันที่คุณใช้เพื่อเข้าถึงปลายทางการคาดการณ์ของ Vertex AI เพื่อรับการคาดการณ์ใน SQL เปิดใช้ส่วนขยายเหล่านี้โดยเรียกใช้ DDL ต่อไปนี้
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;
หากต้องการตรวจสอบส่วนขยายที่เปิดใช้ในฐานข้อมูล ให้เรียกใช้คำสั่ง SQL นี้
select extname, extversion from pg_extension;
สร้างตาราง
สร้างตารางโดยใช้คำสั่ง DDL ด้านล่าง
CREATE TABLE
apparels ( id BIGINT,
category VARCHAR(100),
sub_category VARCHAR(50),
uri VARCHAR(200),
image VARCHAR(100),
content VARCHAR(2000),
pdt_desc VARCHAR(5000),
embedding vector(768) );
เมื่อดำเนินการคำสั่งข้างต้นสำเร็จ คุณควรจะดูตารางในฐานข้อมูลได้ ตัวอย่างภาพหน้าจอแสดงอยู่ด้านล่าง

ส่งผ่านข้อมูล
สำหรับแล็บนี้ เรามีข้อมูลทดสอบประมาณ 200 รายการในไฟล์ SQL นี้ มี id, category, sub_category, uri, image และ content ส่วนช่องอื่นๆ จะกรอกในภายหลังในห้องทดลอง
คัดลอกบรรทัด/คำสั่งแทรก 20 บรรทัดจากที่นั่น จากนั้นวางบรรทัดเหล่านั้นในแท็บเครื่องมือแก้ไขที่ว่างเปล่า แล้วเลือกเรียกใช้
หากต้องการดูเนื้อหาของตาราง ให้ขยายส่วน Explorer จนกว่าจะเห็นตารางชื่อ apparels เลือกปุ่มสามจุด (⋮) เพื่อดูตัวเลือกในการค้นหาตาราง คำสั่ง SELECT จะเปิดขึ้นในแท็บเครื่องมือแก้ไขใหม่

ให้สิทธิ์
เรียกใช้คำสั่งด้านล่างเพื่อมอบสิทธิ์ในการเรียกใช้ฟังก์ชัน embedding ให้กับผู้ใช้ postgres
GRANT EXECUTE ON FUNCTION embedding TO postgres;
มอบบทบาทผู้ใช้ Vertex AI ให้กับบัญชีบริการ AlloyDB
ไปที่เทอร์มินัล 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"
6. บริบท
กลับไปที่หน้าอินสแตนซ์ AlloyDB
หากต้องการสร้างการฝัง เราจะต้องมี context กล่าวคือข้อมูลทั้งหมดที่เราต้องการรวมไว้ในช่องเดียว เราจะทำเช่นนี้โดยการสร้างคำอธิบายผลิตภัณฑ์ (ซึ่งเราจะเรียกว่า pdt_desc) ในกรณีของเรา เราจะใช้ข้อมูลทั้งหมดเกี่ยวกับผลิตภัณฑ์แต่ละรายการ แต่เมื่อคุณทำเช่นนี้กับข้อมูลของคุณเอง คุณสามารถปรับแต่งข้อมูลในลักษณะใดก็ได้ที่เห็นว่ามีความหมายต่อธุรกิจของคุณ
เรียกใช้คำสั่งต่อไปนี้จาก AlloyDB Studio ของอินสแตนซ์ที่สร้างขึ้นใหม่ การดำเนินการนี้จะอัปเดตฟิลด์ pdt_desc ด้วยข้อมูลบริบท
UPDATE
apparels
SET
pdt_desc = CONCAT('This product category is: ', category, ' and sub_category is: ', sub_category, '. The description of the product is as follows: ', content, '. The product image is stored at: ', uri)
WHERE
id IS NOT NULL;
DML นี้จะสร้างสรุปบริบทอย่างง่ายโดยใช้ข้อมูลจากฟิลด์ทั้งหมดที่มีในตารางและการอ้างอิงอื่นๆ (หากมีใน Use Case ของคุณ) หากต้องการจัดเรียงข้อมูลและสร้างบริบทให้แม่นยำยิ่งขึ้น คุณสามารถออกแบบข้อมูลในรูปแบบใดก็ได้ที่เห็นว่ามีประโยชน์ต่อธุรกิจ
7. สร้างการฝังสำหรับบริบท
คอมพิวเตอร์ประมวลผลตัวเลขได้ง่ายกว่าประมวลผลข้อความมาก ระบบการฝังจะแปลงข้อความเป็นชุดของตัวเลขทศนิยมที่ควรแสดงข้อความ ไม่ว่าข้อความนั้นจะเขียนอย่างไร ใช้ภาษาใด ฯลฯ
ลองอธิบายสถานที่ริมทะเล อาจเรียกว่า "ริมน้ำ" "ติดชายหาด" "เดินจากห้องไปมหาสมุทร" "sur la mer" "на берегу океана" ฯลฯ คำเหล่านี้ดูแตกต่างกัน แต่ความหมายเชิงความหมายหรือในคำศัพท์ของแมชชีนเลิร์นนิง การฝังควรจะใกล้เคียงกันมาก
เมื่อข้อมูลและบริบทพร้อมแล้ว เราจะเรียกใช้ SQL เพื่อเพิ่มการฝังของคำอธิบายผลิตภัณฑ์ลงในตารางในช่อง embedding คุณใช้โมเดลการฝังได้หลากหลาย เราใช้ text-embedding-004 จาก Vertex AI โปรดใช้โมเดลการฝังเดียวกันตลอดทั้งโปรเจ็กต์
หมายเหตุ: หากคุณใช้โปรเจ็กต์ Google Cloud ที่มีอยู่ซึ่งสร้างขึ้นเมื่อนานมาแล้ว คุณอาจต้องใช้โมเดลการฝังข้อความเวอร์ชันเก่าต่อไป เช่น textembedding-gecko
UPDATE
apparels
SET
embedding = embedding( 'text-embedding-004',
pdt_desc)
WHERE
TRUE;
ดูapparelsตารางอีกครั้งเพื่อดูการฝังบางส่วน อย่าลืมเรียกใช้คำสั่ง SELECT อีกครั้งเพื่อดูการเปลี่ยนแปลง
SELECT
id,
category,
sub_category,
content,
embedding
FROM
apparels;
ซึ่งควรแสดงผลเวกเตอร์การฝังที่มีลักษณะคล้ายอาร์เรย์ของจำนวนทศนิยมสำหรับข้อความตัวอย่างในคำค้นหา ดังที่แสดงด้านล่าง

หมายเหตุ: โปรเจ็กต์ Google Cloud ที่สร้างใหม่ภายใต้รุ่นฟรีอาจประสบปัญหาโควต้าเมื่อพูดถึงจำนวนคำขอ Embedding ที่อนุญาตต่อวินาทีไปยังโมเดล Embedding เราขอแนะนำให้คุณใช้การค้นหาตัวกรองสำหรับรหัส จากนั้นเลือก 1-5 ระเบียนและอื่นๆ ในขณะที่สร้างการฝัง
8. ทำการค้นหาเวกเตอร์
ตอนนี้ตาราง ข้อมูล และการฝังพร้อมแล้ว เรามาทำการค้นหาเวกเตอร์แบบเรียลไทม์สำหรับข้อความค้นหาของผู้ใช้กัน
สมมติว่าผู้ใช้ถามว่า
"ฉันต้องการเสื้อผู้หญิง สีชมพูแบบลำลองที่เป็นผ้าฝ้ายแท้เท่านั้น"
คุณดูการจับคู่สำหรับรายการนี้ได้โดยเรียกใช้การค้นหาด้านล่าง
SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
มาดูรายละเอียดของคำค้นหานี้กัน
ในคำค้นหานี้
- ข้อความค้นหาของผู้ใช้คือ "ฉันต้องการเสื้อผู้หญิงสีชมพูแบบลำลองที่เป็นผ้าฝ้ายแท้เท่านั้น"
- เราจะแปลงเป็น Embedding ใน
embedding()โดยใช้โมเดลtext-embedding-004ขั้นตอนนี้ควรจะคุ้นเคยหลังจากขั้นตอนสุดท้าย ซึ่งเราได้ใช้ฟังก์ชันการฝังกับรายการทั้งหมดในตาราง - "
<=>" แสดงถึงการใช้วิธีการวัดระยะทางความคล้ายกันของโคไซน์ คุณดูการวัดความคล้ายกันทั้งหมดที่มีได้ในเอกสารประกอบของ pgvector - เราจะแปลงผลลัพธ์ของวิธีการฝังเป็นประเภทเวกเตอร์เพื่อให้เข้ากันได้กับเวกเตอร์ที่จัดเก็บไว้ในฐานข้อมูล
- LIMIT 5 หมายความว่าเราต้องการดึงเพื่อนบ้านที่ใกล้ที่สุด 5 รายการสำหรับข้อความค้นหา
ผลลัพธ์จะมีลักษณะดังนี้

ดังที่คุณเห็นในผลการค้นหา ข้อความที่ตรงกันจะค่อนข้างใกล้เคียงกับข้อความค้นหา ลองเปลี่ยนสีเพื่อดูว่าผลลัพธ์เปลี่ยนแปลงไปอย่างไร
หมายเหตุสำคัญ:
สมมติว่าเราต้องการเพิ่มประสิทธิภาพ (เวลาในการค้นหา) ประสิทธิภาพ และการเรียกคืนผลการค้นหาเวกเตอร์นี้โดยใช้ดัชนี ScaNN โปรดอ่านขั้นตอนในบล็อกนี้เพื่อเปรียบเทียบความแตกต่างของผลลัพธ์ที่มีและไม่มีดัชนี เราจะแสดงขั้นตอนการสร้างดัชนีที่นี่เพื่อความสะดวก
- เนื่องจากเราได้สร้างคลัสเตอร์ อินสแตนซ์ บริบท และการฝังไว้แล้ว เราจึงเพียงแค่ต้องติดตั้งส่วนขยาย ScaNN โดยใช้คำสั่งต่อไปนี้
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
- จากนั้นเราจะสร้างดัชนี (ScaNN) ดังนี้
CREATE INDEX apparel_index ON apparels
USING scann (embedding cosine)
WITH (num_leaves=54);
ใน DDL ด้านบน apparel_index คือชื่อของดัชนี
"apparels" คือตารางของฉัน
"scann" คือวิธีการจัดทำดัชนี
"embedding" คือคอลัมน์ในตารางที่ฉันต้องการจัดทำดัชนี
"โคไซน์" คือวิธีการวัดระยะทางที่ฉันต้องการใช้กับดัชนี
"54" คือจำนวนพาร์ติชันที่จะใช้กับดัชนีนี้ ตั้งค่าเป็นค่าใดก็ได้ระหว่าง 1 ถึง 1048576 ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีตัดสินใจเลือกค่านี้ได้ที่ปรับดัชนี ScaNN
ฉันใช้รากที่สองของจำนวนจุดข้อมูลตามที่แนะนำใน ScaNN repo (เมื่อทำการแบ่งพาร์ติชัน num_leaves ควรเป็นรากที่สองของจำนวนจุดข้อมูลโดยประมาณ)
- ตรวจสอบว่ามีการสร้างดัชนีโดยใช้การค้นหาต่อไปนี้หรือไม่
SELECT * FROM pg_stat_ann_indexes;
- ทำการค้นหาเวกเตอร์โดยใช้คำค้นหาเดียวกันกับที่เราใช้โดยไม่มีดัชนี
select * from apparels
ORDER BY embedding <=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768))
LIMIT 20
คำค้นหาข้างต้นเป็นคำค้นหาเดียวกันกับที่เราใช้ในห้องทดลองในขั้นตอนที่ 8 แต่ตอนนี้เราได้จัดทำดัชนีฟิลด์แล้ว
- ทดสอบด้วยคำค้นหาอย่างง่ายโดยมีและไม่มีดัชนี (โดยการวางดัชนี):
white tops for girls without any print
ข้อความค้นหาข้างต้นในคำค้นหาการค้นหาเวกเตอร์ในข้อมูลการฝังที่จัดทำดัชนีจะส่งผลให้ได้ผลการค้นหาที่มีคุณภาพและมีประสิทธิภาพ ดัชนีช่วยปรับปรุงประสิทธิภาพได้อย่างมาก (ในแง่ของเวลาในการดำเนินการ: 10.37 มิลลิวินาทีหากไม่มี ScaNN และ 0.87 มิลลิวินาทีหากมี ScaNN) ดูข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อนี้ได้ในบล็อกนี้
9. การตรวจสอบความถูกต้องของการจับคู่ด้วย LLM
ก่อนที่จะดำเนินการต่อและสร้างบริการเพื่อแสดงผลลัพธ์ที่ตรงกันมากที่สุดให้กับแอปพลิเคชัน เรามาใช้โมเดล Generative AI เพื่อตรวจสอบว่าคำตอบที่อาจเกิดขึ้นเหล่านี้เกี่ยวข้องจริงและปลอดภัยที่จะแชร์กับผู้ใช้หรือไม่
ตรวจสอบว่าตั้งค่าอินสแตนซ์สำหรับ Gemini แล้ว
ก่อนอื่น ให้ตรวจสอบว่าได้เปิดใช้การผสานรวม ML ของ Google สำหรับคลัสเตอร์และอินสแตนซ์แล้วหรือยัง ใน AlloyDB Studio ให้ป้อนคำสั่งต่อไปนี้
show google_ml_integration.enable_model_support;
หากค่าแสดงเป็น "เปิด" คุณสามารถข้าม 2 ขั้นตอนถัดไปและไปที่การตั้งค่าการผสานรวมโมเดล AlloyDB และ Vertex AI ได้โดยตรง
- ไปที่อินสแตนซ์หลักของคลัสเตอร์ AlloyDB แล้วคลิกแก้ไขอินสแตนซ์หลัก

- ไปที่ส่วนฟีเจอร์ทดลองในตัวเลือกการกำหนดค่าขั้นสูง และตรวจสอบว่าตั้งค่า
google_ml_integration.enable_model_support flagเป็น "on" ตามที่แสดงด้านล่าง

หากไม่ได้ตั้งค่าเป็น "เปิด" ให้ตั้งค่าเป็น "เปิด" แล้วคลิกปุ่มอัปเดตอินสแตนซ์ ขั้นตอนนี้จะใช้เวลาสักครู่
การผสานรวมโมเดล AlloyDB และ Vertex AI
ตอนนี้คุณสามารถเชื่อมต่อกับ AlloyDB Studio และเรียกใช้คำสั่ง DML ต่อไปนี้เพื่อตั้งค่าการเข้าถึงโมเดล Gemini จาก AlloyDB โดยใช้รหัสโปรเจ็กต์ของคุณในตำแหน่งที่ระบุ คุณอาจได้รับคำเตือนเกี่ยวกับข้อผิดพลาดทางไวยากรณ์ก่อนที่จะเรียกใช้คำสั่ง แต่คำสั่งควรทำงานได้ดี
ก่อนอื่น เราจะสร้างการเชื่อมต่อโมเดล Gemini 1.5 ดังที่แสดงด้านล่าง อย่าลืมแทนที่ $PROJECT_ID ในคำสั่งด้านล่างด้วยรหัสโปรเจ็กต์ Google Cloud ของคุณ
CALL
google_ml.create_model( model_id => 'gemini-1.5',
model_request_url => 'https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/us-central1/publishers/google/models/gemini-1.5-pro:streamGenerateContent',
model_provider => 'google',
model_auth_type => 'alloydb_service_agent_iam');
คุณตรวจสอบโมเดลที่กำหนดค่าสำหรับการเข้าถึงได้โดยใช้คำสั่งต่อไปนี้ใน AlloyDB Studio
select model_id,model_type from google_ml.model_info_view;
สุดท้ายนี้ เราต้องให้สิทธิ์แก่ผู้ใช้ฐานข้อมูลเพื่อเรียกใช้ฟังก์ชัน ml_predict_row เพื่อเรียกใช้การคาดการณ์ผ่านโมเดล Google Vertex AI เรียกใช้คำสั่งต่อไปนี้
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;
หมายเหตุ: หากคุณใช้โปรเจ็กต์ Google Cloud ที่มีอยู่และคลัสเตอร์/อินสแตนซ์ AlloyDB ที่มีอยู่ซึ่งสร้างขึ้นเมื่อนานมาแล้ว คุณอาจต้องทิ้งการอ้างอิงโมเดล gemini-1.5 แบบเก่าและสร้างใหม่ด้วยคำสั่ง CALL ด้านบน แล้วเรียกใช้ grant execute on function ml_predict_row อีกครั้งในกรณีที่คุณพบปัญหาในการเรียกใช้ gemini-1.5 ในอนาคต
การประเมินคำตอบ
แม้ว่าเราจะใช้การค้นหาขนาดใหญ่ 1 รายการในส่วนถัดไปเพื่อให้มั่นใจว่าคำตอบจากการค้นหาสมเหตุสมผล แต่การค้นหาอาจเข้าใจยาก ตอนนี้เราจะมาดูชิ้นส่วนต่างๆ และดูว่าชิ้นส่วนเหล่านั้นรวมกันเป็นอะไรในอีกไม่กี่นาที
- ก่อนอื่นเราจะส่งคำขอไปยังฐานข้อมูลเพื่อรับรายการที่ตรงกับคำค้นหาของผู้ใช้มากที่สุด 5 รายการ เราจะฮาร์ดโค้ดการค้นหาเพื่อให้ง่าย แต่ไม่ต้องกังวล เราจะแทรกการค้นหานี้ลงในการค้นหาในภายหลัง เราจะรวมรายละเอียดผลิตภัณฑ์จากตาราง
apparelsและเพิ่มฟิลด์ใหม่ 2 ฟิลด์ โดยฟิลด์หนึ่งจะรวมรายละเอียดกับดัชนี และอีกฟิลด์หนึ่งจะรวมคำขอเดิม ระบบจะบันทึกข้อมูลทั้งหมดนี้ไว้ในตารางชื่อxyz(เป็นเพียงชื่อตารางชั่วคราว)
CREATE TABLE
xyz AS
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' AS user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
เอาต์พุตของคำค้นหานี้จะเป็นแถวที่คล้ายกันมากที่สุด 5 แถวที่เกี่ยวข้องกับคำค้นหาของผู้ใช้ ตารางใหม่ xyz จะมี 5 แถว โดยแต่ละแถวจะมีคอลัมน์ต่อไปนี้
literaturecontentuser_text
- เราจะใช้การค้นหาที่ซับซ้อนเพื่อพิจารณาว่าคำตอบถูกต้องเพียงใด โดยเราจะอธิบายวิธีประเมินคำตอบ โดยจะใช้
user_textและcontentในตารางxyzเป็นส่วนหนึ่งของคําค้นหา
"Read this user search text: ', user_text,
' Compare it against the product inventory data set: ', content,
' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
- เมื่อใช้คำค้นหานั้นแล้ว เราจะตรวจสอบ "คุณภาพ" ของคำตอบใน
xyzตาราง
CREATE TABLE
x AS
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM
xyz;
predict_rowจะแสดงผลลัพธ์ในรูปแบบ JSON โค้ด "-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'"ใช้เพื่อดึงข้อความจริงจาก JSON นั้น หากต้องการดู JSON จริงที่ส่งคืน คุณสามารถนำโค้ดนี้ออกได้- สุดท้าย หากต้องการรับฟิลด์ LLM คุณเพียงแค่ต้องดึงข้อมูลจากตาราง x
SELECT
LLM_RESPONSE
FROM
x;
- ซึ่งสามารถรวมเป็นคำค้นหาถัดไปคำเดียวได้ดังนี้
คุณจะต้องลบตาราง xyz และ x ออกจากฐานข้อมูล AlloyDB ก่อนที่จะเรียกใช้คำสั่งนี้ หากคุณเรียกใช้คำค้นหาข้างต้นเพื่อตรวจสอบผลลัพธ์ระดับกลาง
SELECT
LLM_RESPONSE
FROM (
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM (
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5 ) AS xyz ) AS X;
แม้ว่าอาจจะยังดูน่ากังวลอยู่ แต่เราหวังว่าคุณจะเข้าใจมากขึ้น ผลลัพธ์จะบอกว่ามีเนื้อหาที่ตรงกันหรือไม่ ตรงกันกี่เปอร์เซ็นต์ และคำอธิบายบางส่วนของการจัดประเภท
โปรดทราบว่าโมเดล Gemini จะเปิดการสตรีมไว้โดยค่าเริ่มต้น ดังนั้นคำตอบจริงจะกระจายอยู่หลายบรรทัด 
10. นำแอปพลิเคชันไปใช้บนเว็บ
พร้อมที่จะนำแอปนี้ไปใช้บนเว็บแล้วใช่ไหม ทำตามขั้นตอนด้านล่างเพื่อทำให้ Knowledge Engine เป็นแบบไร้เซิร์ฟเวอร์ด้วยฟังก์ชัน Cloud Run
- ไปที่ฟังก์ชัน Cloud Run ใน Google Cloud Console เพื่อสร้างฟังก์ชัน Cloud Run ใหม่ หรือใช้ลิงก์ https://console.cloud.google.com/functions/add
- เลือกสภาพแวดล้อมเป็น "ฟังก์ชัน Cloud Run" ระบุชื่อฟังก์ชัน "retail-engine" และเลือกภูมิภาคเป็น "us-central1" ตั้งค่าการตรวจสอบสิทธิ์เป็น "อนุญาตการเรียกใช้ที่ไม่ผ่านการตรวจสอบสิทธิ์" แล้วคลิกถัดไป เลือก Java 17 เป็นรันไทม์และ Inline Editor สำหรับซอร์สโค้ด
- โดยค่าเริ่มต้น ระบบจะตั้งค่าจุดแรกเข้าเป็น "
gcfv2.HelloHttpFunction" แทนที่โค้ดตัวยึดตำแหน่งในHelloHttpFunction.javaและpom.xmlของฟังก์ชัน Cloud Run ด้วยโค้ดจากไฟล์ Java และ XML ตามลำดับ - อย่าลืมเปลี่ยนตัวยึดตำแหน่ง $PROJECT_ID และข้อมูลเข้าสู่ระบบการเชื่อมต่อ AlloyDB ด้วยค่าของคุณในไฟล์ Java ข้อมูลเข้าสู่ระบบ AlloyDB คือข้อมูลที่เราใช้ตอนเริ่ม Codelab นี้ หากคุณใช้ค่าอื่น โปรดแก้ไขค่าดังกล่าวในไฟล์ Java
- คลิกทำให้ใช้งานได้
เมื่อติดตั้งใช้งานแล้ว เราจะสร้างเครื่องมือเชื่อมต่อ VPC เพื่ออนุญาตให้ Cloud Functions เข้าถึงอินสแตนซ์ฐานข้อมูล AlloyDB
ขั้นตอนสำคัญ:
เมื่อตั้งค่าสำหรับการติดตั้งใช้งานแล้ว คุณควรจะเห็นฟังก์ชันในคอนโซลฟังก์ชันของ Cloud Run ใน Google ค้นหาฟังก์ชันที่สร้างขึ้นใหม่ (retail-engine) คลิกฟังก์ชันนั้น แล้วคลิกแก้ไขและเปลี่ยนข้อมูลต่อไปนี้
- ไปที่การตั้งค่ารันไทม์ การสร้าง การเชื่อมต่อ และความปลอดภัย
- เพิ่มการหมดเวลาเป็น 180 วินาที
- ไปที่แท็บการเชื่อมต่อ

- ตรวจสอบว่าได้เลือก "อนุญาตการรับส่งข้อมูลทั้งหมด" ในการตั้งค่าขาเข้า
- ในส่วนการตั้งค่าขาออก ให้คลิกเมนูแบบเลื่อนลงของเครือข่าย แล้วเลือกตัวเลือก "เพิ่มตัวเชื่อมต่อ VPC ใหม่" จากนั้นทำตามวิธีการที่เห็นในกล่องโต้ตอบที่ปรากฏขึ้น

- ระบุชื่อเครื่องมือเชื่อมต่อ VPC และตรวจสอบว่าภูมิภาคตรงกับอินสแตนซ์ ปล่อยให้ค่าเครือข่ายเป็นค่าเริ่มต้น และตั้งค่าเครือข่ายย่อยเป็นช่วง IP ที่กำหนดเองโดยมีช่วง IP เป็น 10.8.0.0 หรือค่าที่คล้ายกันที่ใช้ได้
- ขยาย "แสดงการตั้งค่าการปรับขนาด" และตรวจสอบว่าคุณได้ตั้งค่าการกำหนดค่าเป็นดังนี้

- คลิกสร้าง แล้วเครื่องมือเชื่อมต่อนี้ควรแสดงในการตั้งค่าขาออกในตอนนี้
- เลือกตัวเชื่อมต่อที่สร้างขึ้นใหม่
- เลือกให้กำหนดเส้นทางการรับส่งข้อมูลทั้งหมดผ่านเครื่องมือเชื่อมต่อ VPC นี้
- คลิกถัดไป แล้วคลิกติดตั้งใช้งาน
11. ทดสอบแอปพลิเคชัน
เมื่อติดตั้งใช้งาน Cloud Function ที่อัปเดตแล้ว คุณควรเห็นปลายทางในรูปแบบต่อไปนี้
https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/retail-engine
คุณสามารถทดสอบได้จากเทอร์มินัล Cloud Shell โดยเรียกใช้คำสั่งต่อไปนี้
gcloud functions call retail-engine --region=us-central1 --gen2 --data '{"search": "I want some kids clothes themed on Disney"}'
หรือคุณจะทดสอบฟังก์ชัน Cloud Run ได้ดังนี้
PROJECT_ID=$(gcloud config get-value project)
curl -X POST https://us-central1-$PROJECT_ID.cloudfunctions.net/retail-engine \
-H 'Content-Type: application/json' \
-d '{"search":"I want some kids clothes themed on Disney"}' \
| jq .
ผลลัพธ์ที่ได้มีดังนี้

เท่านี้ก็เรียบร้อย การค้นหาเวกเตอร์ความคล้ายคลึงโดยใช้โมเดลการฝังในข้อมูล AlloyDB นั้นง่ายดายเพียงเท่านี้
การสร้างเอเจนต์แบบสนทนา
คุณจะได้สร้างเอเจนต์ในส่วนที่ 2 ของ Lab นี้
12. ล้างข้อมูล
หากคุณวางแผนที่จะทำส่วนที่ 2 ของแล็บนี้ให้เสร็จสมบูรณ์ ให้ข้ามขั้นตอนนี้เนื่องจากขั้นตอนนี้จะลบโปรเจ็กต์ปัจจุบัน
โปรดทำตามขั้นตอนต่อไปนี้เพื่อเลี่ยงไม่ให้เกิดการเรียกเก็บเงินกับบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ในโพสต์นี้
- ใน Google Cloud Console ให้ไปที่หน้าจัดการทรัพยากร
- ในรายการโปรเจ็กต์ ให้เลือกโปรเจ็กต์ที่ต้องการลบ แล้วคลิกลบ
- ในกล่องโต้ตอบ ให้พิมพ์รหัสโปรเจ็กต์ แล้วคลิกปิดเพื่อลบโปรเจ็กต์
13. ขอแสดงความยินดี
ยินดีด้วย คุณทำการค้นหาความคล้ายคลึงโดยใช้ AlloyDB, pgvector และการค้นหาเวกเตอร์เรียบร้อยแล้ว การรวมความสามารถของ AlloyDB, Vertex AI และ Vector Search ทำให้เราก้าวกระโดดไปข้างหน้าในการทำให้การค้นหาตามบริบทและการค้นหาแบบเวกเตอร์เข้าถึงได้ มีประสิทธิภาพ และขับเคลื่อนด้วยความหมายอย่างแท้จริง ส่วนถัดไปของแล็บนี้จะครอบคลุมขั้นตอนการสร้างเอเจนต์