* LangChain4j中的流式调用
在大模型对话中,用户最怕的就是盯着屏幕等半天,然后“刷”地一下弹出一大段文字。这种体验就像发短信等回信,而流式调用则像面对面聊天,对方说一个字你就能听到一个字。
之前我们用的是阻塞式调用,模型把所有回答想好了才一次性给出来。这一节,我们就来学习如何用 LangChain4j 实现流式调用,让文字像打字机一样逐字呈现。
一、流式调用需要什么?
流式调用的核心是服务器端持续推送数据,客户端持续接收并渲染。在技术栈上,我们需要两样东西:
服务端:支持流式响应的模型(
StreamingChatModel)和能够输出反应式流的接口(Flux)客户端:能够逐步消费流数据的前端页面
LangChain4j 为我们提供了完整的支持,只需调整少量配置和代码即可。
二、引入必要依赖
在原有项目基础上,加入 Spring WebFlux 和 LangChain4j 的反应式模块:
<!-- Source: https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-webflux --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <!-- Source: https://mvnrepository.com/artifact/dev.langchain4j/langchain4j-reactor --> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-reactor</artifactId> <version>1.15.0-beta25</version> </dependency>完整的pom.xml配置如下:
<?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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.5.14</version> <relativePath/> </parent> <artifactId>LangChain4j-SpringBoot</artifactId> <properties> <maven.compiler.source>21</maven.compiler.source> <maven.compiler.target>21</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- 具体的 "模型驱动",负责集成OpenAI并生成基础AI对象。 --> <!-- Source: https://mvnrepository.com/artifact/dev.langchain4j/langchain4j-open-ai-spring-boot-starter --> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-open-ai-spring-boot-starter</artifactId> <version>1.15.0-beta25</version> </dependency> <!-- 框架的 "功能核心",负责提供自动配置和高级AI服务声明 --> <!-- Source: https://mvnrepository.com/artifact/dev.langchain4j/langchain4j-spring-boot-starter --> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-spring-boot-starter</artifactId> <version>1.15.0-beta25</version> </dependency> <!-- Source: https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-webflux --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <!-- Source: https://mvnrepository.com/artifact/dev.langchain4j/langchain4j-reactor --> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-reactor</artifactId> <version>1.15.0-beta25</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>3.5.14</version> </dependency> </dependencies> </project>三、配置流式模型对象
在application.yml中,除了之前的阻塞式模型,新增流式模型的配置:
langchain4j: open-ai: streaming-chat-model: #流式模型配置 base-url: https://dashscope.aliyuncs.com/compatible-mode/v1 api-key: ${API-KEY} model-name: qwen-plus log-requests: true log-responses: true启动后,LangChain4j 会自动往容器中注入OpenAiStreamingChatModel,Bean 名称为openAiStreamingChatModel。
完整配置如下:
langchain4j: open-ai: chat-model: base-url: https://dashscope.aliyuncs.com/compatible-mode/v1 #api-key: ${API-KEY} # 引用环境变量 api-key: sk-xxxx model-name: qwen-plus log-requests: true # 打印请求日志 log-responses: true # 打印响应日志 streaming-chat-model: #流式模型配置 base-url: https://dashscope.aliyuncs.com/compatible-mode/v1 #api-key: ${API-KEY} api-key: sk-xxxx model-name: qwen-plus log-requests: true log-responses: true logging: level: dev.langchain4j: debug # 设置日志级别四、改造接口层,返回反应式流
4.1 调整 ConsultantService
将 streamChat方法的返回值为Flux<String>(反应式字符串流):
package com.langchan4jSpringBoot.aiService; import dev.langchain4j.service.spring.AiService; import reactor.core.publisher.Flux; @AiService public interface ConsultantService { //用于聊天的方法,message为用户输入的内容 public String chat(String message); Flux<String> streamChat(String message); }4.2 调整 ChatController
Controller 中新增streamChat方法,返回值为Flux<String>,并设置正确的响应类型进行流式输出:
produces = MediaType.TEXT_EVENT_STREAM_VALUEpackage com.langchan4jSpringBoot.controller; import com.langchan4jSpringBoot.aiService.ConsultantService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Flux; @RestController public class ChatController { @Autowired private ConsultantService consultantService; @RequestMapping("/chat") public String chat(@RequestParam("message") String message) { String result = consultantService.chat(message); return result; } @RequestMapping(value = "/streamChat", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<String> streamChat(@RequestParam("message") String message) { return consultantService.streamChat(message); } }4.3进行测试
在输入框中输入问题,点击发送,你会看到文字像真人打字一样逐字出现在屏幕上。这就是流式调用带来的交互体验——低延迟、即时反馈、更自然。
五、小结
从阻塞到流式,我们只改了三处:
依赖:添加
spring-boot-starter-webflux和langchain4j-reactor配置:增加
streaming-chat-model的 yml 配置接口:
ConsultantService和ChatController的返回值改为Flux<String>,并在@AiService中指定streamingChatModel
LangChain4j 将底层流式模型的复杂细节封装得干干净净,我们只需关注返回值类型和模型指定两个点,代码层面的改动量极小。配合一个简单的前端页面,就能让 AI 对话体验从“等快递”变成“看直播”。
核心改动(仅三处)
添加依赖
spring-boot-starter-webflux(提供 Flux 反应式流支持)langchain4j-reactor(LangChain4j 的反应式适配器)
配置流式模型
在application.yml中增加langchain4j.open-ai.streaming-chat-model配置项(base-url、api-key、model-name 等),Spring Boot 会自动注入OpenAiStreamingChatModelBean。改造接口返回值
服务层(
ConsultantService):将streamChat方法返回类型改为Flux<String>控制器(
ChatController):新增/streamChat接口,设置produces = MediaType.TEXT_EVENT_STREAM_VALUE,直接返回Flux<String>流
