当前位置: 首页 > news >正文

* 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_VALUE
package 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进行测试

在输入框中输入问题,点击发送,你会看到文字像真人打字一样逐字出现在屏幕上。这就是流式调用带来的交互体验——低延迟、即时反馈、更自然

五、小结

从阻塞到流式,我们只改了三处:

  1. 依赖:添加spring-boot-starter-webfluxlangchain4j-reactor

  2. 配置:增加streaming-chat-model的 yml 配置

  3. 接口ConsultantServiceChatController的返回值改为Flux<String>,并在@AiService中指定streamingChatModel

LangChain4j 将底层流式模型的复杂细节封装得干干净净,我们只需关注返回值类型模型指定两个点,代码层面的改动量极小。配合一个简单的前端页面,就能让 AI 对话体验从“等快递”变成“看直播”。

核心改动(仅三处)

  1. 添加依赖

    • spring-boot-starter-webflux(提供 Flux 反应式流支持)

    • langchain4j-reactor(LangChain4j 的反应式适配器)

  2. 配置流式模型
    application.yml中增加langchain4j.open-ai.streaming-chat-model配置项(base-url、api-key、model-name 等),Spring Boot 会自动注入OpenAiStreamingChatModelBean。

  3. 改造接口返回值

    • 服务层(ConsultantService):将streamChat方法返回类型改为Flux<String>

    • 控制器(ChatController):新增/streamChat接口,设置produces = MediaType.TEXT_EVENT_STREAM_VALUE,直接返回Flux<String>

http://www.jsqmd.com/news/860560/

相关文章:

  • 《2026浦东5家初高中学科辅导机构横向测评:我帮你把坑踩完了》 - GrowthUME
  • AI编程工具 Codex 入门教程,带你7分钟上手 Codex !
  • Cert-Manager 安装与配置文档
  • 2026年福州汽车贴膜合规资质权威测评:4家主流门店横向对比,附避坑指南与选型推荐 - GrowthUME
  • 巨亏47亿,市值5000亿:拆解智谱AI的定价逻辑
  • 2026杭州GEO优化公司权威评测:五大厂商横向对比,避坑选型必读 - qq150194
  • 2026 全国高端整合营销公司权威榜单:十大整合营销服务商真实能力横评与选型指南 - GEO优化
  • 【原理实战】OpenClaw Memory 系统:从“多记一点“到“治理层“的演进
  • 学习大模型RAG与Agent智能体基础知识day1
  • 2025.12.18海南封关运作后,内地老板为何扎堆来注册公司?2026年海南注册公司代理记账靠谱财税机构排行榜单 - GrowthUME
  • 2026 年上海 GEO 优化公司权威榜单:全意图 GEO 驱动品牌魔都增长战略指南 - GEO优化
  • VS 2022教程VsCode技巧(创建C语言程序)
  • 为OpenClaw智能体工作流配置Taotoken作为稳定的模型供应后端
  • 2026年美容抗衰仪器价格指南:U.SUN时光梭如何实现全民抗衰普及? - GrowthUME
  • Amphenol ICC DRPC51A009A40线束组件详解与替代方案
  • 【限时解密】Midjourney毛发质感生成私藏Prompt库:仅剩87组未公开高保真指令(含犬科/灵长类/昆虫刚毛专用模板)
  • 紧急预警:拟态风格版权灰区已扩大!——2024最新欧盟AI生成物合规白皮书+5步规避侵权风险实操清单
  • 2026天津市北辰区家政公司权威榜单:口碑好又专业的TOP机构揭秘 - GrowthUME
  • VLA已死,WAM当立:机器人的GPT时刻到了吗?
  • TraceML:用三行代码为训练循环加入 step 级诊断
  • 大牛直播SDK(SmartMediaKit)Windows平台RTSP/RTMP直播播放SDK集成说明(C#版)
  • 解锁凋亡调控密码:核心蛋白与信号通路全景解析
  • 【Midjourney范戴克印相终极指南】:20年影像工艺专家首度公开AI胶片化调色黄金参数(含7组不可复制的v6提示词矩阵)
  • 30天学会AI工程师|Day 13:Tool Calling 不是高级玩法,它是 Agent 开始有手脚的那一步
  • OpenClaw(小龙虾AI)Windows一键部署包v2.7.5|零代码+可视化操作
  • 读懂数据结构:计算机存储数据的底层逻辑
  • 抖音视频怎么下载?2026年六大方法全解析及全类型工具对比 - GrowthUME
  • 2026年福州汽车贴膜行业横向测评白皮书 - GrowthUME
  • ‌我靠技术博客实现月入3w+:一名软件测试工程师的垂直深耕之路
  • 【Prompt实战】打破“废话生成器”魔咒:结构化提示词(CRISPE框架)编写指南