حافظه LLM

بیشتر برنامه‌های مبتنی بر LLM یک رابط چت مانند WeChat دارند. یکی از توانایی‌های مهم فرآیند گفتگوی مصنوعی، قابلیت ارجاع به اطلاعات ارائه شده در گفتگوی قبلی می‌باشد، به همان شکلی که فردانه در گفتگو، بدون نیاز به تکرار محتوای قبلی، اطلاعات قبلی را به یاد می‌آورند.

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

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

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

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

فرآیند پیاده‌سازی توانایی حافظه در لنگ‌چین به شکل نمودار زیر نشان داده شده است: Memory Process

ادغام اجزای حافظه در سیستم

قبل از استفاده از اجزای حافظه، باید به دو سوال زیر توجه کنید:

  • چگونگی ذخیره داده‌های پیام تاریخی
  • چگونگی پرس‌وجوی داده‌های پیام تاریخی

ذخیره‌سازی: لیست پیام‌های چت

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

پرس‌وجو: چگونگی پرس‌وجوی پیام‌های گفت‌وگوی تاریخی مرتبط

برای پیاده‌سازی توانایی حافظه LLM، هسته، این است که محتوای پیام تاریخی را به عنوان اطلاعات پس‌زمینه به تهدیدها اضافه کند. به این ترتیب LLM می‌تواند در پاسخ به سوالات به اطلاعات پس‌زمینه ارجاع دهد.

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

استراتژی‌های متداول پرس‌وجوی پیام‌های تاریخی شامل:

  • فقط پرس‌وجوی N پیام اخیر به عنوان اطلاعات پس‌زمینه برای هشدارها
  • استفاده از هوش مصنوعی برای خلاصه‌سازی پیام‌های تاریخی، با خلاصه به عنوان اطلاعات پس‌زمینه برای هشدارها
  • بهره‌گیری از یک پایگاه داده برداری برای پرس‌وجوی پیام‌های تاریخی مشابه گفتگوی کنونی به عنوان اطلاعات پس‌زمینه برای هشدارها

مثال استفاده از اجزای لنگ‌چین

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

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

from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory()
memory.chat_memory.add_user_message("hi!")
memory.chat_memory.add_ai_message("what's up?")
  • توجه: لنگ‌چین انواع مختلفی از اجزای حافظه با استفاده مشابه ارائه می‌دهد.

بعدا، بیایید ببینیم چگونه از اجزای حافظه در زنجیره استفاده کنیم. در زیر، نحوه استفاده از LLM و ChatModel، دو مدل کپسوله شده در لنگ‌چین، از اجزای حافظه را شرح می‌دهد.

مثال استفاده از LLM با استفاده از اجزای حافظه

from langchain_openai import OpenAI
from langchain_core.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory

llm = OpenAI(temperature=0)

template = """شما یک ربات گفت‌وگوی بسیار خوب هستید که با یک انسان در حال گفت‌وگو می‌باشد.

گفت‌وگوی قبلی:
{chat_history}

سوال جدید: {question}
پاسخ هوش مصنوعی:"""
prompt = PromptTemplate.from_template(template)

memory = ConversationBufferMemory(memory_key="chat_history")
conversation = LLMChain(
    llm=llm,
    prompt=prompt,
    verbose=True,
    memory=memory
)
conversation({"question": "سلام"})

مثالی از ChatModel با استفاده از کامپوننت Memory

from langchain_openai import ChatOpenAI
from langchain.prompts import (
    ChatPromptTemplate,
    MessagesPlaceholder,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory

llm = ChatOpenAI()
prompt = ChatPromptTemplate(
    messages=[
        SystemMessagePromptTemplate.from_template(
            "تو یه چت‌بات خوبی هستی که داری با یه انسان گپ میزنی."
        ),
        MessagesPlaceholder(variable_name="chat_history"),
        HumanMessagePromptTemplate.from_template("{question}")
    ]
)
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

conversation = LLMChain(
    llm=llm,
    prompt=prompt,
    verbose=True,
    memory=memory
)
conversation({"question": "سلام"})