Использование агентов LangChain Pandas в качестве инструментов для разговорного чат-бота с памятью.

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

Использование агентов LangChain Pandas в качестве инструментов для разговорного чат-бота с памятью.

В данный момент я использую двух агентов LangChain (агенты Pandas) для извлечения информации из обширной табличной базы данных. Изначально оба набора данных о биомеханике находились в одном оригинальном агенте Pandas, но разделение двух различных наборов данных на два агента значительно повысило точность моих выводов. Вот почему у меня теперь есть два агента.

В настоящее время агенты не имеют памяти и не позволяют использовать память через kwargs в последней версии LangChain. Тем не менее, я интересуюсь, есть ли способ использовать LangChain для:

Создания разговорного чат-бота с памятью, используя функцию буфера памяти из LangChain.

Для целей этого вопроса я заменил оригинальные наборы данных на наборы данных Iris и Titanic.

Я попытался следовать нескольким ссылкам о том, как это сделать, но у меня не получилось.

Я написал следующий код:

import pandas as pd
from langchain.agents import create_pandas_dataframe_agent, ZeroShotAgent, AgentExecutor
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationBufferWindowMemory
from langchain.chains import LLMChain

# Загрузка наборов данных
df1 = pd.read_csv("https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv")
df2 = pd.read_csv("https://gist.githubusercontent.com/curran/a08a1080b88344b0c8a7/raw/0e7a9b0a5d22642a06d3d5b9bcbad9890c8ee534/iris.csv")

# Инициализация модели LLM
llm_model = AzureChatOpenAI(
    temperature=0,
    openai_api_version=oai_api_vers,
    azure_deployment=deployment
)

# Создание агентов для наборов данных Titanic и Iris
titanic_agent = create_pandas_dataframe_agent(
    llm_model,
    df1,
    verbose=True,
    engine="pandas",
    agent_type="openai-tools"
)

iris_agent = create_pandas_dataframe_agent(
    llm_model,
    df2,
    verbose=True,
    engine="pandas",
    agent_type="openai-tools"
)

# Настройка подсказки и памяти
prefix = """Побеседуйте с человеком. Отвечайте шаг за шагом, и история сообщений критически важна для использования. Теперь у вас есть доступ к следующим инструментам:"""
suffix = """Начинайте!

{chat_history}
Вопрос: {input}
{agent_scratchpad}"""

# Список инструментов, включая агентов
tools = [titanic_agent, iris_agent]

# Создание подсказки
prompt = ZeroShotAgent.create_prompt(
    tools=tools, 
    prefix=prefix, 
    suffix=suffix, 
    input_variables=["input", "chat_history", "agent_scratchpad"]
)

# Настройка памяти
memory = ConversationBufferWindowMemory(
    memory_key='chat_history',
    k=5,
    return_messages=True
)

# Настройка цепочки LLM
llm_chain = LLMChain(llm=ChatOpenAI(temperature=0, model="gpt-4"), prompt=prompt)

# Создание агента
agent = ZeroShotAgent(llm_chain=llm_chain, tools=tools, verbose=True)

# Интеграция инструментов, агента и памяти
agent_chain = AgentExecutor.from_agent_and_tools(
    agent=agent, 
    tools=tools, 
    verbose=True, 
    memory=memory,
    stopping_method="generate"
)

# Пример взаимодействия
def chat_with_bot(user_input):
    response = agent_chain.run(input=user_input)
    return response

# Пример использования
user_input = "Скажи мне о проценте выживших на Титанике."
print(chat_with_bot(user_input))

Тем не менее, это не делает то, что я хочу. Я был бы очень признателен, если кто-то сможет направить меня в правильном направлении и прокомментировать, возможно ли это вообще.

Что я ищу в своем предложенном решении/ответе:

Разговорный чат-бот с ограничением в 5 взаимодействий, который может использовать обоих агентов в качестве инструментов для получения информации по мере необходимости.

Тест:

Пользователь: Каков процент пассажиров, выживших в
наборе данных Titanic?
Мысль AI: Мне нужно использовать моего агента Титаника.
Обработка кода
Ответ: Процент выживших составил P%.

Пользователь: Спасибо, бот.
Мысль AI: Пользователь меня благодарит; мне не нужны инструменты для ответа.
Ответ: Пожалуйста!

Пользователь: Каково количество различных видов в наборе данных Iris?
Мысль AI: Мне нужен мой агент Iris для ответа.
Интерпретатор кода
Ответ: В наборе данных 3 различных вида.
Пользователь: Как они называются?

Как вы можете видеть, это подразумевает наличие памяти, поэтому правильный мыслительный процесс будет: Мыслительный процесс: Пользователь связывает этот запрос с предыдущим и хочет знать названия 3 различных видов в наборе данных Iris. Ответ: Iris setosa, Iris virginica и Iris versicolor.

Я был бы очень благодарен, если бы вы могли направить меня в правильном направлении. Спасибо!

Ответ или решение

Вы создаете чат-бота с использованием LangChain и Pandas-агентов для извлечения информации из набора данных об "Титанике" и "Ирисе". Данное решение предполагает использование памяти для обеспечения непрерывности разговора и более точных ответов. Ниже представлено полное руководство по реализации вашего замысла.

Полное решение

  1. Импорт необходимых библиотек

    Убедитесь, что все необходимые библиотеки установлены и импортированы:

    import pandas as pd
    from langchain.agents import create_pandas_dataframe_agent, ZeroShotAgent, AgentExecutor
    from langchain.chat_models import ChatOpenAI
    from langchain.memory import ConversationBufferWindowMemory
    from langchain.chains import LLMChain
  2. Загрузка данных

    Загрузите наборы данных:

    df1 = pd.read_csv("https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv")
    df2 = pd.read_csv("https://gist.githubusercontent.com/curran/a08a1080b88344b0c8a7/raw/0e7a9b0a5d22642a06d3d5b9bcbad9890c8ee534/iris.csv")
  3. Инициализация модели LLM

    Замените AzureChatOpenAI на подходящую модель, доступную в вашей среде. Убедитесь, что это корректная модель, например:

    llm_model = ChatOpenAI(temperature=0, model="gpt-4")
  4. Создание агентов для наборов данных

    Создайте агентов:

    titanic_agent = create_pandas_dataframe_agent(
       llm_model,
       df1,
       verbose=True
    )
    
    iris_agent = create_pandas_dataframe_agent(
       llm_model,
       df2,
       verbose=True
    )
  5. Установка памяти и конфигурация

    Определите память и конструкцию строки запроса:

    
    memory = ConversationBufferWindowMemory(
       memory_key='chat_history',
       k=5,
       return_messages=True
    )
    
    prefix = """Вы ведете разговор с человеком. Отвечайте шаг за шагом, и история сообщений критически важна. У вас есть доступ к следующим инструментам:"""
    suffix = """Начинайте!

{chat_history}
Вопрос: {input}
{agent_scratchpad}"""

tools = [titanic_agent, iris_agent]

prompt = ZeroShotAgent.create_prompt(
tools=tools,
prefix=prefix,
suffix=suffix,
input_variables=["input", "chat_history", "agent_scratchpad"]
)


6. **Настройка LLM-цепочки**

   Создайте цепочку:

   ```python
   llm_chain = LLMChain(llm=llm_model, prompt=prompt)

   agent = ZeroShotAgent(llm_chain=llm_chain, tools=tools, verbose=True)
  1. Сборка исполняемой цепочки

    Теперь соберите окончательную цепочку агента:

    agent_chain = AgentExecutor.from_agent_and_tools(
       agent=agent, 
       tools=tools, 
       verbose=True, 
       memory=memory,
       stopping_method="generate"
    )
  2. Функция для общения с ботом

    Имplementируйте функцию, с помощью которой пользователи будут взаимодействовать с ботом:

    def chat_with_bot(user_input):
       response = agent_chain.run(input=user_input)
       return response
  3. Пример взаимодействия

    Используйте функцию для тестирования:

    user_input = "Каков процент выживших на Титанике?"
    print(chat_with_bot(user_input))
    
    user_input = "Спасибо, бот."
    print(chat_with_bot(user_input))
    
    user_input = "Сколько видов в наборе данных Ирис?"
    print(chat_with_bot(user_input))
    
    user_input = "Как они называются?"
    print(chat_with_bot(user_input))

Заключение

Данный подход должен позволить вам создать чат-бота, который будет эффективно использовать два агента, сохраняя при этом контекст диалога с помощью функции памяти. Убедитесь, что протестируете каждое части кода, чтобы подтвердить его правильность. Если вы столкнетесь с трудностями, проверяйте, правильно ли работают временные инициализации и корректно ли загружаются данные.

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

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