Créer des systèmes multi-agents

Les agents basés sur des grands modèles de langage sont une application puissante des LLM. Un agent est un système capable d'effectuer des tâches complexes en planifiant la division des tâches en tâches plus petites et (à l'aide de l'appel d'outil) en exécutant des tâches qui interagissent avec des ressources externes telles que des bases de données ou même des appareils physiques.

Voici quelques extraits d'un agent du service client très simple créé à l'aide d'une seule invite et de plusieurs outils:

const menuLookupTool = ai.defineTool(
  {
    name: 'menuLookupTool',
    description: 'use this tool to look up the menu for a given date',
    inputSchema: z.object({
      date: z.string().describe('the date to look up the menu for'),
    }),
    outputSchema: z.string().describe('the menu for a given date'),
  },
  async (input) => {
    // Retrieve the menu from a database, website, etc.
    // ...
  }
);

const reservationTool = ai.defineTool(
  {
    name: 'reservationTool',
    description: 'use this tool to try to book a reservation',
    inputSchema: z.object({
      partySize: z.coerce.number().describe('the number of guests'),
      date: z.string().describe('the date to book for'),
    }),
    outputSchema: z
      .string()
      .describe(
        "true if the reservation was successfully booked and false if there's" +
          ' no table available for the requested time'
      ),
  },
  async (input) => {
    // Access your database to try to make the reservation.
    // ...
  }
);
const chat = ai.chat({
  model: gemini15Pro,
  system:
    "You are an AI customer service agent for Pavel's Cafe. Use the tools " +
    'available to you to help the customer. If you cannot help the ' +
    'customer with the available tools, politely explain so.',
  tools: [menuLookupTool, reservationTool],
});

Une architecture simple comme celle illustrée ci-dessus peut suffire lorsque votre agent ne dispose que de quelques fonctionnalités. Toutefois, même pour l'exemple limité ci-dessus, vous pouvez voir que les clients s'attendent probablement à certaines fonctionnalités: par exemple, la liste de leurs réservations actuelles, l'annulation d'une réservation, etc. À mesure que vous créez de plus en plus d'outils pour implémenter ces fonctionnalités supplémentaires, vous commencez à rencontrer des problèmes:

  • Plus vous ajoutez d'outils, plus vous étendez la capacité du modèle à utiliser de manière cohérente et correcte l'outil adapté à la tâche.
  • Certaines tâches sont mieux gérées par un échange plus ciblé entre l'utilisateur et l'agent, plutôt que par un seul appel d'outil.
  • Certaines tâches peuvent bénéficier d'une requête spécialisée. Par exemple, si votre agent répond à un client mécontent, vous pouvez lui demander d'adopter un ton plus professionnel, tandis que l'agent qui accueille le client au départ peut adopter un ton plus amical et plus léger.

Pour résoudre ces problèmes qui surviennent lors de la création d'agents complexes, vous pouvez créer de nombreux agents spécialisés et utiliser un agent à usage général pour leur déléguer des tâches. Genkit est compatible avec cette architecture en vous permettant de spécifier des invites en tant qu'outils. Chaque invite représente un seul agent spécialisé, avec son propre ensemble d'outils à sa disposition. Ces agents sont à leur tour disponibles en tant qu'outils pour votre seul agent d'orchestration, qui est l'interface principale avec l'utilisateur.

Voici à quoi pourrait ressembler une version étendue de l'exemple précédent en tant que système multi-agent:

// Define a prompt that represents a specialist agent
const reservationAgent = ai.definePrompt(
  {
    name: 'reservationAgent',
    description: 'Reservation Agent can help manage guest reservations',
    tools: [reservationTool, reservationCancelationTool, reservationListTool],
  },
  '{{role "system"}} Help guests make and manage reservations'
);

// Or load agents from .prompt files
const menuInfoAgent = ai.prompt('menuInfoAgent');
const complaintAgent = ai.prompt('complaintAgent');

// The triage agent is the agent that users interact with initially
const triageAgent = ai.definePrompt(
  {
    name: 'triageAgent',
    description: 'Triage Agent',
    tools: [reservationAgent, menuInfoAgent, complaintAgent],
  },
  `{{role "system"}} You are an AI customer service agent for Pavel's Cafe.
  Greet the user and ask them how you can help. If appropriate, transfer to an
  agent that can better handle the request. If you cannot help the customer with
  the available tools, politely explain so.`
);
// Start a chat session, initially with the triage agent
const chat = ai.chat(triageAgent);