وقتی یک RAG را به Production میبریم، همیشه با یک Trade-off مواجه هستیم:
Quality ↔ Speed ↔ Cost
مدلهای بزرگ:
- کیفیت بالا دارند
- اما حافظه زیاد مصرف میکنند
- GPU قوی میخواهند
- هزینه اجرا بالا است
یکی از تکنیکهای اصلی برای حل این مشکل:
Quantization
است.
1. Quantization چیست؟
به زبان ساده:
Quantization یعنی کاهش دقت عددی مدل یا Vectorها برای کوچکتر شدن حجم، با کمترین افت کیفیت.
یعنی:
به جای ذخیره اعداد با دقت بالا، از نسخه فشردهتر استفاده میکنیم.
مثال ساده:
فرض کنید یک عدد داریم:
0.736482918
با دقت کامل ذخیره میشود.
اما میتوانیم تقریب بزنیم:
0.74
حجم کمتر:
- حافظه کمتر
- محاسبه سریعتر
اما کمی خطا داریم.
2. تشبیه با فشردهسازی تصویر
یک تصویر معمولی:
24 bit per pixel
کیفیت عالی.
اما حجم زیاد.
فشرده کنیم:
12 bit
حجم نصف میشود.
یا:
6 bit
حجم خیلی کمتر.
اما:
- رنگها خرابتر میشوند
- Artifact ایجاد میشود
Quantization دقیقاً همین کار را با:
- وزنهای LLM
- Vectorهای Embedding
انجام میدهد.
3. Quantization در LLM
یک LLM شامل میلیاردها Parameter است.
مثلاً:
Llama
70B parameters
هر Parameter معمولاً:
16 bit
است.
حجم تقریبی:
70B × 16 bit
خیلی بزرگ است.
با Quantization:
حالت اصلی:
FP16
هر عدد:
16 بیت
بعد از Quantization:
INT8
یا:
INT4
یعنی:
FP16
↓
INT8
↓
INT4
4. اثر Quantization روی LLM
مثال:
مدل:
70B FP16
نیاز:
140GB VRAM
نسخه:
70B INT4
ممکن است:
35GB VRAM
نیاز داشته باشد.
نتیجه:
✅ GPU ارزانتر
✅ مصرف RAM کمتر
✅ سرعت بیشتر
✅ امکان اجرای Local
هزینه:
کمی افت کیفیت.
مثلاً:
قبل:
MMLU:
80%
بعد:
MMLU:
78%
5. Quantization در Embedding Vectorها
در RAG فقط LLM مهم نیست.
Vector Database هم حجم زیادی دارد.
فرض:
Embedding Model:
768 dimensions
هر dimension:
float32
یعنی:
32 bit
حجم یک Vector:
768 × 32 bit
تقریباً:
3 KB
اگر:
100 میلیون Vector داشته باشیم:
300 GB
فقط برای Vectorها.
اینجا Quantization خیلی مهم میشود.
6. Integer Quantization برای Vectorها
روش رایج:
تبدیل:
float32
به:
int8
یعنی:
به جای:
0.234523
-0.45322
0.98231
داریم:
34
-52
112
حجم:
از:
32 bit
میرسد به:
8 bit
یعنی:
4 برابر کوچکتر.
مثال:
قبل:
Vector size:
3 KB
بعد:
750 bytes
برای میلیونها Vector:
صرفهجویی عظیم.
7. Integer Quantization چگونه کار میکند؟
فرض کنیم یک Dimension داریم.
مقادیر:
-1.0 تا 1.0
چون INT8:
256 مقدار دارد:
0 تا 255
این Range را تقسیم میکنیم:
[-1,1]
↓
256 بخش
مثلاً:
-1.0 → 0
0 → 128
1.0 → 255
بعد هر مقدار Float تبدیل میشود به نزدیکترین Integer.
برای بازسازی:
نیاز داریم:
- Minimum value
- Step size
را نگه داریم.
8. تأثیر روی Retrieval
سؤال مهم:
آیا Search خراب میشود؟
معمولاً:
نه خیلی.
مثلاً:
Recall@K:
قبل:
92%
بعد:
89%
یعنی:
کمی افت.
اما:
- حافظه کمتر
- Search سریعتر
9. Binary Quantization
نسخه شدیدتر:
به جای:
32 bit
استفاده کنیم:
1 bit
هر مقدار فقط:
0
یا
1
است.
حجم:
32 برابر کمتر
مثال:
قبل:
768 dimensions × 32 bit
بعد:
768 dimensions × 1 bit
مزیت:
سرعت بسیار بالا.
عیب:
افت کیفیت بیشتر.
روش ترکیبی:
مرحله اول:
Binary Search
سریع:
1-bit vector
بعد:
دقیق:
Original vector
برای Re-ranking.
10. Matryoshka Embeddings
یک تکنیک پیشرفتهتر.
اسم آن از:
عروسکهای روسی Matryoshka
گرفته شده.
ایده:
Vector طوری آموزش داده میشود که:
بخشهای اول Vector مهمتر باشند.
مثلاً:
یک Vector:
1000 dimensions
اما:
First 100 dimensions
بیشترین اطلاعات را دارند.
پس میتوانیم:
حالت کامل:
1000 dimensions
یا:
سریع:
100 dimensions
استفاده کنیم.
مثال:
Retrieval سریع:
100 dim vector
بعد برای چند نتیجه برتر:
1000 dim vector
یعنی:
دو مرحلهای:
Fast Search
↓
Accurate Re-score
11. Quantization در RAG Pipeline
یک معماری واقعی:
Documents
|
Embedding Model
|
Quantized Embeddings
|
Vector Database
|
ANN Search
|
Retrieved Docs
|
Quantized LLM
|
Response
12. چه زمانی استفاده کنیم؟
مناسب:
✅ Dataset بزرگ
✅ میلیونها Document
✅ GPU محدود
✅ Local Deployment
✅ کاهش هزینه Cloud
کمتر لازم است:
❌ Prototype کوچک
❌ چند هزار Document
❌ نیاز به بیشترین Accuracy ممکن
13. پیشنهاد عملی برای RAG Production
معمولاً این ترتیب خوب است:
مرحله اول
مدل اصلی:
FP16
تست کیفیت.
مرحله دوم
Quantization:
INT8
مقایسه:
- Accuracy
- Latency
- Cost
مرحله سوم
اگر لازم بود:
INT4
برای Embedding:
اول:
INT8 Quantization
را امتحان کنید.
جمعبندی نهایی
Quantization یعنی:
کم کردن دقت عددی برای کاهش حجم و افزایش سرعت، با افت کیفیت کم.
در RAG دو جای مهم استفاده میشود:
| بخش | هدف |
|---|---|
| LLM Quantization | کاهش VRAM و هزینه اجرای مدل |
| Embedding Quantization | کاهش حجم Vector Database و افزایش سرعت Search |
تکنیکهای مهم:
- FP16 → INT8 → INT4 برای LLM
- Float32 → INT8 برای Vector
- Binary Quantization برای فشردهسازی شدید
- Matryoshka Embeddings برای Vectorهای قابل کوچکسازی
در سیستمهای Production بزرگ، Quantization یکی از مهمترین ابزارها برای تبدیل یک RAG آزمایشی به یک سرویس سریع و اقتصادی است.