В LangChain появилась новая абстракция для работы со сложными инструментами — структурированные инструменты (Structured Tool). Они позволяют агентам взаимодействовать с различными функциями, оборачивая их в удобные для использования объекты. Это значительное развитие по сравнению с первоначальной реализацией, когда при запуске LangChain в ноябре 2022 года использование инструментов было довольно упрощённым: модель генерировала всего два строковых значения — название инструмента и строку ввода для выбранного инструмента. Тогда агент мог использовать только один инструмент за ход, а ввод ограничивался одной строкой.
Развитие продвинутых языковых моделей (text-davinci-003, gpt-3.5-turbo, gpt-4) позволило пересмотреть ограничения на использование инструментов в среде агентов LangChain. Теперь устранено ограничение на ввод одной строки — представлена поддержка структурированных инструментов.
Структурированный инструмент определяется следующими параметрами:
* name — метка, указывающая агенту, какой инструмент выбрать (например, GetCurrentWeather);
* description — краткое руководство, объясняющее, когда и зачем агенту использовать инструмент;
* args_schema — описывает интерфейс инструмента для агента (на основе сигнатуры обёрнутой функции, допускает дополнительную логику проверки входных данных инструмента; представляет собой Pydantic BaseModel, который определяет аргументы с информацией об их типах);
* функции _run и _arun — определяют внутреннюю работу инструмента (например, возврат текущего времени, отправка сообщения, управление роботом).
Имя инструмента должно однозначно указывать, что он делает. Описание даёт подробные указания по использованию, может содержать примеры или контрпримеры. args_schema выполняет две задачи: сообщает, какая информация требуется от агента, и проверяет эти входные данные перед выполнением внутренней функциональности инструмента.
Уже выпущены новые структурированные инструменты:
* File management — для операций с файловой системой (write, grep, move, copy, list_dir, find);
* официальный stateful PlayWright Browser toolkit — позволяет агенту переходить на сайты, кликать, отправлять формы, запрашивать данные.
Чтобы начать работу со структурированными инструментами, можно использовать конструктор StructuredTool.fromfunction(yourcallable).
Приведён пример инструмента для взаимодействия с моделями Hugging Face через библиотеку requests. Функция gethuggingfacemodels вызывает GET‑запросы к API принимает параметры path и queryparams (возможные параметры поиска: search, author, filter, sort), использует API‑ключ в заголовке авторизации. Инструмент создаётся так: gethuggingfacemodelstool = StructuredTool.fromfunction(gethuggingfacemodels). Вызов выглядит так: models = gethuggingfacemodelstool.run({"query_params": {"search": "gpt-j"}}).
Для большего контроля над определением инструмента можно наследоваться от BaseTool. Например, кастомный инструмент GetHuggingFaceModelsTool включает схему параметров GetHuggingFaceModelsToolSchema (поля path и queryparams), использует API‑ключ из переменных окружения (HUGGINGFACEAPIKEY), реализует синхронный (run) и асинхронный (_arun) методы выполнения запроса.
Пример использования GetHuggingFaceModelsTool для получения моделей с запросом «gpt-j»:
getmodelstool = GetHuggingFaceModelsTool
models = getmodelstool.run({"query_params": {"search": "gpt-j"}})
print(models)
this page
Также добавлен StructuredChatAgent, работающий со структурированными инструментами. Для запуска агента можно использовать следующий код:
from langchain.agents import initializeagent, AgentType
from langchain.chatmodels import ChatAnthropic
tools = [] # Add any tools here
llm = ChatAnthropic(temperature=0) # or any other LLM
agentchain = initializeagent(tools, llm, agent=AgentType.STRUCTUREDCHATZEROSHOTREACT_DESCRIPTION)
Структурированные инструменты совместимы с агентом AutoGPT из langchain.experimental. Инструменты с одним строковым аргументом работают с существующими агентами, а инструменты с более чем одним аргументом требуют дополнительной настройки для агентов: zero-shot-react-description, react-docstore, self-ask-with-search, conversational-react-description, chat-zero-shot-react-description, chat-conversational-react-description.
Можно создавать строковые инструменты с помощью конструктора Tool и декораторов @tool. Инструменты, наследующие от BaseTool и принимающие один строковый аргумент, обрабатываются как строковые инструменты. Ранее определённые строковые BaseTool можно использовать с новыми агентами для StructuredTool — обратная совместимость обеспечена. Инструменты, ожидающие JSON‑сериализованные строковые входные данные, могут потребовать модификации для взаимодействия с парсером вывода новых агентов либо обновления до нового формата.