Kurumsal Arama-Güçlendirilmiş Üretim (RAG) hatları genellikle kritik bir darboğazla, yani çıkarım gecikmesiyle karşılaşır. Arama hızlı olsa da, Büyük Dil Modellerinden (LLM) yanıt üretmek son kullanıcılar için kabul edilemez gecikmelere yol açabilir. Üretim seviyesinde AI uygulamaları geliştiren geliştiriciler için bu gecikmeyi optimize etmek sadece bir performans ayarı değil; kullanıcı memnuniyeti ve maliyet verimliliği için bir gerekliliktir. Bu yazıda üç yüksek etkili stratejiyi inceleyeceğiz: model nicelleme, akıllı önbellekleme ve toplu boyut ayarı.
1. Nicelleme: Hafıza Kullanımını Azaltmak
Nicelleme, model ağırlıklarının sayısal hassasiyetini 32-bit kayan nokta (FP32) formatından daha düşük bitlere, örneğin 16-bit (FP16), 8-bit (INT8) veya hatta 4-bit (INT4) formatına düşürür. Birincil faydası, bellek kullanımı üzerinde önemli bir azalma ve bellek ile GPU arasında taşınması gereken veri miktarının azalması nedeniyle artan işleme hızıdır. Modellerin genellikle büyük olduğu RAG sistemleri için bu, daha fazla örneği barındırmanıza veya daha büyük bağlam pencerelerini işlemenize olanak tanır.
Hugging Face'in Optimum kütüphanesi gibi araçlar bu işlemi erişilebilir hale getirir. Bir Hugging Face Transformers modeline dinamik nicelleme uygulamak için şu adımları izleyebilirsiniz:
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
model_name = "mistralai/Mistral-7B-v0.1"
tokenizer = AutoTokenizer.from_pretrained(model_name)
# Modeli nicelleme ile yükleyin
model = AutoModelForCausalLM.from_pretrained(
model_name,
load_in_8bit=True, # 8-bit nicelleme için bitsandbytes kullanır
device_map="auto"
)
# Çıkarım aynı kalır ancak daha hızlıdır
inputs = tokenizer("RAG'ı açıkla", return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=50)
8-bit nicelleme hız ve doğruluk arasında iyi bir denge sunarken, 4-bit nicelleme (QLoRA) bellek gereksinimlerini %75'e kadar daha da azaltabilir, ancak bu durum çıktı kalitesinde hafif bir düşüşe yol açabilir. Kabul edilebilir en düşük hassasiyeti belirlemek için her zaman kendi kullanım durumunuzu değerlendirin.
2. Akıllı Önbellekleme Stratejileri
RAG hatlarında, üretim maliyetinin önemli bir kısmı, alınan bağlamın ve istemin işlenmesine harcanır. Önceki sorguların sonuçlarını önbelleğe almak, tekrarlayan veya benzer istekler için gecikmeyi ciddi ölçüde azaltabilir. İki etkili önbellekleme katmanı şunlardır:
- Gömme Önbelleği: Alınan belgeler için vektör gömmelerini saklayın. Yeni bir sorgu aynı en iyi k belgesini verirse, vektör aramasını atlayın.
- LLM Yanıt Önbelleği: LLM çıktılarını önbelleğe almak için tam dize eşleşmesi veya bulanık eşleşme kullanın. LangChain'in
InMemoryCacheveya Redis destekli önbellekleri gibi araçlar, (istem, yanıt) anahtar-değer çiftlerini saklayabilir.
Python'da basit bir Redis tabanlı önbellek uygulaması şu şekilde görünebilir:
import redis
import hashlib
import json
r = redis.Redis(host='localhost', port=6379, db=0)
def get_cached_response(prompt):
# İstemin bir karma değerini oluşturun
prompt_hash = hashlib.sha256(prompt.encode()).hexdigest()
# Önbelleği kontrol edin
cached = r.get(prompt_hash)
if cached:
return json.loads(cached)
# Yeni yanıt oluşturun (sahte kod)
response = generate_llm_response(prompt)
# Önbelleğe TTL (örn. 1 saat) ile saklayın
r.setex(prompt_hash, 3600, json.dumps(response))
return response
3. Toplu Boyut Ayarı
Toplu boyut, GPU tarafından aynı anda işlenen istek sayısını ifade eder. Toplu boyutu artırmak, GPU paralelliğini daha iyi kullanarak işleme hızını (throughput) iyileştirir, ancak daha uzun kuyruk bekleme süreleri nedeniyle istek başına gecikmeyi de artırabilir. Amaç, bireysel kullanıcılar için kabul edilemez gecikmelere yol açmadan işleme hızını maksimize eden "ideal nokta"yı bulmaktır.
Gerçek zamanlı RAG uygulamaları için düşük gecikme süresi amacıyla küçük toplu boyutlar (örn. 1-4) tercih edilebilir. Ancak, çevrimdışı işleme veya asenkron görevler için daha büyük toplular (örn. 16-64) işleme hızını önemli ölçüde artırabilir. Prometheus ve Grafana gibi izleme araçları, toplu parametreleri ayarladıkça gecikme ile işleme hızı arasındaki ödünleşimi görselleştirmenize yardımcı olabilir.
Sonuç
LLM sunum gecikmesini optimize etmek bütünsel bir yaklaşım gerektirir. Model boyutunu azaltmak için nicelleme, gereksiz hesaplamalardan kaçınmak için önbellekleme ve işleme hızı ile gecikme arasında denge kurmak için toplu boyut ayarını birleştirerek geliştiriciler hem hızlı hem de maliyet etkin RAG hatları oluşturabilir. En az kod değişikliğiyle en acil performans kazanımlarını sağlayan nicelleme ile başlayın, ardından daha fazla optimizasyon için önbellekleme ve toplulaştırmayı ekleyin.