شروع با جستجوی برداری آچار

۱. مقدمه

Spanner یک سرویس پایگاه داده توزیع‌شده جهانی، کاملاً مدیریت‌شده، مقیاس‌پذیر افقی و مناسب برای بارهای کاری عملیاتی رابطه‌ای و غیررابطه‌ای است.

اسپنر از جستجوی برداری داخلی پشتیبانی می‌کند و شما را قادر می‌سازد تا جستجوی شباهت یا معنایی را انجام دهید و تولید افزوده بازیابی (RAG) را در برنامه‌های GenAI در مقیاس بزرگ پیاده‌سازی کنید و از ویژگی‌های K-نزدیک‌ترین همسایه (KNN) یا نزدیکترین همسایه تقریبی (ANN) استفاده کنید.

کوئری‌های جستجوی برداری Spanner به محض انجام تراکنش‌ها، داده‌های تازه و بلادرنگ را برمی‌گردانند، درست مانند هر کوئری دیگری روی داده‌های عملیاتی شما.

در این آزمایش، شما با راه‌اندازی ویژگی‌های اساسی مورد نیاز برای استفاده از Spanner جهت انجام جستجوی برداری و دسترسی به مدل‌های جاسازی و LLM از باغ مدل VertexAI با استفاده از SQL آشنا خواهید شد.

معماری به این شکل خواهد بود:

d179a760add7adc0.png

با این پایه، شما یاد خواهید گرفت که چگونه یک شاخص برداری با پشتیبانی الگوریتم ScaNN ایجاد کنید و از توابع فاصله APPROX در مواقعی که حجم کار معنایی شما نیاز به مقیاس‌بندی دارد، استفاده کنید.

آنچه خواهید ساخت

به عنوان بخشی از این آزمایشگاه، شما:

  • یک نمونه Spanner ایجاد کنید
  • طرحواره پایگاه داده Spanner را برای ادغام با مدل‌های جاسازی و LLM در VertexAI تنظیم کنید
  • بارگذاری مجموعه داده‌های خرده‌فروشی
  • درخواست‌های جستجوی شباهت را در مجموعه داده‌ها اعمال کنید
  • زمینه را برای مدل LLM فراهم کنید تا توصیه‌های خاص محصول را ارائه دهد.
  • طرحواره را اصلاح کنید و یک شاخص برداری ایجاد کنید.
  • کوئری‌ها را طوری تغییر دهید که از شاخص برداری تازه ایجاد شده استفاده کنند.

آنچه یاد خواهید گرفت

  • نحوه راه‌اندازی یک نمونه Spanner
  • نحوه ادغام با VertexAI
  • نحوه استفاده از Spanner برای انجام جستجوی برداری جهت یافتن موارد مشابه در یک مجموعه داده خرده فروشی
  • چگونه پایگاه داده خود را برای مقیاس‌بندی حجم کار جستجوی برداری با استفاده از جستجوی ANN آماده کنید.

آنچه نیاز دارید

  • یک پروژه گوگل کلود که به یک حساب صورتحساب متصل است.
  • یک مرورگر وب، مانند کروم یا فایرفاکس .

۲. تنظیمات و الزامات

ایجاد یک پروژه

اگر از قبل حساب گوگل (جیمیل یا برنامه‌های گوگل) ندارید، باید یکی ایجاد کنید . وارد کنسول پلتفرم ابری گوگل ( console.cloud.google.com ) شوید و یک پروژه جدید ایجاد کنید.

اگر از قبل پروژه‌ای دارید، روی منوی کشویی انتخاب پروژه در سمت چپ بالای کنسول کلیک کنید:

6c9406d9b014760.png

و در پنجره‌ی باز شده روی دکمه‌ی «پروژه‌ی جدید» کلیک کنید تا یک پروژه‌ی جدید ایجاد شود:

۹۴۹d۸۳c۸a۴ee۱۷d۹.png

اگر از قبل پروژه‌ای ندارید، باید پنجره‌ای مانند این را برای ایجاد اولین پروژه خود ببینید:

870a3cbd6541ee86.png

پنجره‌ی بعدیِ ایجاد پروژه به شما امکان می‌دهد جزئیات پروژه‌ی جدید خود را وارد کنید:

6a92c57d3250a4b3.png

شناسه پروژه را به خاطر بسپارید، که یک نام منحصر به فرد در تمام پروژه‌های Google Cloud است (نام بالا قبلاً گرفته شده و برای شما کار نخواهد کرد، متاسفیم!). بعداً در این آزمایشگاه کد به آن PROJECT_ID گفته خواهد شد.

در مرحله بعد، اگر قبلاً این کار را نکرده‌اید، برای استفاده از منابع Google Cloud و فعال کردن Spanner API ، باید صورتحساب را در کنسول توسعه‌دهندگان فعال کنید .

15d0ef27a8fbab27.png

اجرای این آزمایشگاه کد نباید بیش از چند دلار برای شما هزینه داشته باشد، اما اگر تصمیم به استفاده از منابع بیشتر بگیرید یا اگر آنها را در حال اجرا رها کنید (به بخش «پاکسازی» در انتهای این سند مراجعه کنید)، می‌تواند بیشتر هم بشود. قیمت Google Cloud Spanner در اینجا مستند شده است.

کاربران جدید پلتفرم ابری گوگل واجد شرایط دریافت یک دوره آزمایشی رایگان ۳۰۰ دلاری هستند که این کدلب را کاملاً رایگان می‌کند.

راه‌اندازی پوسته ابری گوگل

اگرچه می‌توان از راه دور و از طریق لپ‌تاپ، گوگل کلود و اسپنر را کنترل کرد، اما در این آزمایشگاه کد، از گوگل کلود شل ، یک محیط خط فرمان که در فضای ابری اجرا می‌شود، استفاده خواهیم کرد.

این ماشین مجازی مبتنی بر دبیان، تمام ابزارهای توسعه مورد نیاز شما را در خود جای داده است. این ماشین مجازی یک دایرکتوری خانگی ۵ گیگابایتی دائمی ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی بهبود می‌بخشد. این بدان معناست که تنها چیزی که برای این آزمایشگاه کد نیاز دارید یک مرورگر است (بله، روی کروم‌بوک هم کار می‌کند).

  1. برای فعال کردن Cloud Shell از کنسول Cloud، کافیست روی Activate Cloud Shell کلیک کنید. gcLMt5IuEcJJNnMId-Bcz3sxCd0rZn7IzT_r95C8UZeqML68Y1efBG_B0VRp7hc7qiZTLAF-TXD7SsOadxn8uadgHhaLeASnVS3ZHK39eOlKJOgj9SJua_oeGhMxRrbOg3qigddS2A (فقط چند لحظه طول می‌کشد تا آماده شود و به محیط متصل شود).

JjEuRXGg0AYYIY6QZ8d-66gx_Mtc-_jDE9ijmbXLJSAXFvJt-qUpNtsBsYjNpv2W6BQSr Dc1D-ARINNQ-1EkwUhz-iUK-FUCZhJ-NtjvIEx9pIkE-246DomWuCfiGHK78DgoeWkHRw

اسکرین شات 2017-06-14 ساعت 10.13.43 PM.png

پس از اتصال به 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 جستجو کنید:

۱۵۸fNPfwSxsFqz9YbtJVZes8viTS3d1bV4CVhij3XPxuzVFOtTObnwsphlm6lYGmgdMFwBJtc-FaLrZU7XHAg_ZYoCrgombMRR3h-eolLPcvO351c5iBv506B3ZwghZoiRg6cz23Qw

Cloud Shell همچنین برخی از متغیرهای محیطی را به طور پیش‌فرض تنظیم می‌کند که ممکن است هنگام اجرای دستورات بعدی مفید باشند.

echo $GOOGLE_CLOUD_PROJECT

خروجی دستور

<PROJECT_ID>

فعال کردن Spanner API

gcloud services enable spanner.googleapis.com

خلاصه

در این مرحله، اگر پروژه‌ای نداشتید، آن را راه‌اندازی کرده‌اید، پوسته ابری را فعال کرده‌اید و APIهای مورد نیاز را فعال کرده‌اید.

بعدی

در مرحله بعد، نمونه و پایگاه داده Spanner را تنظیم خواهید کرد.

۳. یک نمونه و پایگاه داده 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 را تنظیم خواهید کرد.

۴. بارگذاری طرح و داده‌های Cymbal

طرحواره Cymbal را ایجاد کنید

برای تنظیم طرحواره، به Spanner Studio بروید:

3e1a0fed928b33cf.png

این طرحواره دو بخش دارد. اول، شما می‌خواهید جدول 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 کلیک کنید و چند ثانیه صبر کنید تا طرحواره شما ایجاد شود.

در مرحله بعد، دو مدل ایجاد کرده و آنها را با نقاط پایانی مدل VertexAI پیکربندی خواهید کرد.

مدل اول یک مدل جاسازی (Embedding) است که برای تولید جاسازی‌ها از متن استفاده می‌شود و مدل دوم یک مدل 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-pro',
default_batch_size = 1
);

سپس، روی دکمه run کلیک کنید و چند ثانیه صبر کنید تا مدل‌های شما ایجاد شوند.

در پنل سمت چپ Spanner Studio باید جداول و مدل‌های زیر را ببینید:

۶۲۴۵۵aa4b0e839d9.png

بارگذاری داده‌ها

حالا، می‌خواهید چند محصول را در پایگاه داده خود وارد کنید. یک تب جدید در 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 بارگذاری کردید.

بعدی

در مرحله بعد، شما با مدل Embedding ادغام خواهید شد تا جاسازی‌هایی برای توضیحات محصول ایجاد کنید، و همچنین یک درخواست جستجوی متنی را به یک جاسازی برای جستجوی محصولات مرتبط تبدیل کنید.

۵. با جاسازی‌ها کار کنید

ایجاد جاسازی‌های برداری برای توضیحات محصول

برای اینکه جستجوی شباهت روی محصولات کار کند، باید برای توضیحات محصول، جاسازی‌هایی ایجاد کنید.

با ایجاد EmbeddingsModel در طرحواره، این یک دستور DML ساده UPDATE است.

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 کلیک کنید. نتایج باید به شکل زیر باشد:

672e111753077fcf.png

توجه داشته باشید که فیلترهای اضافی در پرس و جو استفاده می‌شوند، مانند اینکه فقط به محصولاتی که در انبار موجود هستند ( inventoryCount > 0 ) علاقه‌مند باشند.

خلاصه

در این مرحله، شما با استفاده از SQL و با بهره‌گیری از ادغام Spanner با مدل‌ها در VertexAI، جاسازی‌های توضیحات محصول و جاسازی درخواست جستجو را ایجاد کردید. همچنین یک جستجوی برداری برای یافتن محصولات مشابه که با درخواست جستجو مطابقت دارند، انجام دادید.

مراحل بعدی

در مرحله بعد، بیایید از نتایج جستجو برای ارسال به یک LLM استفاده کنیم تا برای هر محصول، پاسخ سفارشی تولید شود.

۶. با یک 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 کلیک کنید. نتایج باید به شکل زیر باشد:

۳۵۸۷۸cd0f88f1470.png

محصول اول به دلیل محدوده سنی ذکر شده در توضیحات محصول (۲ تا ۴ سال)، برای کودک ۳ ساله مناسب است. سایر محصولات چندان مناسب نیستند.

خلاصه

در این مرحله، شما با یک LLM کار کردید تا پاسخ‌های اولیه به درخواست‌های کاربر را تولید کنید.

مراحل بعدی

در مرحله بعد، بیایید یاد بگیریم که چگونه از ANN برای مقیاس‌بندی جستجوی برداری استفاده کنیم.

۷. جستجوی برداری مقیاس‌بندی

مثال‌های قبلی جستجوی برداری از جستجوی برداری exact-KNN استفاده می‌کردند. این روش زمانی که بتوانید زیرمجموعه‌های بسیار خاصی از داده‌های Spanner خود را جستجو کنید، عالی است. گفته می‌شود که این نوع جستجوها قابلیت تقسیم‌بندی بالایی دارند.

اگر حجم کاری شما به شدت قابل تقسیم‌بندی نیست و حجم داده‌های شما زیاد است، بهتر است از جستجوی برداری ANN با استفاده از الگوریتم ScaNN برای افزایش کارایی جستجو استفاده کنید.

برای انجام این کار در Spanner، باید دو کار انجام دهید:

  • ایجاد یک اندیس برداری
  • پرس‌وجوی خود را برای استفاده از توابع فاصله 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)
  )
)

نتایج حاصل از پرس و جو را هایلایت کنید و آنها را کپی کنید.

۱b43c5ae4ef9ab68.png

سپس در کوئری زیر، <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;

باید چیزی شبیه به این باشد:

۱۲۳۹۷۱۰۷ec۴۹c۴۹۱.png

خلاصه

در این مرحله، شما طرحواره خود را برای ایجاد یک شاخص برداری تبدیل کردید. و سپس پرس و جوی جاسازی را برای انجام جستجوی ANN با استفاده از شاخص برداری بازنویسی کردید. این یک گام مهم است زیرا داده‌های شما برای مقیاس‌بندی حجم کار جستجوی برداری رشد می‌کنند.

مراحل بعدی

بعدش، وقت تمیز کردنه!

۸. تمیز کردن (اختیاری)

برای پاکسازی، کافیست به بخش Cloud Spanner در Cloud Console بروید و نمونه ' retail-demo ' که در codelab ایجاد کردیم را حذف کنید.

41cbc1a84b3588d5.png

۹. تبریک می‌گویم!

تبریک می‌گویم، شما با موفقیت جستجوی شباهت را با استفاده از جستجوی برداری داخلی Spanner انجام دادید. علاوه بر این، دیدید که کار با مدل‌های جاسازی و LLM برای ارائه قابلیت هوش مصنوعی مولد به طور مستقیم با استفاده از SQL چقدر آسان است.

در نهایت، فرآیند انجام جستجوی ANN با پشتیبانی الگوریتم ScaNN برای مقیاس‌بندی بارهای کاری جستجوی برداری را آموختید.

بعدش چی؟

برای کسب اطلاعات بیشتر در مورد ویژگی نزدیکترین همسایه دقیق (جستجوی برداری KNN) در Spanner، به آدرس زیر مراجعه کنید: https://cloud.google.com/spanner/docs/find-k-nearest-neighbors

برای کسب اطلاعات بیشتر در مورد ویژگی نزدیکترین همسایه تقریبی (جستجوی برداری ANN) در Spanner، به اینجا مراجعه کنید: https://cloud.google.com/spanner/docs/find-approximate-nearest-neighbors

همچنین می‌توانید اطلاعات بیشتری در مورد نحوه انجام پیش‌بینی‌های آنلاین با SQL با استفاده از ادغام VertexAI Spanner را در اینجا بخوانید: https://cloud.google.com/spanner/docs/ml