RAG کنترل شده با کیفیت با آخرین ویژگی های جستجوی برداری AlloyDB!

۱. مرور کلی

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

راز کثیف جستجوی برداری فقط ساختن آن نیست، بلکه دانستن این است که آیا تطابق‌های برداری شما واقعاً خوب هستند یا خیر. همه ما در این موقعیت بوده‌ایم که با نگاهی خالی به لیستی از نتایج خیره شده‌ایم و از خود می‌پرسیم: «آیا این اصلاً کار می‌کند؟!» بیایید به چگونگی ارزیابی واقعی کیفیت تطابق‌های برداری خود بپردازیم. می‌پرسید: «خب، چه چیزی در RAG تغییر کرده است؟» همه چیز! سال‌ها، بازیابی نسل افزوده (RAG) مانند یک هدف امیدوارکننده اما دست‌نیافتنی به نظر می‌رسید. اکنون، بالاخره، ما ابزارهایی برای ساخت برنامه‌های RAG با عملکرد و قابلیت اطمینان مورد نیاز برای وظایف حیاتی داریم.

اکنون ما درک اساسی از ۳ چیز داریم:

  1. جستجوی زمینه‌ای برای عامل شما به چه معناست و چگونه می‌توان با استفاده از جستجوی برداری (Vector Search) آن را انجام داد.
  2. ما همچنین عمیقاً به دنبال دستیابی به جستجوی برداری در محدوده داده‌های شما، یعنی درون خود پایگاه داده شما هستیم (اگر از قبل نمی‌دانستید، همه پایگاه‌های داده ابری گوگل از آن پشتیبانی می‌کنند!).
  3. ما با استفاده از قابلیت جستجوی برداری AlloyDB که توسط شاخص ScaNN پشتیبانی می‌شود، یک قدم فراتر از سایر نقاط جهان رفتیم و به شما گفتیم که چگونه می‌توانید چنین قابلیت جستجوی برداری سبک RAG را با عملکرد و کیفیت بالا به دست آورید.

اگر آن آزمایش‌های مقدماتی، متوسط ​​و کمی پیشرفته RAG را انجام نداده‌اید، توصیه می‌کنم آن ۳ مورد را به ترتیب اینجا ، اینجا و اینجا بخوانید.

جستجوی پتنت به کاربر در یافتن پتنت‌های مرتبط با متن جستجویش کمک می‌کند و ما قبلاً نسخه‌ای از آن را ساخته‌ایم. اکنون آن را با ویژگی‌های جدید و پیشرفته RAG خواهیم ساخت که امکان جستجوی متنی با کیفیت کنترل‌شده را برای آن برنامه فراهم می‌کند. بیایید شروع کنیم!

تصویر زیر روند کلی اتفاقات این برنامه را نشان می‌دهد.~ 1c871099f1fde825.png

هدف

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

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

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

  1. ایجاد یک نمونه AlloyDB و بارگذاری مجموعه داده‌های عمومی اختراعات
  2. ایجاد شاخص فراداده و شاخص ScaNN
  3. پیاده‌سازی جستجوی برداری پیشرفته در AlloyDB با استفاده از روش فیلترینگ درون‌خطی ScaNN
  4. پیاده‌سازی ویژگی ارزیابی یادآوری
  5. ارزیابی پاسخ پرس‌وجو

الزامات

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

۲. قبل از شروع

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

  1. در کنسول گوگل کلود ، در صفحه انتخاب پروژه، یک پروژه گوگل کلود را انتخاب یا ایجاد کنید.
  2. مطمئن شوید که صورتحساب برای پروژه ابری شما فعال است. یاد بگیرید که چگونه بررسی کنید که آیا صورتحساب در یک پروژه فعال است یا خیر .
  3. شما از Cloud Shell ، یک محیط خط فرمان که در Google Cloud اجرا می‌شود، استفاده خواهید کرد. روی Activate 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. API های مورد نیاز را فعال کنید. می‌توانید از دستور 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 به مستندات مراجعه کنید.

۳. راه‌اندازی پایگاه داده

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

بیایید یک کلاستر، نمونه و جدول AlloyDB ایجاد کنیم که مجموعه داده‌های ثبت اختراع در آن بارگذاری شود.

ایجاد یک کلاستر و نمونه

  1. در کنسول ابری، صفحه AlloyDB را پیمایش کنید. یک راه آسان برای یافتن اکثر صفحات در کنسول ابری، جستجوی آنها با استفاده از نوار جستجوی کنسول است.
  2. از آن صفحه، گزینه CREATE CLUSTER را انتخاب کنید:

f76ff480c8c889aa.png

  1. صفحه‌ای مانند تصویر زیر خواهید دید. یک کلاستر و نمونه با مقادیر زیر ایجاد کنید (مطمئن شوید که مقادیر مطابقت دارند، در صورتی که کد برنامه را از مخزن کپی می‌کنید):
  • شناسه خوشه : " vector-cluster "
  • رمز عبور : " alloydb "
  • PostgreSQL 15 / آخرین نسخه توصیه شده
  • منطقه : " us-central1 "
  • شبکه : " default "

538dba58908162fb.png

  1. وقتی شبکه پیش‌فرض را انتخاب می‌کنید، صفحه‌ای مانند تصویر زیر مشاهده خواهید کرد.

تنظیم اتصال را انتخاب کنید.

7939bbb6802a91bf.png

  1. از آنجا، « استفاده از یک محدوده IP اختصاص داده شده خودکار » را انتخاب کرده و ادامه دهید. پس از بررسی اطلاعات، «ایجاد اتصال» را انتخاب کنید. 768ff5210e79676f.png
  2. پس از راه‌اندازی شبکه، می‌توانید به ایجاد خوشه خود ادامه دهید. برای تکمیل راه‌اندازی خوشه، مطابق شکل زیر، روی CREATE CLUSTER کلیک کنید:

e06623e55195e16e.png

مطمئن شوید که شناسه نمونه (که می‌توانید در زمان پیکربندی خوشه/نمونه پیدا کنید) را به ... تغییر دهید.

اگر نمی‌توانید آن را تغییر دهید، به یاد داشته باشید که در تمام ارجاعات بعدی از vector-instance نمونه خود استفاده کنید .

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

۴. دریافت داده‌ها

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

847e35f1bf8a8bd8.png

ممکن است لازم باشد منتظر بمانید تا نمونه شما به طور کامل ایجاد شود. پس از اتمام این کار، با استفاده از اعتبارنامه‌هایی که هنگام ایجاد خوشه ایجاد کرده‌اید، وارد AlloyDB شوید. از داده‌های زیر برای تأیید اعتبار در PostgreSQL استفاده کنید:

  • نام کاربری: " postgres "
  • پایگاه داده: " postgres "
  • رمز عبور: " alloydb "

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

۹۱a۸۶d۹۴۶۹d۴۹۹c۴.png

شما می‌توانید دستورات AlloyDB را در پنجره‌های ویرایشگر وارد کنید و در صورت لزوم از گزینه‌های Run، Format و Clear استفاده کنید.

فعال کردن افزونه‌ها

برای ساخت این برنامه، از افزونه‌های pgvector و google_ml_integration استفاده خواهیم کرد. افزونه pgvector به شما امکان ذخیره و جستجوی جاسازی‌های برداری را می‌دهد. افزونه google_ml_integration توابعی را ارائه می‌دهد که برای دسترسی به نقاط پایانی پیش‌بینی هوش مصنوعی Vertex برای دریافت پیش‌بینی‌ها در 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 IAM ، به حساب سرویس AlloyDB (که به این شکل است: service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com) دسترسی به نقش "Vertex AI User" را بدهید. 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"

بارگذاری داده‌های ثبت اختراع در پایگاه داده

مجموعه داده‌های عمومی ثبت اختراعات گوگل در BigQuery به عنوان مجموعه داده ما استفاده خواهد شد. ما از AlloyDB Studio برای اجرای کوئری‌های خود استفاده خواهیم کرد. داده‌ها در فایل insert_scripts.sql قرار می‌گیرند و ما آن را برای بارگذاری داده‌های ثبت اختراع اجرا خواهیم کرد.

  1. در کنسول Google Cloud، صفحه AlloyDB را باز کنید.
  2. کلاستر تازه ایجاد شده خود را انتخاب کنید و روی نمونه کلیک کنید.
  3. در منوی ناوبری AlloyDB، روی AlloyDB Studio کلیک کنید. با اطلاعات کاربری خود وارد شوید.
  4. با کلیک روی نماد برگه جدید در سمت راست، یک برگه جدید باز کنید.
  5. عبارت پرس و جوی insert را از اسکریپت insert_scripts.sql که در بالا ذکر شد، در ویرایشگر کپی کنید. می‌توانید برای نمایش سریع این مورد استفاده، 10 تا 50 عبارت درج را کپی کنید.
  6. روی «اجرا» کلیک کنید. نتایج پرس‌وجوی شما در جدول نتایج ظاهر می‌شود.

توجه: ممکن است متوجه شوید که اسکریپت درج، داده‌های زیادی در خود دارد. این به این دلیل است که ما جاسازی‌ها را در اسکریپت‌های درج گنجانده‌ایم. در صورتی که در بارگیری فایل در گیت‌هاب مشکل دارید، روی «مشاهده خام» کلیک کنید. این کار به این منظور انجام می‌شود که در صورتی که از یک حساب پرداخت اعتباری آزمایشی برای Google Cloud استفاده می‌کنید، از دردسر تولید بیش از چند جاسازی (مثلاً حداکثر ۲۰ تا ۲۵) در مراحل بعدی خلاص شوید.

۵. ایجاد جاسازی‌ها برای داده‌های ثبت اختراع

ابتدا بیایید تابع جاسازی را با اجرای کوئری نمونه زیر آزمایش کنیم:

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

این باید بردار جاسازی‌ها را که شبیه آرایه‌ای از اعداد اعشاری است، برای متن نمونه در پرس‌وجو برگرداند. به این شکل است:

25a1d7ef0e49e91e.png

فیلد بردار abstract_embeddings را به‌روزرسانی کنید

DML زیر را اجرا کنید تا خلاصه‌های ثبت اختراع در جدول با جاسازی‌های مربوطه به‌روزرسانی شوند، البته فقط در صورتی که داده‌های abstract_embeddings را به عنوان بخشی از اسکریپت درج وارد نکرده باشید:

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

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

۶. انجام RAG پیشرفته با ویژگی‌های جدید AlloyDB

حالا که جدول، داده‌ها و جاسازی‌ها آماده هستند، بیایید جستجوی برداری بلادرنگ (real-time Vector Search) را برای متن جستجوی کاربر انجام دهیم. می‌توانید این را با اجرای کوئری زیر آزمایش کنید:

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 به embedding تبدیل می‌کنیم.
  3. «<=>» نشان دهنده استفاده از روش فاصله تشابه کسینوس است.
  4. ما نتیجه متد جاسازی را به نوع بردار تبدیل می‌کنیم تا با بردارهای ذخیره شده در پایگاه داده سازگار شود.
  5. LIMIT 10 نشان می‌دهد که ما 10 مورد از نزدیک‌ترین تطابق‌ها با متن جستجو را انتخاب می‌کنیم.

AlloyDB، جستجوی برداری RAG را به سطح بالاتری می‌برد:

تعداد زیادی مورد معرفی شده است. دو مورد از موارد متمرکز بر توسعه‌دهندگان عبارتند از:

  1. فیلتر درون خطی
  2. ارزیاب یادآوری

فیلتر درون خطی

پیش از این، به عنوان یک توسعه‌دهنده، شما مجبور بودید کوئری Vector Search را انجام دهید و با فیلتر کردن و فراخوانی آن سر و کار داشته باشید. AlloyDB Query Optimizer در مورد نحوه اجرای یک کوئری با فیلترها تصمیم می‌گیرد. فیلتر درون‌خطی، یک تکنیک جدید بهینه‌سازی کوئری است که به بهینه‌ساز کوئری 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 یا بالاتر ارتقا دهید تا از قابلیت‌های ارزیابی فراخوان (recall evaluator) بهره‌مند شوید.

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

این مرحله فقط در صورتی باید اجرا شود که پسوند بردار شما <0.8.0.google-3> باشد.

نکته مهم: اگر تعداد ردیف‌های شما کمتر از ۱۰۰ باشد، نیازی به ایجاد شاخص ScaNN در وهله اول نخواهید داشت زیرا برای ردیف‌های کمتر اعمال نمی‌شود. لطفاً در این صورت از مراحل زیر صرف نظر کنید.

  1. برای ایجاد اندیس‌های ScaNN، افزونه alloydb_scann را نصب کنید.
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
  1. ابتدا جستجوی برداری (Vector Search Query) را بدون اندیس و بدون فعال بودن فیلتر درون‌خطی (Inline Filter) اجرا کنید:
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

زمان اجرا ۲.۴ میلی‌ثانیه

  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) برای کل مجموعه داده‌های ما با بیش از ۱۰۰۰ ردیف اعمال می‌شود. اگر تعداد ردیف‌های شما کمتر از ۱۰۰ باشد، نیازی به ایجاد شاخص در وهله اول نخواهید داشت زیرا برای ردیف‌های کمتر اعمال نمی‌شود.

  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;

aa54cba2b2ada2c.png

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

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

ارزیاب یادآوری

فراخوانی در جستجوی شباهت، درصد نمونه‌های مرتبطی است که از یک جستجو بازیابی شده‌اند، یعنی تعداد موارد مثبت واقعی. این رایج‌ترین معیار مورد استفاده برای اندازه‌گیری کیفیت جستجو است. یکی از منابع از دست دادن فراخوانی، تفاوت بین جستجوی تقریبی نزدیکترین همسایه یا aNN و جستجوی k (دقیق) نزدیکترین همسایه یا kNN است. شاخص‌های برداری مانند ScaNN از AlloyDB الگوریتم‌های aNN را پیاده‌سازی می‌کنند و به شما این امکان را می‌دهند که در ازای یک بده‌بستان کوچک در فراخوانی، جستجوی برداری را در مجموعه داده‌های بزرگ سرعت بخشید. اکنون، AlloyDB این امکان را برای شما فراهم می‌کند که این بده‌بستان را مستقیماً در پایگاه داده برای پرس‌وجوهای فردی اندازه‌گیری کنید و از پایداری آن در طول زمان اطمینان حاصل کنید. می‌توانید پارامترهای پرس‌وجو و شاخص را در پاسخ به این اطلاعات به‌روزرسانی کنید تا به نتایج و عملکرد بهتری دست یابید.

منطق پشت یادآوری نتایج جستجو چیست؟

در زمینه جستجوی برداری، فراخوانی به درصد بردارهایی اشاره دارد که شاخص، نزدیکترین همسایه‌های واقعی را برمی‌گرداند. برای مثال، اگر یک جستجوی نزدیکترین همسایه برای 20 نزدیکترین همسایه، 19 نزدیکترین همسایه واقعی را برگرداند، آنگاه فراخوانی برابر با 19/20x100 = 95% است. فراخوانی معیاری است که برای کیفیت جستجو استفاده می‌شود و به عنوان درصد نتایج برگشتی که به طور عینی به بردارهای جستجو نزدیک هستند، تعریف می‌شود.

شما می‌توانید با استفاده از تابع evaluate_query_recall، فراخوانی یک پرس‌وجوی برداری را روی یک اندیس برداری برای یک پیکربندی مشخص پیدا کنید. این تابع به شما امکان می‌دهد پارامترهای خود را تنظیم کنید تا به نتایج فراخوانی پرس‌وجوی برداری مورد نظر خود برسید.

نکته مهم:

اگر در مراحل بعدی با خطای عدم اجازه دسترسی در شاخص HNSW مواجه شدید، فعلاً از کل این بخش ارزیابی فراخوان صرف نظر کنید. ممکن است در حال حاضر مربوط به محدودیت‌های دسترسی باشد، زیرا این خطا در زمان انتشار این کد منتشر شده است.

  1. پرچم Enable Index Scan را روی شاخص 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

می‌بینم که میزان بازیابی (RECALL) برابر با ۷۰٪ است. حالا می‌توانم از این اطلاعات برای تغییر پارامترهای اندیس، متدها و پارامترهای پرس‌وجو استفاده کنم و میزان بازیابی‌ام را برای این جستجوی برداری بهبود بخشم!

۷. آن را با پارامترهای پرس‌وجو و شاخص اصلاح‌شده آزمایش کنید

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

  1. من تعداد ردیف‌های مجموعه نتایج را به ۷ تغییر داده‌ام (از ۲۵ ردیف قبلی) و میزان بازیابی بهبود یافته، یعنی ۸۶٪ را می‌بینم.

c12f7b92b8481ceb.png

این یعنی می‌توانم در لحظه تعداد تطابق‌هایی که کاربرانم می‌بینند را تغییر دهم تا ارتباط تطابق‌ها را مطابق با زمینه جستجوی کاربران بهبود بخشم.

  1. بیایید دوباره با تغییر پارامترهای اندیس امتحان کنیم:

برای این آزمون، من به جای تابع فاصله شباهت " کسینوس" از " فاصله L2" استفاده خواهم کرد. همچنین محدودیت پرس و جو را به 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']);

نکته بسیار مهم: شما می‌پرسید: «از کجا بفهمیم که این پرس‌وجو از شباهت کسینوسی استفاده می‌کند؟» می‌توانید تابع فاصله را با استفاده از «<=>» برای نمایش فاصله کسینوسی شناسایی کنید.

لینک اسناد برای توابع فاصله جستجوی برداری.

نتیجه کوئری بالا این است:

c62ef8922d6bf0b2.png

همانطور که می‌بینید، RECALL بدون هیچ تغییری در منطق اندیس ما، ۷۰٪ است. اندیس ScaNN که در مرحله ۶ از بخش فیلتر درون‌خطی ایجاد کردیم، " 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

چه تحولی در ارزش یادآوری، ۹۰٪!!!

پارامترهای دیگری نیز وجود دارند که می‌توانید در اندیس تغییر دهید، مانند num_leaves و غیره. این پارامترها را می‌توانید بر اساس مقدار فراخوانی مورد نظر و مجموعه داده‌ای که برنامه شما استفاده می‌کند، تنظیم کنید.

۸. تمیز کردن

برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این پست، این مراحل را دنبال کنید:

  1. در کنسول گوگل کلود، به صفحه مدیریت منابع بروید.
  2. در لیست پروژه‌ها، پروژه‌ای را که می‌خواهید حذف کنید انتخاب کنید و سپس روی «حذف» کلیک کنید.
  3. در کادر محاوره‌ای، شناسه پروژه را تایپ کنید و سپس برای حذف پروژه، روی خاموش کردن کلیک کنید.
  4. از طرف دیگر، می‌توانید کلاستر AlloyDB را که برای این پروژه ایجاد کرده‌ایم، با کلیک روی دکمه‌ی DELETE CLUSTER حذف کنید (اگر در زمان پیکربندی، us-central1 را برای کلاستر انتخاب نکرده‌اید، مکان آن را در این هایپرلینک تغییر دهید).

۹. تبریک

تبریک! شما با موفقیت کوئری جستجوی پتنت متنی خود را با جستجوی وکتور پیشرفته AlloyDB برای عملکرد بالا و واقعاً معنامحور کردن آن ساختید. من یک برنامه عامل چند ابزاره با کنترل کیفیت تهیه کرده‌ام که از ADK و تمام موارد AlloyDB که در اینجا مورد بحث قرار دادیم، برای ایجاد یک عامل جستجو و تحلیلگر بردار پتنت با عملکرد بالا و کیفیت بالا استفاده می‌کند که می‌توانید آن را اینجا مشاهده کنید: https://youtu.be/Y9fvVY0yZTY

اگر می‌خواهید ساخت آن عامل را یاد بگیرید، لطفاً به این codelab مراجعه کنید.

همین امروز شروع کنید !