Llamadas a herramientas

Las llamadas a herramientas, también conocidas como llamadas a funciones, son una forma estructurada de brindar Los LLM son la capacidad de enviar solicitudes a la aplicación que los llamó. Tú definas las herramientas que quieres que estén disponibles para el modelo, realizar solicitudes de herramientas a tu app según sea necesario para cumplir con las instrucciones que le proporciones.

Los casos de uso de las llamadas a herramientas generalmente se dividen en algunos temas:

Cómo otorgar a un LLM acceso a información con la que no fue entrenado

  • Información que cambia con frecuencia, como el menú diario de un restaurante o el estado del inventario de la tienda.
  • Información específica del dominio de tu app, como la información del producto.

Ten en cuenta la superposición con la generación de aumento de recuperación (RAG), que también una forma de permitir que un LLM integre información fáctica a sus generaciones. El RAG es un solución más pesada que es más adecuada cuando hay una gran cantidad de información o la información más relevante para una instrucción es ambigua. Activada por otro lado, si recuperar la información que necesita el LLM es una función simple llamada o búsqueda de base de datos, la llamada a herramientas es más apropiada.

Introducción de un grado de determinismo a un flujo de trabajo de LLM

  • Realizar cálculos que el LLM no puede completar de manera confiable a sí mismo
  • Obligar a un LLM a generar texto literal en ciertas circunstancias, como al responder una pregunta sobre las condiciones del servicio de una aplicación.

Realiza una acción cuando un LLM la inicia

  • Cómo encender y apagar luces en un asistente para la casa potenciado por LLM
  • Reservar reservas de mesas en un agente de restaurante potenciado por LLM

Antes de comenzar

Si deseas ejecutar los ejemplos de código de esta página, primero completa los pasos en la guía de introducción. En todos los ejemplos, se supone que ya hayan configurado un proyecto con las dependencias de Genkit instaladas.

Esta página analiza una de las funciones avanzadas de la abstracción del modelo Genkit y generate(), por lo que, antes de adentrarte en detalle, debes conocer el contenido de la página Genera contenido con modelos de IA. Deberías el sistema de Genkit para definir esquemas de entrada y salida, que se analiza en la página Flujos.

Descripción general de las llamadas a herramientas

En términos generales, esto es lo que una interacción típica de llamada a herramientas con un LLM se ve así:

  1. La aplicación que realiza la llamada le indica al LLM una solicitud y también incluye a la instrucción una lista de herramientas que el LLM puede usar para generar una respuesta.
  2. El LLM genera una respuesta completa o una llamada a herramientas en un formato específico.
  3. Si el emisor recibe una respuesta completa, la solicitud se completa y el finaliza la interacción; pero si el llamador recibe una llamada de herramienta, realizará lógica sea adecuada y envía una nueva solicitud al LLM que contiene la instrucción original o alguna variación, así como el resultado de la llamada a una herramienta.
  4. El LLM controla la nueva instrucción como en el paso 2.

Para que esto funcione, se deben cumplir varios requisitos:

  • El modelo debe entrenarse para realizar solicitudes de herramientas cuando sea necesario completar un mensaje. La mayoría de los modelos más grandes proporcionados a través de APIs web, como Gemini y Claude, pueden hacerlo, pero los modelos más pequeños y especializados a menudo no pueden. Genkit arrojará un error si intentas proporcionar herramientas a un modelo que no para respaldarlo.
  • La aplicación que realiza la llamada debe proporcionar definiciones de herramientas al modelo en el formato esperado.
  • La aplicación que realiza la llamada debe indicarle al modelo que genere llamadas a herramientas. las solicitudes en el formato que espera la aplicación.

Llamadas a herramientas con Genkit

Genkit proporciona una sola interfaz para realizar llamadas a herramientas con modelos compatibles. Cada complemento del modelo garantiza que se cumplan los dos últimos criterios anteriores. La función generate() lleva a cabo automáticamente el bucle de llamada de herramientas. descrita anteriormente.

Asistencia de modelos

La compatibilidad con las llamadas a herramientas depende del modelo, la API del modelo y el complemento Genkit. Consulta la documentación relevante para determinar si es probable que se realice una llamada a la herramienta. no es compatible. Además, tenga en cuenta lo siguiente:

  • Genkit arrojará un error si intentas proporcionar herramientas a un modelo que no para respaldarlo.
  • Si el complemento exporta referencias de modelo, la propiedad info.supports.tools indicará si admite las llamadas a herramientas.

Herramientas de definición

Usa la función defineTool() para escribir definiciones de la herramienta:

const specialToolInputSchema = z.object({ meal: z.enum(["breakfast", "lunch", "dinner"]) });
const specialTool = defineTool(
  {
    name: "specialTool",
    description: "Retrieves today's special for the given meal",
    inputSchema: specialToolInputSchema,
    outputSchema: z.string(),
  },
  async ({ meal }): Promise<string> => {
    // Retrieve up-to-date information and return it. Here, we just return a
    // fixed value.
    return "Baked beans on toast";
  }
);

Aquí, la sintaxis es similar a la sintaxis de defineFlow(); Sin embargo, los cuatro se usan los parámetros name, description, inputSchema y outputSchema como en los productos necesarios. Al escribir la definición de una herramienta, ten cuidado con la redacción la descripción de estos parámetros, ya que son vitales para que el LLM y hacer uso eficaz de las herramientas disponibles.

Incluir herramientas en tus instrucciones

Después de definir tus herramientas, especifícalas en el parámetro de herramientas de generate():

const llmResponse = await generate({
  model: gemini15Flash,
  prompt,
  tools: [specialTool],
});

Puedes hacer que varias herramientas estén disponibles: el LLM llamará a las herramientas según sea necesario para completar la instrucción.

Cómo controlar de forma explícita las llamadas a la herramienta

De forma predeterminada, Genkit llama repetidamente al LLM hasta que cada llamada a la herramienta se haya resuelto. Si quieres tener más control sobre el bucle de llamada de esta herramienta, por ejemplo, para Aplica una lógica más complicada, establece el parámetro returnToolRequests en true. Ahora es tu responsabilidad asegurarte de que se satisfagan todas las solicitudes de herramientas:

let generateOptions: GenerateOptions = {
  model: gemini15Flash,
  prompt,
  tools: [specialTool],
  returnToolRequests: true,
};
let llmResponse;
while (true) {
  llmResponse = await generate(generateOptions);
  const toolRequests = llmResponse.toolRequests();
  if (toolRequests.length < 1) {
    break;
  }
  const toolResponses: ToolResponsePart[] = await Promise.all(
    toolRequests.map(async (part) => {
      switch (part.toolRequest.name) {
        case "specialTool":
          return {
            toolResponse: {
              name: part.toolRequest.name,
              ref: part.toolRequest.ref,
              output: await specialTool(specialToolInputSchema.parse(part.toolRequest?.input)),
            },
          };
        default:
          throw Error('Tool not found');
        }
      }));
    generateOptions.history = llmResponse.toHistory();
    generateOptions.prompt = toolResponses;
}