* LangChain4j Tools 工具原理与实战
一、Tools 原理:大模型如何调用你的函数?
Tools工具,以前也叫做function calling,翻译过来叫做函数调用,如果在我们的程序中添加了function calling功能,那整个工作流程会发生一些改变,我们简单的看一看。

整个交互流程比纯文本生成要复杂一些,但 LangChain4j 已经帮我们封装了绝大部分细节。理解下面的循环过程,能让你更好地排查问题:
-
发送工具描述:用户问题被发送给大模型,同时携带一份“工具清单”——包括每个函数的名称、功能描述以及参数列表(名称、类型、含义)。这些信息来源于我们代码中的
@Tool和@P注解。 -
大模型决策:大模型分析用户意图,判断是否需要调用某个函数。如果需要,它会返回一个结构化的响应,指明要调用的函数名以及对应的参数值。
-
AI 应用执行:应用接收到调用指令后,真正去执行这个 Java 方法(比如操作数据库)。
-
结果反馈:将函数的执行结果(成功/失败信息、查询到的数据等)再次发送给大模型。
-
循环或结束:大模型根据最新结果继续判断,可能调用另一个函数,也可能就此生成最终回答。这个循环会一直持续,直到任务完成为止。
简而言之,大模型成了“大脑”,你的业务函数成了“手脚”,LangChain4j 则是负责协调的“神经系统”。
二、快速实战:为 AI 顾问增加预约功能
假设我们的 ReservationService 已经封装好了数据库操作,现在我们需要让大模型能够调用它来帮考生预约志愿填报服务。
2.1 准备工具方法
首先创建一个 Spring Bean,并用 @Tool 和 @P 注解来描述方法。
import com.itheima.consultant.pojo.Reservation;
import com.itheima.consultant.service.ReservationService;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
public class ReservationTool {
@Autowired
private ReservationService reservationService;
// 工具方法:预约志愿填报服务
@Tool("预约志愿填报服务")
public void addReservation(
@P("考生姓名") String name,
@P("考生性别") String gender,
@P("考生手机号") String phone,
@P("预约沟通时间,格式为: yyyy-MM-dd'T'HH:mm") String communicationTime,
@P("考生所在省份") String province,
@P("考生预估分数") Integer estimatedScore
) {
Reservation reservation = new Reservation(null, name, gender, phone,
LocalDateTime.parse(communicationTime), province, estimatedScore);
reservationService.insert(reservation);
}
// 工具方法:查询预约信息
@Tool("根据考生手机号查询预约单")
public Reservation findReservation(@P("考生手机号") String phone) {
return reservationService.findByPhone(phone);
}
}
-
@Tool:放在方法上,用字符串描述这个方法是干什么的。这个描述会被发给大模型,务必清晰准确。 -
@P:放在参数上,说明这个参数代表什么(比如“考生姓名”)。LangChain4j 会把这些信息组织成 JSON Schema 发送给模型,模型就能智能地从用户消息中提取出对应的值。
2.2 在 AI 服务中配置工具
工具类准备好后,只需要在 @AiService 注解的 tools 属性中指定 Bean 名称,LangChain4j 就会自动将其纳入可调用工具列表。
@AiService(
wiringMode = AiServiceWiringMode.EXPLICIT,
chatModel = "openAiChatModel",
streamingChatModel = "openAiStreamingChatModel",
chatMemoryProvider = "chatMemoryProvider",
contentRetriever = "contentRetriever", // RAG 检索器
tools = "reservationTool" // 新增工具配置
)
public interface ConsultantService {
@SystemMessage(fromResource = "system.txt")
Flux<String> chat(@MemoryId String memoryId, @UserMessage String message);
}
就这样,你的 AI 顾问瞬间就“长了手”。
2.3 测试与日志观察
启动应用后,你可以这样测试:
用户:你好,我想预约一个志愿填报服务,我姓张,手机号是138xxxx,明天下午3点有空,我在浙江省,预估分数650分。
因为开启了会话记忆(chatMemoryProvider),模型会结合历史上下文一步步引导用户提供缺失的信息(比如性别),然后自动调用 addReservation 方法。在 IDEA 控制台中,你会看到 LangChain4j 在发给大模型的请求中带上了 tools 参数,里面清晰地列出了方法名、描述和参数信息。当模型决定调用时,响应中会包含 tool_calls,LangChain4j 随即执行对应的 Java 方法,并将结果再次发送。
三、小结
至此,我们的 AI 志愿填报顾问已经从一个只会“回答”的聊天机器人,升级成了能够查询最新数据(RAG)和操作业务系统(Tools)的智能助理。这两个能力组合起来,便构成了智能体(Agent)的雏形。
LangChain4j 将 Function Calling 的复杂度压缩到了几个注解之中,让开发者可以专注于业务函数的实现,而不必深究提示词工程和消息拼接的细节。掌握 @Tool 和 @P 的用法,你就能轻松让大模型与任何 Java 服务交互。快打开 IDEA,给你的 AI 应用也加上一双能干实事的“手”吧!
更多推荐




所有评论(0)