1. บทนำ
Spanner เป็นบริการฐานข้อมูลที่มีการจัดการครบวงจร รองรับการปรับขนาดในแนวราบ และมีการกระจายข้อมูลไปทั่วโลก ซึ่งเหมาะอย่างยิ่งสำหรับภาระงานการดำเนินงานทั้งแบบเชิงสัมพันธ์และไม่ใช่แบบเชิงสัมพันธ์
Spanner มีการรองรับการค้นหาเวกเตอร์ในตัว ซึ่งช่วยให้คุณทำการค้นหาความคล้ายคลึงหรือการค้นหาเชิงความหมาย และใช้การสร้างที่เพิ่มประสิทธิภาพการดึงข้อมูล (RAG) ในแอปพลิเคชัน GenAI ได้ในระดับใหญ่ โดยใช้ประโยชน์จากฟีเจอร์ K-Nearest Neighbor แบบตรงทุกประการ (KNN) หรือ Approximate Nearest Neighbor (ANN)
คำค้นหาเวกเตอร์ของ Spanner จะแสดงข้อมูลแบบเรียลไทม์ที่อัปเดตล่าสุดทันทีที่การทำธุรกรรมเสร็จสมบูรณ์ เช่นเดียวกับการค้นหาอื่นๆ ในข้อมูลการดำเนินงาน
ในแล็บนี้ คุณจะได้ดูขั้นตอนการตั้งค่าฟีเจอร์พื้นฐานที่จำเป็นเพื่อใช้ประโยชน์จาก Spanner ในการค้นหาเวกเตอร์ รวมถึงเข้าถึงโมเดลการฝังและโมเดล LLM จากโมเดลการ์เดนของ VertexAI โดยใช้ SQL
สถาปัตยกรรมจะมีลักษณะดังนี้
เมื่อมีพื้นฐานดังกล่าวแล้ว คุณจะได้เรียนรู้วิธีสร้างดัชนีเวกเตอร์ที่สนับสนุนโดย อัลกอริทึม ScaNN และใช้ฟังก์ชันระยะทาง APPROX เมื่อภาระงานเชิงความหมายจำเป็นต้องปรับขนาด
สิ่งที่คุณจะได้สร้าง
ในแล็บนี้ คุณจะได้ทำสิ่งต่อไปนี้
- สร้างอินสแตนซ์ Spanner
- ตั้งค่าสคีมาฐานข้อมูลของ Spanner เพื่อผสานรวมกับโมเดลการฝังและโมเดล LLM ใน VertexAI
- โหลดชุดข้อมูลการค้าปลีก
- ออกคำค้นหาความคล้ายคลึงกับชุดข้อมูล
- ระบุบริบทให้กับโมเดล LLM เพื่อสร้างคำแนะนำที่เฉพาะเจาะจงสำหรับผลิตภัณฑ์
- แก้ไขสคีมาและสร้างดัชนีเวกเตอร์
- เปลี่ยนคำค้นหาเพื่อใช้ประโยชน์จากดัชนีเวกเตอร์ที่สร้างขึ้นใหม่
สิ่งที่คุณจะได้เรียนรู้
- วิธีตั้งค่าอินสแตนซ์ Spanner
- วิธีผสานรวมกับ VertexAI
- วิธีใช้ Spanner เพื่อทำการค้นหาเวกเตอร์เพื่อค้นหารายการที่คล้ายกันในชุดข้อมูลการค้าปลีก
- วิธีเตรียมฐานข้อมูลเพื่อปรับขนาดภาระงานการค้นหาเวกเตอร์โดยใช้การค้นหา ANN
สิ่งที่คุณต้องมี
2. การตั้งค่าและข้อกำหนด
สร้างโปรเจ็กต์
หากยังไม่มีบัญชี Google (Gmail หรือ Google Apps) คุณต้องสร้างบัญชี ลงชื่อเข้าใช้คอนโซล Google Cloud Platform ( console.cloud.google.com) แล้วสร้างโปรเจ็กต์ใหม่
หากมีโปรเจ็กต์อยู่แล้ว ให้คลิกเมนูแบบเลื่อนลงสำหรับการเลือกโปรเจ็กต์ที่ด้านซ้ายบนของคอนโซล

แล้วคลิกปุ่ม "โปรเจ็กต์ใหม่" ในกล่องโต้ตอบที่ปรากฏขึ้นเพื่อสร้างโปรเจ็กต์ใหม่

หากยังไม่มีโปรเจ็กต์ คุณจะเห็นกล่องโต้ตอบลักษณะนี้เพื่อสร้างโปรเจ็กต์แรก

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

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

การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากกว่า 2-3 ดอลลาร์ แต่ค่าใช้จ่ายอาจสูงขึ้นหากคุณตัดสินใจใช้ทรัพยากรเพิ่มเติมหรือปล่อยให้ทรัพยากรทำงานต่อไป (ดูส่วน "การล้างข้อมูล" ที่ส่วนท้ายของเอกสารนี้) การกำหนดราคาของ Google Cloud Spanner มีระบุไว้ที่นี่ here.
ผู้ใช้ Google Cloud Platform รายใหม่มีสิทธิ์รับช่วงทดลองใช้ฟรีมูลค่า $300 ซึ่งจะทำให้ Codelab นี้ไม่มีค่าใช้จ่าย
การตั้งค่า Google Cloud Shell
แม้ว่าคุณจะใช้งาน Google Cloud และ Spanner จากระยะไกลจากแล็ปท็อปได้ แต่ใน Codelab นี้เราจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์
เครื่องเสมือนที่ใช้ Debian นี้มาพร้อมกับเครื่องมือพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีแรกขนาด 5 GB แบบถาวรและทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก ซึ่งหมายความว่าสิ่งที่คุณต้องใช้สำหรับ Codelab นี้มีเพียงเบราว์เซอร์เท่านั้น (ใช่แล้ว ใช้ได้กับ Chromebook)
- หากต้องการเปิดใช้งาน Cloud Shell จาก Cloud Console เพียงคลิกเปิดใช้งาน Cloud Shell
(ระบบจะจัดสรรและเชื่อมต่อกับสภาพแวดล้อมภายในเวลาไม่กี่วินาที)


เมื่อเชื่อมต่อกับ Cloud Shell แล้ว คุณจะเห็นว่าระบบได้ตรวจสอบสิทธิ์ให้คุณแล้วและโปรเจ็กต์ตั้งค่าเป็น PROJECT_ID ของคุณแล้ว
gcloud auth list
เอาต์พุตจากคำสั่ง
Credentialed accounts:
- <myaccount>@<mydomain>.com (active)
gcloud config list project
เอาต์พุตจากคำสั่ง
[core]
project = <PROJECT_ID>
หากระบบไม่ได้ตั้งค่าโปรเจ็กต์ไว้ด้วยเหตุผลบางประการ ให้เรียกใช้คำสั่งต่อไปนี้
gcloud config set project <PROJECT_ID>
กำลังมองหา PROJECT_ID ใช่ไหม ดูรหัสที่คุณใช้ในขั้นตอนการตั้งค่าหรือค้นหารหัสในแดชบอร์ด Cloud Console

นอกจากนี้ Cloud Shell ยังตั้งค่าตัวแปรสภาพแวดล้อมบางอย่างไว้โดยค่าเริ่มต้น ซึ่งอาจเป็นประโยชน์เมื่อคุณเรียกใช้คำสั่งในอนาคต
echo $GOOGLE_CLOUD_PROJECT
เอาต์พุตจากคำสั่ง
<PROJECT_ID>
เปิดใช้ Spanner API
gcloud services enable spanner.googleapis.com
สรุป
ในขั้นตอนนี้ คุณได้ตั้งค่าโปรเจ็กต์ (หากยังไม่มี) เปิดใช้งาน Cloud Shell และเปิดใช้ API ที่จำเป็น
รายการถัดไป
ต่อไป คุณจะตั้งค่าอินสแตนซ์และฐานข้อมูล Spanner
3. สร้างอินสแตนซ์และฐานข้อมูล Spanner
สร้างอินสแตนซ์ Spanner
ในขั้นตอนนี้ เราจะตั้งค่าอินสแตนซ์ Spanner สำหรับ Codelab หากต้องการดำเนินการนี้ ให้เปิด Cloud Shell แล้วเรียกใช้คำสั่งนี้
export SPANNER_INSTANCE_ID=retail-demo
gcloud spanner instances create $SPANNER_INSTANCE_ID \
--config=regional-us-central1 \
--description="spanner AI retail demo" \
--nodes=1
--edition=ENTERPRISE
เอาต์พุตจากคำสั่ง:
$ gcloud spanner instances create $SPANNER_INSTANCE_ID \
--config=regional-us-central1 \
--description="spanner AI retail demo" \
--nodes=1
--edition=ENTERPRISE
Creating instance...done.
สร้างฐานข้อมูล
เมื่ออินสแตนซ์ทำงานแล้ว คุณจะสร้างฐานข้อมูลได้ Spanner อนุญาตให้มีฐานข้อมูลหลายรายการในอินสแตนซ์เดียว
ฐานข้อมูลคือที่ที่คุณกำหนดสคีมา นอกจากนี้ คุณยังควบคุมผู้ที่มีสิทธิ์เข้าถึงฐานข้อมูล ตั้งค่าการเข้ารหัสที่กำหนดเอง กำหนดค่าตัวเพิ่มประสิทธิภาพ และตั้งค่าระยะเวลาเก็บรักษาได้ด้วย
หากต้องการสร้างฐานข้อมูล ให้ใช้เครื่องมือบรรทัดคำสั่ง gcloud อีกครั้ง
export SPANNER_DATABASE=cymbal-bikes
gcloud spanner databases create $SPANNER_DATABASE \
--instance=$SPANNER_INSTANCE_ID
เอาต์พุตจากคำสั่ง:
$ gcloud spanner databases create $SPANNER_DATABASE \
--instance=$SPANNER_INSTANCE_ID
Creating database...done.
สรุป
ในขั้นตอนนี้ คุณได้สร้างอินสแตนซ์และฐานข้อมูล Spanner
รายการถัดไป
ต่อไป คุณจะตั้งค่าสคีมาและข้อมูล Spanner
4. โหลดสคีมาและข้อมูล Cymbal
สร้างสคีมา Cymbal
หากต้องการตั้งค่าสคีมา ให้ไปที่ Spanner Studio

สคีมามี 2 ส่วน ส่วนแรกคือการเพิ่มตาราง products คัดลอกและวางคำสั่งนี้ในแท็บว่าง
สำหรับสคีมา ให้คัดลอกและวาง DDL นี้ลงในช่อง
CREATE TABLE products (
categoryId INT64 NOT NULL,
productId INT64 NOT NULL,
productName STRING(MAX) NOT NULL,
productDescription STRING(MAX) NOT NULL,
productDescriptionEmbedding ARRAY<FLOAT32>,
createTime TIMESTAMP NOT NULL OPTIONS (
allow_commit_timestamp = true
),
inventoryCount INT64 NOT NULL,
priceInCents INT64,
) PRIMARY KEY(categoryId, productId);
จากนั้นคลิกปุ่ม run แล้วรอสักครู่เพื่อให้ระบบสร้างสคีมา
ต่อไป คุณจะสร้างโมเดล 2 รายการและกำหนดค่าโมเดลเหล่านั้นไปยังปลายทางโมเดล VertexAI
โมเดลแรกคือโมเดลการฝังที่ใช้สร้างการฝังจากข้อความ และโมเดลที่ 2 คือโมเดล LLM ที่ใช้สร้างการตอบสนองตามข้อมูลใน Spanner
วางสคีมาต่อไปนี้ลงในแท็บใหม่ใน Spanner Studio
CREATE MODEL EmbeddingsModel INPUT(
content STRING(MAX),
) OUTPUT(
embeddings STRUCT<statistics STRUCT<truncated BOOL, token_count FLOAT32>, values ARRAY<FLOAT32>>,
) REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<PROJECT_ID>/locations/us-central1/publishers/google/models/text-embedding-004'
);
CREATE MODEL LLMModel INPUT(
prompt STRING(MAX),
) OUTPUT(
content STRING(MAX),
) REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<PROJECT_ID>/locations/us-central1/publishers/google/models/gemini-3.1-pro-preview',
default_batch_size = 1
);
จากนั้นคลิกปุ่ม run แล้วรอสักครู่เพื่อให้ระบบสร้างโมเดล
คุณควรเห็นตารางและโมเดลต่อไปนี้ในบานหน้าต่างด้านซ้ายของ Spanner Studio

โหลดข้อมูล
ตอนนี้คุณจะต้องแทรกผลิตภัณฑ์บางรายการลงในฐานข้อมูล เปิดแท็บใหม่ใน Spanner Studio แล้วคัดลอกและวางคำสั่งแทรกต่อไปนี้
INSERT INTO products (categoryId, productId, productName, productDescription, createTime, inventoryCount, priceInCents)
VALUES (1, 1, "Cymbal Helios Helmet", "Safety meets style with the Cymbal children's bike helmet. Its lightweight design, superior ventilation, and adjustable fit ensure comfort and protection on every ride. Stay bright and keep your child safe under the sun with Cymbal Helios!", PENDING_COMMIT_TIMESTAMP(), 100, 10999),
(1, 2, "Cymbal Sprout", "Let their cycling journey begin with the Cymbal Sprout, the ideal balance bike for beginning riders ages 2-4 years. Its lightweight frame, low seat height, and puncture-proof tires promote stability and confidence as little ones learn to balance and steer. Watch them sprout into cycling enthusiasts with Cymbal Sprout!", PENDING_COMMIT_TIMESTAMP(), 10, 13999),
(1, 3, "Cymbal Spark Jr.", "Light, vibrant, and ready for adventure, the Spark Jr. is the perfect first bike for young riders (ages 5-8). Its sturdy frame, easy-to-use brakes, and puncture-resistant tires inspire confidence and endless playtime. Let the spark of cycling ignite with Cymbal!", PENDING_COMMIT_TIMESTAMP(), 34, 13900),
(1, 4, "Cymbal Summit", "Conquering trails is a breeze with the Summit mountain bike. Its lightweight aluminum frame, responsive suspension, and powerful disc brakes provide exceptional control and comfort for experienced bikers navigating rocky climbs or shredding downhill. Reach new heights with Cymbal Summit!", PENDING_COMMIT_TIMESTAMP(), 0, 79999),
(1, 5, "Cymbal Breeze", "Cruise in style and embrace effortless pedaling with the Breeze electric bike. Its whisper-quiet motor and long-lasting battery let you conquer hills and distances with ease. Enjoy scenic rides, commutes, or errands with a boost of confidence from Cymbal Breeze!", PENDING_COMMIT_TIMESTAMP(), 72, 129999),
(1, 6, "Cymbal Trailblazer Backpack", "Carry all your essentials in style with the Trailblazer backpack. Its water-resistant material, multiple compartments, and comfortable straps keep your gear organized and accessible, allowing you to focus on the adventure. Blaze new trails with Cymbal Trailblazer!", PENDING_COMMIT_TIMESTAMP(), 24, 7999),
(1, 7, "Cymbal Phoenix Lights", "See and be seen with the Phoenix bike lights. Powerful LEDs and multiple light modes ensure superior visibility, enhancing your safety and enjoyment during day or night rides. Light up your journey with Cymbal Phoenix!", PENDING_COMMIT_TIMESTAMP(), 87, 3999),
(1, 8, "Cymbal Windstar Pump", "Flat tires are no match for the Windstar pump. Its compact design, lightweight construction, and high-pressure capacity make inflating tires quick and effortless. Get back on the road in no time with Cymbal Windstar!", PENDING_COMMIT_TIMESTAMP(), 36, 24999),
(1, 9,"Cymbal Odyssey Multi-Tool","Be prepared for anything with the Odyssey multi-tool. This handy gadget features essential tools like screwdrivers, hex wrenches, and tire levers, keeping you ready for minor repairs and adjustments on the go. Conquer your journey with Cymbal Odyssey!", PENDING_COMMIT_TIMESTAMP(), 52, 999),
(1, 10,"Cymbal Nomad Water Bottle","Stay hydrated on every ride with the Nomad water bottle. Its sleek design, BPA-free construction, and secure lock lid make it the perfect companion for staying refreshed and motivated throughout your adventures. Hydrate and explore with Cymbal Nomad!", PENDING_COMMIT_TIMESTAMP(), 42, 1299);
คลิกปุ่ม run เพื่อแทรกข้อมูล
สรุป
ในขั้นตอนนี้ คุณได้สร้างสคีมาและโหลดข้อมูลพื้นฐานบางอย่างลงในฐานข้อมูล cymbal-bikes
รายการถัดไป
ต่อไป คุณจะผสานรวมกับโมเดลการฝังเพื่อสร้างการฝังสำหรับคำอธิบายผลิตภัณฑ์ รวมถึงแปลงคำขอค้นหาที่เป็นข้อความเป็นการฝังเพื่อค้นหาผลิตภัณฑ์ที่เกี่ยวข้อง
5. ทำงานกับการฝัง
สร้างการฝังเวกเตอร์สำหรับคำอธิบายผลิตภัณฑ์
หากต้องการให้การค้นหาความคล้ายคลึงทำงานกับผลิตภัณฑ์ คุณต้องสร้างการฝังสำหรับคำอธิบายผลิตภัณฑ์
เมื่อสร้าง EmbeddingsModel ในสคีมาแล้ว คำสั่งนี้จะเป็นคำสั่ง UPDATE DML อย่างง่าย
UPDATE products p1
SET productDescriptionEmbedding =
(SELECT embeddings.values from ML.PREDICT(MODEL EmbeddingsModel,
(SELECT productDescription as content FROM products p2 where p2.productId=p1.productId)))
WHERE categoryId=1;
คลิกปุ่ม run เพื่ออัปเดตคำอธิบายผลิตภัณฑ์
การใช้การค้นหาเวกเตอร์
ในตัวอย่างนี้ คุณจะระบุคำขอค้นหาภาษาธรรมชาติผ่านคำค้นหา SQL คำค้นหานี้จะเปลี่ยนคำขอค้นหาเป็นการฝัง จากนั้นค้นหาผลลัพธ์ที่คล้ายกันโดยอิงตามการฝังคำอธิบายผลิตภัณฑ์ที่จัดเก็บไว้ซึ่งสร้างขึ้นในขั้นตอนก่อนหน้า
-- Use Spanner's vector search, and integration with embedding and LLM models to
-- return items that are semantically relevant and available in inventory based on
-- real-time data.
SELECT productName, productDescription, inventoryCount, COSINE_DISTANCE(
productDescriptionEmbedding,
( SELECT embeddings.values
FROM ML.PREDICT(
MODEL EmbeddingsModel,
(SELECT "I'd like to buy a starter bike for my 3 year old child" as content)
)
)
) as distance
FROM products
WHERE inventoryCount > 0
ORDER BY distance
LIMIT 5;
คลิกปุ่ม run เพื่อค้นหาผลิตภัณฑ์ที่คล้ายกัน ผลลัพธ์ควรมีลักษณะดังนี้

โปรดสังเกตว่ามีการใช้ตัวกรองเพิ่มเติมในคำค้นหา เช่น สนใจเฉพาะผลิตภัณฑ์ที่มีสินค้าพร้อมจำหน่าย (inventoryCount > 0)
สรุป
ในขั้นตอนนี้ คุณได้สร้างการฝังคำอธิบายผลิตภัณฑ์และการฝังคำขอค้นหาโดยใช้ SQL ซึ่งใช้ประโยชน์จากการผสานรวมของ Spanner กับโมเดลใน VertexAI นอกจากนี้ คุณยังทำการค้นหาเวกเตอร์เพื่อค้นหาผลิตภัณฑ์ที่คล้ายกันซึ่งตรงกับคำขอค้นหา
ขั้นตอนถัดไป
ต่อไป เราจะใช้ผลการค้นหาเพื่อป้อนข้อมูลลงใน LLM เพื่อสร้างการตอบสนองที่กำหนดเองสำหรับแต่ละผลิตภัณฑ์
6. ทำงานกับ LLM
Spanner ช่วยให้ผสานรวมกับโมเดล LLM ที่ให้บริการจาก VertexAI ได้ง่าย ซึ่งช่วยให้นักพัฒนาแอปใช้ SQL เพื่อโต้ตอบกับ LLM ได้โดยตรง โดยไม่จำเป็นต้องให้แอปพลิเคชันดำเนินการตรรกะ
ตัวอย่างเช่น เรามีผลลัพธ์จากคำค้นหา SQL ก่อนหน้าจากผู้ใช้ "I'd like to buy a starter bike for my 3 year old child".
นักพัฒนาแอปต้องการให้การตอบสนองสำหรับผลลัพธ์แต่ละรายการว่าผลิตภัณฑ์เหมาะกับผู้ใช้หรือไม่ โดยใช้พรอมต์ต่อไปนี้
"Answer with ‘Yes' or ‘No' and explain why: Is this a good fit for me? I'd like to buy a starter bike for my 3 year old child"
นี่คือคำค้นหาที่คุณใช้ได้
-- Use an LLM to analyze this list and provide a recommendation on whether each
-- product is a good fit for the user. We use the vector search and real time
-- inventory data to first filter the products to reduce the size of the prompt to
-- the LLM.
SELECT productName, productDescription, inventoryCount, content AS LLMResponse
FROM ML.PREDICT(
MODEL LLMModel,
( SELECT
inventoryCount,
productName,
productDescription,
CONCAT(
"Answer with ‘Yes' or ‘No' and explain why: Is this a good fit for me?",
"I'd like to buy a starter bike for my 3 year old child \n",
"Product Name: ", productName, "\n",
"Product Description:", productDescription) AS prompt,
FROM products
WHERE inventoryCount > 0
ORDER by COSINE_DISTANCE(
productDescriptionEmbedding,
( SELECT embeddings.values
FROM ML.PREDICT(
MODEL EmbeddingsModel,
( SELECT "I'd like to buy a starter bike for my 3 year old child" as content)
)
)
) LIMIT 5
),
STRUCT(256 AS maxOutputTokens)
);
คลิกปุ่ม run เพื่อออกคำค้นหา ผลลัพธ์ควรมีลักษณะดังนี้

ผลิตภัณฑ์แรกเหมาะสำหรับเด็กอายุ 3 ขวบเนื่องจากช่วงอายุในคำอธิบายผลิตภัณฑ์ (2-4 ขวบ) ส่วนผลิตภัณฑ์อื่นๆ ไม่เหมาะ
สรุป
ในขั้นตอนนี้ คุณได้ทำงานกับ LLM เพื่อสร้างการตอบสนองพื้นฐานต่อพรอมต์จากผู้ใช้
ขั้นตอนถัดไป
ต่อไป เรามาดูวิธีใช้ ANN เพื่อปรับขนาดการค้นหาเวกเตอร์
7. การปรับขนาดการค้นหาเวกเตอร์
ตัวอย่างการค้นหาเวกเตอร์ก่อนหน้านี้ใช้ประโยชน์จากการค้นหาเวกเตอร์ KNN แบบตรงทุกประการ ซึ่งเหมาะอย่างยิ่งเมื่อคุณค้นหาชุดย่อยที่เฉพาะเจาะจงมากของข้อมูล Spanner ได้ เราเรียกคำค้นหาประเภทดังกล่าวว่า แบ่งพาร์ติชันได้สูง
หากคุณไม่มีภาระงานที่แบ่งพาร์ติชันได้สูงและมีข้อมูลจำนวนมาก คุณจะต้องใช้การค้นหาเวกเตอร์ ANN โดยใช้ประโยชน์จาก อัลกอริทึม ScaNN เพื่อเพิ่มประสิทธิภาพการค้นหา
หากต้องการดำเนินการดังกล่าวใน Spanner คุณจะต้องทำ 2 สิ่งต่อไปนี้
- สร้างดัชนีเวกเตอร์
- แก้ไขคำค้นหาเพื่อใช้ฟังก์ชันระยะทาง APPROX
สร้างดัชนีเวกเตอร์
หากต้องการสร้างดัชนีเวกเตอร์ในชุดข้อมูลนี้ ก่อนอื่นเราจะต้องแก้ไขคอลัมน์ productDescriptionEmbeddings เพื่อกำหนดความยาวของเวกเตอร์แต่ละรายการ หากต้องการเพิ่มความยาวเวกเตอร์ลงในคอลัมน์ คุณต้องลบคอลัมน์เดิมและสร้างคอลัมน์ใหม่
ALTER TABLE `products` DROP COLUMN `productDescriptionEmbedding`;
ALTER TABLE
`products` ADD COLUMN `productDescriptionEmbedding` ARRAY<FLOAT32>(vector_length=>768);
จากนั้นสร้างการฝังอีกครั้งจากขั้นตอน Generate Vector embedding ที่คุณเรียกใช้ก่อนหน้านี้
UPDATE products p1
SET productDescriptionEmbedding =
(SELECT embeddings.values from ML.PREDICT(MODEL EmbeddingsModel,
(SELECT productDescription as content FROM products p2 where p2.productId=p1.productId)))
WHERE categoryId=1;
หลังจากสร้างคอลัมน์แล้ว ให้สร้างดัชนี
CREATE VECTOR INDEX ProductDescriptionEmbeddingIndex
ON products(productDescriptionEmbedding)
WHERE productDescriptionEmbedding IS NOT NULL
OPTIONS (
distance_type = 'COSINE'
);
ใช้ดัชนีใหม่
หากต้องการใช้ดัชนีเวกเตอร์ใหม่ คุณจะต้องแก้ไขคำค้นหาการฝังก่อนหน้าเล็กน้อย
นี่คือคำค้นหาเดิม
SELECT productName, productDescription, inventoryCount, COSINE_DISTANCE(
productDescriptionEmbedding,
( SELECT embeddings.values
FROM ML.PREDICT(
MODEL EmbeddingsModel,
(SELECT "I'd like to buy a starter bike for my 3 year old child" as content)
)
)
) as distance
FROM products
WHERE inventoryCount > 0
ORDER BY distance
LIMIT 5;
คุณจะต้องทำการเปลี่ยนแปลงต่อไปนี้
- ใช้คำแนะนำดัชนีสำหรับดัชนีเวกเตอร์ใหม่:
@{force_index=ProductDescriptionEmbeddingIndex} - เปลี่ยนการเรียกฟังก์ชัน
COSINE_DISTANCEเป็นAPPROX_COSINE_DISTANCEโปรดทราบว่าตัวเลือก JSON ในคำค้นหาสุดท้ายด้านล่างก็จำเป็นเช่นกัน - สร้างการฝังจากฟังก์ชัน ML.PREDICT แยกกัน
- คัดลอกผลลัพธ์ของการฝังลงในคำค้นหาสุดท้าย
สร้างการฝัง
-- Generate the prompt embeddings
SELECT embeddings.values
FROM ML.PREDICT(
MODEL EmbeddingsModel,
(SELECT "I'd like to buy a starter bike for my 3 year old child" as content)
)
)
ไฮไลต์ผลลัพธ์จากคำค้นหา แล้วคัดลอกผลลัพธ์

จากนั้นแทนที่ <VECTOR> ในคำค้นหาต่อไปนี้โดยวางการฝังที่คุณคัดลอกไว้
-- Embedding query now using the vector index
SELECT productName, productDescription, inventoryCount,
APPROX_COSINE_DISTANCE(productDescriptionEmbedding, array<float32>[@VECTOR], options => JSON '{\"num_leaves_to_search\": 10}')
FROM products @{force_index=ProductDescriptionEmbeddingIndex}
WHERE productDescriptionEmbedding IS NOT NULL AND inventoryCount > 0
ORDER BY distance
LIMIT 5;
ซึ่งควรมีลักษณะดังนี้

สรุป
ในขั้นตอนนี้ คุณได้แปลงสคีมาเพื่อสร้างดัชนีเวกเตอร์ จากนั้นเขียนคำค้นหาการฝังใหม่เพื่อทำการค้นหา ANN โดยใช้ดัชนีเวกเตอร์ ขั้นตอนนี้มีความสำคัญเมื่อข้อมูลของคุณเพิ่มขึ้นเพื่อปรับขนาดภาระงานการค้นหาเวกเตอร์
ขั้นตอนถัดไป
ต่อไปได้เวลาล้างข้อมูลแล้ว
8. การล้างข้อมูล (ไม่บังคับ)
หากต้องการล้างข้อมูล เพียงไปที่ส่วน Cloud Spanner ของ Cloud Console แล้วลบอินสแตนซ์ 'retail-demo' ที่เราสร้างขึ้นใน Codelab

9. ยินดีด้วย
ยินดีด้วย คุณทำการค้นหาความคล้ายคลึงโดยใช้การค้นหาเวกเตอร์ในตัวของ Spanner ได้สำเร็จ นอกจากนี้ คุณยังเห็นว่าการทำงานกับโมเดลการฝังและโมเดล LLM เพื่อมอบฟังก์ชันการทำงานของ Generative AI โดยตรงโดยใช้ SQL นั้นง่ายเพียงใด
สุดท้าย คุณได้เรียนรู้กระบวนการทำการค้นหา ANN ที่สนับสนุนโดย อัลกอริทึม ScaNN เพื่อปรับขนาดภาระงานการค้นหาเวกเตอร์
ขั้นตอนต่อไปคืออะไร
ดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์ Exact Nearest Neighbor (การค้นหาเวกเตอร์ KNN) ของ Spanner ได้ที่นี่ https://cloud.google.com/spanner/docs/find-k-nearest-neighbors
ดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์ Approximate Nearest Neighbor (การค้นหาเวกเตอร์ ANN) ของ Spanner ได้ที่นี่ https://cloud.google.com/spanner/docs/find-approximate-nearest-neighbors
นอกจากนี้ คุณยังอ่านเพิ่มเติมเกี่ยวกับวิธีทำการคาดการณ์ออนไลน์ด้วย SQL โดยใช้การผสานรวม Spanner กับ VertexAI ได้ที่นี่ https://cloud.google.com/spanner/docs/ml
