架构模式

ReAct 架构

深入理解 ReAct 架构原理,掌握使用预构建代理和自定义实现的方法

📚 学习目标

学完这篇文章后,你将能够:

  • 理解 ReAct (Reasoning and Acting) 的核心设计理念
  • 使用 createReactAgent 快速构建智能代理
  • 手动构建自定义的 ReAct 循环以获得更细粒度的控制
  • 实现具备工具调用能力的流式对话代理

前置知识

在开始学习之前,建议先阅读:

你需要了解:

  • ReAct 论文(Optionally)的基本概念:LLM 在执行任务时交替进行思考(Reasoning)和行动(Acting)

1️⃣ 什么是 ReAct?

ReAct = Reasoning(推理)+ Acting(行动)。

它解决了纯 LLM 的两个核心问题:

  1. 幻觉:LLM 可能会编造事实,而 ReAct 允许它通过工具获取真实信息。
  2. 错误传播:单次推理容易出错,ReAct 允许它观察行动结果并修正计划。

执行流程循环


2️⃣ 快速开始:预构建代理

LangGraph 提供了 createReactAgent 辅助函数,可以一键创建标准的 ReAct 代理。

代码示例

import { createReactAgent } from '@langchain/langgraph/prebuilt';
import { ChatOpenAI } from '@langchain/openai';
import { tool } from '@langchain/core/tools';
import { z } from 'zod';

// 1. 定义工具
const magicTool = tool(
  async ({ input }) => {
    return `Magic result for ${input}`;
  },
  {
    name: 'magic_function',
    description: 'A magic tool that does something cool',
    schema: z.object({ input: z.string() }),
  }
);

// 2. 创建代理
const agent = createReactAgent({
  llm: new ChatOpenAI({ model: "gpt-4-turbo" }),
  tools: [magicTool],
});

// 3. 运行
const result = await agent.invoke({
  messages: [{ role: "user", content: "Use the magic tool on 'hello'" }],
});

console.log(result.messages.at(-1).content);

3️⃣ 进阶:自定义 ReAct 实现

为了完全掌控 ReAct 循环(例如添加人工审批、修改记忆逻辑),我们需要手动构建 Graph。

核心组件

  1. Agent Node:负责调用 LLM 进行推理。
  2. Tools Node:负责执行 LLM 请求调用的工具。
  3. Routers:决定是继续调用工具还是结束对话。

实现步骤

import { StateGraph, Annotation, END } from '@langchain/langgraph';
import { ToolNode } from '@langchain/langgraph/prebuilt';

// ... 定义 tool 和 llmWithTools ...

// 1. 定义节点
const agentNode = async (state) => {
  const response = await llmWithTools.invoke(state.messages);
  return { messages: [response] };
};

// 工具执行节点(LangGraph 预置)
const toolsNode = new ToolNode(tools);

// 2. 定义路由
const shouldContinue = (state) => {
  const lastMessage = state.messages[state.messages.length - 1];
  // 如果 LLM 想要调用工具 -> tools
  if (lastMessage.tool_calls?.length) {
    return "tools";
  }
  // 否则 -> 结束
  return END;
};

// 3. 构建 Graph
const workflow = new StateGraph(MessagesAnnotation)
  .addNode("agent", agentNode)
  .addNode("tools", toolsNode)
  .addEdge(START, "agent")
  .addConditionalEdges("agent", shouldContinue)
  .addEdge("tools", "agent"); // 行动后回到代理继续思考

const app = workflow.compile();

💡 练习题

  1. 思考题:在 ReAct 循环中,如果 LLM 连续多次调用工具但无法解决问题,会导致什么后果?如何防止这种情况?(提示:递归限制)
  2. 操作题:使用 createReactAgent 创建一个代理,赋予它一个简单的 getCurrentTime 工具,并询问它 "现在几点了?"。

📚 参考资源

官方文档


✅ 总结

本章要点

  • ReAct 是构建智能代理的基石模式。
  • createReactAgent 适合快速原型开发。
  • 自定义 Graph 实现提供了无限的扩展能力(如添加 Human-In-The-Loop)。

下一步:当一个 Agent 不够用时,我们需要多代理系统

登录以继续阅读

解锁完整文档、代码示例及更多高级功能。

立即登录

On this page