AI Agents

مشکل حافظه: ساخت زمینه پایدار برای عامل‌های هوش مصنوعی

یکی از رایج‌ترین دام‌ها در توسعه عامل‌های هوش مصنوعی خودمختار، «مشکل ماه طلایی» است. بدون مکانیزمی برای حفظ اطلاعات، عامل با هر تعامل جدید به حالت اولیه بازمی‌گردد. اگرچه مدل‌های زبانی بزرگ (LLMs) در پردازش زمینه در یک پنجره تک‌پrompt بسیار قدرتمند هستند، اما ذاتاً فاقد پایداری بلندمدت می‌باشند. برای ساخت عامل‌هایی که واقعاً بتوانند یاد بگیرند، ترجیحات را به خاطر بسپارند و وضعیت را در طول جلسات حفظ کنند، باید معماری‌های حافظه مستحکمی پیاده‌سازی کنیم.

انواع حافظه عامل

حافظه مؤثر عامل به ندرت یک ساختار تک‌تکه و یکپارچه است. در عوض، معمولاً از سه لایه متمایز تشکیل شده است که هر کدام هدف متفاوتی را بر عهده دارند:

  1. حافظه کوتاه‌مدت (پنجره زمینه): این همان زمینه فوری است که در حین استنتاج به LLM داده می‌شود. این شامل تاریخچه مکالمه فعلی و دستورالعمل‌های سیستم است. اگرچه توسط محدودیت‌های توکن محدود می‌شود، اما برای استدلال فوری حیاتی است.
  2. حافظه بلندمدت (ذخیره‌سازی برداری): این به عنوان هارد دیسک خارجی عامل عمل می‌کند. با تعبیه اسناد یا تعاملات گذشته در فضاهای برداری، عامل می‌تواند اطلاعات تاریخی مرتبط را هنگام نیاز بازیابی کند و به طور مؤثر محدودیت‌های توکن را دور بزند.
  3. حافظه رویدادی (حافظه کاری): این وضعیت خاص و گذرای عامل در طول یک وظیفه است، مانند لیست خریدی که در حال ساختن است یا قطعه کدی که در حال دیباگ شدن است.

پیاده‌سازی حافظه بلندمدت با RAG

عملی‌ترین رویکرد برای دادن حافظه بلندمدت به عامل، تولید تقویت‌شده با بازیابی (RAG) است. به جای ریختن تمام تعاملات گذشته در پنجره زمینه (که پرهزینه و ناکارآمد است)، ما فقط قطعات مرتبط‌ترین را بازیابی می‌کنیم. این نیازمند تبدیل متن به بردارهای با ابعاد بالا با استفاده از یک مدل تعبیه (Embedding) است.

در زیر یک مثال عملی با استفاده از پایتون و کتابخانه LangChain برای راه‌اندازی یک سیستم حافظه ساده که تاریخچه مکالمه را ذخیره کرده و در صورت نیاز بازیابی می‌کند، آورده شده است.

from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import OpenAIEmbeddings
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain

# راه‌اندازی مدل تعبیه
embeddings = OpenAIEmbeddings()

# ایجاد یک ذخیره‌سازی برداری برای نگهداری تعاملات گذشته
# در یک برنامه واقعی، شما این را روی دیسک یا پایگاه داده پایدار می‌کنید
vectorstore = Chroma(embedding_function=embeddings, persist_directory="./db")

# راه‌اندازی حافظه مکالمه‌ای برای ردیابی نوبت‌های اخیر
memory = ConversationBufferMemory(
    memory_key="chat_history", 
    return_messages=True, 
    output_key="answer"
)

# ترکیب بازیاب با LLM
retriever = vectorstore.as_retriever(search_kwargs={"k": 2})

# زنجیره بازیابی را با تولید ترکیب می‌کند
chat_chain = ConversationalRetrievalChain.from_llm(
    llm, 
    retriever=retriever, 
    memory=memory
)

ملاحظات عملی: بازیابی و نگهداری

در حالی که راه‌اندازی زیرساخت ساده است، چالش مهندسی در نگهداری نهفته است. حافظه ایستا نیست؛ نیاز به هرس دارد. ذخیره هر تعامل به تنهایی در نهایت منجر به نویز و افزایش تأخیر می‌شود. شما باید استراتژی‌هایی را برای موارد زیر پیاده‌سازی کنید:

  • خلاصه‌سازی: به طور منظم مکالمات قدیمی را به حقایق انتزاعی خلاصه کنید به جای نگهداری متن خام.
  • اخراج: یک سیاست اخراج (مانند کمترین استفاده اخیر) را پیاده‌سازی کنید تا داده‌های فرسوده را از ذخیره‌سازی برداری حذف کند.
  • فیلتر کردن: از متادیتا برای فیلتر کردن حافظه‌ها بر اساس مرتبط بودن استفاده کنید، اطمینان حاصل کنید که عامل فقط به داده‌های مرتبط با کاربر یا وظیفه فعلی نگاه می‌کند.

نتیجه‌گیری

حافظه پایه هوش واقعی در عامل‌های هوش مصنوعی است. بدون آن، عامل‌ها صرفاً چت‌بات‌های پیچیده‌ای هستند که هیچ حس پیوستگی‌ای ندارند. با پیاده‌سازی یک استراتژی حافظه لایه‌ای که زمینه کوتاه‌مدت را با ذخیره‌سازی برداری پایدار ترکیب می‌کند، توسعه‌دهندگان می‌توانند عامل‌هایی بسازند که واقعاً شخصی، مفید و قادر به استدلال پیچیده و چندمرحله‌ای به نظر برسند. با پیشرفت این حوزه، احتمالاً معماری‌های حافظه پیچیده‌تری را خواهیم دید که فرآیندهای شناختی انسان را تقلید می‌کنند، اما در حال حاضر، تسلط بر RAG و پایگاه‌های داده برداری، اولین و ضروری‌ترین گام است.

Share: