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

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

درباره این codelab

subjectآخرین به‌روزرسانی: مه ۲۸, ۲۰۲۵
account_circleنویسنده: Author: Abirami Sukumaran

1. نمای کلی

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

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

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

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

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

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

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

هدف

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

چیزی که خواهی ساخت

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

  1. یک نمونه AlloyDB ایجاد کنید و مجموعه داده های عمومی Patents را بارگیری کنید
  2. نمایه ابرداده و نمایه ScaNN ایجاد کنید
  3. با استفاده از روش فیلتر درون خطی ScaNN، جستجوی برداری پیشرفته را در AlloyDB پیاده سازی کنید
  4. قابلیت Recall eval را پیاده سازی کنید
  5. پاسخ پرس و جو را ارزیابی کنید

الزامات

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

2. قبل از شروع

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

  1. در Google Cloud Console ، در صفحه انتخاب پروژه، یک پروژه Google Cloud را انتخاب یا ایجاد کنید.
  2. مطمئن شوید که صورتحساب برای پروژه Cloud شما فعال است. با نحوه بررسی فعال بودن صورت‌حساب در پروژه آشنا شوید.
  3. شما از Cloud Shell ، یک محیط خط فرمان که در Google Cloud اجرا می شود، استفاده خواهید کرد. روی Activate Cloud Shell در بالای کنسول Google Cloud کلیک کنید.

تصویر دکمه Cloud Shell را فعال کنید

  1. پس از اتصال به Cloud Shell، با استفاده از دستور زیر بررسی می‌کنید که قبلاً احراز هویت شده‌اید و پروژه به ID پروژه شما تنظیم شده است:
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 به اسناد مراجعه کنید.

3. راه اندازی پایگاه داده

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

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

یک خوشه و نمونه ایجاد کنید

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

f76ff480c8c889aa.png

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

538dba58908162fb.png

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

SET UP CONECTION را انتخاب کنید.

7939bbb6802a91bf.png

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

e06623e55195e16e.png

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

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

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

4. بلع داده ها

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

847e35f1bf8a8bd8.png

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

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

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

91a86d9469d499c4.png

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

برنامه های افزودنی را فعال کنید

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

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;

ROLE کاربر Vertex AI را به حساب سرویس AlloyDB اعطا کنید

از کنسول Google Cloud IAM ، به حساب سرویس 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، صفحه AlloyDB را باز کنید.
  2. خوشه تازه ایجاد شده خود را انتخاب کنید و روی نمونه کلیک کنید.
  3. در منوی مسیریابی AlloyDB، روی AlloyDB Studio کلیک کنید. با اعتبار خود وارد شوید.
  4. با کلیک بر روی نماد برگه جدید در سمت راست، یک برگه جدید باز کنید.
  5. عبارت insert query را از اسکریپت insert_scripts.sql که در بالا ذکر شد در ویرایشگر کپی کنید. شما می توانید 10-50 عبارت insert را برای نمایش سریع این مورد استفاده کپی کنید.
  6. روی Run کلیک کنید. نتایج جستجوی شما در جدول نتایج ظاهر می شود.

توجه: ممکن است متوجه شوید که اسکریپت درج داده های زیادی در خود دارد. این به این دلیل است که ما تعبیه‌هایی را در اسکریپت‌های درج قرار داده‌ایم. در صورتی که در بارگذاری فایل در github با مشکل مواجه شدید، روی "View Raw" کلیک کنید. در صورتی که از حساب صورت‌حساب اعتبار آزمایشی برای Google Cloud استفاده می‌کنید، این کار به این منظور انجام می‌شود که شما را از مشکل (در مراحل آتی) در ایجاد بیش از چند جاسازی (مثلاً حداکثر 20-25) نجات دهد.

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

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

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

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

25a1d7ef0e49e91e.png

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

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

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

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

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. ما آن را با استفاده از مدل text-embedding-005 به embeddings در متد embedding() تبدیل می کنیم.
  3. "<=>" نشان دهنده استفاده از روش فاصله COSINE SIMILARITY است.
  4. ما در حال تبدیل نتیجه روش embedding به نوع برداری هستیم تا آن را با بردارهای ذخیره شده در پایگاه داده سازگار کنیم.
  5. LIMIT 10 نشان دهنده این است که ما در حال انتخاب 10 نزدیکترین مطابقت متن جستجو هستیم.

AlloyDB Vector Search RAG را به سطح بعدی می برد:

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

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

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

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

فیلتر درون خطی برای موارد با گزینش پذیری متوسط ​​بهترین است. همانطور که AlloyDB در میان شاخص برداری جستجو می کند، فقط فاصله ها را برای بردارهایی محاسبه می کند که با شرایط فیلتر ابرداده مطابقت دارند (فیلترهای عملکردی شما در یک پرس و جو معمولاً در عبارت WHERE استفاده می شوند). این به طور گسترده ای عملکرد این پرسش ها را بهبود می بخشد و مزایای پس فیلتر یا پیش فیلتر را تکمیل می کند.

  1. پسوند pgvector را نصب یا به روز کنید
CREATE EXTENSION IF NOT EXISTS vector WITH VERSION '0.8.0.google-3';

اگر پسوند pgvector قبلاً نصب شده است، پسوند برداری را به نسخه 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

همانطور که می بینید زمان اجرا برای همان Vector Search به میزان قابل توجهی کاهش می یابد. Inline Filtering ایندکس ScaNN را در جستجوی برداری ایجاد کرده است که این امکان را فراهم کرده است!!!

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

فراخوان ارزیاب

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

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

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

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

نکته مهم:

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

  1. پرچم Enable Index Scan را روی فهرست ScaNN Index & 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']);

تابع value_query_recall پرس و جو را به عنوان پارامتر می گیرد و فراخوانی آن را برمی گرداند. من از همان پرس و جوی استفاده می کنم که برای بررسی عملکرد به عنوان پرس و جو ورودی تابع استفاده کردم. من SCaNN را به عنوان روش شاخص اضافه کرده ام. برای گزینه های پارامتر بیشتر به مستندات مراجعه کنید.

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

c98f38fbe6a0b6c5.png

من می بینم که RECALL 70٪ است. اکنون می توانم از این اطلاعات برای تغییر پارامترهای شاخص، روش ها و پارامترهای پرس و جو و بهبود فراخوانی خود برای این جستجوی برداری استفاده کنم!

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

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

  1. من تعداد سطرها را در مجموعه نتیجه به 7 تغییر دادم (از 25 مورد قبلی) و ReCALL بهبود یافته، یعنی 86٪ را می بینم.

c12f7b92b8481ceb.png

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

  1. بیایید دوباره آن را با تغییر پارامترهای شاخص امتحان کنیم:

برای این تست، من قصد دارم از "L2 Distance" به جای تابع فاصله تشابه "کسینوس" استفاده کنم. همچنین برای نشان دادن بهبود کیفیت نتایج جستجو حتی با افزایش تعداد مجموعه نتایج جستجو، محدودیت درخواست را به 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 استفاده می کند؟" شما بپرسید می توانید تابع فاصله را با استفاده از "<=>" برای نشان دادن فاصله کسینوس شناسایی کنید.

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

نتیجه پرس و جو فوق این است:

c62ef8922d6bf0b2.png

همانطور که می بینید، RECALL بدون هیچ تغییری در منطق شاخص ما 70٪ است. ایندکس ScaNN را که در مرحله 6 از بخش Inline Filtering، " 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 پس از تغییر تابع فاصله عملکرد جستجوی برداری خود اجرا کنم.

[AFTER] کوئری که از تابع فاصله تشابه کسینوس استفاده می کند:

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، به صفحه مدیریت منابع بروید.
  2. در لیست پروژه، پروژه ای را که می خواهید حذف کنید انتخاب کنید و سپس روی Delete کلیک کنید.
  3. در محاوره، شناسه پروژه را تایپ کنید و سپس روی Shut down کلیک کنید تا پروژه حذف شود.
  4. از طرف دیگر، می‌توانید فقط خوشه AlloyDB را حذف کنید (اگر در زمان پیکربندی us-central1 را برای خوشه انتخاب نکرده‌اید، مکان را در این لینک تغییر دهید) که ما برای این پروژه با کلیک روی دکمه DELETE CLUSTER ایجاد کردیم.

9. تبریک میگم

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

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

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