با گذر مدلهای زبانی بزرگ (LLMs) از نمونههای آزمایشی به کاربردهای حیاتی در تولید، مدیریت هزینه و کاهش تأخیر به دو رکن اساسی تبدیل شدهاند. هر فراخوانی API به یک LLM هزینه مالی دارد و سربار شبکه ایجاد میکند. برای برنامههای با ترافیک بالا، این هزینهها میتواند به سرعت افزایش یابد و تجربه کاربری به دلیل زمان پاسخدهی کند، کاهش یابد. اینجا است که کشینگ هوش مصنوعی (AI Caching) به عنوان یک ضرورت استراتژیک و نه یک ویژگی اختیاری، وارد جعبهابزار LLMOps میشود.
برخلاف کشینگ وب سنتی که اغلب به کلیدهای مبتنی بر URL متکی است، کشینگ هوش مصنوعی به درک عمیقتری از ورودیها و خروجیها نیاز دارد. در این مقاله، ما معماری کشینگ هوش مصنوعی مؤثر را بررسی کرده، بین کشینگ در سطح پرامپت و کشینگ در سطح تولید تمایز قائل میشویم و استراتژیهای پیادهسازی عملی ارائه میدهیم.
درک سلسله مراتب کش در LLMها
برای ساخت یک لایه کش مؤثر، توسعهدهندگان باید درک کنند که چه چیزی کش میشود. در زمینه LLMها، ما معمولاً با سه نوع جزء قابل کش مواجه میشویم:
- کش پرامپت (Prompt Caching): ذخیره خروجی بر اساس پرامپت ورودی دقیق. این روش برای سوالات قطعی مؤثر است، اما اگر کاربر حتی یک کاراکتر را تغییر دهد، شکست میخورد.
- کش پنجره زمینه (KV Cache): بسیاری از ارائهدهندگان اکنون حالتهای کلید-مقدار (Key-Value) توکنهای پرامپت را کش میکنند. اگر شما یک سوال کاربر را به یک پرامپت سیستم طولانی اضافه کنید، مدل تنها نیاز دارد توکنهای جدید را محاسبه کند که سرعت استنتاج را به طور قابل توجهی افزایش میدهد.
- کش برداری معنایی (Semantic Vector Cache): که عمدتاً در سیستمهای RAG (تولید تقویتشده با بازیابی) استفاده میشود. با تعبیه (Embedding) سوال کاربر، میتوانید بررسی کنید که آیا سوال مشابهی اخیراً پاسخ داده شده است یا خیر، صرفنظر از تفاوتهای بیان.
پیادهسازی کش در سطح پرامپت در پایتون
برای بسیاری از برنامهها، یک کش مبتنی بر هش ساده روی پرامپت ورودی و زمینه سیستم مرتبط، سادهترین و مقرونبهصرفهترین نقطه شروع است. در زیر یک مثال عملی با استفاده از پایتون، hashlib و یک دیکشنری در حافظه برای نمایش منطق آن آورده شده است.
import hashlib
import time
import os
# تابع شبیهسازی شده API مدل زبانی بزرگ
def call_llm_api(prompt):
print(f"Calling LLM API for: {prompt[:50]}...")
time.sleep(2) # شبیهسازی تأخیر شبکه
return "This is a generated response."
# پیادهسازی ساده کش
class LLMCache:
def __init__(self, max_size=100):
self.cache = {}
self.max_size = max_size
def _generate_key(self, prompt, system_prompt="default"):
# ایجاد هش منحصر به فرد از پرامپت و دستورالعملهای سیستم
raw_key = f"{system_prompt}||{prompt}"
return hashlib.sha256(raw_key.encode()).hexdigest()
def get(self, prompt, system_prompt="default"):
key = self._generate_key(prompt, system_prompt)
if key in self.cache:
print("Cache Hit!")
return self.cache[key]
return None
def put(self, prompt, response, system_prompt="default"):
key = self._generate_key(prompt, system_prompt)
if len(self.cache) >= self.max_size:
# شبیهسازی ساده حذف LRU
oldest_key = next(iter(self.cache))
del self.cache[oldest_key]
self.cache[key] = response
# مثال استفاده
cache = LLMCache()
user_prompt = "Explain quantum entanglement."
# فراخوانی اول (Cache Miss)
response1 = cache.get(user_prompt)
if not response1:
response1 = call_llm_api(user_prompt)
cache.put(user_prompt, response1)
# فراخوانی دوم (Cache Hit)
response2 = cache.get(user_prompt)
if not response2:
response2 = call_llm_api(user_prompt)
cache.put(user_prompt, response2)
else:
print(f"Retrieved cached response: {response2}")
ملاحظات پیشرفته: TTL و بازگشت به حالت معنایی
در حالی که مثال بالا عملکردی است، سیستمهای تولید به ویژگیهای مقاومتری نیاز دارند. اول، یک مکانیسم زمان تا انقضا (TTL) را پیادهسازی کنید. پاسخهای LLM ممکن است با ظهور اطلاعات جدید، قدیمی شوند. تنظیم TTL به مدت ۲۴ ساعت برای سوالات واقعی اغلب عاقلانه است.
دوم، در نظر بگیرید که یک بازگشت به حالت معنایی را پیادهسازی کنید. اگر تطبیق هش دقیق شکست بخورد، از یک مدل تعبیه سبکوزن استفاده کنید تا بررسی کنید آیا سوالی با معنای مشابه در کش شما وجود دارد یا خیر. این روش تغییراتی مانند «۲+۲ چیست؟» و «مجموع دو و دو را محاسبه کنید» را پوشش میدهد.
نتیجهگیری
کشینگ هوش مصنوعی سنگ بنای LLMOps کارآمد است. با کاهش فراخوانیهای تکراری API، توسعهدهندگان میتوانند هزینهها را تا ۹۰٪ برای سوالات تکراری کاهش دهند و در عین حال پاسخهای تقریباً آنی را به کاربران ارائه دهند. چه در حال ساخت یک چتبات ساده باشید و چه یک پایپلاین RAG پیچیده، ادغام یک لایه کش در مراحل اولیه معماری شما منافع قابل توجهی به همراه دارد. با کلیدهای مبتنی بر هش ساده شروع کنید، نرخ برخورد (Hit Rates) خود را پایش کنید و با رشد پایگاه کاربر خود، به سمت کشینگ معنایی پیش بروید.