作为 Java 后端开发者,刚入门 AI 智能体(Agent)和函数调用(Function Call)时,我发现很多小伙伴都会和我一样犯迷糊——这俩代码写起来几乎一模一样,但实际用起来差别可太大了!

所以今天就结合我自己跑通的 Demo,用通俗易懂的方式,把两者的核心区别讲明白,全程附可直接复制的代码,不管你是刚入门 Java AI,还是想快速上手 LangChain4j,都能看懂、能跟着跑,求职时拿出来展示也很加分~


一、前置准备(新手必看)

先跟大家说下我用的技术环境,大家照着配,能避免很多环境坑,确保 Demo 一次跑通,不用反复折腾:

  • JDK 17(LangChain4j 官方推荐)
  • LangChain4j 0.34.0(稳定版,完美支持Ollama 工具调用)
  • 大模型支持:阿里云通义千问、Ollama 本地模型
  • 统一配置:通过 AiModelFactory 统一获取模型实例,集中管理密钥与配置,方便快速切换多模型

1.1 Maven 依赖

<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 工具类

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 工具类

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 接口

package com.xiaoyuancode.langchain4j.functioncall;

import dev.langchain4j.service.SystemMessage;

public interface Assistant {
    @SystemMessage("你是智能助手,必须调用工具获取结果,不能编造答案。")
    String chat(String message);
}

3.2 FunctionCallDemo 主程序

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 运行结果

FunctionCallDemo运行结果

3.4 函数调用特点

  • 单次请求仅支持单工具调用
  • 无自主规划能力,无法串联多个任务
  • 可加 chatMemory 记住上下文,但依然不会自动多步调用
  • 适合简单、单一、明确的业务场景

四、Agent 智能体(Agent)是什么?

Agent 是函数调用的智能化升级版,核心能力是:自主理解需求 → 规划步骤 → 自动多轮调用工具,不需要我们手动干预。

注:本章复用上方已定义的WeatherTool 工具与 CalculatorTool 工具,不再重复贴码

4.1 独立Assistant 接口

package com.xiaoyuancode.langchain4j.agent;

import dev.langchain4j.service.SystemMessage;

public interface Assistant {
    @SystemMessage("你是一个智能Agent,可以自主思考、调用工具。必须调用工具,不能编造答案")
    String chat(String message);
}

4.2 AgentDemo 主程序

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 运行结果

AgentDemo运行结果

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:

https://gitee.com/xiaoyuancode/java-ai-agent-study


作者简介

刘晓媛(XiaoYuanCode)

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

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

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

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

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐