AI Agents

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

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

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

معماری حافظه عامل

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

ذخیره‌سازی ساده هر کلمه در یک مکالمه ناکارآمد است و اغلب نویز را وارد می‌کند. به جای این کار، عامل‌ها باید از یک استراتژی «تثبیت» استفاده کنند. در پایان یک جلسه، یا در فواصل منظم، عامل مکالمه را خلاصه می‌کند و حقایق برجسته را استخراج می‌کند. این فرآیند حجم داده را کاهش می‌دهد در حالی که معنای معنایی را حفظ می‌کند.

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

برای ذخیره‌سازی بلندمدت، پایگاه‌های داده برداری مانند Pinecone، Weaviate یا ChromaDB ایده‌آل هستند. این پایگاه‌های داده امکان جستجوی شباهت را فراهم می‌کنند و به عامل اجازه می‌دهند بر اساس شباهت معنایی و نه تطبیق دقیق کلمات کلیدی، خاطرات مرتبط گذشته را پیدا کنند. در زیر یک مثال عملی با استفاده از Python و کتابخانه ChromaDB برای پیاده‌سازی یک انبار حافظه پایه آورده شده است.

import chromadb
from chromadb.utils import embedding_functions

# Initialize the ChromaDB client
client = chromadb.Client()

# Define an embedding function using a lightweight model
# In production, use a more robust model like Sentence Transformers
embed_function = embedding_functions.SentenceTransformerEmbeddingFunction(model_name="all-MiniLM-L6-v2")

# Create a persistent collection for agent memory
# Persistence ensures data survives between script runs
memory_collection = client.get_or_create_collection(
    name="agent_long_term_memory",
    embedding_function=embed_function,
    metadata={"hnsw:space": "cosine"}
)

def store_memory(agent, memory_text, metadata=None):
    """
    Stores a specific memory into the vector database.
    
    Args:
        agent: The agent ID associated with the memory.
        memory_text: The text representation of the memory.
        metadata: Additional metadata like timestamp or importance score.
    """
    # Ensure metadata includes the agent ID for filtering
    if metadata is None:
        metadata = {}
    metadata["agent_id"] = agent
    
    # Generate a unique ID based on hash or use UUID
    import uuid
    doc_id = str(uuid.uuid4())
    
    memory_collection.add(
        ids=[doc_id],
        documents=[memory_text],
        metadatas=[metadata]
    )
    return doc_id

def retrieve_memories(agent, query, n_results=5):
    """
    Retrieves the most relevant memories for a given query.
    
    Args:
        agent: The agent ID to filter by.
        query: The current context or question.
        n_results: Number of memories to retrieve.
        
    Returns:
        List of relevant memory documents.
    """
    # Perform a similarity search filtered by agent ID
    results = memory_collection.query(
        query_texts=[query],
        n_results=n_results,
        where={"agent_id": agent}
    )
    
    # Extract documents and distances for analysis
    memories = results["documents"][0]
    distances = results["distances"][0]
    
    # Filter out low-relevance memories (optional threshold)
    relevant_memories = []
    for mem, dist in zip(memories, distances):
        if dist < 0.5:  # Cosine distance threshold
            relevant_memories.append(mem)
            
    return relevant_memories

# Example Usage
# 1. Storing a memory after a conversation
store_memory("Agent_Alpha", "The user prefers dark mode in their dashboard settings.")

# 2. Retrieving memory when user asks about UI settings
query = "How should I configure the theme for my profile?"
relevant_context = retrieve_memories("Agent_Alpha", query)
print("Retrieved Context:", relevant_context)

بازیابی ترکیبی برای دقت

اگرچه جستجوی برداری در درک معنایی عالی است، اما گاهی اوقات در تطبیق‌های دقیق، مانند نام‌های خاص، تاریخ‌ها یا شناسه‌های فنی، شکست می‌خورد. برای کاهش این مشکل، سیستم‌های عامل پیشرفته از بازیابی ترکیبی استفاده می‌کنند که جستجوی شباهت برداری را با جستجوی سنتی کلمات کلیدی (مثلاً BM25) ترکیب می‌کند. این رویکرد اطمینان می‌دهد که عامل هم اطلاعات مرتبط از نظر مفهومی و هم جزئیات فکتی دقیق را بازیابی می‌کند.

هنگام طراحی پرامپت برای LLM، خاطرات بازیابی شده باید در پرامپت سیستم یا پنجره زمینه فوری تزریق شوند. رتبه‌بندی این خاطرات بر اساس مرتبط بودن و تازگی بسیار حیاتی است. خاطرات قدیمی‌تر باید وزن کمتری داشته باشند یا خلاصه شوند تا از آلودگی زمینه جلوگیری شود. برای مثال، ممکن است سه خاطره مرتبط و اخیر را به همراه خلاصه‌ای از تمام تعاملات قدیمی‌تر گنجانده باشید.

مدیریت محدودیت‌های پنجره زمینه

حتی با بازیابی کارآمد، LLMها پنجره‌های زمینه محدودی دارند. اگر یک عامل برای مدت طولانی فعال بوده باشد، حافظه کوتاه‌مدت آن (تاریخچه مکالمه) ممکن است به حد مجاز نزدیک شود. استراتژی‌هایی برای مدیریت این موضوع عبارتند از:

  • پنجره لغزان: فقط N پیام آخر را در زمینه فعال نگه دارید.
  • خلاصه‌سازی: به صورت دوره‌ای از LLM بخواهید مکالمه تا این لحظه را خلاصه کند و تاریخچه کامل را با خلاصه جایگزین کنید.
  • انتقال حافظه: تاریخچه جزئیات را به ذخیره‌سازی برداری بلندمدت منتقل کنید و فقط خلاصه را در زمینه کوتاه‌مدت نگه دارید.

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

نتیجه‌گیری

پیاده‌سازی حافظه عامل فقط درباره ذخیره‌سازی داده نیست؛ بلکه درباره مدیریت زمینه است. یک سیستم حافظه طراحی شده خوب به عامل‌ها اجازه می‌دهد شکاف بین LLMهای بدون حالت و دستیارهای هوشمند پایدار را پُر کنند. با یک انبار برداری ساده برای حقایق بلندمدت شروع کنید، جستجوی ترکیبی را برای دقت بگنجانید و پنجره زمینه خود را به طور دقیق مدیریت کنید. با تکامل مدل‌ها و ابزارها، توانایی مدیریت مؤثر حافظه همچنان یک شایستگی اصلی برای ساخت عامل‌های هوش مصنوعی پیشرفته باقی خواهد ماند.

Share: