بدء استخدام ميزة "البحث المتجه" في Spanner

1. مقدمة

Spanner هي خدمة قاعدة بيانات مُدارة بالكامل وقابلة للتوسع الأفقي وموزّعة على مستوى العالم، وهي رائعة لكل من مهام العمل التشغيلية العلائقية وغير العلائقية.

يتضمّن Spanner ميزة البحث المضمّنة في المتجهات، ما يتيح لك إجراء بحث تشابه أو بحث دلالي وتنفيذ ميزة "إنشاء البحث المحسَّن" (RAG) في تطبيقات الذكاء الاصطناعي التوليدي على نطاق واسع، وذلك من خلال الاستفادة من ميزتَي أقرب K جار (KNN) أو أقرب جار تقريبي (ANN).

تُعرِض طلبات البحث بالاستناد إلى المتجهات في Spanner بيانات جديدة في الوقت الفعلي فور تأكيد المعاملات، تمامًا مثل أي طلب بحث آخر في بياناتك التشغيلية.

في هذا الدرس العملي، ستتعرّف على كيفية إعداد الميزات الأساسية المطلوبة للاستفادة من Spanner لإجراء البحث المتجه، والوصول إلى نماذج التضمين والنماذج اللغوية الكبيرة من حديقة النماذج في VertexAI باستخدام لغة الاستعلامات البنيوية (SQL).

ستبدو البنية على النحو التالي:

d179a760add7adc0.png

باستخدام هذه المعلومات الأساسية، ستتعرّف على كيفية إنشاء فهرس متّجه مستند إلى خوارزمية ScaNN، واستخدام دوالّ المسافة APPROX عندما تحتاج إلى توسيع نطاق أعباء العمل الدلالية.

ما ستُنشئه

كجزء من هذا الدرس التطبيقي، عليك تنفيذ ما يلي:

  • إنشاء مثيل Spanner
  • إعداد مخطّط قاعدة بيانات Spanner للدمج مع نماذج التضمين والنماذج اللغوية الكبيرة في VertexAI
  • تحميل مجموعة بيانات للبيع بالتجزئة
  • طرح طلبات بحث تستند إلى التشابه مع مجموعة البيانات
  • تقديم سياق لنموذج "التعلم الآلي على مستوى اللغة" لإنشاء اقتراحات خاصة بالمنتجات
  • عدِّل المخطّط وأنشئ فهرسًا للمتجه.
  • غيِّر طلبات البحث للاستفادة من فهرس المتجهات الذي تم إنشاؤه حديثًا.

المُعطيات

  • كيفية إعداد مثيل Spanner
  • كيفية الدمج مع VertexAI
  • كيفية استخدام Spanner لإجراء بحث متجه للعثور على سلع مشابهة في مجموعة بيانات للبيع بالتجزئة
  • كيفية إعداد قاعدة بياناتك لتوسيع نطاق أعباء عمل البحث بالاستناد إلى المتجهات باستخدام البحث المستند إلى الشبكات العصبية الاصطناعية

المتطلبات

  • مشروع على Google Cloud مرتبط بحساب فوترة
  • متصفّح ويب، مثل Chrome أو Firefox

2. الإعداد والمتطلبات

إنشاء مشروع

إذا لم يكن لديك حساب على Google (Gmail أو Google Apps)، عليك إنشاء حساب. سجِّل الدخول إلى وحدة تحكّم Google Cloud Platform ( console.cloud.google.com) وأنشِئ مشروعًا جديدًا.

إذا كان لديك مشروع، انقر على القائمة المنسدلة لاختيار المشروع في أعلى يمين وحدة التحكّم:

6c9406d9b014760.png

انقر على الزر "مشروع جديد" في مربّع الحوار الناتج لإنشاء مشروع جديد:

949d83c8a4ee17d9.png

إذا لم يكن لديك مشروع، من المفترض أن يظهر لك مربّع حوار مثل هذا لإنشاء مشروعك الأول:

870a3cbd6541ee86.png

يتيح لك مربّع الحوار اللاحق لإنشاء المشروع إدخال تفاصيل مشروعك الجديد:

6a92c57d3250a4b3.png

تذكَّر معرّف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (سبق أن تم استخدام الاسم أعلاه ولن يكون متاحًا لك). وسيتم الإشارة إليه لاحقًا في هذا الدليل التعليمي على أنّه PROJECT_ID.

بعد ذلك، عليك تفعيل الفوترة في "وحدة تحكّم المطوّرين" لاستخدام موارد Google Cloud وتفعيل Spanner API إذا لم يسبق لك إجراء ذلك.

15d0ef27a8fbab27.png

من المفترض ألا تتجاوز تكلفة تنفيذ هذا الدليل التعليمي حول الرموز البرمجية بضعة دولارات، ولكن قد تزيد هذه التكلفة إذا قرّرت استخدام المزيد من الموارد أو إذا تركت الأدوات تعمل (راجِع قسم "التنظيف" في نهاية هذا المستند). يمكنك الاطّلاع على أسعار Google Cloud Spanner هنا.

إنّ المستخدمين الجدد في Google Cloud Platform مؤهّلون للاستفادة من فترة تجريبية مجانية بقيمة 300 دولار أمريكي، ما يعني أنّ هذا الإصدار التجريبي من "مختبر رموز Google" سيكون مجانيًا بالكامل.

إعداد Google Cloud Shell

على الرغم من أنّه يمكن تشغيل Google Cloud وSpanner عن بُعد من الكمبيوتر المحمول، سنستخدم في هذا الإصدار التجريبي من "مختبر رموز Google" Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.

تم تجهيز هذا الجهاز الافتراضي المستنِد إلى Debian بجميع أدوات التطوير التي ستحتاج إليها. ويقدّم هذا الدليل دليلاً منزليًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يُحسِّن بشكل كبير أداء الشبكة والمصادقة. وهذا يعني أنّ كل ما ستحتاجه لتنفيذ هذا الدليل التعليمي هو متصفّح (نعم، يعمل على جهاز Chromebook).

  1. لتفعيل Cloud Shell من Cloud Console، ما عليك سوى النقر على رمز تفعيل Cloud Shell gcLMt5IuEcJJNnMId-Bcz3sxCd0rZn7IzT_r95C8UZeqML68Y1efBG_B0VRp7hc7qiZTLAF-TXD7SsOadxn8uadgHhaLeASnVS3ZHK39eOlKJOgj9SJua_oeGhMxRrbOg3qigddS2A (من المفترض ألا تستغرق عملية توفير البيئة والربط بها سوى بضع ثوانٍ).

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

Screen Shot 2017-06-14 at 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:

158fNPfwSxsFqz9YbtJVZes8viTS3d1bV4CVhij3XPxuzVFOtTObnwsphlm6lYGmgdMFwBJtc-FaLrZU7XHAg_ZYoCrgombMRR3h-eolLPcvO351c5iBv506B3ZwghZoiRg6cz23Qw

تضبط Cloud Shell أيضًا بعض متغيّرات البيئة تلقائيًا، ما قد يكون مفيدًا عند تنفيذ الأوامر المستقبلية.

echo $GOOGLE_CLOUD_PROJECT

ناتج الأمر

<PROJECT_ID>

تفعيل واجهة برمجة التطبيقات Spanner API

gcloud services enable spanner.googleapis.com

ملخّص

في هذه الخطوة، أعددت مشروعك إذا لم يكن لديك مشروع، وفعّلت Cloud Shell، وفعّلت واجهات برمجة التطبيقات المطلوبة.

المحتوى التالي

بعد ذلك، عليك إعداد مثيل Spanner وقاعدة البيانات.

3- إنشاء مثيل Spanner وقاعدة بيانات

إنشاء مثيل Spanner

في هذه الخطوة، سنُعدّ مثيل Spanner لمشروع "الكود البرمجي". لإجراء ذلك، افتح 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:

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.

النموذج الأول هو نموذج إدراج يُستخدَم لإنشاء إدراجات من النص، والثاني هو نموذج لغوي كبير يُستخدَم لإنشاء الردود استنادًا إلى البيانات في 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، من المفترض أن تظهر لك الجداول والنماذج التالية:

62455aa4b0e839d9.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.

المحتوى التالي

بعد ذلك، ستدمج نموذج "الترميز" لإنشاء نماذج ترميز لأوصاف المنتجات، بالإضافة إلى تحويل طلب بحث نصي إلى نموذج ترميز للبحث عن المنتجات ذات الصلة.

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 للعثور على المنتجات المشابهة. من المفترض أن تظهر النتائج على النحو التالي:

672e111753077fcf.png

يُرجى العِلم أنّه يتم استخدام فلاتر إضافية في الطلب، مثل الاهتمام فقط بالمنتجات المتوفّرة (inventoryCount > 0).

ملخّص

في هذه الخطوة، أنشأت اقتراحات لوصف المنتجات واقتراحات لطلبات البحث باستخدام لغة الاستعلامات البنيوية (SQL)، وذلك من خلال الاستفادة من دمج Spanner مع النماذج في VertexAI. أجريت أيضًا بحثًا باستخدام متجهات للعثور على منتجات مشابهة تتطابق مع طلب البحث.

الخطوات التالية

بعد ذلك، لنستخدم نتائج البحث لإدخالها في نموذج لغوي كبير (LLM) لإنشاء ردّ مخصّص لكل منتج.

6- العمل مع نموذج لغوي كبير

تسهِّل Spanner الدمج مع نماذج النماذج اللغوية الكبيرة (LLM) التي يتم عرضها من VertexAI. ويسمح ذلك للمطوّرين باستخدام SQL للتواصل مع قواعد البيانات اللغوية الكبيرة مباشرةً، بدلاً من مطالبة التطبيق بتنفيذ المنطق.

على سبيل المثال، لدينا نتائج من طلب البحث السابق على 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 لإصدار طلب البحث. من المفترض أن تظهر النتائج على النحو التالي:

35878cd0f88f1470.png

المنتج الأول مناسب لطفل عمره 3 سنوات بسبب الفئة العمرية الواردة في وصف المنتج (من عمر سنتين إلى 4 سنوات). المنتجات الأخرى غير مناسبة.

ملخّص

في هذه الخطوة، استخدمت نموذجًا لغويًا كبيرًا لإنشاء ردود أساسية على طلبات المستخدم.

الخطوات التالية

بعد ذلك، لنتعرّف على كيفية استخدام الشبكات العصبية الاصطناعية لتوسيع نطاق البحث عن المتجهات.

7- البحث عن المتجهات على نطاق واسع

استفادت أمثلة البحث بالاستناد إلى المتجهات السابقة من البحث بالاستناد إلى المتجهات باستخدام نموذج KNN الدقيق. وهذا أمر رائع عندما تتمكّن من طلب البحث عن مجموعات فرعية محدّدة جدًا من بيانات Spanner. ويُقال إنّ هذه الأنواع من طلبات البحث قابلة للتقسيم بشكل كبير.

إذا لم تكن لديك أعباء عمل قابلة للتقسيم بشكل كبير، وكان لديك كمية كبيرة من البيانات، ستحتاج إلى استخدام البحث بالاستناد إلى مصفوفات الشبكات العصبية الاصطناعية والاستفادة من خوارزمية 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)
  )
)

ميِّز النتائج من طلب البحث وانسخها.

1b43c5ae4ef9ab68.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;

من المفترض أن تظهر بشكلٍ مشابه لما يلي:

12397107ec49c491.png

ملخّص

في هذه الخطوة، حوّلت المخطّط لإنشاء فهرس متّجه. بعد ذلك، أعدت كتابة طلب البحث المضمّن لإجراء بحث باستخدام الشبكات العصبية الاصطناعية باستخدام فهرس المتجهات. هذه خطوة مهمة مع زيادة حجم بياناتك لتوسيع نطاق أعباء البحث بالاستناد إلى المتجهات.

الخطوات التالية

بعد ذلك، حان وقت التنظيف.

8. تنظيف البيانات (اختياري)

لإزالة العناصر غير الضرورية، ما عليك سوى الانتقال إلى قسم Cloud Spanner في Cloud Console وحذف مثيل "retail-demo" الذي أنشأناه في ورشة رموز البرامج.

41cbc1a84b3588d5.png

9. تهانينا!

تهانينا، لقد أجريت بنجاح عملية بحث عن التشابه باستخدام ميزة البحث المتجه المضمّنة في Spanner. بالإضافة إلى ذلك، تعرّفت على مدى سهولة العمل مع نماذج التضمين والنماذج اللغوية الكبيرة لتوفير وظائف الذكاء الاصطناعي التوليدي مباشرةً باستخدام SQL.

أخيرًا، تعرّفت على عملية إجراء البحث باستخدام الشبكات العصبية الاصطناعية (ANN) المستندة إلى خوارزمية ScaNN لتوسيع نطاق أعباء البحث بالاستناد إلى المتجهات.

ما هي الخطوات التالية؟

يمكنك الاطّلاع على مزيد من المعلومات عن ميزة "أقرب العناصر المتشابهة" الدقيقة في Spanner (بحث متجهات KNN) على الرابط التالي: https://cloud.google.com/spanner/docs/find-k-nearest-neighbors.

يمكنك الاطّلاع على مزيد من المعلومات عن ميزة "أقرب العناصر تقريبًا" (بحث متجهات الشبكات العصبية التوليدية) في Spanner على هذا الرابط: https://cloud.google.com/spanner/docs/find-approximate-nearest-neighbors

يمكنك أيضًا الاطّلاع على مزيد من المعلومات حول كيفية إجراء توقّعات على الإنترنت باستخدام لغة الاستعلامات البنيوية (SQL) باستخدام عملية دمج VertexAI في Spanner على هذا الرابط: https://cloud.google.com/spanner/docs/ml