Deng桑头像
LangChain4j写一次工具调用-SpringAI的另一副面孔封面图

LangChain4j写一次工具调用-SpringAI的另一副面孔

LangChain4j 写一次工具调用:Spring AI 的另一副面孔

选型篇的末尾说过,两个框架的差别都在工单循环外面,循环本身一模一样。纸上对比不过瘾,这篇把 LangChain4j 这边跑通,同一个查天气的工单换个框架实现,差别落在哪一眼可见。跑完两个框架的 demo,选型时那三道判断题就不再是背下来的,而是亲手试过的。

台子怎么搭

LangChain4j 不挑工程,纯 Java 就能跑,加一个主依赖和你要的模型适配(版本口径:1.x 主线,核验 2026-10-25,动手前查 Maven 最新版)。

<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j</artifactId>
    <version>1.22.0</version>
</dependency>

模型客户端直接 new 出来即可,以 OpenAI 兼容接口为例,baseUrl 和 apiKey 指向你的供应商。

ChatModel model = OpenAiChatModel.builder()
        .baseUrl("https://api.example.com/v1")
        .apiKey(System.getenv("AI_API_KEY"))
        .modelName("gpt-4o-mini")
        .build();

工具还是那个方法

和 Spring AI 一样,工具是普通类里的普通方法加一个 @Tool 注解,说明书放在描述里。包路径在 1.x 是 dev.langchain4j.service.tool.Tool,旧版本在 dev.langchain4j.agent.tool,以你用的版本为准。

class WeatherTools {

    @Tool("查询指定城市的当前天气")
    String getWeather(String city) {
        return city + ",晴,25 度";   // 真实场景在这里发 HTTP
    }
}

方法名会被翻译成工单里的工具名,参数名翻译成参数名,这套翻译逻辑和 Spring AI 逐字相同。

接口就是门面

LangChain4j 的调用入口长得不像 Spring,它用一个接口当门面,AiServices 把接口和工具绑起来,调接口方法就像调本地代码。

interface Assistant {
    String chat(String userMessage);
}

Assistant assistant = AiServices.builder(Assistant.class)
        .chatLanguageModel(model)
        .tools(new WeatherTools())
        .build();

String answer = assistant.chat("北京今天多少度?");
System.out.println(answer);

工单循环在底下照常转:模型写工单、框架解析、执行 getWeather、回填、模型总结,只是这一圈活全藏在接口代理后面。这副面孔的气质是「声明式」,Spring AI 则是「构建器式」,两种都是 Java 程序员熟悉的语法,差别只在口味。

LangChain4j 的写法

Spring AI 的写法

@Tool 标记 Bean 方法

ChatClient.prompt()
.tools(bean).call()

@Tool 标记普通类方法

接口门面 + AiServices
assistant.chat(...)

同一个工单循环
写单、解析、执行、回填

逐点对照

Spring AILangChain4j
工具形态Spring Bean 加注解普通类加注解
调用入口ChatClient 流式构建接口门面加 AiServices
装配方式自动配置与注入手工 builder
适合的工程Spring 全家桶任意 Java,包括无 Spring
自定义扩展Advisor 链(拦截器思维)自定义能力原语

亲手跑

三段代码加一个 main 就是完整程序,把 ChatModel 的配置换成你的供应商,运行 main 就能看到回答。更有价值的是打开日志(把 langchain4j 的日志级别调到 DEBUG),两个框架的工单报文都能看见,形状完全一致,这就是「循环相同」的实证。
跑完顺手做两个对照实验。把方法的参数加上 @Tool 的描述,看工单 JSON Schema 的变化,说明书是给模型读的。把 getWeather 里改成抛异常,对比两个框架把错误包回 tool_result 的措辞差异,这是排查问题时真会用到的细节。

记住一句话:框架选的是语法和装配习惯,工单循环永远是那一圈。

适用边界

这一篇管工具调用的最小闭环。LangChain4j 的记忆与检索模块、流式输出的 handler 写法、以及和 Spring 融合(Spring AI 之外的 LangChain4j Spring 集成)是另外的题。包路径和 Builder 的方法名随版本微调,本文按 2026-10-25 的 1.x 口径整理。两个框架的最小 demo 都在手里之后,选型篇那三道判断题可以重答一遍,答案会比上次笃定。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/D_ENG_F/article/details/169837904

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--