Este formato de uso de herramientas está desactualizado

Recomendamos encarecidamente que cambie lo antes posible a nuestra estructura mejorada de uso de herramientas, que es más confiable y permite un rendimiento de mayor calidad, especialmente para tareas de uso de herramientas más complejas.

Este formato de uso de herramientas no está optimizado para Claude 3 y puede resultar en un rendimiento inferior en comparación con nuestro formato actualizado de uso de herramientas.

Nota: El nuevo formato de uso de herramientas aún no está disponible en Vertex AI o Amazon Bedrock, pero llegará pronto a esas plataformas.


Cómo funciona el uso de herramientas heredadas

Con el uso de herramientas heredadas, las funciones se definen dentro del prompt mismo. Cuando proporciona a Claude descripciones de herramientas y funciones que puede usar, Claude puede decidir de manera inteligente cuándo y cómo usar esas herramientas para ayudar a responder preguntas y completar tareas.

Por ejemplo, digamos que proporciona a Claude (en el prompt) una función llamada get_weather(location) que recupera el clima actual para una ubicación determinada. Si un usuario luego pregunta “¿Cómo está el clima en Londres en este momento?”, Claude reconocerá que puede usar la función get_weather que proporcionó para buscar la respuesta.

Detrás de escena, este es un proceso de varios pasos:

  1. Las definiciones de funciones y la pregunta del usuario se pasan a Claude en un solo prompt
    • Claude no solo necesita las herramientas y sus descripciones para decidir con éxito si usar las herramientas, sino que probablemente también necesite ejemplos de situaciones en las que se deben usar dichas herramientas, según la complejidad del caso de uso y las herramientas.
  2. Claude evalúa la pregunta del usuario y decide qué función(es) llamar y con qué argumentos
  3. Claude construye una llamada de función con el formato adecuado
  4. La llamada a la función se intercepta a través del código del cliente con una clara stop_sequence, y la función real se ejecuta en el lado del cliente
  5. El resultado de la función se devuelve a Claude
  6. Claude usa el resultado de la función para formular su respuesta final al usuario

Esta técnica permite a Claude aprovechar el conocimiento y las capacidades externas mientras mantiene una interfaz conversacional.


Definición de funciones

Las funciones se definen proporcionando a Claude una descripción de la función envuelta en etiquetas XML. La descripción debe incluir:

  • El nombre de la función
  • Una explicación en texto plano de lo que hace la función
  • Los parámetros esperados, sus tipos y descripciones
  • Los valores y tipos de retorno
  • Cualquier excepción que pueda generarse

Aquí hay un ejemplo de definición de función:

XML
<tool_description>
<tool_name>get_weather</tool_name>
<description>
Recupera el clima actual para una ubicación especificada.
Devuelve un diccionario con dos campos:
- temperature: float, la temperatura actual en Fahrenheit
- conditions: string, una breve descripción de las condiciones climáticas actuales
Genera ValueError si no se puede encontrar la ubicación proporcionada.
</description>
<parameters>
<parameter>
<name>location</name>
<type>string</type>
<description>La ciudad y el estado, por ejemplo, San Francisco, CA</description>
</parameter>
</parameters>
</tool_description>

Algunos consejos para escribir buenas descripciones de funciones:

  • Sea claro y conciso, pero proporcione suficientes detalles para que Claude entienda cuándo se debe usar la función
  • Especifique los tipos de los parámetros y los valores de retorno
  • Mencione cualquier excepción relevante que pueda generarse
  • Use descripciones en texto plano, no sintaxis de código

Formato heredado de uso de herramientas

Para que Claude llame a una función, tiene que generar un bloque XML con un formato muy específico. El formato se ve así:

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

El bloque <function_calls> puede contener múltiples bloques <invoke> si Claude está llamando a más de una función al mismo tiempo. Cada <invoke> contiene el nombre de la función que se llama y los parámetros que se pasan.

Debe pasar </function_calls> a su llamada a la API como una stop_sequence para asegurarse de que Claude deje de generar texto una vez que haya llamado a una función.

Después de un bloque <function_calls>, y suponiendo que tenga la secuencia de parada adecuada, Claude dejará de generar y esperará que el resultado de la función se pase de vuelta en un bloque <function_results> que se ve así:

XML
<function_results>
<result>
<tool_name>function_name</tool_name>
<stdout>
aquí va el resultado de la función
</stdout>
</result>
</function_results>

El resultado de la función debe colocarse dentro de las etiquetas <stdout>. Si la función generó una excepción, eso debe devolverse así:

XML
<function_results>
<error>
aquí va el mensaje de error
</error>
</function_results>

El resultado completo de la función debe pasarse de vuelta a Claude como un mensaje que continúa la conversación desde antes. Después de recibir los resultados de la función, Claude continuará generando para incorporar los resultados en su respuesta.


Ejemplo de prompt heredado de uso de herramientas

Aquí hay un ejemplo completo de un prompt que proporciona a Claude dos funciones y una pregunta que requiere usarlas:

Content
SystemEn este entorno, tienes acceso a un conjunto de herramientas que puedes usar para responder la pregunta del usuario.

Puedes llamarlas así:
<function_calls>
<invoke>
<tool_name>$TOOL_NAME</tool_name>
<parameters>
<$PARAMETER_NAME>$PARAMETER_VALUE</$PARAMETER_NAME>

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

Aquí están las herramientas disponibles:
<tools>
<tool_description>
<tool_name>get_current_stock_price
</tool_name><description>Obtiene el precio actual de las acciones de una empresa. Devuelve float: El precio actual de las acciones.
Genera ValueError: si el símbolo de entrada no es válido/desconocido.</description>
<parameters>
<parameter>
<name>symbol</name>
<type>string</type>
<description>El símbolo bursátil de la empresa para obtener el precio.</description>
</parameter>
</parameters>
</tool_description>

<tool_description>
<tool_name>get_ticker_symbol</tool_name>
<description>Obtiene el símbolo bursátil de una empresa buscada por nombre. Devuelve str: El símbolo bursátil de las acciones de la empresa. Genera TickerNotFound: si no se encuentra un símbolo bursátil coincidente.
</description>
<parameters>
<parameter>
<name>company_name</name>
<type>string</type>
<description>El nombre de la empresa.</description>
</parameter>
</parameters>
</tool_description></tools>
User¿Cuál es el precio actual de las acciones de General Motors?

Así es como respondería Claude:

Content
Assistant<scratchpad>
Para responder esta pregunta, necesitaré:

1. Obtener el símbolo bursátil de General Motors usando la función get_ticker_symbol().
2. Usar el símbolo bursátil devuelto para obtener el precio actual de las acciones usando la función 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 primero llama a get_ticker_symbol para recuperar el símbolo bursátil de General Motors. Podemos reconocer que Claude quiere llamar a una función a través de la secuencia de parada </function calls>. Extraemos los datos relevantes de entre las etiquetas XML relevantes y ejecutamos la función en nombre de Claude. Luego pasamos los resultados de vuelta a Claude en etiquetas <function_results>.

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

Ahora que conoce el símbolo bursátil, Claude decidirá posteriormente que tiene que llamar a get_current_stock_price y obtener el precio actual.

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

También pasamos estos resultados de vuelta.

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

Con toda esta cadena de conversación proporcionando a Claude todos los detalles que necesita, Claude podrá proporcionar una respuesta al usuario como su salida final.

Content
<answer>
El precio actual de las acciones de General Motors es $38.50.
</answer>

Preguntas frecuentes sobre el uso de herramientas heredadas

¿Cuántas herramientas puedo pasar a Claude en una interacción determinada?

Puede definir cualquier número de herramientas y funciones para que Claude las use, aunque actualmente recomendamos que no exceda de 3 a 5 para esta estructura heredada de uso de herramientas, dependiendo de la complejidad de su caso de uso y las funciones en cuestión.

¿Claude tiene alguna herramienta incorporada que conozca?

No. Cualquier herramienta que desee que Claude use, tendrá que definirla usted mismo dentro de un prompt de uso de herramientas. Claude no tiene una lista predeterminada de funciones y definiciones que funcionen mejor.

¿Cuándo llegará el nuevo formato de uso de herramientas a Vertex AI o Amazon Bedrock?

¡En un futuro cercano!