ميزة "التقييم حسب الفئة حسب الجودة" التي تتضمّن أحدث ميزات البحث بالاستناد إلى المتجهات من AlloyDB

مراجعة جودة الموجّه مع أحدث ميزات البحث بالاستناد إلى المتجهات من AlloyDB

لمحة عن هذا الدرس التطبيقي حول الترميز

subjectتاريخ التعديل الأخير: مايو 28, 2025
account_circleتأليف: Author: Abirami Sukumaran

1. نظرة عامة

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

إنّ السرّ في البحث باستخدام المتجهات ليس فقط إنشاءها، بل معرفة ما إذا كانت مطابقات المتجهات جيدة حقًا. لقد مرّ بنا جميعًا هذا الموقف، حيث ننظر إلى قائمة النتائج بدون أن نعرف ما إذا كانت تعمل بشكل صحيح. لنطّلِع على كيفية تقييم جودة مطابقات المتجهات. قد تتساءل "ما الذي تغيّر في RAG؟" كل شيء على مدار سنوات، كان يبدو أنّ ميزة "الإنشاء المعزّز لاسترداد المعلومات" (RAG) هي هدف واعد ولكنّه بعيد المنال. والآن، لدينا أخيرًا الأدوات اللازمة لإنشاء تطبيقات RAG بالأداء والموثوقية المطلوبَين للمهام المهمة.

لدينا الآن فهم أساسي لثلاثة أمور:

  1. تعرَّف على أهمية البحث السياقي لموظّف الدعم وكيفية تحقيق ذلك باستخدام ميزة "البحث بالاستناد إلى المتجهات".
  2. لقد تعمّقنا أيضًا في الحصول على ميزة "البحث بالاستناد إلى المتجهات" في نطاق بياناتك، أي في قاعدة بياناتك نفسها (تتوافق جميع قواعد بيانات Google Cloud مع ذلك، إذا لم تكن على دراية بذلك).
  3. لقد قطعنا خطوة إضافية مقارنةً بباقي أنحاء العالم في إطلاعك على كيفية تحقيق قدرة RAG خفيفة الوزن لبحث المتجهات بأداء وجودة عاليَين باستخدام قدرة بحث المتجهات في AlloyDB المستندة إلى فهرس ScaNN.

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

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

تعرض الصورة أدناه المسار العام لما يحدث في هذا التطبيق.~ 1c871099f1fde825.png

الهدف

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

ما ستُنشئه

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

  1. إنشاء مثيل AlloyDB وتحميل مجموعة بيانات Patents Public Dataset
  2. إنشاء فهرس البيانات الوصفية فهرس ScaNN
  3. تنفيذ ميزة "البحث باستخدام المتجهات" المتقدّمة في AlloyDB باستخدام طريقة الفلترة المضمّنة في ScaNN
  4. تنفيذ ميزة تقييم "الاستدعاء"
  5. تقييم ردّ طلب البحث

المتطلبات

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

2. قبل البدء

إنشاء مشروع

  1. في Google Cloud Console، في صفحة أداة اختيار المشاريع، اختَر مشروعًا على Google Cloud أو أنشِئه.
  2. تأكَّد من تفعيل الفوترة لمشروعك على Cloud. تعرَّف على كيفية التحقّق مما إذا كانت الفوترة مفعَّلة في أحد المشاريع .
  3. ستستخدم Cloud Shell، وهي بيئة سطر أوامر تعمل في Google Cloud. انقر على "تفعيل Cloud Shell" في أعلى "وحدة تحكّم Google Cloud".

تفعيل صورة زر Cloud Shell

  1. بعد الاتصال بخدمة Cloud Shell، عليك التحقّق من أنّك سبق أن تم مصادقة حسابك وأنّ المشروع قد تم ضبطه على معرّف مشروعك باستخدام الأمر التالي:
gcloud auth list
  1. شغِّل الأمر التالي في Cloud Shell للتأكّد من أنّ الأمر gcloud يعرف مشروعك.
gcloud config list project
  1. إذا لم يتم ضبط مشروعك، استخدِم الأمر التالي لضبطه:
gcloud config set project <YOUR_PROJECT_ID>
  1. فعِّل واجهات برمجة التطبيقات المطلوبة. يمكنك استخدام أمر gcloud في وحدة تحكّم Cloud Shell الطرفية:
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.

راجِع المستندات لمعرفة أوامر gcloud وكيفية استخدامها.

3. إعداد قاعدة البيانات

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

لننشئ مجموعة ومثيلًا وجدولًا في AlloyDB حيث سيتم تحميل مجموعة بيانات براءات الاختراع.

إنشاء مجموعة ومثيل

  1. انتقِل إلى صفحة AlloyDB في Cloud Console. إنّ البحث عن معظم الصفحات في Cloud Console باستخدام شريط البحث في وحدة التحكّم هو طريقة سهلة للعثور عليها.
  2. اختَر إنشاء مجموعة من هذه الصفحة:

f76ff480c8c889aa.png

  1. ستظهر لك شاشة مثل الشاشة أدناه. أنشئ مجموعة ومثيلًا بالقيم التالية (تأكَّد من تطابق القيم في حال كنت تُنشئ نسخة طبق الأصل من رمز التطبيق من المستودع):
  • معرّف المجموعة: "vector-cluster"
  • كلمة المرور: "alloydb"
  • PostgreSQL 15 / أحدث إصدار ننصح به
  • المنطقة: "us-central1"
  • التواصل: "default"

538dba58908162fb.png

  1. عند اختيار الشبكة التلقائية، ستظهر لك شاشة مثل الشاشة أدناه.

انقر على إعداد عملية الربط.

7939bbb6802a91bf.png

  1. من هناك، اختَر "استخدام نطاق IP مخصّص تلقائيًا" ثم انقر على "متابعة". بعد مراجعة المعلومات، انقر على "إنشاء اتصال". 768ff5210e79676f.png
  2. بعد إعداد شبكتك، يمكنك مواصلة إنشاء مجموعتك. انقر على إنشاء مجموعة لإكمال إعداد المجموعة كما هو موضّح أدناه:

e06623e55195e16e.png

احرص على تغيير رقم تعريف المثيل (الذي يمكنك العثور عليه في وقت ضبط المجموعة أو المثيل) إلى

vector-instance. إذا لم تتمكّن من تغييره، تذكَّر استخدام رقم تعريف المثيل في جميع الإحالات القادمة.

يُرجى العِلم أنّ إنشاء المجموعة سيستغرق 10 دقائق تقريبًا. بعد اكتمال العملية بنجاح، من المفترض أن تظهر لك شاشة تعرض نظرة عامة على المجموعة التي أنشأتها للتو.

4. نقل البيانات

حان الوقت الآن لإضافة جدول يحتوي على بيانات المتجر. انتقِل إلى AlloyDB، واختَر المجموعة الأساسية ثم AlloyDB Studio:

847e35f1bf8a8bd8.png

قد تحتاج إلى الانتظار حتى تكتمل عملية إنشاء المثيل. بعد ذلك، سجِّل الدخول إلى AlloyDB باستخدام بيانات الاعتماد التي أنشأتها عند إنشاء المجموعة. استخدِم البيانات التالية لمصادقة PostgreSQL:

  • اسم المستخدم : "postgres"
  • قاعدة البيانات : "postgres"
  • كلمة المرور : "alloydb"

بعد المصادقة بنجاح في AlloyDB Studio، يتم إدخال أوامر SQL في المحرِّر. يمكنك إضافة عدّة نوافذ في "المحرِّر" باستخدام رمز الإضافة على يسار النافذة الأخيرة.

91a86d9469d499c4.png

عليك إدخال أوامر 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 أدناه في AlloyDB Studio:

CREATE TABLE patents_data ( id VARCHAR(25), type VARCHAR(25), number VARCHAR(20), country VARCHAR(2), date VARCHAR(20), abstract VARCHAR(300000), title VARCHAR(100000), kind VARCHAR(5), num_claims BIGINT, filename VARCHAR(100), withdrawn BIGINT, abstract_embeddings vector(768)) ;

سيسمح عمود abstract_embeddings بتخزين قيم المتجهات للنص.

منح الإذن

شغِّل العبارة أدناه لمنح إذن التنفيذ للدالة "embedding":

GRANT EXECUTE ON FUNCTION embedding TO postgres;

منح دور مستخدم Vertex AI لحساب خدمة AlloyDB

من وحدة تحكّم إدارة الهوية وإمكانية الوصول في Google Cloud، امنح حساب خدمة AlloyDB (الذي يبدو على النحو التالي: service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com) إذن الوصول إلى الدور "مستخدم Vertex AI". سيحتوي متغير PROJECT_NUMBER على رقم مشروعك.

بدلاً من ذلك، يمكنك تنفيذ الأمر التالي من وحدة 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"

تحميل بيانات براءات الاختراع إلى قاعدة البيانات

سيتم استخدام مجموعات البيانات العامة لبراءات اختراع Google على BigQuery كمجموعة بياناتنا. سنستخدم AlloyDB Studio لتشغيل استفساراتنا. يتم الحصول على البيانات من ملف insert_scripts.sql هذا وسنشغّله لتحميل بيانات براءات الاختراع.

  1. في Google Cloud Console، افتح صفحة AlloyDB.
  2. اختَر المجموعة التي تم إنشاؤها حديثًا وانقر على المثيل.
  3. في قائمة التنقّل في AlloyDB، انقر على AlloyDB Studio. سجِّل الدخول باستخدام بيانات الاعتماد.
  4. افتح علامة تبويب جديدة بالنقر على رمز علامة تبويب جديدة على يسار الصفحة.
  5. انسخ عبارة طلب البحث insert من النص البرمجي insert_scripts.sql المذكور أعلاه إلى المحرِّر. يمكنك نسخ من 10 إلى 50 عبارة إدراج لإجراء عرض توضيحي سريع لهذه الحالة.
  6. انقر على تشغيل. تظهر نتائج طلب البحث في جدول النتائج.

ملاحظة: قد تلاحظ أنّ نص الإدراج يحتوي على الكثير من البيانات. ويعود السبب في ذلك إلى أنّنا أدرجنا عناصر مضمّنة في نصوص الإدراج. انقر على "عرض النص الأصلي" في حال مواجهة مشكلة في تحميل الملف في GitHub. يتم ذلك لتجنّب حدوث مشكلة (في الخطوات القادمة) في إنشاء أكثر من بضع عمليات تضمين (من 20 إلى 25 كحد أقصى) في حال كنت تستخدم حساب فوترة رصيد تجريبيًا في Google Cloud.

5. إنشاء عمليات تضمين لبيانات براءات الاختراع

أولاً، لنختبر دالة التضمين من خلال تنفيذ نموذج الاستعلام التالي:

SELECT embedding('text-embedding-005', 'AlloyDB is a managed, cloud-hosted SQL database service.');

من المفترض أن يعرض هذا الطلب متجه "العناصر المضمّنة"، الذي يبدو مثل صفيف من الأعداد العشرية، لعينة النص في الطلب. يظهر على النحو التالي:

25a1d7ef0e49e91e.png

تعديل حقل Vector في abstract_embeddings

شغِّل لغة الاستعلامات البنيوية (DML) أدناه لتعديل ملخّصات براءات الاختراع في الجدول باستخدام البيانات المضمّنة المقابلة فقط إذا لم تُدرِج بيانات abstract_embeddings كجزء من نص الإدراج:

UPDATE patents_data set abstract_embeddings = embedding( 'text-embedding-005', abstract);

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

6. تنفيذ تحليل RAG المتقدّم باستخدام الميزات الجديدة في AlloyDB

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

SELECT id || ' - ' || title as title FROM patents_data ORDER BY abstract_embeddings <=> embedding('text-embedding-005', 'Sentiment Analysis')::vector LIMIT 10;

في هذا الطلب،

  1. النص الذي بحث عنه المستخدم هو: "تحليل المشاعر".
  2. نحن نحوّله إلى عناصر مضمّنة في الطريقة embedding() باستخدام النموذج: text-embedding-005.
  3. يشير "<=>" إلى استخدام طريقة المسافة "تشابه جيب التمام".
  4. نحن بصدد تحويل نتيجة طريقة التضمين إلى نوع متجه لجعلها متوافقة مع المتجهات المخزّنة في قاعدة البيانات.
  5. يشير LIMIT 10 إلى أنّنا نختار أقرب 10 نتائج مطابقة لنص البحث.

تنقل AlloyDB ميزة "البحث المتجه" في نموذج RAG إلى المستوى التالي:

تمّ تقديم عدد كبير من الميزات. إليك مثالان على الفعاليات التي تركّز على المطوّرين:

  1. الفلترة المضمّنة
  2. تقييم التذكُّر

الفلترة المضمّنة

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

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

  1. تثبيت إضافة pgvector أو تحديثها
CREATE EXTENSION IF NOT EXISTS vector WITH VERSION '0.8.0.google-3';

إذا سبق تثبيت إضافة pgvector، عليك ترقية إضافة vector إلى الإصدار 0.8.0.google-3 أو إصدار أحدث للحصول على إمكانات تقييم الاسترجاع.

ALTER EXTENSION vector UPDATE TO '0.8.0.google-3';

يجب تنفيذ هذه الخطوة فقط إذا كانت إضافة الأشكال الهندسية هي <0.8.0.google-3>.

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

  1. لإنشاء فهارس ScaNN، ثبِّت إضافة alloydb_scann.
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
  1. أولاً، شغِّل طلب البحث باستخدام نموذج "الاستعلامات في شكل رسوم بيانية" بدون الفهرس وبدون تفعيل الفلتر المضمّن:
SELECT id || ' - ' || title as title FROM patents_data 
WHERE num_claims
>= 15
ORDER BY abstract_embeddings
<=> embedding('text-embedding-005', 'Sentiment Analysis')::vector LIMIT 10;

يجب أن تكون النتيجة مشابهة لما يلي:

6989de0fc3f0f753.png

  1. يمكنك إجراء تحليل Explain Analyze عليه: (بدون فهرس أو فلترة مضمّنة)

908dcf87c7f00ed4.png

وقت التنفيذ هو 2.4 ملي ثانية

  1. لننشئ فهرسًا عاديًا في حقل num_claims لنتمكّن من الفلترة حسبه:
CREATE INDEX idx_patents_data_num_claims ON patents_data (num_claims);
  1. لننشئ فهرس ScaNN لتطبيق "بحث براءات الاختراع". شغِّل ما يلي من AlloyDB Studio:
CREATE INDEX patent_index ON patents_data 
USING scann
(abstract_embeddings cosine)
WITH
(num_leaves=32);

ملاحظة مهمة: ينطبق (num_leaves=32) على إجمالي مجموعة البيانات التي تضم أكثر من 1000 صف. إذا كان عدد الصفوف أقل من 100، لن تحتاج إلى إنشاء فهرس في المقام الأول لأنّه لن ينطبق على عدد صفوف أقل.

  1. اضبط الفلترة المضمّنة على أنّها مفعّلة في فهرس ScaNN:
SET scann.enable_inline_filtering = on
  1. الآن، لننفِّذ طلب البحث نفسه مع الفلتر وميزة "بحث المتجهات":
SELECT id || ' - ' || title as title FROM patents_data 
WHERE num_claims
>= 15
ORDER BY abstract_embeddings
<=> embedding('text-embedding-005', 'Sentiment Analysis')::vector LIMIT 10;

aa54cba2b2ada2cb.png

كما يمكنك ملاحظة انخفاض وقت التنفيذ بشكل كبير لـ "بحث المتجهات" نفسه. وقد تمكّنت من إجراء ذلك من خلال فهرس ScaNN المزوّد بميزة الفلترة المضمّنة في "بحث المتجهات".

بعد ذلك، لنقيّم نسبة استرجاع "بحث المتجهات" المفعَّل بهيئة ScaNN.

تقييم التذكُّر

في البحث عن التشابه، يشير التذكر إلى النسبة المئوية للحالات ذات الصلة التي تم استرجاعها من عملية بحث، أي عدد الحالات الموجبة الصحيحة. هذا هو المقياس الأكثر شيوعًا المستخدَم لقياس جودة نتائج البحث. ينتج أحد مصادر فقدان الاسترجاع عن الفرق بين البحث عن الجار الأقرب التقريبي أو aNN والبحث عن الجار الأقرب (الدقيق) أو kNN. تُنفِّذ مؤشرات المتجهات، مثل ScaNN في AlloyDB، خوارزميات الشبكات العصبية التجميعية، ما يتيح لك تسريع البحث عن المتجهات في مجموعات البيانات الكبيرة مقابل تنازل بسيط في نسبة الاسترجاع. توفّر لك AlloyDB الآن إمكانية قياس هذا المفاضلة مباشرةً في قاعدة البيانات للاستعلامات الفردية والتأكّد من ثباتها بمرور الوقت. يمكنك تعديل مَعلمات الطلب والفهرس استجابةً لهذه المعلومات لتحقيق نتائج وأداء أفضل.

ما هو المنطق الذي يستند إليه استدعاء نتائج البحث؟

في سياق البحث عن المتجهات، يشير "معدل الاسترجاع" إلى النسبة المئوية للمتجهات التي يعرضها الفهرس والتي هي أقرب المتجهات إلى بعضها. على سبيل المثال، إذا كان طلب البحث عن أقرب 20 جارًا يعرض 19 من أقرب الجيران في الحقيقة، تكون نسبة الاسترجاع ‎19/20x100 = %95. معدل الاسترجاع هو المقياس المستخدَم لجودة البحث، ويتم تعريفه على أنّه النسبة المئوية للنتائج المعروضة التي تكون الأقرب بشكل موضوعي إلى متجهات طلبات البحث.

يمكنك العثور على نسبة استرجاع طلب بحث متجه في فهرس متجه لإعدادات معيّنة باستخدام الدالة evaluate_query_recall. تتيح لك هذه الدالة ضبط مَعلماتك لتحقيق نتائج استرجاع طلب البحث بالاستناد إلى المتجهات التي تريدها.

ملاحظة مهمة:

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

  1. اضبط علامة "تفعيل فحص الفهرس" في فهرس ScaNN وفهرس HNSW:
SET scann.enable_indexscan = on
SET hnsw
.enable_index_scan = on
  1. نفِّذ الاستعلام التالي في AlloyDB Studio:
SELECT
  *
FROM
  evaluate_query_recall($$
  SELECT
    id || ' - ' || title AS title,
    abstract
  FROM
    patents_data
    where num_claims >= 15
  ORDER BY
    abstract_embeddings <=> embedding('text-embedding-005',
      'sentiment analysis')::vector
  LIMIT 25 $$,
    '{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
    ARRAY['scann']);

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

إليك معلومات حول طلب البحث عن المتجهات الذي كنّا نستخدمه:

c98f38fbe6a0b6c5.png

أرى أنّ نسبة الاسترجاع هي %70. يمكنني الآن استخدام هذه المعلومات لتغيير مَعلمات الفهرس والأساليب ومَعلمات طلب البحث وتحسين تذكري لـ "بحث المتجهات" هذا.

7. اختباره باستخدام مَعلمات طلب البحث والفهرس المعدَّلة

لنختبر الآن طلب البحث من خلال تعديل مَعلمات طلب البحث استنادًا إلى طلب الاسترجاع الذي تم تلقّيه.

  1. لقد عدّلت عدد الصفوف في مجموعة النتائج إلى 7 (من 25 سابقًا) وألاحظ تحسُّنًا في نسبة الاسترجاع، أي 86%.

c12f7b92b8481ceb.png

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

  1. لنحاول ذلك مرة أخرى من خلال تعديل مَعلمات الفهرس:

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

[قبل] طلب بحث يستخدم دالة المسافة "تشابه جيب التمام":

SELECT
  *
FROM
  evaluate_query_recall($$
  SELECT
    id || ' - ' || title AS title,
    abstract
  FROM
    patents_data
    where num_claims >= 15
  ORDER BY
    abstract_embeddings <=> embedding('text-embedding-005',
      'sentiment analysis')::vector
  LIMIT 10 $$,
    '{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
    ARRAY['scann']);

ملاحظة مهمة جدًا: قد تسأل: "كيف نعرف أنّ طلب البحث هذا يستخدم التشابه بأسلوب COSINE؟" يمكنك تحديد دالة المسافة باستخدام "<=>" لتمثيل المسافة وفقًا لقانون الجيب الزائدي.

رابط "مستندات Google" لدوالّ المسافة في "بحث المتجهات"

نتيجة طلب البحث أعلاه هي:

c62ef8922d6bf0b2.png

كما ترى، نسبة الاسترجاع هي %70 بدون أي تغيير في منطق الفهرس. هل تذكر فهرس ScaNN الذي أنشأناه في الخطوة 6 من قسم "الفلترة المضمّنة"، "patent_index "؟ لا يزال الفهرس نفسه ساريًا أثناء تنفيذ الطلب أعلاه.

لننشئ الآن فهرسًا باستخدام طلب بحث مختلف لدالة المسافة: مسافة L2: <->

drop index patent_index;

CREATE INDEX patent_index_L2 ON patents_data
USING scann
(abstract_embeddings L2)
WITH
(num_leaves=32);

إنّ عبارة drop index هي فقط لضمان عدم توفّر فهرس غير ضروري في الجدول.

يمكنني الآن تنفيذ الطلب التالي لتقييم ميزة RECALL بعد تغيير دالة المسافة في وظيفة "بحث المتجهات".

[بعد] طلب بحث يستخدم دالة المسافة "تشابه جيب التمام":

SELECT
  *
FROM
  evaluate_query_recall($$
  SELECT
    id || ' - ' || title AS title,
    abstract
  FROM
    patents_data
    where num_claims >= 15
  ORDER BY
    abstract_embeddings <-> embedding('text-embedding-005',
      'sentiment analysis')::vector
  LIMIT 10 $$,
    '{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
    ARRAY['scann']);

نتيجة طلب البحث أعلاه هي:

6c163dd08cf4d693.png

ما هذا التحوّل في قيمة التذكُّر، ‎90%؟

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

8. تَنظيم

لتجنُّب تحصيل رسوم من حسابك على Google Cloud مقابل الموارد المستخدَمة في هذه المشاركة، اتّبِع الخطوات التالية:

  1. في Google Cloud Console، انتقِل إلى صفحة مدير الموارد.
  2. في قائمة المشاريع، اختَر المشروع الذي تريد حذفه، ثم انقر على حذف.
  3. في مربّع الحوار، اكتب رقم تعريف المشروع، ثم انقر على إيقاف لحذف المشروع.
  4. بدلاً من ذلك، يمكنك ببساطة حذف مجموعة AlloyDB (يمكنك تغيير الموقع الجغرافي في هذا الرابط التشعّبي إذا لم تختَر us-central1 للمجموعة في وقت الضبط) التي أنشأناها للتو لهذا المشروع من خلال النقر على الزر DELETE CLUSTER (حذف المجموعة).

9. تهانينا

تهانينا! لقد أنشأت بنجاح طلب البحث السياقي عن براءات الاختراع باستخدام ميزة البحث بالاستناد إلى المتجهات المتقدّمة في AlloyDB لتحقيق أداء عالٍ وجعل البحث موجهًا نحو المعنى. لقد جمعتُ تطبيقًا وكيلاً متعدّد الأدوات يتم التحكّم في جودته ويستخدم ADK وكل أدوات AlloyDB التي ناقشناها هنا لإنشاء وكيل بحث وتحليل عالي الأداء والجودة لملفات براءات الاختراع باستخدام المتجهات، ويمكنك الاطّلاع عليه هنا: https://youtu.be/Y9fvVY0yZTY

إذا أردت التعرّف على كيفية إنشاء هذا الوكيل، يُرجى الرجوع إلى هذا codelab.

البدء اليوم!