简介

LangChain4j 是 LangChiain 的 java 版本,

LangChain 的 Lang 取自 Large Language Model,代表大语言模型,

Chain 是链式执行,即把语言模型应用中的各功能模块化,串联起来,形成一个完整的工作流。

它是面向大语言模型的开发框架,意在封装与 LLM 对接的细节,简化开发流程,提升基于 LLM 开发的效率。

版本支持

LangChain4j Spring Boot integration requires Java 17 and Spring Boot 3.2.

LangChain4j最低支持java17、和springboot3.2

依赖引入

这里直接提供一个我搭建项目时正常启动使用到的pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>MyLangChain4j</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <springboot.version>3.2.0</springboot.version>
        <langchain4j.version>1.0.0-beta2</langchain4j.version>
        <logback.version>1.4.14</logback.version>
        <lombok.version>1.18.30</lombok.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- Lombok 依赖 -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
                <version>${springboot.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>${springboot.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <version>${springboot.version}</version>
            </dependency>

            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
                <version>${logback.version}</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>${logback.version}</version>
            </dependency>

            <dependency>
                <groupId>dev.langchain4j</groupId>
                <artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
                <version>${langchain4j.version}</version>
            </dependency>

            <dependency>
                <groupId>dev.langchain4j</groupId>
                <artifactId>langchain4j-spring-boot-starter</artifactId>
                <version>${langchain4j.version}</version>
            </dependency>

            <dependency>
                <groupId>dev.langchain4j</groupId>
                <artifactId>langchain4j-ollama-spring-boot-starter</artifactId>
                <version>${langchain4j.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
        </dependency>

        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-ollama-spring-boot-starter</artifactId>
        </dependency>

    </dependencies>

</project>

其中核心依赖为:langchain4j-{integration-name}-spring-boot-starter

即:根据不同的模型引入不同的依赖,比如适配openai则引入如下依赖:

openai

<dependency>
                <groupId>dev.langchain4j</groupId>
                <artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
                <version>${langchain4j.version}</version>
            </dependency>

因为deepseek的api与openai设计的一致,所以可以直接使用openai的依赖

如果需要接入本地ollama则需要引入如下依赖:

ollama

<dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-ollama-spring-boot-starter</artifactId>
  					<version>${langchain4j.version}</version>
        </dependency>

配置文件

langchain4j:
  open-ai:
    chat-model:
      api-key: sk-xxxxxxx # 换成自己的
      model-name: deepseek-chat
      base-url: https://api.deepseek.com/v1
  ollama:
    chat-model:
      base-url: http://127.0.0.1:11434
      model-name: deepseek-v3

这里一共接入了两个模型,一个是官方的deepseek-v3,一个是本地使用ollama搭建的deepseek-v3

使用

因为之前引入了springbootTest,所以这里写一个测试类看看是否对接成功

@SpringBootTest
public class MyLangChain4jApplicationTest {

    @Autowired
    private OllamaChatModel ollamaChatModel;

    @Autowired
    private OpenAiChatModel openAiChatModel;

    @Test
    public void test2(){
        String chat = ollamaChatModel.chat("你好,你是谁?");
        System.out.println(chat);
        String chat2 = openAiChatModel.chat("你好,你是谁?");
        System.out.println(chat2);
    }
}

回复如下:

我好!我是 DeepSeek 的助手。DeepSeek 是一种高级 AI helper,能够帮助解决复杂的编程问题和任务。我可以提供各种功能,如代码完成、变量查找、函数定义等,可以提高你的编程效率和产出性。如果你有任何需要帮助的问题,请告诉我,我会尽力协助!
你好!我是DeepSeek Chat,一个由深度求索公司(DeepSeek)开发的智能AI助手。我可以帮助你解答问题、提供信息、聊天交流,甚至协助处理各种文本和文件内容。😊  

有什么我可以帮你的吗?

AiService

AiService 是 LangChain4j 中简化 AI 集成的关键组件,通过声明式接口和注解,让开发者专注于业务逻辑而非底层模型调用细节,显著提升开发效率。

关键特性

  1. 统一接口

    • 无论底层对接的是哪种 AI 模型(如 GPT-4、Claude、本地部署的模型),AiService 通过统一的 Java 接口屏蔽差异,开发者只需定义业务逻辑相关的接口即可。
  2. 注解驱动

    • 通过注解(如 @SystemMessage@UserMessage)动态构造提示词(Prompt),无需手动拼接字符串。
  3. 类型安全

    • 输入和输出可以是自定义的 Java 对象(POJO),自动处理 JSON 序列化/反序列化。
  4. 扩展性

    • 支持自定义工具(Tools),让 AI 能够调用外部 API 或执行代码逻辑(类似 OpenAI 的 Function Calling)。

核心注解

  • @SystemMessage:定义系统角色提示(例如设定 AI 的行为)。
  • @UserMessage:定义用户输入模板(支持占位符,如 {{param}})。
  • @MemoryId:用于多轮对话中标识会话 ID。
  • @V:注入变量到提示词中。

核心依赖

<dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-spring-boot-starter</artifactId>
        </dependency>

使用方法

建立Service接口并使用@AiService注解

@AiService
public interface MyAiService {
    @SystemMessage("你是一个智能助手,你的名字叫小明")
    String chat(String message);
}

如果引入了多个大模型,则需要指定大模型的bean名称

如果引入了langchain4j-ollama-spring-boot-starter则自动注入的bean名称为ollamaChatModel,如果引入的是langchain4j-open-ai-spring-boot-starter则是openAiChatModel

@AiService(wiringMode = AiServiceWiringMode.EXPLICIT,chatModel="ollamaChatModel")
public interface MyAiService {
    @SystemMessage("你是一个智能助手,你的名字叫小明")
    String chat(String message);
}

我们写个测试类调用一下

@SpringBootTest
public class MyLangChain4jApplicationTest {

    @Autowired
    private MyAiService myAiService;

    @Test
    public void test2(){
        String chat = myAiService.chat("你是谁?");
        System.out.println(chat);
    }
}

回复如下:

我是小明,你的智能助手!

Tools

在 LangChain4j 中,@Tools 是一个关键注解,用于将 外部工具(函数/API) 暴露给 AI 模型,使模型能够动态调用这些工具来完成复杂任务(类似 OpenAI 的 Function Calling)。通过 @Tools,开发者可以扩展 AI 的能力,使其不仅能生成文本,还能执行实际操作(如查询数据库、计算、调用第三方服务等)。

无工具调用大模型

由于大模型无法访问互联网或计算机内部的信息,所以很多事情大模型只能回答而无法实现,下面举个最简单的例子.

@SpringBootTest
public class MyLangChain4jApplicationTest {

    @Autowired
    private MyAiService myAiService;

    @Test
    public void test2(){
        String chat = myAiService.chat("今天是几号?");
        System.out.println(chat);
    }
}
我不是太确定,但是根据上一次询问的时间,我可以猜测今天可能是12月26日。因为我没有访问外部信息,只能通过前面的对话来判断时间。有需要的话,我们也可以尝试找出今天的日期。

可以看到,大模型甚至无法无法当前时间,只能调用自带的知识库中的数据进行问答,局限性很大。

自定义Tools

只需要在Service中使用@Tool注解即可,这里使用hutool的日期工具类进行演示。

引入依赖:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.36</version>
</dependency>

创建service并使用tool注解

import cn.hutool.core.date.DateUtil;
import dev.langchain4j.agent.tool.Tool;
import org.springframework.stereotype.Service;

@Service
public class MyToolsService {

    @Tool("用于获取当前日期时间 格式:yyyy-MM-dd HH:mm:ss")
    public String getNowDate(){
        return DateUtil.now();
    }
}

让大模型使用tool

如果引入了多个大模型,则需要显示指定tool所在的Service的bean名称,否则不需要手动指定

@AiService(wiringMode = AiServiceWiringMode.EXPLICIT,chatModel="ollamaChatModel",tools = {"myToolsService"})
public interface MyAiService {
    @SystemMessage("你是一个智能助手,你的名字叫小明")
    String chat(String message);
}

接着我们再使用刚刚的示例:

@SpringBootTest
public class MyLangChain4jApplicationTest {

    @Autowired
    private MyAiService myAiService;

    @Test
    public void test2(){
        String chat = myAiService.chat("今天是几号?");
        System.out.println(chat);
    }
}
今天是04月07日。

MCP

由于在AiService中并没有找到mcp的配置,所以只能使用低代码构建MCP

MCP Service可以在官网找到一些:https://mcpservers.org/

以下教程以Filesystem举例

添加maven依赖

<dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-mcp</artifactId>
        </dependency>

安装npm依赖

filesystem给了两个构建示例 一个是docker一个是npx 我们以简单的npx为例

npm install @modelcontextprotocol/server-filesystem

手动构建MCP

McpTransport transport = new StdioMcpTransport.Builder()
                .command(List.of("/usr/local/bin/npx", "-y", "@modelcontextprotocol/server-filesystem","/Users/luoqing/Documents"))
                .logEvents(true)
                .build();
        McpClient mcpClient = new DefaultMcpClient.Builder()
                .transport(transport)
                .build();
        ToolProvider toolProvider = McpToolProvider.builder()
                .mcpClients(List.of(mcpClient))
                .build();
        MyAiService aiService = AiServices.builder(MyAiService.class)
                .chatLanguageModel(qwenChatModel)
                .toolProvider(toolProvider)
                .build();
        System.out.println(aiService.chat("在/Users/luoqing/Documents目录下创建一个1.txt 并将Hello World写入到文件中"));