跳转到主要内容
多Agent系统使专业化的Agent能够协同处理复杂任务。每个Agent专注于特定领域,并通过编排模式进行协调。

多Agent系统设计模式

设计多Agent系统有多种方式,但我们常见两种广泛适用的模式:
  • 管理者模式(Agent作为工具):中央管理者/编排器将专业子Agent作为工具调用,并保持对话控制权。
  • 交接模式:对等Agent将控制权移交给接管对话的专业Agent。这是去中心化的。
本指南重点介绍管理者模式(Agent作为工具),这是最常见且最直接的方法。

安装

npm install @langchain/openai @langchain/core @langchain/langgraph langchain zod

管理者模式(Agent作为工具)

在管理者模式中,中央编排器将专业Agent作为工具调用。编排器在整个对话过程中保持控制权,并决定何时调用每个专业Agent。

创建专业Agent

每个专业Agent专注于特定任务:
import { ChatOpenAI } from "@langchain/openai";
import { tool } from "langchain";
import { ToolNode } from "@langchain/langgraph/prebuilt";
import z from "zod";

const llm = new ChatOpenAI({
  model: process.env.OPENAI_MODEL || "gpt-4o-mini",
  apiKey: process.env.OPENAI_API_KEY,
  configuration: {
    baseURL: process.env.OPENAI_BASE_URL,
  },
});

const writePoem = tool(
  async ({ topic }) => {
    return (
      await llm.invoke([
        {
          role: "system",
          content:
            "你是一位专业诗人。根据提供的主题写一首诗。",
        },
        {
          role: "user",
          content: topic,
        },
      ])
    ).content as string;
  },
  {
    name: "writePoem",
    description: "写一首诗",
    schema: z.object({
      topic: z.string().describe("诗歌的主题"),
    }),
  }
);

const writeStory = tool(
  async ({ topic }) => {
    return (
      await llm.invoke([
        {
          role: "system",
          content:
            "你是一位专业故事讲述者。根据提供的主题写一个故事。",
        },
        {
          role: "user",
          content: topic,
        },
      ])
    ).content as string;
  },
  {
    name: "writeStory",
    description: "写一个故事",
    schema: z.object({
      topic: z.string().describe("故事的主题"),
    }),
  }
);

const writeJoke = tool(
  async ({ topic }) => {
    return (
      await llm.invoke([
        {
          role: "system",
          content:
            "你是一位专业喜剧演员。根据提供的主题写一个笑话。",
        },
        {
          role: "user",
          content: topic,
        },
      ])
    ).content as string;
  },
  {
    name: "writeJoke",
    description: "写一个笑话",
    schema: z.object({
      topic: z.string().describe("笑话的主题"),
    }),
  }
);

const tools = [writePoem, writeStory, writeJoke];

const toolNode = new ToolNode(tools);

创建编排器

编排器通过委托给专业Agent来协调工作流。它将专业Agent包装为工具: