Local AI

بهینه‌سازی تأخیر RAG محلی: کاهش بار جستجوی برداری و استنتاج روی سخت‌افزار مصرف‌کننده

اجرای خط‌مشی‌های تولید تقویت‌شده با بازیابی (RAG) به‌صورت محلی به یک استاندارد در توسعه‌های متمرکز بر حریم خصوصی تبدیل شده است. با این حال، بسیاری از توسعه‌دهندگان با یک دیوار آزاردهنده مواجه می‌شوند: تأخیر. روی سخت‌افزارهای مصرف‌کننده—که معمولاً محدود به ۸ گیگابایت یا ۱۶ گیگابایت حافظه VRAM هستند—زمان بین پرسش و پاسخ می‌تواند از چند ثانیه تا چند دقیقه متغیر باشد. این موضوع معمولاً به دلیل کمبود قدرت محاسباتی نیست، بلکه ناشی از جستجوی برداری بهینه‌نشده و استنتاج ناکارآمد مدل است. در این راهنما، ما تکنیک‌های مشخصی را برای کاهش شدید این بارها بررسی خواهیم کرد تا RAG محلی احساسی روان و آماده برای تولید داشته باشد.

روان‌سازی جستجوی برداری با شاخص‌های کارآمد

بازیابی اغلب اولین گلوگاه است. اگر هنوز از جستجوی زور بازو یا شباهت کسینوس ساده روی مجموعه‌های داده بزرگ استفاده می‌کنید، در حال از دست دادن عملکرد هستید. برای تنظیمات محلی، کتابخانه hnswlib یا FAISS (جستجوی شباهت هوش مصنوعی فیسبوک) انتخاب‌های عالی هستند. گراف‌های HNSW (دنیای کوچک قابل پیمایش سلسله‌مراتبی) پیچیدگی جستجوی زیرخطی را فراهم می‌کنند و زمان مورد نیاز برای یافتن نزدیک‌ترین همسایه‌های top-k را به‌شدت کاهش می‌دهند.

علاوه بر این، اندازه مدل جاسازی (embedding) را در نظر بگیرید. استفاده از یک مدل با پارامترهای بالا برای جاسازی زمانی که یک مدل کوچک‌تر کافی است، بار اضافی ایجاد می‌کند. برای استفاده محلی، all-MiniLM-L6-v2 یا nomic-embed-text تعادل کاملی بین کیفیت و سرعت ایجاد می‌کنند.


import hnswlib
import numpy as np

# Initialize an HNSW index
dim = 384 # Example dimension for MiniLM-L6
max_elements = 10000
index = hnswlib.Index(space='cosine', dim=dim)

# Configure for low latency: larger ef_construction, smaller ef_search
index.init_index(max_elements=max_elements, ef_construction=200, M=16)
index.set_num_threads(4) # Utilize CPU cores efficiently

# Add vectors
vectors = np.random.rand(100, dim)
ids = np.arange(100)
index.add_items(vectors, ids)

# Search with tuned ef parameter for speed vs accuracy
k = 5
ef_search = 16
labels, distances = index.knn_query(vectors[:1], k=k)

شتاب‌دهی استنتاج LLM با کمّی‌سازی و ONNX

پس از بهینه‌سازی بازیابی، گلوگاه به سمت مدل زبانی جابه‌جا می‌شود. GPUهای مصرف‌کننده با مدل‌های FP16 یا FP32 اگر بزرگ باشند، مشکل دارند. تأثیرگذارترین تغییری که می‌توانید انجام دهید کمّی‌سازی است. تبدیل مدل شما به INT8 یا INT4 ردپای حافظه را کاهش می‌دهد و نرخ گذار را افزایش می‌دهد. کتابخانه‌هایی مانند llama.cpp یا vLLM این کار را به‌طور بومی انجام می‌دهند، اما برای سازگاری گسترده‌تر، ONNX Runtime یک قدرت عظیم است.

با استفاده از ONNX، می‌توانید از OrtInferenceSession با ارائه‌دهندگان اجرا (execution providers) که به‌طور خاص برای سخت‌افزار شما تنظیم شده‌اند (CUDA برای NVIDIA، DirectML برای AMD/Intel) استفاده کنید. علاوه بر این، اگر سیستم RAG شما چندین پرسش را همزمان پردازش می‌کند، بچینگ پویا (dynamic batching) را فعال کنید.


import onnxruntime as ort

# Load the ONNX model
so = ort.SessionOptions()
so.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL

providers = ["CUDAExecutionProvider", "CPUExecutionProvider"]

session = ort.InferenceSession("llama_onnx_model.onnx", so, providers=providers)

# Define input tokens (example)
input_ids = np.array([[1, 2, 3, 4]], dtype=np.int64)

# Run inference
outputs = session.run(None, {"input_ids": input_ids, "attention_mask": np.ones_like(input_ids)})

نکته عملی: تکه‌بندی و مدیریت پنجره زمینه

پنجره زمینه را بیش از حد پر نکنید. اگر تکه‌های شما بزرگ باشند، LLM زمان بیشتری را صرف پردازش توکن‌های نامرتبط می‌کند. هدف‌گذاری کنید تکه‌هایی با ۲۰۰ تا ۵۰۰ توکن داشته باشید تا اطمینان حاصل شود که ارتباط بالا است. اگر مجبور هستید زمینه بیشتری را شامل شوید، از یک رویکرد کوچک "نقشه-کاهش" (map-reduce) استفاده کنید: ابتدا تکه‌های فرعی را خلاصه کنید، سپس آن‌ها را ترکیب کنید. این کار تعداد توکن‌های داده‌شده به فراخوانی نهایی LLM را کاهش می‌دهد و به‌طور مستقیم زمان استنتاج را پایین می‌آورد.

نتیجه‌گیری

بهینه‌سازی RAG محلی یک فرآیند چندلایه است. با ترکیب شاخص‌های برداری کارآمد مانند HNSW، مدل‌های جاسازی سبک و استنتاج ONNX کمّی‌سازی‌شده، می‌توانید پاسخ‌های نزدیک به بلادرنگ را روی سخت‌افزار مصرف‌کننده به دست آورید. با پروفایل‌گیری شروع کنید: از ابزارهایی مانند py-spy یا Nsight Systems برای شناسایی اینکه گلوگاه شما در بازیابی است یا تولید، استفاده کنید. ابتدا بزرگ‌ترین عامل ایجادکننده مشکل را حل کنید و برنامه‌های هوش مصنوعی محلی شما واقعاً واکنش‌گرا به نظر خواهند رسید.

Share: