Java AI 入门:LangChain4j 函数调用 vs Agent 智能体(核心区别 + 可运行代码)

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 智能体
代码写法 几乎一样 几乎一样
核心能力 单步调用,无规划 多步调用,自主决策
适用场景 简单任务 复杂多步骤、多工具串联任务
行为模式 被动执行 主动规划

六、新手常见误区

  1. 加chatMemory 就是 Agent? 不是,记忆只是记住上下文,不会自动多步调用工具
  2. 两者代码差不多,能力就一样? 看似配置接近,但大模型底层调度逻辑完全不同,能力边界差距很大。
  3. 简单问题能体现Agent? 不能,必须用复合任务(先......再......)才能看出差距。

七、总结

函数调用是大模型工具交互的基础,Agent是在此之上的智能化升级。

两者代码实现高度相近,核心分水岭在于AI是否自主多步执行与任务规划

日常简单查询、固定工具调用选用函数调用即可;

面对复杂业务、连环场景、智能问答需求,优先使用Agent智能体。

后续计划:

  • LangChain4j多模态动态切换
  • 本地 Ollama 大模型整合实战
  • Spring AI 与 LangChain4j 对比
  • 企业级 RAG 知识库落地实战

🔴 快速运行指南

  1. git clone 源码仓库
  2. 配置通义千问 API Key
  3. 直接运行 FunctionCallDemo / AgentDemo

源码已上传Gitee,欢迎 Start & Fork:

gitee.com/xiaoyuancod...


作者简介

XiaoYuanCode

拥有多年全栈开发经验,前后端均有扎实的项目落地实践;

早期深耕 PHP 技术生态,近年主力技术栈全面转向 Java & Spring Boot;

现阶段聚焦大模型应用开发,持续研究 LangChain4j、Spring AI 等智能化技术;

专注输出实战向技术博文,记录学习与踩坑过程,共同进步。

相关推荐
IT_陈寒3 小时前
为什么你应该学习JavaScript?
前端·人工智能·后端
淇奥74 小时前
【MyBatis-Plus】MyBatis-Plus 学习笔记
后端
_code_bear_4 小时前
OpenSpec CLI 与 OPSX 工作流说明
前端·后端·架构
用户8356290780514 小时前
使用 Python 在 PowerPoint 中添加并控制音频播放
后端·python
用户8356290780514 小时前
使用 Python 在 PowerPoint 中生成并自定义饼图与环形图
后端·python
念何架构之路4 小时前
Go语言常见并发模式
开发语言·后端·golang
Cosolar5 小时前
大模型应用开发面试 • 第4期|A2A、复杂挑战与具身智能
人工智能·后端·面试
迷渡5 小时前
聊一聊 Bun 用 Rust 重写这件事
开发语言·后端·rust
王中阳Go5 小时前
秒杀、分库分表、全链路追踪:一个电商微服务的架构全拆解
后端·go
正儿八经的少年5 小时前
Spring Boot 两种激活配置方式的作用与区别
java·spring boot·后端