Этот формат использования инструмента устарел

Мы настоятельно рекомендуем вам как можно скорее перейти на наш улучшенный формат использования инструментов, который является более надежным и обеспечивает более высокое качество работы, особенно для более сложных задач с использованием инструментов.

Этот формат использования инструмента не оптимизирован для Claude 3 и может привести к более низкой производительности, чем наш обновленный формат использования инструмента.


Как работает устаревшее использование инструментов

При устаревшем использовании инструментов функции определяются непосредственно в самом промпте. Когда вы предоставляете Claude описания инструментов и функций, которые он может использовать, Claude может интеллектуально решать, когда и как использовать эти инструменты, чтобы помочь ответить на вопросы и выполнить задачи.

Например, предположим, вы предоставляете Claude (в промпте) функцию с названием get_weather(location), которая получает текущую погоду для заданного местоположения. Если пользователь затем спросит: “Какая сейчас погода в Лондоне?”, Claude поймет, что он может использовать функцию get_weather, которую вы предоставили, чтобы найти ответ.

За кулисами это многоэтапный процесс:

  1. Определения функций и вопрос пользователя передаются Claude в одном промпте
    • Claude не только нужны инструменты и их описания, чтобы успешно решить, следует ли использовать инструменты, но, вероятно, также сопутствующие примеры ситуаций, в которых такие инструменты должны использоваться, в зависимости от сложности варианта использования и инструментов.
  2. Claude оценивает вопрос пользователя и решает, какие функции вызвать и с какими аргументами
  3. Claude конструирует правильно отформатированный вызов функции
  4. Вызов функции перехватывается клиентским кодом с четкой stop_sequence, и фактическая функция выполняется на стороне клиента
  5. Результат функции передается обратно в Claude
  6. Claude использует результат функции для формулирования своего окончательного ответа пользователю

Этот метод позволяет Claude использовать внешние знания и возможности, сохраняя при этом интерфейс диалога.


Определение функций

Функции определяются путем предоставления Claude описания функции, заключенного в XML-теги. Описание должно включать:

  • Имя функции
  • Текстовое объяснение того, что делает функция
  • Ожидаемые параметры, их типы и описания
  • Возвращаемые значения и типы
  • Любые исключения, которые могут быть вызваны

Вот пример определения функции:

XML
<tool_description>
<tool_name>get_weather</tool_name>
<description>
Получает текущую погоду для указанного местоположения.
Возвращает словарь с двумя полями:
- temperature: float, текущая температура в градусах Фаренгейта
- conditions: string, краткое описание текущих погодных условий
Вызывает ValueError, если указанное местоположение не может быть найдено.
</description>
<parameters>
<parameter>
<name>location</name>
<type>string</type>
<description>Город и штат, например, Сан-Франциско, Калифорния</description>
</parameter>
</parameters>
</tool_description>

Несколько советов по написанию хороших описаний функций:

  • Будьте ясными и лаконичными, но предоставляйте достаточно деталей, чтобы Claude понимал, когда следует использовать функцию
  • Укажите типы параметров и возвращаемых значений
  • Упомяните любые соответствующие исключения, которые могут быть вызваны
  • Используйте текстовые описания, а не синтаксис кода

Формат устаревшего использования инструмента

Для того чтобы Claude вызвал функцию, он должен вывести очень специфически отформатированный XML-блок. Формат выглядит следующим образом:

XML
<function_calls>
<invoke>
<tool_name>function_name</tool_name>
<parameters>
<param1>value1</param1>
<param2>value2</param2>
</parameters>
</invoke>
</function_calls>

Блок <function_calls> может содержать несколько блоков <invoke>, если Claude вызывает более одной функции одновременно. Каждый <invoke> содержит имя вызываемой функции и передаваемые параметры.

Вы должны передать </function_calls> в свой вызов API в качестве stop_sequence, чтобы гарантировать, что Claude прекратит генерировать текст после вызова функции.

После блока <function_calls> и при наличии правильной последовательности остановки Claude прекратит генерацию и будет ждать, пока результат функции не будет передан обратно в блоке <function_results>, который выглядит следующим образом:

XML
<function_results>
<result>
<tool_name>function_name</tool_name>
<stdout>
function result goes here
</stdout>
</result>
</function_results>

Результат функции должен быть помещен внутри тегов <stdout>. Если функция вызвала исключение, оно должно быть возвращено следующим образом:

XML
<function_results>
<error>
error message goes here
</error>
</function_results>

Полный результат функции должен быть передан обратно в Claude в виде сообщения, продолжающего разговор с предыдущего момента. После получения результатов функции Claude продолжит генерацию, чтобы включить результаты в свой ответ.


Пример промпта с устаревшим использованием инструмента

Вот полный пример промпта, который предоставляет Claude две функции и вопрос, требующий их использования:

Content
SystemВ этой среде у вас есть доступ к набору инструментов, которые вы можете использовать для ответа на вопрос пользователя.

Вы можете вызывать их следующим образом:
<function_calls>
<invoke>
<tool_name>$TOOL_NAME</tool_name>
<parameters>
<$PARAMETER_NAME>$PARAMETER_VALUE</$PARAMETER_NAME>

</parameters>
</invoke>
</function_calls>

Вот доступные инструменты:
<tools>
<tool_description>
<tool_name>get_current_stock_price
</tool_name><description>Получает текущую цену акций компании. Возвращает float: Текущая цена акции.
Вызывает ValueError: если входной символ недействителен/неизвестен.</description>
<parameters>
<parameter>
<name>symbol</name>
<type>string</type>
<description>Символ акции компании, для которой нужно получить цену.</description>
</parameter>
</parameters>
</tool_description>

<tool_description>
<tool_name>get_ticker_symbol</tool_name>
<description>Получает символ тикера акций для компании, найденной по названию. Возвращает str: Символ тикера для акции компании. Вызывает TickerNotFound: если соответствующий символ тикера не найден.
</description>
<parameters>
<parameter>
<name>company_name</name>
<type>string</type>
<description>Название компании.</description>
</parameter>
</parameters>
</tool_description></tools>
UserКакова текущая цена акций General Motors?

Вот как Claude ответит:

Content
Assistant<scratchpad>
Чтобы ответить на этот вопрос, мне нужно будет:

1. Получить символ тикера для General Motors с помощью функции get_ticker_symbol().
2. Использовать возвращенный символ тикера, чтобы получить текущую цену акций с помощью функции get_current_stock_price().</scratchpad>

<function_calls>
<invoke>
<tool_name>get_ticker_symbol</tool_name>
<parameters>
<company_name>General Motors</company_name>
</parameters>
</invoke>
</function_calls>

Сначала Claude вызывает get_ticker_symbol, чтобы получить символ тикера для General Motors. Мы можем распознать, что Claude хочет вызвать функцию через последовательность остановки </function calls>. Мы извлекаем соответствующие данные между соответствующими XML-тегами и запускаем функцию от имени Claude. Затем мы передаем результаты обратно в Claude в тегах <function_results>.

Content
User<function_results>
<result>
<tool_name>get_ticker_symbol</tool_name>
<stdout>
GM
</stdout>
</result>
</function_results>

Теперь, зная символ тикера, Claude впоследствии решит, что ему нужно вызвать get_current_stock_price и получить текущую цену.

Content
Assistant<function_calls>
<invoke>
<tool_name>get_current_stock_price</tool_name>
<parameters>
<symbol>GM</symbol>
</parameters>
</invoke>
</function_calls>

Мы также передаем обратно эти результаты.

Content
User<function_results>
<result>
<tool_name>get_current_stock_price</tool_name>
<stdout>
38.50
</stdout>
</result>
</function_results>

Имея всю эту цепочку разговора, предоставляющую Claude все необходимые детали, Claude сможет дать пользователю ответ в качестве своего окончательного вывода.

Content
<answer>
Текущая цена акций General Motors составляет $38.50.
</answer>

Часто задаваемые вопросы по устаревшему использованию инструментов

Сколько инструментов я могу передать Claude в данном взаимодействии?

Вы можете определить любое количество инструментов и функций для использования Claude, хотя в настоящее время мы рекомендуем не превышать 3-5 для этой устаревшей структуры использования инструментов, в зависимости от сложности вашего варианта использования и рассматриваемых функций.

Есть ли у Claude какие-либо встроенные инструменты, которые он знает?

Нет. Любые инструменты, которые вы хотите, чтобы Claude использовал, вам придется определить самостоятельно в промпте использования инструмента. У Claude нет предопределенного списка функций и определений, которые работают лучше всего.

Когда новый формат использования инструмента появится на Vertex AI или Amazon Bedrock?

В ближайшем будущем!