Вопрос или проблема
Я создал LLM, который взаимодействует с Python с помощью LangChain и LlamaCpp. Я использовал буфер памяти LangChain, но хочу, чтобы мой LLM запоминал предыдущие разговоры даже после перезапуска кода. Как я могу этого добиться? Пожалуйста, помогите.
from operator import itemgetter
from langchain.llms import LlamaCpp
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.memory import ConversationBufferMemory
from langchain.schema.runnable import RunnablePassthrough, RunnableLambda
from huggingface_hub import hf_hub_download
def create_chain(system_prompt):
#(repo_id, model_file_name) = ("TheBloke/Mistral-7B-Instruct-v0.1-GGUF",
# "mistral-7b-instruct-v0.1.Q4_0.gguf")
# model_path = hf_hub_download(repo_id=repo_id,
#filename=model_file_name,
#repo_type="model")
llm = LlamaCpp(
model_path="./mistral-7b-v0.1-layla-v4-Q4_K_M-imat.gguf",
temperature=0,
max_tokens=3000,
top_p=1,
verbose=False,
streaming=True , # Отключите потоковую передачу для терминального вывода
stop=["Human:"]
)
prompt = ChatPromptTemplate.from_messages([
("system", system_prompt),
MessagesPlaceholder(variable_name="chat_history"),
("human", "{human_input}"),
("ai", ""),
])
memory = ConversationBufferMemory(memory_key="chat_history",
return_messages=True)
def save_memory(inputs_outputs):
inputs = {"human": inputs_outputs["human"]}
outputs = {"ai": inputs_outputs["ai"]}
memory.save_context(inputs, outputs)
def extract_response(chain_response):
return chain_response["ai"]
llm_chain = {
"human_input": RunnablePassthrough(),
"chat_history": (
RunnableLambda(memory.load_memory_variables) |
itemgetter("chat_history")
)
} | prompt | llm
chain_with_memory = RunnablePassthrough() | {
"human": RunnablePassthrough(),
"ai": llm_chain
} | {
"save_memory": RunnableLambda(save_memory),
"ai": itemgetter("ai")
} | RunnableLambda(extract_response)
return chain_with_memory
def main():
# Установите системный запрос
f = open("sys.txt", "r")
system_prompt =f.read()
llm_chain = create_chain(system_prompt)
# Сохранить историю разговоров
messages = [{"role": "human woman", "content": "привет, парень, хочешь повеселиться?"}]
# Печать начального сообщения помощника
#print("Assistant: Как я могу помочь вам сегодня?")
while True:
user_prompt = input("Вы: ")
if user_prompt.lower() in ["выход", "уйти"]:
break
# Сохранить ввод пользователя
messages.append({"role": "user", "content": user_prompt})
# Генерировать ответ от LLM
response = llm_chain.invoke(user_prompt)
# Сохранить ответ помощника
messages.append({"role": "human woman", "content": response})
# Печать ответа помощника
print(f"юпитер: {response}")
if __name__ == "__main__":
main()
Это мой код, с которым я работаю, я надеюсь, что получу помощь. Это важный проект для меня.
Ответ или решение
Управление памятью LLM: Как сохранить историю разговоров между сессиями
Ваша задача состоит в том, чтобы предоставить вашему языковому моделированию (LLM) возможность запоминать предыдущие разговоры даже после перезапуска кода. Это можно достичь, используя соответствующие механизмы для хранения и извлечения памяти. В текущем контексте вы используете LangChain и LlamaCpp для реализации своего LLM.
Шаги для обеспечения постоянства памяти
-
Выбор подходящего механизма хранения:
Для сохранения истории общения рекомендуется использовать систему, которая поддерживает устойчивое хранение данных. Это может быть:- Файловая система (например, JSON или текстовые файлы).
- Реляционная база данных (например, SQLite).
- NoSQL база данных (например, MongoDB).
-
Создание функции для записи в хранилище:
Разработайте функцию, которая будет отвечать за сохранение состояния памяти в выбранное хранилище. Ниже представлен пример того, как вы можете реализовать это с помощью JSON-файла:import json MEMORY_FILE = 'memory.json' def load_memory(): try: with open(MEMORY_FILE, 'r') as f: return json.load(f) except FileNotFoundError: return [] def save_memory(chat_history): with open(MEMORY_FILE, 'w') as f: json.dump(chat_history, f)
-
Интеграция с вашим кодом:
Перед началом сессии загрузите память и добавьте её в память вашей системы. После обработки каждого сообщения обновите память, чтобы она содержала всю историю.Измените функцию
main()
следующим образом:def main(): # Загрузка сохраненной памяти chat_history = load_memory() # Чтение системного промта f = open("sys.txt", "r") system_prompt = f.read() llm_chain = create_chain(system_prompt) # Добавление загруженной истории в сообщения messages = chat_history while True: user_prompt = input("Вы: ") if user_prompt.lower() in ["выход", "quit"]: break # Сохранение пользовательского ввода messages.append({"role": "user", "content": user_prompt}) # Генерация ответа от LLM response = llm_chain.invoke(user_prompt) # Сохранение ответа ассистента messages.append({"role": "assistant", "content": response}) # Печать ответа ассистента print(f"Assistant: {response}") # Сохранение обновленной истории save_memory(messages)
Заключение
Следуя указанным шагам, вы сможете создать полноценную систему управления памятью для вашего LLM, позволяющую ему запоминать разговоры между сессиями. Это не только улучшит пользовательский опыт, но и обеспечит более контекстуальную и связную коммуникацию. Не забывайте тестировать вашу систему и адаптировать её по мере необходимости для достижения наилучших результатов.
Если вам потребуется дополнительная помощь или уточнения, не стесняйтесь задавать вопросы. Успехов в вашем проекте!