高级java每日一道面试题-2025年8月06日-基础篇[LangChain4j]-如何实现 ReAct Agent?请描述其工作原理。

高级java每日一道面试题-2025年8月06日-基础篇[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,然后通过正则等方式解析。

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


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

1. 定义工具类

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

importdev.langchain4j.agent.tool.Tool;publicclassWeatherTools{@Tool("获取指定城市的实时天气")publicStringgetWeather(@Tool("城市名称")String location){// 实际调用天气 APIreturn"晴天,20℃";}}

2. 创建支持 ReAct 的助手接口

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

publicinterfaceAssistant{Stringchat(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(newWeatherTools())// 绑定工具.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: 最终答案 """;

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

4.2 错误处理与重试

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

4.3 多工具与工具选择

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

4.4 限制循环次数

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


五、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(newWeatherTools()).build();// 第一次对话 assistant.chat("北京天气?");// 第二次对话,记忆里已有上下文 assistant.chat("那上海呢?");// 模型可能直接调用工具查询上海

七、总结

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

掌握这些内容,面试中就能清晰展示对 LangChain4j 高级特性的理解,以及构建复杂 Agent 的能力。

Read more

简单易学的分离式部署小米智能家居Miloco方法

一、安装环境 * Windows用户:安装WSL2以及Docker * macOS/Linux用户:安装Docker 此处不再赘述,网上随便找个教程即可。特别地,对于Windows用户来说,你需要将 WSL2 的网络模式设置为 Mirrored。 二、使用Docker部署Miloco后端 以下均为bash命令。请Windows用户进入WSL2 / Linux、macOS用户进入终端操作: mkdir miloco cd milico vi docker-compose.yml 以下是compose的内容(不会使用vi的同学可以傻瓜式操作:先按i,再使用粘贴功能,然后按冒号,输入wq然后回车,记得关闭输入法): services:backend:container_name: miloco-backend image: ghcr.nju.edu.cn/xiaomi/miloco-backend:latest network_mode:

By Ne0inhk

EtherCAT在机器人多轴控制中的实战应用与性能优化

EtherCAT在工业机器人多轴控制中的实战优化与性能突破 工业机器人正经历从单轴独立控制向多轴协同作业的演进,而EtherCAT凭借其微秒级同步精度和灵活的拓扑结构,已成为高端装备制造领域的通信标准。在半导体晶圆搬运、包装机械高速分拣等场景中,传统脉冲控制方案正被基于EtherCAT的分布式时钟体系所替代。本文将深入解析如何通过协议优化、硬件选型和网络设计,实现128轴以上系统的抖动控制在±100ns以内。 1. EtherCAT核心技术解析与性能优势 EtherCAT的革新性在于其"On-the-fly"数据处理机制。与常规工业以太网不同,EtherCAT从站设备采用专用ASIC芯片(如ET1100、ET1200)进行帧处理,数据延迟仅纳秒级。在汽车焊接机器人案例中,采用分布式时钟同步的6轴系统可实现循环周期250μs,位置控制精度达±1μm。 关键性能指标对比: 参数脉冲控制CANopenEtherCAT同步精度±1ms±500μs±100ns单周期最大轴数8轴32轴256轴拓扑灵活性星型总线型任意拓扑电缆最大长度20m100m100m(铜缆)/2km(光纤)单帧

By Ne0inhk
OpenClaw配置Bot接入飞书机器人+Kimi2.5

OpenClaw配置Bot接入飞书机器人+Kimi2.5

上一篇文章写了Ubuntu_24.04下安装OpenClaw的过程,这篇文档记录一下接入飞书机器+Kimi2.5。 准备工作 飞书 创建飞书机器人 访问飞书开放平台:https://open.feishu.cn/app,点击创建应用: 填写应用名称和描述后就直接创建: 复制App ID 和 App Secret 创建成功后,在“凭证与基础信息”中找到 App ID 和 App Secret,把这2个信息复制记录下来,后面需要配置到openclaw中 配置权限 点击【权限管理】→【开通权限】 或使用【批量导入/导出权限】,选择导入,输入以下内容,如下图 点击【下一步,确认新增权限】即可开通所需要的权限。 配置事件与回调 说明:这一步的配置需要先讲AppId和AppSecret配置到openclaw成功之后再设置订阅方式,

By Ne0inhk
组建龙虾团队——OpenClaw多机器人构建

组建龙虾团队——OpenClaw多机器人构建

成功搭建了OpenClaw,也成功建立的自己的每日服务,这时候发现,似乎不太敢在当前的机器人中让他做别的事情,生怕会话太多会让他出现遗忘。(尽管我们配置了QMD记忆增强,但毋庸置疑任何技术都是有上限的)。 换做同样的情况,比如在DeepSeek或者豆包之类的对话窗口,我们会习惯性地新建一个对话。那么我们是否可以新建一个机器人,或者多个机器人,让他们各司其职,各尽所能,形成一个相互配合的团队呢~开干吧,没什么不可能的!! 🦞新建一个机器人 来到飞书开发者后台,新创建一个应用,在这里我们以短视频剪辑脚本应用为例。 创建之后,由于我们的openclaw绑定的是之前的飞书渠道,并没有链接到这个应用的APP ID,所以暂时不做其他操作,只需要记录一下他的APP ID和APP Secret。 🦞配置OpenClaw 如果还是按照claw的命令行安装,每一步都有些让人担心害怕,毕竟我们先前已经配置过一次了,接下来的操作,需要小心是否会把以前的配置给覆盖掉。 为了避免这样的不确定性,我们直接去操作他的配置文件 在WSL2终端中进入openclaw目录 cd .openclaw

By Ne0inhk