Springboot整合LangChain4j 全流程
一 LangChain4j簡(jiǎn)介
LangChain4j(LangChain for Java)是一個(gè)專為 Java 生態(tài)打造的大語(yǔ)言模型(LLM)應(yīng)用開發(fā)框架。
Python 領(lǐng)域大語(yǔ)言模型(LLM)應(yīng)用開發(fā)框架是LangChain,LangChain4j 可以理解為它的 “Java 版兄弟”。但它并非簡(jiǎn)單的 API 翻譯,而是充分結(jié)合了 Java 語(yǔ)言特性(強(qiáng)類型、注解驅(qū)動(dòng)、Spring 生態(tài)集成等)進(jìn)行了重新設(shè)計(jì)。
LangChain4j 提供了豐富的功能模塊,覆蓋 LLM 應(yīng)用開發(fā)的各個(gè)環(huán)節(jié):
| 核心能力 | 說明 |
|---|---|
| 統(tǒng)一模型 API | 一套接口適配 OpenAI、通義千問、Ollama、Azure OpenAI、Anthropic 等 15+ 模型提供商 |
| AI Service 抽象 | 通過 Java 接口 + 注解定義 AI 服務(wù),像寫 MyBatis Mapper 一樣簡(jiǎn)單 |
| 對(duì)話記憶(Memory) | 內(nèi)置多輪對(duì)話記憶管理,支持內(nèi)存、持久化等多種策略 |
| RAG(檢索增強(qiáng)生成) | 完整的 RAG Pipeline 支持:文檔加載 → 分割 → 向量化 → 檢索 → 生成 |
| function Calling | 一套接口適配 OpenAI、通義千問、Ollama、Azure OpenAI、Anthropic 等 15+ 模型提供商 |
| 結(jié)構(gòu)化輸出 | 將 LLM 的自然語(yǔ)言輸出自動(dòng)解析為 Java 對(duì)象(POJO) |
| 流式響應(yīng)(Streaming) | 支持 SSE 流式輸出,提升用戶交互體驗(yàn) |
| Embedding & 向量存儲(chǔ) | 集成 Pinecone、Milvus、Redis、PGVector 等主流向量數(shù)據(jù)庫(kù) |
二 項(xiàng)目示例
1 開發(fā)環(huán)境
- IntelliJ IDEA
- JDK 21
- DeepSeek API,這里需要提前注冊(cè)申請(qǐng)。在DeepSeek開放平臺(tái)創(chuàng)建API keys:DeepSeek開發(fā)平臺(tái)
- Langchain4j 1.0.1
2 代碼集成
2.1 添加版本依賴
創(chuàng)建父模塊,添加Spring Ai相關(guān)依賴:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- springcloud alibaba 版本-->
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>${spring-ai-alibaba.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-bom</artifactId>
<version>${langchain4j.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 引入阿里云百煉平臺(tái)依賴-->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-community-bom</artifactId>
<version>${langchain4j-community.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>創(chuàng)建子模塊,添加相關(guān)依賴:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
</dependency>
</dependencies>2.2 配置環(huán)境變量
將大模型API Key 配置到環(huán)境變量。
2.3 配置多模型
@Configuration
public class LLMConfig {
@Bean(name = "qwen")
public ChatModel chatModelQwen(){
return OpenAiChatModel.builder()
.apiKey(System.getenv("aliQwen-api"))
.modelName("qwen-plus")
.baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
.logRequests(true)// 日志設(shè)置
.logResponses(true)
.maxRetries(2)// 重試次數(shù)
.timeout(Duration.ofSeconds(5))//請(qǐng)求超時(shí)
.build();
}
@Bean(name = "deepseek")
public ChatModel chatModelDeepSeek(){
return OpenAiChatModel.builder()
.apiKey(System.getenv("deepseek-api"))
.modelName("deepseek-chat")
.baseUrl("https://api.deepseek.com/v1")
.build();
}
}2.3 基礎(chǔ)API調(diào)用
在Controller層,注入模型Bean對(duì)象,調(diào)用接口?;A(chǔ)API可以獲得消耗token等數(shù)量。
@Resource(name = "qwen")
private ChatModel chatModel;
@Resource(name = "deepseek")
private ChatModel chatModelDeepseek;
@GetMapping("/langchain4j/qwen/hello")
public String hello(@RequestParam(value = "msg",defaultValue = "你是誰") String msg){
String result = chatModel.chat(msg);
System.out.println("調(diào)用大模型回復(fù):"+result);
return result;
}
@GetMapping("/langchain4j/dp/hello")
public String dpHello(@RequestParam(value = "msg",defaultValue = "你是誰") String msg){
ChatResponse result = chatModelDeepseek.chat(UserMessage.from(msg));
System.out.println("調(diào)用大模型回復(fù):"+result.aiMessage().text());
TokenUsage tokenUsage = result.tokenUsage();
System.out.println("消耗的token數(shù)量:"+tokenUsage.toString());
return result.aiMessage().text();
}接口調(diào)用響應(yīng)如下:

2.4 高級(jí)API調(diào)用
定義一個(gè)chat接口,并在LLMConfig 類配置對(duì)應(yīng)Bean對(duì)象。
public interface ChatAssitant {
String chat(String prompt);
}
@Configuration
public class LLMConfig {
@Bean(name = "qwen")
public ChatModel chatModelQwen(){
return OpenAiChatModel.builder()
.apiKey(System.getenv("aliQwen-api"))
.modelName("qwen-plus")
.baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
.logRequests(true)// 開發(fā)時(shí),可打印請(qǐng)求request
.logResponses(true)
.maxRetries(2)// 重試次數(shù)
.build();
}
@Bean(name = "deepseek")
public ChatModel chatModelDeepSeek(){
return OpenAiChatModel.builder()
.apiKey(System.getenv("deepseek-api"))
.modelName("deepseek-chat")
.baseUrl("https://api.deepseek.com/v1")
.build();
}
@Bean
public ChatAssitant chatAssitant(@Qualifier("qwen") ChatModel chatModelQwen){
return AiServices.create(ChatAssitant.class,chatModelQwen);
}
}在Controller層,使用高級(jí)API調(diào)用接口。
@GetMapping("/highApi/hello")
public String highApi(@RequestParam(value = "msg",defaultValue = "你是誰") String msg){
return chatAssitant.chat(msg);
}
接口調(diào)用響應(yīng)如下:

2.5 流式輸出對(duì)話
在子模塊,添加相關(guān)依賴:
<dependencies>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-reactor</artifactId>
</dependency>
</dependencies>配置對(duì)應(yīng)StreamingChatModel :
@Configuration
public class LLMConfig {
@Bean(name = "qwen-plus")
public StreamingChatModel streamingChatModelQwen(){
return OpenAiStreamingChatModel.builder()
.apiKey(System.getenv("aliQwen-api"))
.modelName("qwen-plus")
.baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
.build();
}
//流式輸出
@Bean("chat2")
public ChatAssitant2 chatAssitant2(StreamingChatModel streamingChatModel){
return AiServices.create(ChatAssitant2.class,streamingChatModel);
}
}定義一個(gè)chat接口,并在LLMConfig 類配置對(duì)應(yīng)Bean對(duì)象。
public interface ChatAssitant2 {
String chat(String prompt);
Flux<String> chatFlux(String prompt);
}在Controller層,調(diào)用API接口。
@Autowired
private StreamingChatModel streamingChatModel;
@Autowired
private ChatAssitant2 chatAssitant;
@GetMapping(value = "/chatstream")
public Flux<String> chat(@RequestParam(value = "prompt",defaultValue = "你是誰") String prompt){
return Flux.create(emitter->{
streamingChatModel.chat(prompt, new StreamingChatResponseHandler() {
@Override
public void onPartialResponse(String s) {
emitter.next(s);
}
@Override
public void onCompleteResponse(ChatResponse chatResponse) {
emitter.complete();
// 可以獲取花費(fèi)的token
}
@Override
public void onError(Throwable throwable) {
emitter.error(throwable);
}
});
});
}
//高級(jí)API調(diào)用方式
@GetMapping(value = "/chatstream2")
public Flux<String> chat2(@RequestParam(value = "prompt",defaultValue = "南京有什么好吃的") String prompt){
return chatAssitant.chatFlux(prompt);
}接口調(diào)用響應(yīng)如下:

2.5 集成Springboot
創(chuàng)建子模塊,添加相關(guān)依賴:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
</dependency>
<!-- 高級(jí)API-->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-spring-boot-starter</artifactId>
</dependency>
</dependencies>配置文件中配置模型參數(shù)
server.port=9003
spring.application.name=langchain4j-springboot
langchain4j.open-ai.chat-model.api-key=${aliQwen-api}
langchain4j.open-ai.chat-model.base-url=https://dashscope.aliyuncs.com/compatible-mode/v1
langchain4j.open-ai.chat-model.model-name=qwen-plus定義一個(gè)chat接口,加上@AiService注解。
@AiService
public interface ChatAssitant {
//定義系統(tǒng)提示詞
@SystemMessage("你是一個(gè)友好的AI助手,名叫小智。你的回答簡(jiǎn)潔、專業(yè)、有條理。請(qǐng)使用中文回答。")
String chat( String prompt);
}在Controller層,調(diào)用chat接口。
@RestController
public class AiServiceController {
@Resource
private ChatAssitant chatAssitantQwen;
@GetMapping(value = "/boot/chat")
public String chat(@RequestParam(value = "msg",defaultValue = "你是誰") String prompt){
return chatAssitantQwen.chat(prompt);
}
}三 總結(jié)
本文詳述了Spring,Springboot與LangChain4j集成構(gòu)建智能對(duì)話系統(tǒng)的全流程。了解了 LangChain4j 的定位、核心能力與發(fā)展趨勢(shì),了解了 Deepseek / 通義千問 模型的接入方式,掌握了LangChain4j API 基礎(chǔ)用法和高級(jí)用法。
到此這篇關(guān)于Springboot整合LangChain4j 全流程的文章就介紹到這了,更多相關(guān)Springboot整合LangChain4j內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Swing實(shí)現(xiàn)自定義日期時(shí)間選擇器組件
Swing 原生沒有好用的日期時(shí)間選擇器組件,如果想讓用戶選擇日期,通常只能用手寫文本框加格式校驗(yàn),代碼繁瑣且體驗(yàn)一般,下面小編就和大家分享一下Java Swing實(shí)現(xiàn)自定義日期時(shí)間選擇器的相關(guān)方法吧2026-05-05
基于SSM實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于SSM實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12
基于Java實(shí)現(xiàn)緩存Cache的深入分析
本篇文章是對(duì)Java實(shí)現(xiàn)緩存Cache進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
java使用mysql預(yù)編譯語(yǔ)句查詢優(yōu)勢(shì)及示例詳解
這篇文章主要為大家介紹了java使用mysql預(yù)編譯語(yǔ)句的優(yōu)勢(shì)特點(diǎn)及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
Activiti7通過代碼動(dòng)態(tài)生成工作流實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了Activiti7通過代碼動(dòng)態(tài)生成工作流實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Java開發(fā)實(shí)現(xiàn)人機(jī)猜拳游戲
這篇文章主要為大家詳細(xì)介紹了Java開發(fā)實(shí)現(xiàn)人機(jī)猜拳游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08
Java 異步實(shí)現(xiàn)的幾種方式小結(jié)
這篇文章主要介紹了Java 異步實(shí)現(xiàn)的幾種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
java短信驗(yàn)證碼獲取次數(shù)限制實(shí)例
這篇文章主要介紹了java短信驗(yàn)證碼獲取次數(shù)限制實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01

