1. เกริ่นนำ
SPANer เป็นบริการฐานข้อมูลที่มีการจัดการครบวงจรและรองรับการปรับขนาดได้อย่างเต็มรูปแบบและกระจายอยู่ทั่วโลก ซึ่งเหมาะสำหรับภาระงานด้านการดำเนินงานทั้งแบบเชิงสัมพันธ์และไม่สัมพันธ์กัน
การเปิดตัวฟังก์ชัน K-Nabor ใกล้เคียงที่สุดทำให้ขณะนี้ Spanner เป็นฐานข้อมูลเวกเตอร์ที่รองรับการปรับขนาดได้อย่างมาก ซึ่งช่วยให้คุณดำเนินการค้นหาตามความหมายหรือความคล้ายคลึงกัน รวมถึงนำการสร้างแบบเสริม (RAG) แบบดึงข้อมูลมาในแอปพลิเคชัน GenAI ได้ในวงกว้าง คำค้นหาเวกเตอร์ของ Spanner จะแสดงข้อมูลสดแบบเรียลไทม์ทันทีที่มีการดำเนินการธุรกรรม เช่นเดียวกับคำค้นหาอื่นๆ ในข้อมูลการดำเนินการของคุณ
ในห้องทดลองนี้ คุณจะได้รู้จักกับการตั้งค่าฟีเจอร์พื้นฐานที่จำเป็นต่อการใช้ประโยชน์จาก Spanner เพื่อค้นหาเวกเตอร์ และเข้าถึงการฝังและโมเดล LLM จากสวนโมเดลของ VertexAI โดยใช้ SQL
สถาปัตยกรรมจะมีลักษณะดังนี้
สิ่งที่คุณจะสร้าง
ในห้องทดลองนี้ คุณจะทำสิ่งต่อไปนี้ได้
- สร้างอินสแตนซ์ Spanner
- ตั้งค่าสคีมาฐานข้อมูลของ Spanner เพื่อผสานรวมกับโมเดล LLM และการฝังใน VertexAI
- โหลดชุดข้อมูลการค้าปลีก
- ออกคำค้นหาความคล้ายคลึงกันกับชุดข้อมูล
- ระบุบริบทให้กับโมเดล LLM เพื่อสร้างคำแนะนำเฉพาะผลิตภัณฑ์
สิ่งที่คุณจะได้เรียนรู้
- วิธีตั้งค่าอินสแตนซ์ Spanner
- วิธีผสานรวมกับ VertexAI
- วิธีใช้ Spanner ในการค้นหาเวกเตอร์เพื่อค้นหารายการที่คล้ายกันในชุดข้อมูลการค้าปลีก
สิ่งที่ต้องมี
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 ได้ที่นี่
ผู้ใช้ใหม่ของ 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
เอาต์พุตจากคำสั่ง:
$ gcloud spanner instances create $SPANNER_INSTANCE_ID \
--config=regional-us-central1 \
--description="spanner AI retail demo" \
--nodes=1
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<FLOAT64>,
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 FLOAT64>, values ARRAY<FLOAT64>>,
) REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<PROJECT_ID>/locations/us-central1/publishers/google/models/textembedding-gecko@003'
);
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/text-bison@001',
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. ใช้งานการฝัง
สร้างการฝังเวกเตอร์สำหรับคำอธิบายผลิตภัณฑ์
หากต้องการให้การค้นหาที่คล้ายกันทำงานกับผลิตภัณฑ์ได้ คุณต้องสร้างการฝังให้กับรายละเอียดผลิตภัณฑ์
นี่คือคำสั่ง DML ของ UPDATE
แบบง่ายๆ ด้วย EmbeddingsModel
ที่สร้างขึ้นในสคีมา
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 ปี) ผลิตภัณฑ์อื่นๆ ไม่เหมาะสำหรับ
สรุป
ขั้นตอนถัดไป
ต่อไปก็ถึงเวลาล้างข้อมูล
7. กำลังล้างข้อมูล (ไม่บังคับ)
หากต้องการล้างข้อมูล เพียงไปที่ส่วน Cloud Spanner ของ Cloud Console แล้วลบอินสแตนซ์ 'retail-demo
' ที่เราสร้างใน Codelab
8. ยินดีด้วย
ขอแสดงความยินดี คุณทำการค้นหาความคล้ายคลึงกันโดยใช้การค้นหาเวกเตอร์ในตัวของ Spanner สำเร็จแล้ว นอกจากนี้ คุณยังได้เห็นวิธีง่ายๆ ในการฝังการฝังและโมเดล LLM เพื่อมอบฟังก์ชันการทำงานของ Generative AI โดยตรงโดยใช้ SQL
ขั้นตอนถัดไปคือ
เรียนรู้เพิ่มเติมเกี่ยวกับฟีเจอร์เพื่อนบ้านที่ใกล้ที่สุด (การค้นหาเวกเตอร์ KNN) ของ Spanner ได้ที่นี่ https://cloud.google.com/spanner/docs/find-k-nearest-neighbors
นอกจากนี้ คุณยังอ่านเพิ่มเติมเกี่ยวกับวิธีการคาดการณ์ออนไลน์ด้วย SQL โดยใช้การผสานรวม VertexAI ของ Spanner ได้ที่นี่ https://cloud.google.com/spanner/docs/ml