Skip to content

Spring Boot 整合 LangChain4j 快速开始

快速开始

一、概述

LangChain4j 是 Java 版本的 LangChain,提供与大语言模型(LLM)交互、RAG、Agent、Tools 等能力。与 Spring Boot 整合后,可通过自动配置和声明式 AI Services 极速构建 AI 应用。

二、项目依赖

使用 Maven,在 pom.xml 中添加以下依赖:

xml
<properties>
    <java.version>17</java.version>
    <langchain4j.version>0.36.2</langchain4j.version>
</properties>

<dependencies>
   
    <!-- LangChain4j 核心 -->
    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j</artifactId>
        <version>${langchain4j.version}</version>
    </dependency>

    
    <!-- 模型实现(按需选择,这里以 OpenAI + 智谱AI 为例) -->
    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j-open-ai</artifactId>
        <version>${langchain4j.version}</version>
    </dependency>

    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j-community-zhipu-ai</artifactId>
        <version>1.0.0-alpha1</version>
    </dependency>

    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j-ollama</artifactId>
        <version>${langchain4j.version}</version>
    </dependency>
    
    <!-- Spring Boot WebFlux(流式输出必须用响应式,不能用普通 Web) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
</dependencies>

如使用其他模型(如 Ollama、Azure OpenAI、通义千问等参考文档 Comparison Table of all supported Language Models | LangChain4j

三、配置模型

java
@Configuration
public class LLMConfig {

    @Value("${openai.api-key}")
    private String openaiKey;
    
    @Value("${zhipu.api-key}")
    private String zhipuKey;

    // OpenAI 流式模型
    @Bean(name = "openAiStreamingModel")
    public StreamingChatLanguageModel openAiStreamingModel() {
        return OpenAiStreamingChatModel.builder()
            .apiKey(openaiKey)
            .modelName("gpt-3.5-turbo")
            .temperature(0.7)
            .logRequests(true)
            .logResponses(true)
            .build();
    }

    // 智谱AI 流式模型
    @Bean(name = "zhipuStreamingModel")
    public StreamingChatLanguageModel zhipuStreamingModel() {
        return ZhipuAiStreamingChatModel.builder()
            .apiKey(zhipuKey)
            .model(ChatCompletionModel.GLM_4_FLASH)
            .temperature(0.6)
            .maxToken(99999)
            .callTimeout(Duration.ofSeconds(60))
            .connectTimeout(Duration.ofSeconds(60))
            .writeTimeout(Duration.ofSeconds(60))
            .readTimeout(Duration.ofSeconds(60))
            .logRequests(true)
            .logResponses(true)
            .build();
    }

    static String MODEL_NAME = "deepseek-r1:1.5b"; // 本地模型名称通过 ollama list 查看
    static String BASE_URL = "http://192.168.30.130:11434"; // 访问 ollama IP地址

    @Bean(name = "ollamaStreamingModel")
    public StreamingChatLanguageModel OllamaStreamingModel() {
        return OllamaStreamingChatModel.builder()
            .baseUrl(BASE_URL)
            .modelName(MODEL_NAME)
            .temperature(0.0)
            .logRequests(true)
            .logResponses(true)
            .build();
    }

四、流式接口实现

1. 实现 Service

java
@Service
public class StreamingChatService {

    @Qualifier("openAiStreamingModel")
    @Autowired
    private StreamingChatLanguageModel openAiStreamingModel;

    @Qualifier("zhipuStreamingModel")
    @Autowired
    private StreamingChatLanguageModel zhipuStreamingModel;

    @Qualifier("ollamaStreamingModel")
    @Autowired
    private StreamingChatLanguageModel ollamaStreamingModel;

    public Flux<String> streamWithOpenAi(String prompt) {
        return buildFlux(openAiStreamingModel, prompt);
    }

    public Flux<String> streamWithZhipu(String prompt) {
        return buildFlux(zhipuStreamingModel, prompt);
    }

    public Flux<String> streamWithOllama(String prompt) {
        return buildFlux(ollamaStreamingModel, prompt);
    }

    private Flux<String> buildFlux(StreamingChatLanguageModel model, String prompt) {
        // Sinks 是 WebFlux 的响应式"管道",把回调转成 Flux
        Sinks.Many<String> sink = Sinks.many().unicast().onBackpressureBuffer();

        model.generate(prompt, new StreamingResponseHandler<AiMessage>() {
            @Override
            public void onNext(String token) {
                // 每来一个 token,往管道里推一个
                sink.tryEmitNext(token);
            }

            @Override
            public void onComplete(Response<AiMessage> response) {
                // 生成完毕,关闭管道
                sink.tryEmitComplete();
            }

            @Override
            public void onError(Throwable error) {
                // 发生错误,向管道发送错误信号
                sink.tryEmitError(error);
            }
        });

        return sink.asFlux();
    }
}

2. 注入并使用

java
@Tag(name = "AI 对话", description = "多模型对话接口")
@RestController
@RequiredArgsConstructor
@RequestMapping("/chat")
public class ChatController {

    private final StreamingChatService streamingChatService;

    @Operation(summary = "OpenAI 对话", description = "使用 OpenAI 模型进行对话")
    @GetMapping(value = "/openAi",produces = "text/plain;charset=UTF-8")
    public Flux<String> openAiChat(
        @Parameter(description = "用户输入的消息", example = "你是谁?")
        @RequestParam(defaultValue = "你是谁?") String message) {
        return streamingChatService.streamWithOpenAi(message);
    }

    @Operation(summary = "质谱 对话", description = "使用 质谱 模型进行对话")
    @GetMapping(value = "/glm", produces = "text/plain;charset=UTF-8")
    public Flux<String> glmChat(
        @Parameter(description = "用户输入的消息", example = "你是谁?") @RequestParam(defaultValue = "你是谁?") String message) {
        return streamingChatService.streamWithZhipu(message);
    }

    @Operation(summary = "ollama 对话", description = "ollama 本地模型进行对话")
    @GetMapping(value = "/ollama", produces = "text/plain;charset=UTF-8")
    public Flux<String> ollamaChat(
        @Parameter(description = "用户输入的消息", example = "你是谁?") @RequestParam(defaultValue = "你是谁?") String message) {
        return streamingChatService.streamWithOllama(message);
    }
}

如有转载或 CV 的请标注本站原文地址

访客数 --| 总访问量 --