简介
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 集成的关键组件,通过声明式接口和注解,让开发者专注于业务逻辑而非底层模型调用细节,显著提升开发效率。
关键特性
统一接口
- 无论底层对接的是哪种 AI 模型(如 GPT-4、Claude、本地部署的模型),
AiService
通过统一的 Java 接口屏蔽差异,开发者只需定义业务逻辑相关的接口即可。
- 无论底层对接的是哪种 AI 模型(如 GPT-4、Claude、本地部署的模型),
注解驱动
- 通过注解(如
@SystemMessage
、@UserMessage
)动态构造提示词(Prompt),无需手动拼接字符串。
- 通过注解(如
类型安全
- 输入和输出可以是自定义的 Java 对象(POJO),自动处理 JSON 序列化/反序列化。
扩展性
- 支持自定义工具(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写入到文件中"));