Использование нескольких инструментов с Claude
Современные большие языковые модели (LLM), такие как Claude, обладают удивительными способностями к пониманию и генерации человеческого языка. Они могут писать тексты, отвечать на вопросы, резюмировать информацию и даже генерировать код. Однако, как и любой инструмент, LLM имеют свои ограничения. Они не всегда способны выполнять точные математические вычисления, получать актуальные данные из интернета в реальном времени или взаимодействовать с внешними системами, такими как календари или базы данных.
Именно здесь на помощь приходят инструменты (tools). Интеграция внешних инструментов позволяет расширить возможности Claude, предоставляя ему доступ к специализированным функциям. Это превращает Claude из простого генератора текста в мощного интеллектуального агента, способного выполнять сложные, многоэтапные задачи, взаимодействуя с окружающим цифровым миром.
Зачем Claude нужны инструменты?
Представьте, что вы хотите создать систему напоминаний с помощью Claude. Если вы попросите Claude "установить напоминание на завтра", он, скорее всего, поймет запрос, но не сможет выполнить его, потому что у него нет встроенной функции для взаимодействия с календарем или точного расчета дат. Более того, Claude, будучи языковой моделью, может допускать неточности в сложных арифметических операциях или расчетах дат.
Для создания надежной системы напоминаний нам потребуются следующие возможности, реализованные как отдельные инструменты:
get_current_datetime: Claude должен знать текущую дату и время, чтобы правильно отсчитывать интервалы или устанавливать напоминания относительно "сегодня".add_duration_to_datetime: Поскольку Claude может быть неточен в сложении дат и временных интервалов, нам нужен надежный инструмент для выполнения этой операции. Например, "177 дней после 1 января 2050 года".set_reminder: Необходим способ фактически установить напоминание во внешней системе (например, в календаре или приложении для заметок).
Интегрируя эти инструменты, мы даем Claude "руки", чтобы он мог не только понимать наши запросы, но и действовать в ответ на них.
Интеграция нескольких инструментов: Общий подход
После того как базовая инфраструктура для работы с инструментами настроена, добавление новых инструментов становится простым и повторяемым процессом. Основная идея заключается в том, чтобы сообщить Claude обо всех доступных ему инструментах, предоставив их схемы (schemas).
При инициализации диалога или при каждом вызове API, вы передаете Claude список всех инструментов, которые он может использовать. Это делается путем передачи списка схем инструментов в параметре tools. Например:
response = chat(messages, tools=[
get_current_datetime_schema,
add_duration_to_datetime_schema,
set_reminder_schema
])
Каждая схема инструмента — это описание его функциональности, ожидаемых входных параметров и типа возвращаемого значения. Claude использует эти схемы, чтобы понять, какие инструменты доступны, когда их использовать и как правильно формировать запросы к ним. Это позволяет Claude самостоятельно выбирать наиболее подходящий инструмент для выполнения части задачи.
Обработка выполнения инструментов
Когда Claude решает использовать инструмент, он не выполняет его сам. Вместо этого он генерирует специальный "блок использования инструмента" (tool use block) в своем ответе, указывая имя инструмента и параметры, с которыми его следует вызвать. Ваша задача как разработчика — перехватить этот блок, выполнить соответствующую функцию на вашей стороне и вернуть результат обратно Claude.
Для этого обычно используется централизованная функция, которая принимает имя инструмента и его входные данные, а затем вызывает соответствующую реальную функцию. Пример такой функции:
def run_tool(tool_name, tool_input):
if tool_name == "get_current_datetime":
return get_current_datetime(**tool_input)
elif tool_name == "add_duration_to_datetime":
return add_duration_to_datetime(**tool_input)
elif tool_name == "set_reminder":
return set_reminder(**tool_input)
# ... другие инструменты
Этот шаблон обеспечивает согласованность: вы проверяете имя инструмента, вызываете соответствующую функцию с предоставленными входными данными и возвращаете результат. Этот результат затем передается обратно Claude, который использует его для продолжения диалога или выполнения следующего шага задачи.
Пример использования нескольких инструментов
Давайте рассмотрим сложный запрос, который требует использования нескольких инструментов: "Установи напоминание о приеме у врача. Это через 177 дней после 1 января 2050 года."
Чтобы выполнить этот запрос, Claude должен:
- Рассчитать дату: Сначала ему нужно определить, какая дата будет через 177 дней после 1 января 2050 года. Для этого Claude выберет инструмент
add_duration_to_datetime. - Установить напоминание: После получения рассчитанной даты, Claude использует ее для установки напоминания с помощью инструмента
set_reminder.
Claude не выполняет все эти шаги одновременно. Он делает это последовательно, в несколько "ходов" диалога. Сначала он объясняет, что ему нужно сделать, затем вызывает первый инструмент (add_duration_to_datetime), получает результат (например, 27 июня 2050 года), а затем вызывает второй инструмент (set_reminder) с правильной датой. Этот процесс демонстрирует, как Claude может связывать вызовы нескольких инструментов для выполнения сложных задач.
Понимание потока сообщений
Изучение истории диалога показывает, как Claude управляет несколькими инструментами в одном ответе и в течение нескольких обменов сообщениями. Когда пользователь делает запрос, Claude анализирует его и формирует ответ, который может содержать как текстовый блок (объяснение своих действий), так и один или несколько блоков использования инструментов (tool_use).
В случае с напоминанием, поток сообщений будет выглядеть примерно так:
- Пользователь: "Установи напоминание о приеме у врача. Это через 177 дней после 1 января 2050 года."
- Claude: (Текстовый блок: "Понял. Мне нужно сначала рассчитать точную дату, а затем установить напоминание.") + (Блок
tool_useдляadd_duration_to_datetimeс параметрами:start_date="2050-01-01",duration="177 days"). - Ваше приложение: Выполняет
add_duration_to_datetime, получает результат (например,"2050-06-27") и отправляет его обратно Claude какtool_result. - Claude: (Текстовый блок: "Дата рассчитана. Теперь я установлю напоминание.") + (Блок
tool_useдляset_reminderс параметрами:description="прием у врача",date="2050-06-27"). - Ваше приложение: Выполняет
set_reminder, получает результат (например,"Напоминание успешно установлено") и отправляет его обратно Claude какtool_result. - Claude: (Текстовый блок: "Напоминание о приеме у врача на 27 июня 2050 года успешно установлено.")
Этот многоходовой обмен позволяет Claude последовательно решать сложные задачи, используя результаты одного инструмента для информирования следующего. Это мощный механизм для создания по-настоящему интерактивных и функциональных AI-помощников.
Простой шаблон для добавления новых инструментов
Как только базовая инфраструктура для работы с инструментами настроена, добавление новых инструментов следует простому трехэтапному процессу:
- Добавьте схему инструмента: Включите новую схему инструмента в список
tools, который вы передаете Claude при инициализации диалога (например, в вызовеchat). - Обновите логику выполнения: Добавьте соответствующий
case(например,elifусловие) для нового инструмента в функциюrun_tool, которая обрабатывает вызовы инструментов. - Реализуйте функцию инструмента: Напишите фактическую функцию, которая выполняет логику нового инструмента. Это может быть вызов внешнего API, обращение к базе данных или выполнение сложного вычисления.
Фреймворк Anthropic API (или SDK, если вы используете его) автоматически обрабатывает всю передачу сообщений, форматирование результатов инструментов и управление потоком диалога. Это значительно упрощает создание сложных AI-помощников, которые могут выполнять несколько связанных задач последовательно.
Заключение
Возможность интеграции нескольких инструментов с Claude является краеугольным камнем для создания по-настоящему мощных и универсальных AI-агентов. Она позволяет преодолеть внутренние ограничения LLM, предоставляя им доступ к специализированным функциям и данным из внешнего мира. Следуя простому, повторяемому шаблону для добавления и обработки инструментов, разработчики могут создавать сложные системы, которые не только понимают намерения пользователя, но и активно действуют для их выполнения, делая Claude незаменимым помощником в самых разнообразных сценариях.