Управление памятью LLM

Вопрос или проблема

Я создал 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.

Шаги для обеспечения постоянства памяти

  1. Выбор подходящего механизма хранения:
    Для сохранения истории общения рекомендуется использовать систему, которая поддерживает устойчивое хранение данных. Это может быть:

    • Файловая система (например, JSON или текстовые файлы).
    • Реляционная база данных (например, SQLite).
    • NoSQL база данных (например, MongoDB).
  2. Создание функции для записи в хранилище:
    Разработайте функцию, которая будет отвечать за сохранение состояния памяти в выбранное хранилище. Ниже представлен пример того, как вы можете реализовать это с помощью 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)
  3. Интеграция с вашим кодом:
    Перед началом сессии загрузите память и добавьте её в память вашей системы. После обработки каждого сообщения обновите память, чтобы она содержала всю историю.

    Измените функцию 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, позволяющую ему запоминать разговоры между сессиями. Это не только улучшит пользовательский опыт, но и обеспечит более контекстуальную и связную коммуникацию. Не забывайте тестировать вашу систему и адаптировать её по мере необходимости для достижения наилучших результатов.

Если вам потребуется дополнительная помощь или уточнения, не стесняйтесь задавать вопросы. Успехов в вашем проекте!

Оцените материал
Добавить комментарий

Капча загружается...