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

0 阅读5分钟

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 依赖

<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 项目结构图

project-structure.png

二、公共工具类

函数调用与 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 运行结果

function-call-demo.png

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

agent-demo.png

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 等智能化技术;

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