Вопрос или проблема
Использование агентов 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-агентов для извлечения информации из набора данных об "Титанике" и "Ирисе". Данное решение предполагает использование памяти для обеспечения непрерывности разговора и более точных ответов. Ниже представлено полное руководство по реализации вашего замысла.
Полное решение
-
Импорт необходимых библиотек
Убедитесь, что все необходимые библиотеки установлены и импортированы:
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
Замените
AzureChatOpenAI
на подходящую модель, доступную в вашей среде. Убедитесь, что это корректная модель, например:llm_model = ChatOpenAI(temperature=0, model="gpt-4")
-
Создание агентов для наборов данных
Создайте агентов:
titanic_agent = create_pandas_dataframe_agent( llm_model, df1, verbose=True ) iris_agent = create_pandas_dataframe_agent( llm_model, df2, verbose=True )
-
Установка памяти и конфигурация
Определите память и конструкцию строки запроса:
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)
-
Сборка исполняемой цепочки
Теперь соберите окончательную цепочку агента:
agent_chain = AgentExecutor.from_agent_and_tools( agent=agent, tools=tools, verbose=True, memory=memory, stopping_method="generate" )
-
Функция для общения с ботом
Имplementируйте функцию, с помощью которой пользователи будут взаимодействовать с ботом:
def chat_with_bot(user_input): response = agent_chain.run(input=user_input) return response
-
Пример взаимодействия
Используйте функцию для тестирования:
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))
Заключение
Данный подход должен позволить вам создать чат-бота, который будет эффективно использовать два агента, сохраняя при этом контекст диалога с помощью функции памяти. Убедитесь, что протестируете каждое части кода, чтобы подтвердить его правильность. Если вы столкнетесь с трудностями, проверяйте, правильно ли работают временные инициализации и корректно ли загружаются данные.