Введение в многоблочные сообщения Claude AI
В процессе работы с искусственным интеллектом Claude, особенно при использовании его функциональности для взаимодействия с внешними инструментами (tool functionality), вы столкнетесь с новой структурой ответов. В отличие от простых текстовых сообщений, которые вы, возможно, видели ранее, Claude теперь может возвращать многоблочные сообщения (multi-block messages), содержащие как обычный текст, так и информацию об использовании инструментов.
Эта эволюция значительно расширяет возможности Claude, позволяя ему не только генерировать текст, но и динамически взаимодействовать с внешними системами, базами данных или API для выполнения сложных задач. Понимание того, как обрабатывать эти новые типы сообщений, является ключевым для создания мощных и адаптивных приложений на базе Claude.
Включение инструментов в вызовы API
Чтобы дать Claude возможность использовать внешние инструменты, вам необходимо включить специальный параметр tools в ваш вызов API. Этот параметр принимает список JSON-схем, которые подробно описывают функции, доступные для вызова Claude. Каждая схема определяет имя функции, ее описание и параметры, которые она принимает.
Вот как может выглядеть структура запроса, включающего параметр tools:
messages = []
messages.append({
"role": "user",
"content": "Какое сейчас точное время в формате ЧЧ:ММ:СС?"
})
response = client.messages.create(
model=model,
max_tokens=1000,
messages=messages,
tools=[get_current_datetime_schema], # Здесь передается схема инструмента
)
В этом примере get_current_datetime_schema — это JSON-схема, которая описывает функцию для получения текущей даты и времени. Когда вы отправляете такой запрос, Claude анализирует его и, если сочтет нужным, решит использовать описанный инструмент для выполнения задачи пользователя.
Понимание структуры многоблочных сообщений
Когда Claude решает использовать инструмент, он возвращает сообщение от ассистента (assistant message) с несколькими блоками в списке content. Это существенное отличие от простых текстовых ответов, с которыми вы работали ранее.
Многоблочное сообщение обычно содержит:
- Человекочитаемый текст, объясняющий, что Claude собирается делать или уже сделал (например, "Я могу помочь вам узнать текущее время. Позвольте мне найти эту информацию для вас").
- Инструкции для вашего кода о том, какой инструмент вызвать и какие параметры использовать. Эта информация содержится в специальном блоке типа
tool_use.
Блок tool_use включает в себя:
- Уникальный
IDдля отслеживания вызова инструмента. name— имя функции, которую нужно вызвать (например,"get_current_datetime").input— входные параметры, отформатированные в соответствии с вашей JSON-схемой.type— обозначение типа блока как"tool_use".
Ваш код должен быть готов разобрать этот список content, чтобы извлечь как текстовую информацию для пользователя, так и инструкции по вызову инструмента.
Управление историей сообщений с многоблочным контентом
Это критически важная часть: Claude не хранит историю разговора самостоятельно, поэтому вы должны управлять ею вручную. При работе с ответами, включающими инструменты, необходимо сохранять всю структуру контента, включая все блоки, для поддержания контекста.
Вместо того чтобы просто извлекать текст из ответа и добавлять его в историю, вам нужно добавить полный объект content:
messages.append({
"role": "assistant",
"content": response.content # Добавляем весь список блоков
})
Такой подход сохраняет как текстовый блок, так и блок tool_use, поддерживая полный контекст разговора для будущих вызовов API. Если вы не сохраните блок tool_use в истории, Claude не будет знать, что он ранее запрашивал использование инструмента, и может потерять нить рассуждений или повторить запрос.
Полный цикл использования инструментов
Процесс использования инструментов следует четкому шаблону, который включает несколько шагов:
- Отправка сообщения пользователя с JSON-схемой инструмента в Claude. Вы сообщаете Claude о доступных функциях.
- Получение многоблочного сообщения от ассистента. Claude возвращает ответ, который может содержать текст и блок
tool_use, указывающий на необходимость вызова внешней функции. - Извлечение информации о вызове инструмента и выполнение функции. Ваш код парсит ответ Claude, идентифицирует блок
tool_use, извлекает имя функции и параметры, а затем вызывает соответствующую внешнюю функцию. - Отправка результата работы инструмента обратно в Claude вместе с полной историей сообщений. После выполнения внешней функции вы формируете новое сообщение, содержащее результат этой функции, и добавляете его в историю разговора, отправляя все это обратно Claude.
- Получение окончательного ответа от Claude. Claude обрабатывает результат работы инструмента и предоставляет окончательный, естественный языковой ответ пользователю, завершая цикл.
Каждый шаг требует тщательной обработки структуры сообщений для поддержания непрерывности разговора. Ключевая идея заключается в том, что разговоры с использованием инструментов включают более сложные форматы сообщений, но фундаментальный принцип сохранения полной истории сообщений остается неизменным.
Обновление вспомогательных функций
Если вы использовали вспомогательные функции, такие как add_user_message или add_assistant_message, для управления историей сообщений, вам, вероятно, потребуется обновить их, чтобы они могли обрабатывать многоблочный контент. Предыдущие версии этих функций, скорее всего, поддерживали только одиночные текстовые блоки. Теперь им необходимо учитывать более сложные структуры контента, которые могут включать блоки tool_use, а также блоки tool_result, которые вы будете отправлять обратно Claude.
Убедитесь, что ваши функции корректно сериализуют и десериализуют эти структуры, чтобы история разговора всегда была полной и понятной для Claude.