本文 AI 產出,尚未審核

LangChain 多代理系統(Multi‑Agent Systems)

主題:多 Agent 協作架構


簡介

在 LLM(大型語言模型)日益普及的今天,單一模型往往只能完成「單一任務」的工作。當需求變成 多步驟跨領域需要不同專業知識 時,僅靠一個 Agent 很快就會碰到能力瓶頸。
多 Agent 協作架構(Multi‑Agent System, MAS)正是為了解決這類複雜問題而設計的:透過 分工溝通協調,讓多個專精的 Agent 共同完成一個大型任務。

在 LangChain 中,MAS 不只是概念性的設計,而是一套可直接套用的 API 與範例,讓開發者能快速組裝、測試與部署多 Agent 系統。本文將從核心概念切入,結合實作範例,說明如何在 LangChainJS 中打造可靠的多 Agent 協作架構,並提供常見陷阱與最佳實踐,協助您在實務上快速落地。


核心概念

1. Agent 的角色與類型

類型 主要職責 典型 Prompt
Planner(規劃者) 解析高階需求,拆解成子任務 根據使用者需求,列出需要完成的步驟與順序。
Executor(執行者) 完成具體子任務,如搜尋、計算、寫作 根據指示,使用工具 X 完成資料抓取。
Evaluator(評估者) 檢查子任務結果的正確性與完整性 請檢查以下回應是否符合原始需求。
Mediator(仲裁者) 當多個 Executor 同時回應時,決定最終答案 綜合以下三個回應,給出最合理的結論。

重點:在實作時,盡量讓每個 Agent 職責單一,避免功能交叉造成維護困難。

2. 通訊機制

LangChain 提供兩種主要的訊息傳遞方式:

  1. Direct Call(直接呼叫)

    • 一個 Agent 直接呼叫另一個 Agent 的 run() 方法。
    • 適用於 同步層層遞進 的工作流。
  2. Message Bus(訊息總線)

    • 透過 AgentExecutorBaseMessageChannel,將訊息放入佇列,由訂閱者自行取出處理。
    • 適合 非同步平行動態路由 的情境。

下面的程式碼示範了兩種方式的簡易實作。

3. Orchestrator(協調者)

協調者是整個 MAS 的「大腦」,負責:

  • 接收使用者的原始需求。
  • 呼叫 Planner 產生子任務清單。
  • 根據任務屬性分派給相應的 Executor。
  • 收集回應後交給 Evaluator 或 Mediator,產出最終答案。

在 LangChainJS 中,我們通常以 AgentExecutor 包裝一個 Chain,再配合 RunnableParallelRunnableSequence 完成工作流的組合。


程式碼範例

以下範例均使用 LangChainJS@langchain/core@langchain/agents)與 OpenAI 作為 LLM 後端。請先確保已安裝套件:

npm install @langchain/core @langchain/agents openai

範例 1:簡易 Planner + Executor(Direct Call)

import { ChatOpenAI } from "@langchain/openai";
import { PromptTemplate } from "@langchain/core/prompts";
import { RunnableSequence } from "@langchain/core/runnables";

// 1. 建立 LLM
const llm = new ChatOpenAI({ temperature: 0 });

// 2. Planner:拆解需求
const plannerPrompt = PromptTemplate.fromTemplate(`
你是任務規劃師,請把以下需求拆解成最少 3 個子任務,並以 JSON 陣列回傳。
需求:{input}
`);
const planner = plannerPrompt.pipe(llm).pipe((output) => JSON.parse(output.content));

// 3. Executor:執行單一子任務(示範搜尋)
const executorPrompt = PromptTemplate.fromTemplate(`
請根據以下子任務執行搜尋,並返回最相關的 2 條資訊。
子任務:{task}
`);
const executor = executorPrompt.pipe(llm);

// 4. Orchestrator(同步)
async function run(input) {
  const tasks = await planner.invoke({ input });
  const results = [];
  for (const task of tasks) {
    const res = await executor.invoke({ task });
    results.push({ task, answer: res.content });
  }
  return results;
}

// 使用範例
run("幫我比較台北與新北的租金與生活機能").then(console.log);

說明

  • Planner 產生子任務清單(JSON),方便後續迴圈處理。
  • Executor 只負責單一子任務的執行,保持 職責單一

範例 2:使用 Message Bus 的非同步協作

import { ChatOpenAI } from "@langchain/openai";
import { RunnableParallel, RunnableSequence } from "@langchain/core/runnables";
import { BaseMessageChannel, SimpleMessageChannel } from "@langchain/core/message_channels";

const llm = new ChatOpenAI({ temperature: 0.3 });
const channel = new SimpleMessageChannel();

// 1. 定義兩個 Executor(分別負責「搜尋」與「計算」)
const searchPrompt = PromptTemplate.fromTemplate(`
請搜尋以下關鍵字,列出三條最相關的資訊。
關鍵字:{keyword}
`);
const searchAgent = searchPrompt.pipe(llm).pipe((out) => ({
  type: "search",
  content: out.content,
}));

const calcPrompt = PromptTemplate.fromTemplate(`
請計算以下數學式,並回傳結果。
式子:{expression}
`);
const calcAgent = calcPrompt.pipe(llm).pipe((out) => ({
  type: "calc",
  content: out.content,
}));

// 2. 把 Agent 訂閱到同一個 Channel
channel.subscribe(searchAgent);
channel.subscribe(calcAgent);

// 3. Mediator:從 Channel 收集結果,合併回傳
async function mediator(message) {
  const responses = await channel.publish(message);
  // 簡易合併邏輯
  return responses.map((r) => `${r.type.toUpperCase()}: ${r.content}`).join("\n---\n");
}

// 4. 執行流程(平行)
async function runParallel() {
  const tasks = [
    { keyword: "台北市房價" },
    { expression: "2024 * 1.05" },
  ];
  const results = await Promise.all(
    tasks.map((t) => mediator(t))
  );
  console.log(results.join("\n\n"));
}

runParallel();

說明

  • SimpleMessageChannel 充當 訊息總線,允許多個 Agent 同時接收同一則訊息。
  • Mediator 只負責 結果彙整,不直接處理業務邏輯。

範例 3:完整的 Multi‑Agent 工作流(Planner → Parallel Executors → Evaluator)

import { ChatOpenAI } from "@langchain/openai";
import { PromptTemplate } from "@langchain/core/prompts";
import { RunnableSequence, RunnableParallel } from "@langchain/core/runnables";

// LLM 實例
const llm = new ChatOpenAI({ temperature: 0 });

// Planner
const plannerPrompt = PromptTemplate.fromTemplate(`
請將以下需求拆解成 3 個子任務,並以 JSON 陣列返回。需求:{input}
`);
const planner = plannerPrompt.pipe(llm).pipe((out) => JSON.parse(out.content));

// Executor A:資訊搜尋
const searchPrompt = PromptTemplate.fromTemplate(`
根據子任務「{task}」進行網路搜尋,回傳最相關的 2 條資訊。
`);
const searchExecutor = searchPrompt.pipe(llm);

// Executor B:文字摘要
const summarizePrompt = PromptTemplate.fromTemplate(`
請將以下文字做摘要,控制在 100 個字以內。
文字:{task}
`);
const summarizeExecutor = summarizePrompt.pipe(llm);

// Evaluator
const evaluatorPrompt = PromptTemplate.fromTemplate(`
請根據以下子任務與回應,判斷哪個回應最符合需求,並說明原因。
子任務:{task}
回應:{response}
`);
const evaluator = evaluatorPrompt.pipe(llm);

// Orchestrator
async function run(input) {
  const tasks = await planner.invoke({ input });

  // 建立平行執行的 Runnable
  const parallel = new RunnableParallel({
    search: searchExecutor,
    summarize: summarizeExecutor,
  });

  // 逐一處理每個子任務
  const finalAnswers = [];
  for (const task of tasks) {
    const results = await parallel.invoke({ task });
    // 交給 Evaluator 判斷
    const evalRes = await evaluator.invoke({
      task,
      response: `${results.search}\n---\n${results.summarize}`,
    });
    finalAnswers.push(evalRes.content);
  }
  return finalAnswers;
}

// 測試
run("請幫我整理 2023 年台灣 AI 產業的發展趨勢與主要公司。")
  .then(console.log);

說明

  • RunnableParallel 同時觸發 搜尋摘要 兩個 Executor,提升效能。
  • Evaluator 充當 品質把關,確保最終回應符合使用者需求。

範例 4:自訂 Agent 類別(繼承 BaseAgent)

import { BaseAgent, AgentExecutor } from "@langchain/agents";
import { ChatOpenAI } from "@langchain/openai";
import { PromptTemplate } from "@langchain/core/prompts";

class WeatherAgent extends BaseAgent {
  constructor() {
    super();
    this.llm = new ChatOpenAI({ temperature: 0 });
    this.prompt = PromptTemplate.fromTemplate(`
你是天氣查詢專家,請根據以下城市名稱提供未來三天的天氣概況,格式為 JSON。
城市:{city}
`);
  }

  async _call({ city }) {
    const response = await this.prompt.pipe(this.llm).invoke({ city });
    return JSON.parse(response.content);
  }
}

// 使用
const weather = new WeatherAgent();
const executor = new AgentExecutor({ agent: weather });

executor.invoke({ city: "台北" }).then(console.log);

說明

  • 透過繼承 BaseAgent,可以把 特定領域 的邏輯封裝成可重用的模組,方便在 MAS 中當作 Executor 使用。

常見陷阱與最佳實踐

陷阱 可能原因 解決方案 / 最佳實踐
Agent 角色重疊 設計時未明確劃分職責 在規劃階段先畫 RACI 矩陣,確保每個 Agent 只負責 ResponsibleAccountable 中的單一任務。
回應格式不一致 不同 Agent 使用不同 Prompt,導致 JSON / 文字混雜 統一 output schema(使用 pydantic/zod),在 Prompt 中明確要求返回 JSON。
同步阻塞 大量子任務使用 Direct Call,導致整體延遲 針對可平行的子任務採用 RunnableParallelMessage Bus,將 I/O 密集工作交給非同步執行。
LLM 詞彙漂移 同一 Prompt 在不同 temperature 下產生多樣答案,影響 Evaluator 判斷 在關鍵環節(Planner、Evaluator)設定 temperature = 0,確保輸出穩定。
資源浪費 每個 Executor 都重新建立 LLM 實例 把 LLM 單例化(共用同一個 ChatOpenAI),或使用 LLMPool 以減少連線開銷。
缺乏錯誤回饋 Agent 執行失敗卻未捕捉例外,導致整個工作流中斷 在每個 invoke 包裹 try/catch,並回傳 error payload,讓 Mediator 能決策重試或降級。

最佳實踐總結

  1. 先規劃再實作:使用流程圖或文字描述先確定每個子任務的順序與依賴。
  2. 統一輸出格式:所有 Agent 都應遵守同一 JSON Schema,方便後續彙整。
  3. 平行化可行的子任務:利用 RunnableParallel 或訊息總線提升效能。
  4. 記憶體與成本控管:對於大量呼叫,考慮 cache(如 @langchain/community/cache)或 token 節流
  5. 持續監控與回饋:部署後加入 logmetrics(如成功率、平均延遲),並根據數據調整 Prompt 與 Agent 配置。

實際應用場景

場景 需求 多 Agent 架構的價值
客服自動化 同時處理「查詢資訊」與「問題排程」 Planner 先判斷問題類型 → 分派給 KnowledgeAgent / SchedulerAgent → Evaluator 確認回覆品質。
金融報告生成 收集多市場資料、計算指標、撰寫摘要 DataCollectorAgent(爬蟲)+ CalculatorAgent(數學)+ WriterAgent(自然語言)+ ReviewerAgent(合規檢查)。
旅遊行程規劃 需要「景點搜尋」+「交通規劃」+「預算計算」 Planner 拆解為三個子任務 → 並行執行 → Mediator 合併成完整行程表。
程式碼審查 靜態分析、最佳化建議、風險評估 AnalyzerAgent(靜態分析)+ OptimizerAgent(效能建議)+ RiskAgent(安全掃描)+ SummarizerAgent(審查報告)。
教育平台 依學習者需求提供「概念解釋」+「練習題」+「即時回饋」 TutorPlanner → ConceptAgent、ExerciseAgent、FeedbackAgent → Evaluator 確認學習成效。

總結

多 Agent 協作架構是 將大型語言模型的能力切片、專精化、協同化 的關鍵方法。透過 Planner → Executor(s) → Evaluator / Mediator 的明確流程,我們不僅能提升系統的 可擴充性效能,也能在 品質管控成本管理 上取得更好的平衡。

在 LangChain 中,從 Direct CallMessage Bus、從 RunnableSequenceRunnableParallel,都已提供完整的工具鏈,讓開發者能以最少的程式碼構建出 可靠、可維護 的多 Agent 系統。

實務上,建議先從 小規模、單一任務 的 Agent 開始實驗,逐步抽象出 PlannerEvaluator,再根據需求擴展平行 Executor。持續關注 輸出格式一致性錯誤回饋機制資源使用,即可在各種商業、科研或教育場景中發揮多 Agent 系統的最大價值。

祝您在 LangChain 的多代理世界裡玩得開心,創造出更多智慧且具備協作精神的 AI 應用!