マルチエージェント システムの構築

大規模言語モデルの強力なアプリケーションとして、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],
});

エージェントにはいくつかの機能しかない場合は、上記のようなシンプルなアーキテクチャで十分です。ただし、上記の限定的な例でも、お客様が期待する機能がいくつかあります。たとえば、お客様の現在の予約の表示、予約のキャンセルなどです。これらの追加機能を実装するためのツールをさらに構築すると、次のような問題が発生します。

  • 追加するツールが多いほど、ジョブに適したツールを常に正しく使用できるモデルの能力が向上します。
  • タスクによっては、1 回のツール呼び出しではなく、ユーザーとエージェントとの間でより集中的なやり取りを行うことが最善である場合があります。
  • タスクによっては、専用のメッセージが役立つ場合があります。たとえば、エージェントが不満を抱えているお客様に対応している場合は、よりビジネス的なトーンで対応できますが、最初にお客様に挨拶するエージェントは、より親しみやすく軽いトーンで対応できます。

複雑なエージェントを構築する際に発生するこれらの問題に対処するためのアプローチの 1 つは、多くの専門エージェントを作成し、汎用エージェントを使用してタスクを委任することです。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);