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:
- 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.
- 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:
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ść"})