跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaAIjava

LangChain4j 中 ReAct Agent 的工作原理与实现方法

LangChain4j 框架下 ReAct Agent 通过推理与行动交替循环扩展大模型能力。核心流程包含思考、行动、观察直至最终回答。实现方式分为基于函数调用和文本提示解析两种,前者依赖支持原生调用的模型如 GPT-4,后者适用于开源模型。开发时利用 @Tool 注解定义工具,AiServices 自动处理调用循环与记忆维护。需注意错误处理、循环次数限制及多工具选择。相比传统模式,该机制简化了外部 API 集成,适用于需要实时数据查询或复杂操作的智能应用场景。

RustyLab发布于 2026/3/23更新于 2026/7/2448 浏览
LangChain4j 中 ReAct Agent 的工作原理与实现方法

在 LangChain4j 中实现 ReAct Agent,需要理解其原理并掌握框架提供的工具集成能力。下面从 原理剖析 到 代码实现 进行详细拆解。


一、ReAct Agent 的工作原理

ReAct(Reason + Act)是一种将推理与行动交替结合的 Agent 模式。其核心思想是让大模型在回答问题时,不仅能'思考',还能通过调用外部工具获取实时信息或执行操作,从而扩展模型的能力边界。

典型工作流程(循环):

  1. Thought(思考):模型根据当前任务和已观察到的信息,决定下一步需要做什么。
  2. Action(行动):模型选择一个工具,并指定输入参数。
  3. Observation(观察):执行工具后,将结果返回给模型。
  4. 重复以上步骤,直到模型认为任务完成,输出 Final Answer。

示例(文本格式):

Thought: 我需要查询今天的天气,然后才能回答用户。
Action: get_weather
Action Input: {"location": "北京"}
Observation: 晴天,20℃
Thought: 现在我知道天气了,可以回答用户。
Final Answer: 北京今天晴天,气温 20℃。

二、LangChain4j 中的 ReAct 实现机制

LangChain4j 提供了两种实现 ReAct 的方式:

  • 基于函数调用(Function Calling):当使用支持函数调用的模型(如 OpenAI GPT-4、Claude 等)时,LangChain4j 会利用模型的原生函数调用能力,由模型直接返回工具调用指令,执行效率高且解析稳定。
  • 基于文本提示解析:对于不支持函数调用的模型(如部分开源模型),LangChain4j 会通过精心构造的提示模板,让模型以文本形式输出 Action/Action Input,然后通过正则等方式解析。

框架内部通过 AiServices 和 Tool 注解简化了开发,开发者只需定义工具类,其余由框架自动完成。


三、在 LangChain4j 中实现 ReAct Agent 的步骤

1. 定义工具类

使用 @Tool 注解标记工具方法,框架会自动提取方法名、参数和描述,生成 ToolSpecification。

import dev.langchain4j.agent.tool.Tool;

public class WeatherTools {
    @Tool("获取指定城市的实时天气")
    public String getWeather(@Tool("城市名称") String location) {
        // 实际调用天气 API
        return "晴天,20℃";
    }
}
2. 创建支持 ReAct 的助手接口

定义一个接口,方法代表用户的请求。

public interface Assistant {
    String chat(String userMessage);
}
3. 构建 AiServices 并绑定模型和工具
ChatLanguageModel model = OpenAiChatModel.builder()
    .apiKey(System.getenv("OPENAI_API_KEY"))
    .modelName("gpt-4")
    .temperature(0.0)
    .build();
Assistant assistant = AiServices.builder(Assistant.class)
    .chatLanguageModel(model)
    .tools(new WeatherTools()) // 绑定工具
    .build();
String answer = assistant.chat("北京天气怎么样?");
System.out.println(answer);
4. 运行与调试

当调用 assistant.chat() 时,LangChain4j 内部会自动执行 ReAct 循环:

  • 首次调用模型,传入系统提示(包含工具描述)和用户消息。
  • 如果模型返回工具调用请求,框架执行对应工具,并将结果作为新消息附加到对话中,再次调用模型。
  • 重复直到模型输出最终答案。

四、高级定制与注意事项

4.1 自定义 ReAct 提示模板

如果模型不支持函数调用,或需要精细控制提示,可以通过 ToolSpecification 和自定义 PromptTemplate 实现:

ToolSpecifications toolSpecifications = ToolSpecifications.toolSpecificationsFrom(WeatherTools.class);
String toolInfo = ToolSpecifications.toOpenAiCompatibleJsonSchema(toolSpecifications);
String prompt = """
    你是一个助手,可以调用以下工具: {{tools}}
    用户问题:{{userMessage}}
    请按照以下格式回复:
    如果需要调用工具,输出:Action: 工具名称 Action Input: JSON 格式的参数
    如果已经得到答案,输出:Final Answer: 最终答案
    """;

然后通过 AiServices 的 chatMemory 和自定义 ToolExecutor 手动控制循环。但这种方式较复杂,一般建议优先使用函数调用。

4.2 错误处理与重试
  • 工具执行可能失败(如网络超时),此时应返回错误观察,让模型决定下一步(重试或放弃)。
  • 可以在 @Tool 方法内捕获异常,返回友好错误信息,或通过 ToolExecution 配置重试策略。
4.3 多工具与工具选择

框架会根据模型返回的 tool_calls 自动匹配并执行工具。如果有多个同名方法,需要确保工具名称唯一(可通过 @Tool 的 name 属性指定)。

4.4 限制循环次数

为防止模型陷入无限循环,可以设置最大迭代次数(LangChain4j 内部有默认保护,但也可自定义 ToolExecution 或通过 AiServices 的 maxRetries 参数控制)。


五、ReAct 与 Function Calling 的区别

特性函数调用(Function Calling)基于文本的 ReAct
适用模型OpenAI、Claude 等支持工具调用的模型所有模型,包括开源模型
实现方式模型直接返回结构化工具调用模型输出文本,需解析 Action/Action Input
可靠性高,不易解析错误低,可能因格式问题导致解析失败
性能好,一次调用即可触发工具需要多次调用,且可能产生冗余思考

LangChain4j 会根据模型类型自动选择最佳方式。


六、完整示例(带记忆)

如果需要多轮对话保持上下文,可以加入 ChatMemory:

ChatMemory chatMemory = MessageWindowChatMemory.builder().maxMessages(10).build();
Assistant assistant = AiServices.builder(Assistant.class)
    .chatLanguageModel(model)
    .chatMemory(chatMemory)
    .tools(new WeatherTools())
    .build();
// 第一次对话
assistant.chat("北京天气?");
// 第二次对话,记忆里已有上下文
assistant.chat("那上海呢?");
// 模型可能直接调用工具查询上海

七、总结

  • ReAct 原理:将'思考 - 行动 - 观察'循环引入 Agent,使其能够利用外部工具动态解决问题。
  • LangChain4j 实现:通过 @Tool 注解定义工具,AiServices 自动处理调用循环,支持函数调用和文本解析两种模式。
  • 优势:简化开发,只需关注工具逻辑,框架负责工具调度、记忆维护和循环控制。
  • 适用场景:需要实时数据查询、复杂计算、调用外部 API 的智能应用。

以上内容涵盖了 ReAct Agent 的核心原理及 LangChain4j 的实现细节,适用于构建具备工具调用能力的智能应用。

目录

  1. 一、ReAct Agent 的工作原理
  2. 二、LangChain4j 中的 ReAct 实现机制
  3. 三、在 LangChain4j 中实现 ReAct Agent 的步骤
  4. 1. 定义工具类
  5. 2. 创建支持 ReAct 的助手接口
  6. 3. 构建 AiServices 并绑定模型和工具
  7. 4. 运行与调试
  8. 四、高级定制与注意事项
  9. 4.1 自定义 ReAct 提示模板
  10. 4.2 错误处理与重试
  11. 4.3 多工具与工具选择
  12. 4.4 限制循环次数
  13. 五、ReAct 与 Function Calling 的区别
  14. 六、完整示例(带记忆)
  15. 七、总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 2024 年主流大型语言模型 LLMs 盘点与解析
  • 用 etcd-cpp-apiv3 搭建 C++ 服务注册发现
  • 2026 年 3 月 18 日人工智能产业动态与前沿趋势
  • 2025 年第三季度程序员推荐阅读书单
  • OpenClaw 框架深度指南:HEARTBEAT 机制与定时任务配置
  • AI 时代产品经理:厘清 AI 能力边界与技术限制
  • llama.cpp 量化模型部署实战:从模型转换到 API 服务
  • HDFS EC 基础:Vandermonde 范德蒙德矩阵原理
  • 无人机智能巡检系统与大疆云端 API 集成实践
  • C++ 共享内存原理及 Windows 实现
  • GitHub Copilot 兼容 OpenAI/Anthropic API 的代理工具 copilot-api
  • OpenClaw 对接飞书机器人高频踩坑与解决方案
  • 直流无刷电机 FOC 控制算法原理与 STM32 实战
  • C++ 线程池核心原理与代码实现
  • MetaLlama 大模型系列介绍与本地部署指南
  • OpenAI 集成 LangChain 使用详解
  • AG-UI:构建 AI 前端交互的统一协议
  • C++ 类和对象:默认成员函数详解
  • 网络安全专业术语详解
  • 使用 rrweb 还原用户操作,排查线上 Bug

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online