Построение мультиагентных систем

Мощным применением больших языковых моделей являются агенты на базе LLM. Агент — это система, которая может выполнять сложные задачи, планируя, как разбить задачи на более мелкие, и (с помощью вызова инструментов ) выполнять задачи, которые взаимодействуют с внешними ресурсами, такими как базы данных или даже физические устройства.

Вот несколько выдержек из очень простого агента по обслуживанию клиентов, созданного с использованием одной подсказки и нескольких инструментов:

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

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

  • Чем больше инструментов вы добавляете, тем больше вы расширяете возможности модели последовательно и правильно использовать правильный инструмент для работы.
  • Некоторые задачи лучше всего решать посредством более целенаправленного взаимодействия между пользователем и агентом, а не с помощью одного вызова инструмента.
  • Некоторые задачи могут выиграть от использования специальной подсказки. Например, если ваш агент отвечает недовольному клиенту, вы можете захотеть, чтобы его тон был более деловым, тогда как тон агента, который изначально приветствует клиента, может быть более дружелюбным и беззаботным.

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

Вот как может выглядеть расширенная версия предыдущего примера в виде многоагентной системы:

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