建構多代理系統

大型語言模型的強大應用之一,就是 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);