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

Spring AI(8)——流式响应

流式响应允许异步获取响应数据。通过该方式,大模型每次返回一部分token,而不是等到生成完整结果后再返回。

我们首先来看下类的继承关系:

ZhiPuAiChatModel 实现了ChatModel接口。

public class ZhiPuAiChatModel implements ChatModel {......}

ChatModel接口继承了StreamingChatModel接口。 

public interface ChatModel extends Model<Prompt, ChatResponse>, StreamingChatModel {......}

StreamingChatModel接口中包含的方法:

@FunctionalInterface
public interface StreamingChatModel extends StreamingModel<Prompt, ChatResponse> {default Flux<String> stream(String message) {Prompt prompt = new Prompt(message);return this.stream(prompt).map((response) -> {return response.getResult() != null && response.getResult().getOutput() != null && response.getResult().getOutput().getText() != null ? response.getResult().getOutput().getText() : "";});}default Flux<String> stream(Message... messages) {Prompt prompt = new Prompt(Arrays.asList(messages));return this.stream(prompt).map((response) -> {return response.getResult() != null && response.getResult().getOutput() != null && response.getResult().getOutput().getText() != null ? response.getResult().getOutput().getText() : "";});}Flux<ChatResponse> stream(Prompt prompt);
}

通过源码可以看到,调用ChatModel对象调用stream()方法即可实现流式响应。并且其返回值有两种形式:Flux<String>和Flux<ChatResponse>。

测试代码:

package com.renr.springainew.controller;import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.zhipuai.ZhiPuAiChatModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;@RestController
public class ChatController {@Resourceprivate ZhiPuAiChatModel chatModel;@Resourceprivate ChatClient client;@GetMapping("/stream")public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {Prompt prompt = new Prompt(message);Flux<ChatResponse> stream = this.chatModel.stream(prompt);return stream;}@GetMapping("/stream2")public Flux<String> generateStream2(String message) {return this.chatModel.stream(message);}@GetMapping("/stream3")public Flux<String> generateStream3(String message) {return this.client.prompt().user(message).stream().content();}
}

 测试代码通过ChatModel对象和ChatClient对象分别实现了流式响应。

注意:一定要通过浏览器进行测试,否则无法看到流式响应的效果。

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

相关文章:

  • wafer晶圆几何形貌测量系统:厚度(THK)翘曲度(Warp)弯曲度(Bow)等数据测量
  • 直线导轨运转过程中如何避免震动发生?
  • Linux上部署IgH EtherCAT主站教程
  • B2C商城架构对比:ZKmall模板商城为何选择 Spring Cloud
  • 《P1470 [USACO2.3] 最长前缀 Longest Prefix》
  • SOC-ESP32S3部分:9-GPIO输入按键状态读取
  • python打卡训练营打卡记录day34
  • 电力设备类——如何使用YOLOv8模型对配网缺陷检数据集进行训练、评估和可视化 这个配网销钉缺失检测图像数据集 配网缺陷检测图像数据集 配网缺陷
  • 【达梦数据库】groupadd无法打开etc group
  • C++:适配器
  • VsCode配置
  • 前后端分页详解
  • Java的动态加载及类加载器实践
  • UI 设计|提高审美|Linear UI风格分享
  • RxJS 核心操作符详细用法示例
  • AI开发实习生面试总结(持续更新中...)
  • 精华贴分享|个股拥挤度分析研究分析
  • docker安装es连接kibana并安装分词器
  • Windows开机时间过长的原因
  • 射频芯片学习
  • 技术文档的炼金术:从信息碎片到知识体系的系统性构建
  • 《进化陷阱》--AI 生成文章 《连载 1》
  • RxJS 高阶映射操作符详解:map、mergeMap 和 switchMap
  • 大学之大:柏林自由大学2025.5.23
  • feign调用指定服务ip端口
  • winfrom 的 monthCalendar 指定日期字体加粗
  • 辐射发射RE测试
  • 解决用input选择文件不能选择同一个文件
  • Java多线程面试题
  • 白盒测试概念