架构模式
ReAct 架构
深入理解 ReAct 架构原理,掌握使用预构建代理和自定义实现的方法
📚 学习目标
学完这篇文章后,你将能够:
- 理解 ReAct (Reasoning and Acting) 的核心设计理念
- 使用
createReactAgent快速构建智能代理 - 手动构建自定义的 ReAct 循环以获得更细粒度的控制
- 实现具备工具调用能力的流式对话代理
前置知识
在开始学习之前,建议先阅读:
你需要了解:
- ReAct 论文(Optionally)的基本概念:LLM 在执行任务时交替进行思考(Reasoning)和行动(Acting)
1️⃣ 什么是 ReAct?
ReAct = Reasoning(推理)+ Acting(行动)。
它解决了纯 LLM 的两个核心问题:
- 幻觉:LLM 可能会编造事实,而 ReAct 允许它通过工具获取真实信息。
- 错误传播:单次推理容易出错,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。
核心组件
- Agent Node:负责调用 LLM 进行推理。
- Tools Node:负责执行 LLM 请求调用的工具。
- 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();💡 练习题
- 思考题:在 ReAct 循环中,如果 LLM 连续多次调用工具但无法解决问题,会导致什么后果?如何防止这种情况?(提示:递归限制)
- 操作题:使用
createReactAgent创建一个代理,赋予它一个简单的getCurrentTime工具,并询问它 "现在几点了?"。
📚 参考资源
官方文档
✅ 总结
本章要点:
- ReAct 是构建智能代理的基石模式。
createReactAgent适合快速原型开发。- 自定义 Graph 实现提供了无限的扩展能力(如添加 Human-In-The-Loop)。
下一步:当一个 Agent 不够用时,我们需要多代理系统。
登录以继续阅读
解锁完整文档、代码示例及更多高级功能。