Creazione di sistemi multi-agente

Un'applicazione efficace dei modelli linguistici di grandi dimensioni sono gli agenti basati su LLM. Un agente è un sistema in grado di svolgere attività complesse pianificando come suddividerle in attività più piccole ed eseguire (con l'aiuto delle chiamate di strumenti) attività che interagiscono con risorse esterne come database o persino dispositivi fisici.

Ecco alcuni estratti di un agente dell'assistenza clienti molto semplice creato utilizzando un singolo prompt e diversi strumenti:

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],
});

Un'architettura semplice come quella mostrata sopra può essere sufficiente quando l'agente ha solo alcune funzionalità. Tuttavia, anche per l'esempio limitato riportato sopra, puoi vedere che ci sono alcune funzionalità che i clienti si aspetterebbero di trovare: ad esempio, l'elenco delle prenotazioni attuali del cliente, l'annullamento di una prenotazione e così via. Man mano che crei sempre più strumenti per implementare queste funzionalità aggiuntive, inizi a riscontrare alcuni problemi:

  • Più strumenti aggiungi, più espandi la capacità del modello di impiegare in modo coerente e corretto lo strumento giusto per il lavoro.
  • Alcune attività potrebbero essere eseguite meglio tramite un dialogo più mirato tra l'utente e l'agente, anziché tramite una singola chiamata dello strumento.
  • Per alcune attività potrebbe essere utile un prompt specializzato. Ad esempio, se il tuo agente risponde a un cliente scontento, potrebbe essere opportuno adottare un tono più professionale, mentre l'agente che saluta il cliente inizialmente può adottare un tono più amichevole e leggero.

Un approccio che puoi utilizzare per risolvere questi problemi che si verificano durante la creazione di agenti complessi è creare molti agenti specializzati e utilizzare un agente generico per delegare loro le attività. Genkit supporta questa architettura consentendo di specificare i prompt come strumenti. Ogni prompt rappresenta un singolo agente specializzato con il proprio insieme di strumenti a disposizione, che a loro volta sono disponibili come strumenti per il singolo agente di orchestrazione, ovvero l'interfaccia principale con l'utente.

Ecco un esempio di versione espansa dell'esempio precedente come sistema multi-agente:

// 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);