🧑🎓 Грокаем с агентом школьные математические задачки
Теперь, когда у вас есть инструментарий (функции, которые вы написали в предыдущем степе), то можно с помощью него начать решать математические задачи.
Что делать? Создайте своего агента-математика, использовав
tools
с предыдущего степа. Решите с помощью него предоставленные примеры
и запишите ответ в столбец answer
(только ответ, во всех задачах это
числа - целые или вещественные).
Что на входе? Вам предоставляется датасет с одним столбцом task
-
условия самих задач
import pandas as pd
df = pd.read_csv("https://stepik.org/media/attachments/lesson/1110884/custom_math_tools.csv")
Что на выходе? csv
файл, содержащий два столбца -
task, answer
Замечание: Ваше решение будет зачтено, если в нём будет минимум 8
правильных ответов.
Примечание: для инициализиции агента с инструментами, принимающими
несколько аргументов, воспользуйтесь параметром agent
, записав в него
значение AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION
.
from langchain.agents import initialize_agent, AgentType
agent = initialize_agent(agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,)
Всем привет.
Я создал функции, создал агента, всё отработало хорошо, но я столкнулся со следующей проблемой, а именно: я забираю ответ по ключу output, но в этом ответе, бывает, так что содержится не только "голый" ответ, но еще ключи "action" и "action_input". Вопрос: как мне избавиться от случайного появления ключей "action" и "action_input" в output ответа? Как-то дополнить докстринг в функциях? Использовать парсер? Просто про него ничего в ноутбке не сказанно((
Я пробовал output в словарь, но это не помогло т.к. ключи "action" и "action_input" то появляються, то нет - это видно на скрине под цифрой два и три.
@Эдуард_Поляков, да, можно использовать аутпут парсер или добавить в цикл обработку появления этих ключей. В щаблоне реализован минимально рабочий пример, чтобы было с чего начать - рекомендуется его расширять под свои нужды
@Иван_Александров, спасибо за ответ.
Я реализовал парсер, но он работает "через раз" и как-то не предсказуемо: ключ 'output' то появляется только с 'math_answer' (задан в схеме) то с "action_input", то вообще с другими ключами "number" и "binary_number" и т.д.
Не могли бы вы посмотреть на мой ноутбук и сказать, что я делаю не так и как я могу стабильно, используя парсер забирать ответ от LLM ключу math_answer, который определил в парсере.
@Иван_Александров, спасибо за ответ, я сдал это задание.
Но всё же мне не даёт покоя, что мы не можем нормально и стабильно получать ответ согласно установленной в парсере схемой, а именно получать значение по ключу math_answer без дополнительной очистке.
не могли бы мы подсказать или поделитсья эталооным решением? я просто перерыл документацию, ютуб, но так и не смог допиться желаемого((
также я нашел похожую реализация парсер + агент (за искл. что агент не кастомный), но на строчке output=output_parser.parse(response) я получил исключение((
мой ноутбук
@Эдуард_Поляков, агент, как и все остальные элементы LangChain содержит внутри себя промпт. А вы внего ещё один промпт подаете примерно похожий с похожими инструкциями. Я так понимаю,что вы его использовали для того чтобы атутпут парсер привязать. Ваш Аутпут парсер можно передать в функцию initialize_agent, как параметр (output_parser = output_parser,) и он будет подставляться в агентский промпт. Попробуйте так.
Вообще, конечно, странная реализация метода agent.invoke - почему не сделали схему ответа унифицированной?