java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Springboot整合LangChain4j

Springboot整合LangChain4j 全流程

作者:Try, Again

LangChain4j是一个专为Java生态打造的大语言模型应用开发框架,支持多种模型提供商,具备丰富的功能模块,如对话记忆、RAG管道支持、结构化输出等,这篇文章给大家介绍Springboot整合LangChain4j的全流程,感兴趣的朋友跟随小编一起看看吧

一 LangChain4j简介

    LangChain4j(LangChain for Java)是一个专为 Java 生态打造的大语言模型(LLM)应用开发框架。
Python 领域大语言模型(LLM)应用开发框架是LangChain,LangChain4j 可以理解为它的 “Java 版兄弟”。但它并非简单的 API 翻译,而是充分结合了 Java 语言特性(强类型、注解驱动、Spring 生态集成等)进行了重新设计。

    LangChain4j 提供了丰富的功能模块,覆盖 LLM 应用开发的各个环节:

核心能力说明
统一模型 API一套接口适配 OpenAI、通义千问、Ollama、Azure OpenAI、Anthropic 等 15+ 模型提供商
AI Service 抽象通过 Java 接口 + 注解定义 AI 服务,像写 MyBatis Mapper 一样简单
对话记忆(Memory)内置多轮对话记忆管理,支持内存、持久化等多种策略
RAG(检索增强生成)完整的 RAG Pipeline 支持:文档加载 → 分割 → 向量化 → 检索 → 生成
function Calling一套接口适配 OpenAI、通义千问、Ollama、Azure OpenAI、Anthropic 等 15+ 模型提供商
结构化输出将 LLM 的自然语言输出自动解析为 Java 对象(POJO)
流式响应(Streaming)支持 SSE 流式输出,提升用户交互体验
Embedding & 向量存储集成 Pinecone、Milvus、Redis、PGVector 等主流向量数据库

二 项目示例

1 开发环境

2 代码集成

2.1 添加版本依赖

    创建父模块,添加Spring Ai相关依赖:

    <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>
<!--            引入阿里云百炼平台依赖-->
            <dependency>
                <groupId>dev.langchain4j</groupId>
                <artifactId>langchain4j-community-bom</artifactId>
                <version>${langchain4j-community.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>

    创建子模块,添加相关依赖:

  <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 配置环境变量

    将大模型API Key 配置到环境变量。

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)// 日志设置
                .logResponses(true)
                .maxRetries(2)// 重试次数
                .timeout(Duration.ofSeconds(5))//请求超时
                .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 基础API调用

    在Controller层,注入模型Bean对象,调用接口。基础API可以获得消耗token等数量。

    @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("调用大模型回复:"+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("调用大模型回复:"+result.aiMessage().text());
        TokenUsage tokenUsage = result.tokenUsage();
        System.out.println("消耗的token数量:"+tokenUsage.toString());
        return result.aiMessage().text();
    }

接口调用响应如下:

2.4 高级API调用

    定义一个chat接口,并在LLMConfig 类配置对应Bean对象。

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)// 开发时,可打印请求request
                .logResponses(true)
                .maxRetries(2)// 重试次数
                .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层,使用高级API调用接口。

   @GetMapping("/highApi/hello")
    public String highApi(@RequestParam(value = "msg",defaultValue = "你是谁") String msg){
       return chatAssitant.chat(msg);
    }

接口调用响应如下:

2.5 流式输出对话

    在子模块,添加相关依赖:

  <dependencies>
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-reactor</artifactId>
        </dependency>
  </dependencies>

    配置对应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);
    }
}

    定义一个chat接口,并在LLMConfig 类配置对应Bean对象。

public interface ChatAssitant2 {
    String chat(String prompt);
    Flux<String> chatFlux(String prompt);
}

    在Controller层,调用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();
                    // 可以获取花费的token
                }
                @Override
                public void onError(Throwable throwable) {
                    emitter.error(throwable);
                }
            });
        });
    }
		//高级API调用方式
    @GetMapping(value = "/chatstream2")
    public Flux<String> chat2(@RequestParam(value = "prompt",defaultValue = "南京有什么好吃的") String prompt){
        return chatAssitant.chatFlux(prompt);
    }

接口调用响应如下:

2.5 集成Springboot

    创建子模块,添加相关依赖:

 <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>
<!--        高级API-->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>

    配置文件中配置模型参数

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

    定义一个chat接口,加上@AiService注解。

@AiService
public interface ChatAssitant {
    //定义系统提示词
    @SystemMessage("你是一个友好的AI助手,名叫小智。你的回答简洁、专业、有条理。请使用中文回答。")
     String chat( String prompt);
}

    在Controller层,调用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);
    }
}

三 总结

    本文详述了Spring,Springboot与LangChain4j集成构建智能对话系统的全流程。了解了 LangChain4j 的定位、核心能力与发展趋势,了解了 Deepseek / 通义千问 模型的接入方式,掌握了LangChain4j API 基础用法和高级用法。

到此这篇关于Springboot整合LangChain4j 全流程的文章就介绍到这了,更多相关Springboot整合LangChain4j内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文