مفهوم اصلی
در Semantic Search تا اینجا از معماری استانداردی استفاده شد که به آن:
Bi-Encoder
گفته میشود.
در این معماری:
- هر Document یک Vector دریافت میکند.
- هر Prompt نیز یک Vector دریافت میکند.
- سپس با مقایسه Vectorها، Documentهای مشابه پیدا میشوند.
این روش:
- سرعت بالایی دارد.
- برای سیستمهای Production مناسب است.
اما معماریهای پیشرفتهتری وجود دارند که میتوانند کیفیت Retrieval را افزایش دهند:
- Cross-Encoder
- ColBERT
این روشها بین کیفیت Search و سرعت پردازش یک Trade-off ایجاد میکنند.
1. Bi-Encoder (معماری پایه Semantic Search)
نحوه کار
در Bi-Encoder:
- تمام Documentهای Knowledge Base توسط Embedding Model تبدیل به Vector میشوند.
- این Vectorها از قبل ذخیره میشوند.
- وقتی یک Prompt دریافت میشود:
- Prompt نیز به Vector تبدیل میشود.
- Vector Database با استفاده از ANN نزدیکترین Vectorها را پیدا میکند.
دلیل نام Bi-Encoder
نام Bi-Encoder به این دلیل است که:
- Document
- Prompt
به صورت جداگانه Encode میشوند.
مزیت مهم Bi-Encoder
چون Documentها از قبل Vectorize شدهاند:
- فقط Prompt جدید نیاز به پردازش دارد.
- Search بسیار سریع انجام میشود.
محدودیت Bi-Encoder
چون Document و Prompt جداگانه پردازش میشوند:
مدل نمیتواند ارتباط عمیق بین آنها را به خوبی Cross-Encoder درک کند.
2. Cross-Encoder
مفهوم اصلی
Cross-Encoder برای افزایش کیفیت Ranking طراحی شده است.
در این معماری:
Document و Prompt با هم وارد مدل میشوند.
نحوه کار Cross-Encoder
برای هر Document:
- Prompt و Document کنار هم قرار میگیرند.
مثلاً:
Prompt + Document
- این متن ترکیبی وارد مدل میشود.
- مدل یک امتیاز Relevancy تولید میکند.
خروجی Cross-Encoder
معمولاً یک عدد بین:
0 تا 1
است.
این عدد نشاندهنده احتمال مرتبط بودن Document با Prompt است.
مثال
Prompt:
Great places to eat in New York
سه Document وجود دارد.
Cross-Encoder:
- Prompt را با Document اول ترکیب میکند.
- امتیاز تولید میکند.
مثلاً:
Document 1 → 0.7
Document 2 → 0.3
Document 3 → 0.1
Documentها بر اساس این امتیاز مرتب میشوند.
مزیت Cross-Encoder
Cross-Encoder معمولاً کیفیت Search بالاتری نسبت به Bi-Encoder دارد.
دلیل:
مدل میتواند:
- ارتباط مستقیم Prompt و Document را ببیند.
- تعاملات معنایی عمیقتر را تشخیص دهد.
مشکل اصلی Cross-Encoder
مقیاسپذیری ضعیف
فرض کنید Knowledge Base شامل:
- میلیونها
- یا میلیاردها
Document باشد.
برای هر Prompt باید:
تمام Documentها با Prompt ترکیب شوند و دوباره مدل اجرا شود.
یعنی:
Prompt + Document 1
Prompt + Document 2
Prompt + Document 3
...
برای میلیاردها Document.
چرا نمیتوان Precompute کرد؟
چون:
Prompt از قبل مشخص نیست.
هر کاربر Query متفاوتی ارسال میکند.
بنابراین نمیتوان پردازش را از قبل انجام داد.
نتیجه
Cross-Encoder:
✅ بهترین کیفیت Retrieval
❌ سرعت بسیار پایین
بنابراین:
برای Search اصلی مناسب نیست.
اما برای بهبود نتایج Searchهای دیگر بسیار کاربردی است.
3. ColBERT
مفهوم اصلی
ColBERT تلاش میکند بین دو روش تعادل ایجاد کند:
- سرعت Bi-Encoder
- کیفیت Cross-Encoder
نام کامل:
Contextualized Late Interaction over BERT
ایده اصلی ColBERT
مانند Bi-Encoder:
- Documentها از قبل پردازش میشوند.
اما برخلاف Bi-Encoder:
به جای یک Vector برای کل Document:
برای هر Token یک Vector ساخته میشود.
مقایسه با Bi-Encoder
Bi-Encoder:
یک Document:
Document → یک Vector
ColBERT:
یک Document:
Token 1 → Vector
Token 2 → Vector
Token 3 → Vector
...
مثلاً:
Document با 1000 Token:
نیاز دارد به:
1000 Vector
نحوه امتیازدهی در ColBERT
وقتی Prompt وارد میشود:
Prompt نیز Token به Token تبدیل به Vector میشود.
سپس:
هر Token در Prompt:
نزدیکترین Token خودش در Document را پیدا میکند.
مثال
Prompt:
Great Places to Eat in New York
Document:
شامل:
- New York City
- Cuisine
- Restaurants
مقایسه:
- Tokenهای New و York با New York و City تطبیق پیدا میکنند.
- Token Eat با Cuisine تطبیق پیدا میکند.
MaxSim Score
برای هر Token در Prompt:
بالاترین شباهت با Tokenهای Document انتخاب میشود.
سپس:
تمام این Maximum Scoreها جمع میشوند.
نتیجه:
یک امتیاز کلی برای Document ایجاد میشود.
این امتیاز:
MaxSim Score
نام دارد.
مزایای ColBERT
ColBERT:
- تعامل معنایی بیشتری نسبت به Bi-Encoder دارد.
- کیفیتی نزدیک به Cross-Encoder ارائه میدهد.
- سریعتر از Cross-Encoder است.
محدودیت ColBERT
مصرف حافظه بالا
چون برای هر Token یک Vector ذخیره میشود.
مثال:
Document با:
2000 Token
نیاز دارد به:
2000 Vector
در حالی که Bi-Encoder فقط:
1 Vector
ذخیره میکند.
مقایسه معماریها
| معماری | کیفیت Search | سرعت | مصرف حافظه |
|---|---|---|---|
| Bi-Encoder | خوب | بسیار سریع | کم |
| Cross-Encoder | عالی | بسیار کند | کم |
| ColBERT | نزدیک به عالی | متوسط تا سریع | زیاد |
انتخاب معماری مناسب
Bi-Encoder
انتخاب پیشفرض Semantic Search است.
دلایل:
- کیفیت مناسب
- سرعت بالا
- ذخیرهسازی کم
Cross-Encoder
برای:
- بهترین Ranking ممکن
استفاده میشود.
اما:
به دلیل هزینه بالا نمیتواند Search اصلی باشد.
ColBERT
برای پروژههایی مناسب است که:
- کیفیت Retrieval بسیار مهم است.
- افزایش مصرف حافظه قابل قبول است.
مثال:
- حوزه پزشکی
- حوزه حقوقی
در این حوزهها افزایش کیفیت Search ممکن است ارزش مصرف حافظه بیشتر را داشته باشد.
استفاده ترکیبی در سیستمهای Production
Cross-Encoder معمولاً به صورت مستقیم برای کل Search استفاده نمیشود.
روش معمول:
- ابتدا با روش سریعتر:
- Bi-Encoder
- Hybrid Search
تعداد کمی Document انتخاب میشود.
- سپس Cross-Encoder روی همان Documentهای محدود اجرا میشود.
نتیجه:
- سرعت مناسب
- کیفیت Ranking بالا
جمعبندی
- Semantic Search معمولاً با معماری Bi-Encoder ساخته میشود.
- Bi-Encoder سریع است اما تعامل عمیق Prompt و Document را محدود دارد.
- Cross-Encoder کیفیت بالاتری دارد چون Prompt و Document را همزمان تحلیل میکند.
- مشکل Cross-Encoder هزینه محاسباتی بسیار زیاد است.
- ColBERT با ذخیره Vector برای هر Token تلاش میکند کیفیت Cross-Encoder را با سرعت Bi-Encoder ترکیب کند.
- انتخاب معماری به نیاز پروژه، حجم داده و اهمیت کیفیت Retrieval بستگی دارد.
- در سیستمهای Production معمولاً از ترکیب چند روش برای رسیدن به بهترین نتیجه استفاده میشود.