Pamięć LLM

Większość aplikacji opartych na LLM posiada interfejs czatu podobny do WeChat. Istotną funkcją procesu dialogu AI jest możliwość odwoływania się do informacji wcześniej przekazanych w rozmowie, tak jak w ludzkim procesie dialogu, bez konieczności powtarzania poprzedniej treści. Ludzie automatycznie przypominają sobie informacje historyczne.

Zdolność przechowywania informacji o historii rozmowy w obszarze LLM jest zazwyczaj określana jako "Pamięć", podobnie jak ludzie mają zdolność zapamiętywania. LanChain zawiera różne składowe funkcji pamięci, które można używać oddzielnie lub łączyć w łańcuchu.

Składowe pamięci muszą implementować dwie podstawowe operacje: odczyt i zapis.

Dla różnych składowych zadań Chain w LanChain, jeśli włączysz funkcję Pamięci, będzie ona wykonywać podobną logikę, jak poniżej:

  1. Po otrzymaniu początkowego wejścia użytkownika, zadanie Chain spróbuje wyszukać istotne informacje historyczne z komponentu pamięci, a następnie połączy informacje historyczne z wejściem użytkownika w pytania, które zostaną przekazane do LLM.
  2. Po otrzymaniu zwróconej treści od LLM, automatycznie zostanie ona przechowana w komponencie pamięci w celu łatwego wyszukiwania w przyszłości.

Proces implementacji zdolności pamięci w LanChain jest przedstawiony na poniższym diagramie: Proces Pamięci

Integracja Składników Pamięci w Systemie

Przed użyciem składników pamięci, należy rozważyć następujące dwie kwestie:

  • Jak przechowywać historyczne dane wiadomości
  • Jak zapytać o historyczne dane wiadomości

Przechowywanie: Lista Wiadomości Czatu

Jeśli używasz modelu Czatu, dane rozmowy to lista wiadomości czatu. LanChain obsługuje różne silniki przechowywania do przechowywania historycznych danych wiadomości, przy czym najprostszą metodą jest przechowywanie ich w pamięci. W praktyce najczęściej stosowaną metodą jest przechowywanie ich w bazie danych.

Zapytywanie: Jak Zapytać o Istotne Historyczne Wiadomości Konwersacji

Aby zaimplementować zdolność pamięci LLM, istotne jest połączenie treści historycznych wiadomości jako informacji tła do pytań. W ten sposób LLM może odnosić się do informacji tła podczas odpowiadania na pytania.

Przechowywanie historycznych danych wiadomości jest stosunkowo proste, a bardziej wymagającym aspektem jest sposób zapytywania o historyczne wiadomości związane z bieżącą treścią konwersacji. Głównym powodem potrzeby zapytania o historyczne wiadomości związane z aktualną rozmową jest ograniczenie maksymalnej liczby tokenów LLM; nie możemy wcisnąć całej historycznej treści rozmowy w pytania dla AI.

Powszechne strategie zapytań o historyczne wiadomości obejmują:

  • Zapytanie tylko najnowszych N wiadomości jako informacje tła do pytań
  • Użycie AI do podsumowania historycznych wiadomości, przy czym podsumowanie służy jako informacja tła do pytań
  • Wykorzystanie bazy danych wektorów do zapytania o historyczne wiadomości podobne do aktualnej konwersacji jako informację tła do pytań

Przykład użycia Składnika LanChain

Spójrzmy, jak wygląda składnik Pamięci w LanChain. Tutaj przedstawimy podstawową wiedzę na temat interakcji ze składnikiem Pamięci.

Najpierw zobaczmy, jak używać ConversationBufferMemory w łańcuchu zadań. ConversationBufferMemory to bardzo prosty składnik pamięci, który może przechowywać listę wiadomości czatu w pamięci i przekazać je do nowego szablonu rozmowy.

from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory()
memory.chat_memory.add_user_message("cześć!")
memory.chat_memory.add_ai_message("co słychać?")
  • Uwaga: LanChain udostępnia różne składniki Pamięci o podobnym użyciu.

Dalej zobaczmy, jak użyć składnika Pamięci w łańcuchu. Poniżej przedstawimy, w jaki sposób zaimplementowane modele LLM i ChatModel w LanChain korzystają ze składnika Pamięci.

Przykład użycia LLM z użyciem składnika Pamięci

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 = """Jesteś świetnym chatbotem prowadzącym rozmowę z człowiekiem.

Poprzednia rozmowa:
{chat_history}

Nowe pytanie: {question}
Odpowiedź AI:"""
prompt = PromptTemplate.from_template(template)

memory = ConversationBufferMemory(memory_key="chat_history")
conversation = LLMChain(
    llm=llm,
    prompt=prompt,
    verbose=True,
    memory=memory
)
conversation({"question": "cześć"})
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(
            "Jesteś miłym chatbotem prowadzącym rozmowę z człowiekiem."
        ),
        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": "cześć"})