با تبدیل شدن مدلهای زبانی بزرگ (LLM) به ستون فقرات عاملهای خودمختار، یکی از چالشهای مهندسی پایدار، مدیریت پنجره زمینه است. اگرچه مدلهای مدرن از زمینههای در حال افزایش پشتیبانی میکنند، اما تغذیه ساده تاریخچهای که دائماً در حال رشد است در پرامپت، از نظر محاسباتی پرهزینه است و اغلب منجر به پدیده «گمشدگی در میانه» میشود، جایی که جزئیات حیاتی توسط نویز رقیق میشوند. برای ساخت عاملهای واقعاً دارای وضعیت (stateful)، باید فراتر از اتصال ساده حرکت کنیم و سیستمهای مدیریت حافظه هوشمند را پیادهسازی کنیم. این پست دو استراتژی حیاتی را بررسی میکند: زوال حافظه پویا و خلاصهسازی بازگشتی.
درک زوال حافظه پویا
حافظه انسان ایستا نیست؛ مگر اینکه تقویت شود، به مرور زمان محو میشود. به طور مشابه، در معماریهای عامل هوش مصنوعی، هر قطعه اطلاعات گذشته وزن برابری ندارد. یک مکالمه که سه ساعت پیش رخ داده است، اغلب کمتر از مکالمهای که سه دقیقه پیش اتفاق افتاده است، مرتبط است. زوال حافظه پویا شامل اختصاص یک «نیمهعمر» یا ضریب زوال به هر آیتم حافظه است که با گذشت زمان، تأثیر آن را کاهش میدهد.
به جای اینکه تمام بردارهای زمینه را به طور مساوی در نظر بگیریم، میتوانیم یک سیستم امتیازدهی پیادهسازی کنیم که در آن حافظههای قدیمیتر وزن کمتری دارند. این اجازه میدهد تا عامل تعاملات اخیر را در اولویت قرار دهد، در حالی که همچنان سایهای ضعیف از رویدادهای گذشته را حفظ میکند، که منجر به استدلال بلندمدت ظریف بدون بزرگ شدن پنجره زمینه میشود.
پیادهسازی زوال در پایتون
در زیر یک مثال ساده از نحوه محاسبه امتیاز زوال برای آیتمهای حافظه آورده شده است. ما از یک تابع زوال نمایی که در تحلیل سریهای زمانی استاندارد است، برای تعیین امتیاز مرتبط بودن استفاده میکنیم.
import time
from typing import List, Dict
class MemoryManager:
def __init__(self, decay_rate: float = 0.99):
self.decay_rate = decay_rate
self.memory_store = []
def add_memory(self, content: str, timestamp: float = None):
if timestamp is None:
timestamp = time.time()
self.memory_store.append({
"content": content,
"timestamp": timestamp,
"score": 1.0
})
def get_context(self) -> str:
current_time = time.time()
context_parts = []
for mem in self.memory_store:
# Calculate decay score
time_diff = current_time - mem["timestamp"]
# Exponential decay: score = initial_score * (decay_rate ^ time_diff)
decayed_score = mem["score"] * (self.decay_rate ** time_diff)
mem["score"] = decayed_score
if decayed_score > 0.1: # Threshold to keep significant memories
context_parts.append(f"[Score: {decayed_score:.2f}] {mem['content']}")
return "\n".join(context_parts)
# Example Usage
manager = MemoryManager()
manager.add_memory("User said hello")
time.sleep(1) # Simulate time passing
manager.add_memory("User asked a complex question")
print(manager.get_context())
خلاصهسازی بازگشتی برای حفظ بلندمدت
در حالی که زوال مرتبط بودن را مدیریت میکند، مشکل حجم را حل نمیکند. وقتی مخزن حافظه بیش از حد بزرگ میشود، حتی با وجود زوال، زمینه ممکن است از محدودیت توکنها فراتر رود. اینجاست که خلاصهسازی بازگشتی درخشش میکند. به جای حذف حافظههای قدیمی، ما آنها را به خلاصههای فشردهای که ماهیت معنایی تعاملات گذشته را ثبت میکنند، فشرده میکنیم.
با فراخوانی دورهای یک LLM برای خلاصهسازی قدیمیترین یا کماهمیتترین بخشهای حافظه، میتوانیم گزارشهای طولانی را با کپسولهای فشرده و اطلاعاتدهنده جایگزین کنیم. این استراتژی که اغلب به عنوان «تراکم حافظه» شناخته میشود، تضمین میکند که عامل توانایی پاسخگویی به سوالات درباره رویدادهای گذشته را حفظ کند، بدون اینکه کل تاریخچه خام را حمل کند.
پیادهسازی مؤثر نیاز به یک حلقه بازخورد دارد: وقتی اطلاعات جدید میرسد، سیستم بررسی میکند که آیا بافر حافظه از یک آستانه فراتر رفته است یا خیر. اگر چنین باشد، یک موتور خلاصهسازی برای ادغام ورودیهای تکراری فعال میشود. به عنوان مثال، سه پیام جداگانه درباره «سفارش پیتزا» میتواند به یک خلاصه واحد فشرده شود: «کاربر ساعت ۷ شب پیتزا پپرونی سفارش داد.»
نتیجهگیری
ساخت عاملهای هوش مصنوعی مستحکم نیازمند چیزی فراتر از اتصال یک LLM به یک پایگاه داده است. این کار نیازمند یک رویکرد پیچیده برای مدیریت وضعیت است. با پیادهسازی زوال حافظه پویا، ما تضمین میکنیم که عاملها اطلاعات بهموقع را در اولویت قرار میدهند و طیف توجه انسان را تقلید میکنند. با لایهگذاری خلاصهسازی بازگشتی در بالا، مشکل مقیاسپذیری را حل میکنیم و به عاملها اجازه میدهیم تا در جلسات طولانیمدت بدون رسیدن به محدودیتهای توکن یا تحمیل تأخیر بیش از حد عمل کنند.
برای توسعهدهندگانی که به دنبال ارتقای چارچوبهای عامل خود هستند، آزمایش این الگوها باید در اولویت باشد. با زوال نمایی ساده شروع کنید و به تدریج لایههای خلاصهسازی را همانطور که نیازهای زمینه برنامه کاربردی شما رشد میکند، اضافه کنید. نتیجه عاملهایی خواهد بود که نه تنها هوشمندتر، بلکه کارآمدتر و مقرونبهصرفهتر هستند.