在大模型对话中用户最怕的就是盯着屏幕等半天然后“刷”地一下弹出一大段文字。这种体验就像发短信等回信而流式调用则像面对面聊天对方说一个字你就能听到一个字。之前我们用的是阻塞式调用模型把所有回答想好了才一次性给出来。这一节我们就来学习如何用 LangChain4j 实现流式调用让文字像打字机一样逐字呈现。一、流式调用需要什么流式调用的核心是服务器端持续推送数据客户端持续接收并渲染。在技术栈上我们需要两样东西服务端支持流式响应的模型StreamingChatModel和能够输出反应式流的接口Flux客户端能够逐步消费流数据的前端页面LangChain4j 为我们提供了完整的支持只需调整少量配置和代码即可。二、引入必要依赖在原有项目基础上加入 Spring WebFlux 和 LangChain4j 的反应式模块!-- Source: https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-webflux -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-webflux/artifactId /dependency !-- Source: https://mvnrepository.com/artifact/dev.langchain4j/langchain4j-reactor -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-reactor/artifactId version1.15.0-beta25/version /dependency完整的pom.xml配置如下?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.5.14/version relativePath/ /parent artifactIdLangChain4j-SpringBoot/artifactId properties maven.compiler.source21/maven.compiler.source maven.compiler.target21/maven.compiler.target project.build.sourceEncodingUTF-8/project.build.sourceEncoding /properties dependencies !-- 具体的 模型驱动负责集成OpenAI并生成基础AI对象。 -- !-- Source: https://mvnrepository.com/artifact/dev.langchain4j/langchain4j-open-ai-spring-boot-starter -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-open-ai-spring-boot-starter/artifactId version1.15.0-beta25/version /dependency !-- 框架的 功能核心负责提供自动配置和高级AI服务声明 -- !-- Source: https://mvnrepository.com/artifact/dev.langchain4j/langchain4j-spring-boot-starter -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-spring-boot-starter/artifactId version1.15.0-beta25/version /dependency !-- Source: https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-webflux -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-webflux/artifactId /dependency !-- Source: https://mvnrepository.com/artifact/dev.langchain4j/langchain4j-reactor -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-reactor/artifactId version1.15.0-beta25/version /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId version3.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 会自动往容器中注入OpenAiStreamingChatModelBean 名称为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方法的返回值为FluxString反应式字符串流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); FluxString streamChat(String message); }4.2 调整 ChatControllerController 中新增streamChat方法返回值为FluxString并设置正确的响应类型进行流式输出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 FluxString streamChat(RequestParam(message) String message) { return consultantService.streamChat(message); } }4.3进行测试在输入框中输入问题点击发送你会看到文字像真人打字一样逐字出现在屏幕上。这就是流式调用带来的交互体验——低延迟、即时反馈、更自然。五、小结从阻塞到流式我们只改了三处依赖添加spring-boot-starter-webflux和langchain4j-reactor配置增加streaming-chat-model的 yml 配置接口ConsultantService和ChatController的返回值改为FluxString并在AiService中指定streamingChatModelLangChain4j 将底层流式模型的复杂细节封装得干干净净我们只需关注返回值类型和模型指定两个点代码层面的改动量极小。配合一个简单的前端页面就能让 AI 对话体验从“等快递”变成“看直播”。核心改动仅三处添加依赖spring-boot-starter-webflux提供 Flux 反应式流支持langchain4j-reactorLangChain4j 的反应式适配器配置流式模型在application.yml中增加langchain4j.open-ai.streaming-chat-model配置项base-url、api-key、model-name 等Spring Boot 会自动注入OpenAiStreamingChatModelBean。改造接口返回值服务层(ConsultantService)将streamChat方法返回类型改为FluxString控制器(ChatController)新增/streamChat接口设置produces MediaType.TEXT_EVENT_STREAM_VALUE直接返回FluxString流