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

Java使用Langchai4j接入AI大模型的简单使用(五)--流式输出的实现

一、LLMs流式输出介绍

流式输出(Streaming Output)是大语言模型(LLMs)中一种重要的交互方式,它允许模型将生成的文本逐步返回给用户,而不是等待整个响应完成后再一次性返回。

二、流式输出的工作原理

  1. 分块生成:模型不是一次性生成完整回答,而是逐词或逐句生成

  2. 即时传输:每生成一部分内容就立即发送给客户端

  3. 持续处理:客户端可以即时显示或处理接收到的部分结果

三、流式输出的优势

1、用户体验提升

  • 降低等待焦虑:用户不需要长时间等待就能看到部分结果

  • 更自然的交互:模拟人类对话的逐步响应方式

  • 响应感知:用户可以早期判断响应方向是否正确

2、技术优势

  • 降低延迟:首个令牌(Token)的响应时间(TTFB)大幅缩短

  • 内存效率:不需要缓存完整响应再发送

  • 中断能力:用户可以在中途停止不想要的响应。

四、流式输出的应用场景

  1. 聊天应用:模拟真人对话体验

  2. 代码生成:逐步显示生成的代码

  3. 长文写作:分段显示生成内容

  4. 实时翻译:边听边翻译的场景

  5. 教育应用:逐步解释复杂概念

五、流式输出的技术挑战与解决方案

挑战解决方案
连接稳定性心跳机制、自动重连
部分响应处理客户端状态管理
错误处理错误边界设计、重试机制
前后端协调定义明确的数据协议

六、流式与一次性输出的对比

特性流式输出一次性输出
响应时间快(首个令牌)慢(完整响应)
内存占用
用户体验更优一般
实现复杂度较高较低
适用场景交互式应用批处理任务

流式输出已成为现代LLM应用的标准功能,它能显著提升用户体验,特别是在需要长时间生成内容的场景中。

七、流式输出的实现

下面使用Langchain4j+阿里千问来实现:

1、引入依赖:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>langchain4j</artifactId><version>0.0.1-SNAPSHOT</version><name>langchain4j_springboot</name><description>langchain4j_springboot</description><properties><java.version>17</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><spring-boot.version>3.4.3</spring-boot.version><langchain4j.version>1.0.0-beta1</langchain4j.version></properties><dependencies><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-community-dashscope-spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><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>dev.langchain4j</groupId><artifactId>langchain4j-community-bom</artifactId><version>${langchain4j.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>17</source><target>17</target><encoding>UTF-8</encoding></configuration></plugin></plugins></build></project>

 这里重点说一下需要引入webflux实现流式响应输出:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

2、在application.properties配置流式输出所需要的信息

langchain4j.community.dashscope.streaming-chat-model.api-key=配置key
langchain4j.community.dashscope.streaming-chat-model.model-name=qwq-32b

3、编码实现:

package com.example.langchain4j.controller;import com.fasterxml.jackson.databind.ObjectMapper;
import dev.langchain4j.community.model.dashscope.QwenChatModel;
import dev.langchain4j.community.model.dashscope.QwenStreamingChatModel;
import dev.langchain4j.model.chat.response.ChatResponse;
import dev.langchain4j.model.chat.response.StreamingChatResponseHandler;
import org.springframework.beans.factory.annotation.Autowired;
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;/*** @author: * @Desc:* @create: 2025-07-13 12:40**/
@RestController
@RequestMapping("/ai")
public class ChatController {@Autowiredprivate QwenStreamingChatModel streamingChatModel;//须指定produces为stream输出,编码为utf-8,否则会乱码@RequestMapping(value = "/stream", produces = "text/stream;charset=UTF-8")public Flux<String> stream(@RequestParam(value="message",defaultValue = "你是谁") String message){Flux<String> flux = Flux.create(sink -> {streamingChatModel.chat(message, new StreamingChatResponseHandler() {@Overridepublic void onPartialResponse(String partialResponse) {sink.next(partialResponse);}@Overridepublic void onCompleteResponse(ChatResponse chatResponse) {sink.complete();}@Overridepublic void onError(Throwable throwable) {sink.error(throwable);}});});return flux;}}

http://www.xdnf.cn/news/15256.html

相关文章:

  • 设计模式之单例模式:深入解析全局唯一对象的艺术
  • STM32-第五节-TIM定时器-1(定时器中断)
  • F-GNN的新型检测框架:随机森林增强图神经网络
  • Python 数据建模与分析项目实战预备 Day 4 - EDA(探索性数据分析)与可视化
  • 音视频学习(三十七):pts和dts
  • 香港理工大学实验室定时预约
  • php生成二维码
  • Java网络编程
  • ref 和 reactive
  • 详解Linux下多进程与多线程通信(一)
  • Kafka——Kafka 线上集群部署方案怎么做?
  • 解决 Python 跨目录导入模块问题
  • git实际工作流程
  • Java 大视界 -- Java 大数据在智能教育学习资源智能分类与标签优化中的应用(346)
  • [2025CVPR]DenoiseCP-Net:恶劣天气下基于LiDAR的高效集体感知模型
  • 若依框架集成阿里云OSS实现文件上传优化
  • 基于requests_html的爬虫实战
  • 「小程序开发」项目结构和页面组成
  • java: DDD using oracle 21c
  • 多级@JsonTypeInfo和@JsonSubTypes注解使用详解及场景分析
  • opencv python 基本操作
  • Python自动化:每日销售数据可视化
  • 日志系统 on Linux C/C++
  • STEP 7-Micro/WIN SMART 编程软件:从入门到精通的使用指南
  • Datawhale AI夏令营——基于带货视频评论的用户洞察挑战赛
  • 关于 java:11. 项目结构、Maven、Gradle 构建系统
  • Cesium初探-CallbackProperty
  • 【算法分析与设计】研究生第二次算法作业:基于分治策略的有序数组中位数查找与逆序对计数 latex源码和pdf
  • 五、深度学习——CNN
  • 卫星通信终端天线的5种对星模式之二:DVB跟踪