(5)LangGraph4j框架ReActAgent实现
LangGraph4j框架ReActAgent实现
ReAct-Agent概念
ReAct-Agent 是一种大模型应用中的智能体架构。ReAct 是 Re (Reasoning,推理)和 Act(Action,行动)两个单词的简写,用通俗的话来说,它可以让大模型像人一样“思考”和“行动”,实现更强的任务处理能力。这里把它拆解为两个关键部分来说明:
Re(Reasoning,推理)
大模型通过“推理”步骤来理解任务或者问题。就像你面对一个复杂的问题时,先分析现状、列出条件,然后在脑海中一步步推导出答案一样,ReAct 中的“推理”部分会利用模型的语言理解能力,生成逻辑清晰的分析路径。
Act(Action,行动)
仅仅推理还不够,智能体还需要“行动”,也就是执行特定的操作。比如:
- 通过调用某个工具(例如计算器、数据库查询、外部api接口)来获取信息或解决问题。
- 根据现有信息做出决定并采取下一步行动。
在 ReAct 框架中,“行动”这一步和“推理”紧密结合。模型不会一次性给出答案,而是以“边想边做”的方式,循环地进行推理和行动,直到完成任务。
实际运作流程
- 模型先“想”一想:分析问题,给出可能需要的步骤。
- 模型再“做”一做:如果需要,它可以去查外部信息、调用工具,或者生成一个具体操作。
- 根据结果再“想” :拿到行动的反馈后,重新推理,调整步骤,直到问题解决。
ReAct 的特点
- 动态灵活:不像传统模型“一问一答”,ReAct 模型会动态地调整策略。
- 能调用外部工具:通过执行操作(例如数据库查询或API调用),可以解决大模型本身无法直接处理的问题。
- 更接近人类思维:这种“想一步,做一步”的方式更像人类解决复杂问题的过程。
通俗来说,ReAct 就是让模型“像人一样,先动脑后动手,再动脑接着手”,在不断循环中完成任务。
工具调用
LangGraph4j 中的 ReAct-Agent
ReactAgent 接口提供了构建和运行状态图(StateGraph)的功能。它包含两个主要内部类:CallAgent 和 ExecuteTools,分别用于调用 AI 模型生成响应和执行工具请求。
整个流程体现了典型的 ReAct 模式:
- Reasoning (推理): CallAgent 生成思考并决定是否调用工具。
- Action (动作): ExecuteTools 执行具体工具操作。
- 循环直到获得最终答案(final_response)为止。
状态图设计
-
使用 StateGraph 定义执行流程:
-
起始节点为 START → agent
-
agent根据是否需要调用工具 (shouldContinue) 决定下一步:
- “continue” → action
- “end” → END
-
action 节点执行完工具后再次回到 agent
-
new StateGraph<>(State.SCHEMA, stateSerializer).addNode("agent", node_async(callAgent)).addNode("action", node_async(executeTools)) .addEdge(START, "agent").addConditionalEdges("agent",edge_async(shouldContinue),Map.of("continue", "action", "end", END)).addEdge("action", "agent");
CallAgent
-
负责调用 LangChain4J 的聊天模型或流式聊天模型来生成 AI 响应。
-
根据是否启用流式输出选择不同的执行策略:
- 非流式模式直接调用 ChatModel.execute() 获取完整响应。
- 流式模式使用 StreamingChatModel.chat() 并结合 StreamingChatGenerator 来处理逐步生成的结果。
-
将响应结果映射为结构化格式,支持两种情况:
- 如果需要执行工具,则返回 messages 字段表示待执行的工具调用。
- 如果任务完成,则返回 final_response 表示最终答案。
ExecuteTools
- 处理由 AI 生成的工具调用请求。
- 使用 LangChain4jToolService 执行这些工具,并将结果整合后返回。
- 如果没有找到工具请求,则返回提示信息。