جستجوی برداری چیست؟

با جستجوی برداری (Vector Search) آشنا بشید؛ تکنیکی که با استفاده از نمایش ریاضی داده‌ها، آیتم‌های مشابه رو در مجموعه داده‌های بزرگ پیدا می‌کنه.

جستجوی برداری، رویکرد ما رو تو بازیابی اطلاعات در دنیای توسعه مدرن، کاملاً متحول کرده. این تکنیک بر اساس نمایش‌های عددی از داده‌ها به نام «امبدینگ‌های برداری» (vector embeddings) کار می‌کنه که معنای مفهومی داده‌ها رو در یک فضای برداری ثبت می‌کنن. جستجوی برداری می‌تونه اشیاء مرتبط رو بدون نیاز به تطابق دقیق متنی شناسایی کنه و همین ویژگی، اون رو برای سیستم‌های بازیابی اطلاعات مدرن، به‌خصوص در اپلیکیشن‌های مبتنی بر هوش مصنوعی که سیستم‌های جستجوی سنتی در اون‌ها کم میارن، روز به روز مهم‌تر کرده.

جستجوی برداری چیه؟

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

جستجوی برداری چطور کار می‌کنه؟

جستجوی برداری با تبدیل داده‌ها و کوئری‌ها (پرس‌وجوها) به امبدینگ‌های برداری کار می‌کنه. امبدینگ‌های برداری توسط مدل‌های زبانی تولید می‌شن که یاد گرفتن معنا و زمینه داده‌ها رو در قالب نمایش‌های عددی ثبت کنن.

موقع ورود/ایمپورت داده‌ها (یا هر تغییر مهمی در اشیاء داده)، هر شیء داده و همین‌طور کوئری، با استفاده از مدل‌های امبدینگ به نمایش‌های برداری عددی تبدیل می‌شن. هر شیء داده در یک دیتاست، یک وکتور (بردار) مخصوص به خودش رو می‌گیره و موقع جستجو، این وکتور با وکتور کوئری مقایسه می‌شه.

خلاصه بخوام بگم، امبدینگ‌های برداری آرایه‌ای از اعداد هستن که می‌شه ازشون به عنوان مختصات در یک فضای چندبعدی استفاده کرد. هرچند تصور کردن مختصات تو فضایی بیشتر از سه بعد (x, y, z) سخته، اما هنوزم می‌تونیم از این وکتورها برای محاسبه فاصله بینشون استفاده کنیم. این فاصله نشون‌دهنده شباهت بین اشیاء هست. معیارهای فاصله مختلفی وجود داره، مثل شباهت کسینوسی و فاصله اقلیدسی (فاصله L2).

هر وقت ما یه کوئری رو اجرا می‌کنیم (مثلاً: «بلندترین ساختمان برلین کدومه؟»)، سیستم جستجوی برداری اون رو به یک وکتور «کوئری» تبدیل می‌کنه. وظیفه یک پایگاه داده برداری (vector database) اینه که با استفاده از یک معیار فاصله و یک الگوریتم جستجو، لیستی از وکتورهایی که به وکتور کوئری شما نزدیک‌تر هستن رو شناسایی و بازیابی کنه.

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

یک نمونه از الگوریتم‌های جستجو، الگوریتم k-نزدیک‌ترین همسایه (kNN) هست که با محاسبه امتیاز شباهت برای هر وکتور داده در دیتابیس نسبت به وکتور کوئری، k تا از نزدیک‌ترین وکتورها رو برمی‌گردونه. تو مثال بازی پتانک ما، با ۶ تا بول، الگوریتم kNN فاصله بین جک و هر کدوم از ۶ تا بول روی زمین رو اندازه می‌گیره. این یعنی ۶ محاسبه جداگانه انجام می‌شه.

چطور جستجوی برداری رو از صفر در پایتون پیاده‌سازی کنیم؟

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

بیایید با نصب پکیج پایتون OpenAI برای تولید امبدینگ‌های برداری برای متنمون و numpy برای انجام محاسبات شباهت شروع کنیم.

pip install openai
pip install numpy

بعد می‌تونیم تمام نیازمندی‌هامون رو import کنیم، `OPENAI_API_KEY` خودمون رو تنظیم کنیم و لیستی از جملات رو تعریف کنیم.

from openai import OpenAI
from dotenv import load_dotenv
import os
import numpy as np

load_dotenv()

client = OpenAI(
api_key=os.getenv("OPENAI_API_KEY"),
)

sentences = [
"Best pizza places nearby.",
"Popular breakfast spots in New York.",
"Top-rated seafood restaurants in Miami.",
"Cheap hotels near the beach.",
"Recipes for quick pasta dishes.",
]

می‌تونیم از OpenAI برای تولید امبدینگ‌های برداری برای هر جمله استفاده کنیم و اون‌ها رو در یک دیکشنری جدید ذخیره کنیم.

def get_embedding(text, model="text-embedding-3-small"):
embedding = client.embeddings.create(input=[text], model=model).data[0].embedding
return embedding

sentence_vectors = {}
for sentence in sentences:
embedding = get_embedding(sentence)
sentence_vectors[sentence] = embedding

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

def calculate_cosine_similarity(query_vector, vector):
return np.dot(query_vector, vector) / (np.linalg.norm(query_vector) * np.linalg.norm(vector))

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

def get_top_n_similar(query_sentence, n=2):
query_embedding = get_embedding(query_sentence)

similarities = {sentence: calculate_cosine_similarity(query_embedding, sentence_vectors[sentence]) for sentence in sentences}

sorted_similarities = dict(sorted(similarities.items(), key=lambda x: x[1], reverse=True))
top_matches = list(sorted_similarities.items())[:n]

for sentence, score in top_matches:
print(f"Similarity: {score:.4f} - {sentence}")

می‌تونید ببینید که حتی با اینکه کوئری و اولین جمله برگشتی همه کلمات مشترکی ندارن، باز هم امتیاز بالایی به عنوان یک تطابق خوب می‌گیره، چون *معنای* اون‌ها خیلی شبیه به همه.

query_sentence = "Find the best pizza restaurant close to me."
get_top_n_similar(query_sentence, n=2)
Similarity: 0.7056 - Best pizza places nearby.
Similarity: 0.3585 - Top-rated seafood restaurants in Miami.

با اینکه این روش می‌تونه بر اساس وکتورهای متنی، آیتم‌های مشابه رو به ما بده، اما خیلی ناکارآمده. محاسبه دستی شباهت کسینوسی برای تک تک وکتورها در یک دیتاست بزرگ می‌تونه به سرعت از نظر محاسباتی سنگین بشه. همچنین، بدون یک مکانیزم ایندکس‌گذاری، همه وکتورها به شکل خام ذخیره می‌شن که به مصرف حافظه بالا و کاهش سرعت جستجو منجر می‌شه. و در نهایت، صرفاً ذخیره کردن وکتورها و اشیاء متنی در یک دیکشنری به این معنیه که ما از ویژگی‌های یک پایگاه داده ساختاریافته بی‌بهره‌ایم.

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

جستجوی برداری در پایگاه‌های داده برداری

جستجوی برداری، که بهش جستجوی معنایی هم می‌گن، با استفاده از یک پایگاه داده برداری می‌تونه حجم زیادی از داده‌های بدون ساختار (به جای صفحات گسترده، به پاراگراف‌ها فکر کنید) رو به سرعت و با کارایی بالا مدیریت کنه و نتایج مرتبطی رو در سیستم‌های جستجو و پیشنهاددهنده بر اساس شباهت معنایی به جای تطابق دقیق کلمات، ارائه بده. این قابلیت به شما اجازه می‌ده تا جستجوهای پیشرفته‌ای رو در میان میلیون‌ها سند انجام بدید، مثلاً در یک دیتاست ویکی‌پدیا با بیش از ۲۸ میلیون پاراگراف.

اگه ما دنبال مقالاتی با موضوع «برنامه‌ریزی شهری در اروپا» بگردیم، پایگاه داده برداری (مثل Weaviate) با مجموعه‌ای از مقالات مرتبط با این موضوع، مثل «شهرهایی که برای پایتخت بودن طراحی شدند»، پاسخ می‌ده.

پیدا کردن جواب درست در یک مخزن غول‌پیکر از داده‌های بدون ساختار، چشمگیرترین بخش پایگاه‌های داده برداری نیست (البته که خیلی چشمگیره)، بلکه سرعت 🚀 فوق‌العاده‌ای هست که همه این اتفاقات باهاش رخ می‌ده. برای پیدا کردن مرتبط‌ترین پاسخ به کوئری جستجوی معنایی ما، در یک دیتاست با ۲۸ میلیون پاراگراف، فقط چند میلی‌ثانیه زمان لازمه. این موضوع وقتی با حجم عظیمی از داده‌ها، مثل موتورهای پیشنهاددهنده یا دیتاست‌های اسناد بزرگ، سر و کار داریم، فوق‌العاده مهمه.

سؤال اجتناب‌ناپذیری که بعد از این توضیح پیش میاد همیشه اینه: چرا اینقدر سریعه؟

الگوریتم‌های تخمینی نزدیک‌ترین همسایه (ANN)

به جای مقایسه تک به تک وکتورها، اکثر پایگاه‌های داده برداری از الگوریتم‌های تخمینی نزدیک‌ترین همسایه (ANN) استفاده می‌کنن که در ازای افزایش چشمگیر سرعت، کمی از دقت رو فدا می‌کنن (برای همینه که بهش میگن «تخمینی»).

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

توجه داشته باشید که اکثر پایگاه‌های داده برداری به شما اجازه می‌دن نحوه رفتار الگوریتم ANN رو پیکربندی کنید. این به شما کمک می‌کنه تا تعادل مناسبی بین دقت (recall، یعنی کسری از نتایج که واقعاً نزدیک‌ترین k همسایه هستن)، تأخیر (latency)، توان عملیاتی (تعداد کوئری در ثانیه) و زمان ایمپورت پیدا کنید.

نمونه‌هایی از الگوریتم‌های ANN

نمونه‌هایی از روش‌های ANN عبارتند از:

  • درخت‌ها – مثلاً ANNOY (شکل ۳)،
  • گراف‌های مجاورتی – مثلاً HNSW (شکل ۴)،
  • خوشه‌بندی – مثلاً FAISS،
  • هشینگ – مثلاً LSH

اینکه کدوم الگوریتم بهتر کار می‌کنه، به پروژه شما بستگی داره. عملکرد رو می‌شه بر اساس تأخیر، توان عملیاتی (تعداد کوئری در ثانیه)، زمان ساخت ایندکس و دقت (recall) سنجید. این چهار مؤلفه اغلب با هم در تضاد هستن، بنابراین بسته به کاربرد، بهترین روش متفاوت خواهد بود.
پس، با اینکه ANN یک روش جادویی نیست که همیشه نزدیک‌ترین k همسایه واقعی رو در یک دیتاست پیدا کنه، اما می‌تونه یک تقریب خیلی خوب از اون‌ها رو پیدا کنه. و این کار رو در کسری از زمان انجام می‌ده!

HNSW در Weaviate

Weaviate یک مثال عالی از یک پایگاه داده برداریه که از الگوریتم‌های ANN برای ارائه کوئری‌های فوق‌سریع استفاده می‌کنه. الگوریتم ANN که Weaviate ازش استفاده می‌کنه، یک پیاده‌سازی سفارشی از گراف‌های سلسله‌مراتبی دنیای کوچک قابل پیمایش (HNSW) هست.

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

در پیاده‌سازی Weaviate، الگوریتم HNSW برای پشتیبانی کامل از عملیات CRUD (ایجاد، خواندن، به‌روزرسانی و حذف) بهبود پیدا کرده و امکان کوئری، به‌روزرسانی و حذف آنی رو فراهم می‌کنه. همچنین ویژگی‌هایی مثل نوشتن تدریجی روی دیسک برای بازیابی پس از خرابی و فرآیندهای پاک‌سازی ناهمگام برای به‌روز نگه داشتن ایندکس رو هم داره.

حتماً به بنچمارک‌های ANN در Weaviate یه نگاهی بندازید تا ببینید HNSW روی دیتاست‌های بزرگ و واقعی چطور عمل کرده. می‌تونید ازش برای مقایسه توازن بین دقت، تعداد کوئری در ثانیه، تأخیر و زمان ایمپورت استفاده کنید.

براتون جالب خواهد بود که ببینید Weaviate می‌تونه نرخ دقت خیلی بالایی (بیشتر از ۹۵٪) رو حفظ کنه، در حالی که توان عملیاتی بالا و تأخیر کمی (هر دو در حد میلی‌ثانیه) داره. این دقیقاً همون چیزیه که برای یک جستجوی برداری سریع و در عین حال قابل اعتماد نیاز دارید!

مقایسه ANN و KNN

kNN، یا الگوریتم k-نزدیک‌ترین همسایه، با ANN فرق داره چون امتیاز شباهت رو برای *تک‌تک وکتورهای داده* در دیتابیس در مقایسه با وکتور کوئری محاسبه می‌کنه، خیلی شبیه به مثالی که بالاتر برای پیاده‌سازی از صفر دیدیم.

مقایسه یک وکتور کوئری با ۱۰، ۱۰۰ یا ۱۰۰۰ وکتور داده فقط در دو بعد، کار ساده‌ایه. اما خب، در دنیای واقعی، ما به احتمال زیاد با میلیون‌ها (مثل دیتاست ویکی‌پدیا) یا حتی میلیاردها آیتم داده سر و کار داریم. به علاوه، تعداد ابعادی که اکثر مدل‌های امبدینگ در جستجوی معنایی استفاده می‌کنن به صدها یا هزاران بعد می‌رسه!

روش *بروت فورس (brute force)* یا همون جستجوی همه‌جانبه‌ی kNN از نظر محاسباتی خیلی سنگینه و بسته به اندازه دیتابیس شما، یک کوئری می‌تونه از چند ثانیه تا حتی چند ساعت طول بکشه (عجب! 😅). اگه یک وکتور با ۳۰۰ بعد رو با ۱۰ میلیون وکتور دیگه مقایسه کنید، سیستم جستجو باید ۳۰۰ × ۱۰ میلیون = ۳ میلیارد محاسبه انجام بده! تعداد محاسبات مورد نیاز به صورت خطی با تعداد نقاط داده افزایش پیدا می‌کنه (O(n)).

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

انواع جستجوی برداری

جستجوی برداری فقط به متن، یا حتی متن در یک زبان محدود نمی‌شه. هر چیزی رو می‌شه با یک مدل امبدینگ مناسب به وکتور تبدیل کرد، چه تصویر باشه، چه صدا، ویدیو یا اسناد چندزبانه. این یعنی ما می‌تونیم سیستم‌های جستجوی معنایی چندوجهی (multi-modal) یا چندزبانه (multi-lingual) بسازیم که بتونن انواع مختلفی از فرمت‌های داده، زبان‌ها یا انواع جستجو رو مدیریت کنن.

جستجوی برداری تصویر

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

جستجوی برداری صدا

جستجوی برداری صدا، فایل‌های صوتی رو به وکتور تبدیل می‌کنه تا جستجوی شباهت بر اساس ویژگی‌های صوتی مثل تُن، ریتم یا ملودی رو ممکن کنه. این روش در اپلیکیشن‌هایی مثل پلتفرم‌های کشف موسیقی، کتابخانه‌های افکت‌های صوتی و سیستم‌های تشخیص صدا کاربرد داره.

جستجوی برداری ویدیو

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

جستجوی برداری چندوجهی (Multimodal)

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

جستجوی برداری چندزبانه

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

جستجوی ترکیبی (Hybrid Search)

جستجوی ترکیبی چندین نوع جستجو، معمولاً جستجوی برداری و جستجوی کلیدواژه‌ای، رو در یک سیستم واحد ترکیب می‌کنه. با ترکیب جستجوی کلیدواژه‌ای سنتی و جستجوی معنایی، ما به بهترین نتیجه از هر دو دنیا می‌رسیم: درک معنایی + کلیدواژه‌های خاص. جستجوی معنایی برای درک معنای کلی اسناد و کوئری عالی عمل می‌کنه، اما تطابق‌های دقیق مثل اسامی، اصطلاحات تخصصی صنعتی یا کلمات نادر رو در اولویت قرار نمی‌ده، که این موارد می‌تونن در بسیاری از اپلیکیشن‌ها مفید باشن. از طرفی، بدون جستجوی معنایی (فقط با کلیدواژه)، نتایج ممکنه اطلاعات معنایی مرتبط و زمینه موضوع مورد نظر رو از دست بدن. ترکیب این دو روش می‌تونه هم دقت و هم مرتبط بودن نتایج جستجو رو بهبود ببخشه. این روش تو سئوی مدرن خیلی کاربرد داره، چون هم به درک عمیق موتور جستجو از محتوا کمک می‌کنه و هم کلیدواژه‌های خاص و مهم رو از دست نمیده.

مزایای جستجوی برداری

سیستم‌های جستجوی سنتی مبتنی بر کلیدواژه فقط می‌تونن *عبارات یا اصطلاحات دقیق* یا کلمات کلیدی رو در متن پیدا کنن. در مقابل، جستجوی برداری آیتم‌های مشابه رو بر اساس زمینه یا معنای زیربنایی اون‌ها برمی‌گردونه و با انواع مختلفی از داده‌ها، از جمله متن، تصویر، صدا یا ویدیو کار می‌کنه. برای مثال، جستجوی «میان‌وعده‌های سالم» ممکنه عبارات مرتبط معنایی مثل «غذای مغذی» یا «خوراکی‌های کم‌کالری» رو برگردونه، یا در مورد یک سیستم چندوجهی، تصاویری از گرانولا بار یا میوه رو نشون بده.

به همین دلیله که به جستجوی برداری اغلب جستجوی معنایی هم می‌گن. این تکنیک یک تجربه جستجوی «انسان‌مانندتر» رو فراهم می‌کنه و به کاربران اجازه می‌ده تا اشیاء مرتبط رو پیدا کنن بدون اینکه نیاز داشته باشن کلمات دقیقاً درستی رو در کوئری خودشون به کار ببرن.

کاربردهای جستجوی برداری

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

سیستم‌های جستجو

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

سیستم‌های پیشنهاددهنده

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

تولید افزوده بازیابی (RAG)

تولید افزوده بازیابی یا RAG، یک کاربرد محبوب از جستجوی برداریه که در اپلیکیشن‌هایی مثل چت‌بات‌ها یا سیستم‌های پرسش و پاسخ استفاده می‌شه. RAG در واقع همون جستجوی برداری با یک مرحله اضافه است؛ نتایج مشابهی که توسط پایگاه داده برداری برگردونده می‌شن، به یک مدل زبان بزرگ (LLM) داده می‌شن تا یک پاسخ مرتبط و بافتارمند به کوئری کاربر تولید کنه. RAG به کاهش توهم‌زدن مدل (ارائه اطلاعات غلط)، افزایش دقت پاسخ‌ها کمک می‌کنه و به مدل‌های مولد اجازه می‌ده به دانش تخصصی دسترسی پیدا کنن تا به کوئری‌های پیچیده و مبتنی بر داده پاسخ بدن.

جستجوی معنایی به خاطر سرعت و تواناییش در جستجوی اسناد بر اساس معنا و نه تطابق دقیق کلمات، برای اپلیکیشن‌های RAG عالیه.

راه‌حل‌های جستجوی برداری

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

کتابخانه‌های ایندکس‌گذاری برداری مثل FAISS، Annoy و ScaNN، برای جستجوهای شباهت در حافظه (in-memory) بهینه شدن و فقط وکتورها رو ذخیره می‌کنن، نه اشیاء داده‌ای که ازشون تولید شدن. ایندکس‌های اون‌ها معمولاً غیرقابل تغییر هستن، یعنی بدون ساخت مجدد نمی‌شه اون‌ها رو به صورت پویا به‌روزرسانی کرد. علاوه بر این، کتابخانه‌های برداری اغلب نیاز دارن که همه داده‌ها قبل از کوئری زدن ایمپورت بشن که این می‌تونه انعطاف‌پذیری اون‌ها رو در محیط‌های پویا یا دائماً در حال تغییر محدود کنه. این کتابخانه‌ها برای اپلیکیشن‌هایی که با داده‌های ثابت سر و کار دارن و به عملیات کامل CRUD یا قابلیت‌های پایداری داده نیاز ندارن، مناسب هستن.

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

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

اصطلاح موتور جستجوی برداری اغلب به جای پایگاه داده برداری استفاده می‌شه، اما از نظر فنی متفاوت هستن: یک موتور جستجوی برداری فقط روی لایه بازیابی تمرکز داره، در حالی که یک پایگاه داده برداری شامل ویژگی‌های اضافی مثل ذخیره‌سازی، مدیریت داده و خوشه‌بندی هم می‌شه.

سوالات متداول درباره جستجوی برداری

جستجوی معنایی در مقابل جستجوی برداری

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

جستجوی برداری در مقابل جستجوی کلیدواژه‌ای

جستجوی برداری آیتم‌های مشابه رو بر اساس معنای مفهومی داده‌ها پیدا می‌کنه، در حالی که جستجوی کلیدواژه‌ای به تطابق دقیق کلمات یا تکرار عبارات وابسته است. جستجوی برداری می‌تونه داده‌های بدون ساختار و چندوجهی (مثل متن، تصویر یا صدا) رو مدیریت کنه و مفاهیم مرتبط رو پیدا کنه، در حالی که جستجوی کلیدواژه‌ای برای داده‌های متنی ساختاریافته که در اون‌ها عبارت‌بندی دقیق مهمه، مناسب‌تره.

جستجوی برداری در مقیاس بزرگ چطور انجام می‌شه؟

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

خلاصه

یک جمع‌بندی سریع:

  • جستجوی برداری، که بهش جستجوی معنایی هم می‌گن، می‌تونه اشیاء مرتبط رو بدون نیاز به تطابق دقیق متنی شناسایی کنه و به کاربران اجازه می‌ده بر اساس معنای مفهومی و نه کلیدواژه‌های دقیق جستجو کنن.
  • این تکنیک از مدل‌های یادگیری ماشین برای تولید امبدینگ‌های برداری برای همه اشیاء داده و کوئری استفاده می‌کنه و با انجام محاسبات ریاضی، شباهت رو تعیین می‌کنه.
  • امبدینگ‌های برداری، معنا و زمینه داده‌ها رو ثبت می‌کنن.
  • پایگاه‌های داده برداری به لطف الگوریتم‌های ANN، پاسخ‌های فوق‌العاده سریعی به کوئری‌ها می‌دن.
  • الگوریتم‌های ANN در ازای افزایش چشمگیر سرعت، مقدار کمی از دقت رو فدا می‌کنن.
  • انواع مختلف جستجوی برداری شامل جستجوی ترکیبی یا جستجوی چندوجهی برای تصاویر، صدا یا ویدیو می‌شه.
  • کاربردهای جستجوی برداری شامل تولید افزوده بازیابی (RAG)، سیستم‌های پیشنهاددهنده یا سیستم‌های جستجو است.

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *