Java AI 入门:LangChain4j 函数调用 vs Agent 智能体(核心区别 + 可运行代码)
作为 Java 后端开发者,刚入门 AI 智能体(Agent)和函数调用(Function Call)时,我发现很多小伙伴都会和我一样犯迷糊------这俩代码写起来几乎一模一样,但实际用起来差别可太大了!
所以今天就结合我自己跑通的 Demo,用通俗易懂的方式,把两者的核心区别讲明白,全程附可直接复制的代码,不管你是刚入门 Java AI,还是想快速上手 LangChain4j,都能看懂、能跟着跑,求职时拿出来展示也很加分~
一、前置准备(新手必看)
先跟大家说下我用的技术环境,大家照着配,能避免很多环境坑,确保 Demo 一次跑通,不用反复折腾:
- JDK 17(LangChain4j 官方推荐)
- LangChain4j 0.34.0(稳定版,完美支持Ollama 工具调用)
- 大模型支持:阿里云通义千问、Ollama 本地模型
- 统一配置:通过
AiModelFactory统一获取模型实例,集中管理密钥与配置,方便快速切换多模型
1.1 Maven 依赖
xml
<dependencies>
<!-- LangChain4j 核心 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>0.34.0</version>
</dependency>
<!-- 通义千问 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-dashscope</artifactId>
<version>0.34.0</version>
</dependency>
<!-- Ollama 本地模型 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-ollama</artifactId>
<version>0.34.0</version>
</dependency>
</dependencies>
1.2 项目结构图
二、公共工具类
函数调用与 Agent 智能体,共用同一套自定义工具,统一封装、全局复用,减少代码冗余。
2.1 WeatherTool 工具类
java
package com.xiaoyuancode.langchain4j.tools;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
public class WeatherTool {
@Tool("根据城市查询天气")
public String getWeather(@P("城市") String city){
System.out.println("[Tool] 查询城市天气:" + city);
return city + " 晴天,24℃";
}
}
2.2 CalculatorTool 工具类
java
package com.xiaoyuancode.langchain4j.tools;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
public class CalculatorTool {
@Tool("计算两个数相加")
public int add(@P("数字a") int a, @P("数字b") int b) {
System.out.println("[Tool] 执行加法计算:" + a + "+" + b);
return a + b;
}
}
三、函数调用(Function Call)是什么?
简单说:函数调用就是让大模型根据需求,调用我们提前写好的工具方法,一次对话只调用一个工具,不会自主进行多步推理。
3.1 Assistant 接口
java
package com.xiaoyuancode.langchain4j.functioncall;
import dev.langchain4j.service.SystemMessage;
public interface Assistant {
@SystemMessage("你是智能助手,必须调用工具获取结果,不能编造答案。")
String chat(String message);
}
3.2 FunctionCallDemo 主程序
java
package com.xiaoyuancode.langchain4j.functioncall;
import com.xiaoyuancode.langchain4j.config.AiModelFactory;
import com.xiaoyuancode.langchain4j.tools.CalculatorTool;
import com.xiaoyuancode.langchain4j.tools.WeatherTool;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.service.AiServices;
public class FunctionCallDemo {
public static void main(String[] args) {
ChatLanguageModel model = AiModelFactory.getChatModel();
Assistant assistant = AiServices.builder(Assistant.class)
.chatLanguageModel(model)
.tools(new WeatherTool(),new CalculatorTool())
.chatMemory(MessageWindowChatMemory.withMaxMessages(10))
.build();
System.out.println("用户:北京天气如何?");
String res1 = assistant.chat("北京天气如何?");
System.out.println("AI:" + res1 + "\n------");
System.out.println("用户:100 + 200 等于多少?");
String res2 = assistant.chat("100 + 200 等于多少?");
System.out.println("AI:" + res2);
}
}
3.3 运行结果

3.4 函数调用特点
- 单次请求仅支持单工具调用
- 无自主规划能力,无法串联多个任务
- 可加 chatMemory 记住上下文,但依然不会自动多步调用
- 适合简单、单一、明确的业务场景
四、Agent 智能体(Agent)是什么?
Agent 是函数调用的智能化升级版 ,核心能力是:自主理解需求 → 规划步骤 → 自动多轮调用工具,不需要我们手动干预。
注:本章复用上方已定义的WeatherTool 工具与 CalculatorTool 工具,不再重复贴码
4.1 独立Assistant 接口
java
package com.xiaoyuancode.langchain4j.agent;
import dev.langchain4j.service.SystemMessage;
public interface Assistant {
@SystemMessage("你是一个智能Agent,可以自主思考、调用工具。必须调用工具,不能编造答案")
String chat(String message);
}
4.2 AgentDemo 主程序
java
package com.xiaoyuancode.langchain4j.agent;
import com.xiaoyuancode.langchain4j.tools.CalculatorTool;
import com.xiaoyuancode.langchain4j.tools.WeatherTool;
import com.xiaoyuancode.langchain4j.config.AiModelFactory;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.service.AiServices;
public class AgentDemo {
public static void main(String[] args) {
ChatLanguageModel model = AiModelFactory.getChatModel();
Assistant agent = AiServices.builder(Assistant.class)
.chatLanguageModel(model)
.tools(new WeatherTool(),new CalculatorTool())
.chatMemory(MessageWindowChatMemory.withMaxMessages(10))
.build();
System.out.println("===== 智能体测试 =====");
System.out.println("用户:先查上海天气,再算 55+45");
String response = agent.chat("先查上海天气,再算 55+45");
System.out.println("AI:" + response);
}
}
4.3 运行结果

4.4 Agent 特点
- 支持自主多步、多工具连续调用
- 自动理解复杂需求,拆解分步执行
- 更贴合实际复杂业务、智能问答场景
- 本质:函数调用 + 自主思考 + 记忆
五、函数调用(Function Call)和 Agent 智能体(Agent)的区别
| 对比维度 | 函数调用 | Agent 智能体 |
|---|---|---|
| 代码写法 | 几乎一样 | 几乎一样 |
| 核心能力 | 单步调用,无规划 | 多步调用,自主决策 |
| 适用场景 | 简单任务 | 复杂多步骤、多工具串联任务 |
| 行为模式 | 被动执行 | 主动规划 |
六、新手常见误区
- 加chatMemory 就是 Agent? 不是,记忆只是记住上下文,不会自动多步调用工具。
- 两者代码差不多,能力就一样? 看似配置接近,但大模型底层调度逻辑完全不同,能力边界差距很大。
- 简单问题能体现Agent? 不能,必须用复合任务(先......再......)才能看出差距。
七、总结
函数调用是大模型工具交互的基础,Agent是在此之上的智能化升级。
两者代码实现高度相近,核心分水岭在于AI是否自主多步执行与任务规划。
日常简单查询、固定工具调用选用函数调用即可;
面对复杂业务、连环场景、智能问答需求,优先使用Agent智能体。
后续计划:
- LangChain4j多模态动态切换
- 本地 Ollama 大模型整合实战
- Spring AI 与 LangChain4j 对比
- 企业级 RAG 知识库落地实战
🔴 快速运行指南
- git clone 源码仓库
- 配置通义千问 API Key
- 直接运行 FunctionCallDemo / AgentDemo
源码已上传Gitee,欢迎 Start & Fork:
作者简介
XiaoYuanCode
拥有多年全栈开发经验,前后端均有扎实的项目落地实践;
早期深耕 PHP 技术生态,近年主力技术栈全面转向 Java & Spring Boot;
现阶段聚焦大模型应用开发,持续研究 LangChain4j、Spring AI 等智能化技术;
专注输出实战向技术博文,记录学习与踩坑过程,共同进步。
