news 2026/8/8 13:14:10

Spring Ai--快速入门4:流式对话

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Ai--快速入门4:流式对话

原文网址:Spring Ai--快速入门4:流式对话-CSDN博客

简介

本文介绍Spring Ai流式对话的实战,以这三种方式进行实战:流式返回字符串结果、流式返回全量SSE数据、流式返回手动调用接口的结果。

备注:之前文章介绍过Spring Ai对话的实战:Spring Ai--快速入门1:对话实战-CSDN博客

流式会话的原理是什么?

流式会话的核心:服务端持续地向客户端发送数据。实现方案有两种:WebSocket、SSE。

WebSocket:大部分人都知道,它是长连接,全双工,客户端可以持续向服务端发送数据,服务端也可以持续地向客户端发送数据。

SSE:全称是:Server-Sent Events,中文含义:服务器发送事件。服务端可以持续地向客户端发送数据,但客户端是一次性的发送请求给服务器。

两者详细的对比可以看这里:WebSocket与SSE的对比-CSDN博客

对比后可以发现:SSE更适合用于AI流式数据返回。

Spring Ai底层就是基于SSE。

测试

用apifox进行测试。

1. 流式返回字符串结果

可以发现:Flux<String>这种写法,直接返回了回答的内容,没有额外的数据。

适合只需要结果的业务场景。

2. 流式返回全量SSE数据

可以发现:Flux<ServerSentEvent<ChatResponse>>这种写法会返回全量SSE数据,里边会包含AI的回答。而且,第一个响应和最后一个响应,真实数据的字段text,是空的。

适合需要全量SSE数据的业务场景。实际上,可以对结果进行定制,比如只取ChatResponse里的某个值,只需改写返回值泛型以及这个地方:

.map(chatResponse -> { return ServerSentEvent .builder(chatResponse) .event("message") .build(); });

第一个响应:

中间的响应

最后一个响应

这里贴出完整的单条响应:

{ "result": { "output": { "messageType": "ASSISTANT", "metadata": { "role": "ASSISTANT", "messageType": "ASSISTANT", "finishReason": "", "refusal": "", "index": 0, "annotations": [], "id": "chatcmpl-e20dbdd1-4e7d-9f48-9ea3-eecdf987d3c9", "reasoningContent": "" }, "toolCalls": [], "media": [], "text": "我可以" }, "metadata": { "finishReason": "", "contentFilters": [], "empty": true } }, "results": [ { "output": { "messageType": "ASSISTANT", "metadata": { "role": "ASSISTANT", "messageType": "ASSISTANT", "finishReason": "", "refusal": "", "index": 0, "annotations": [], "id": "chatcmpl-e20dbdd1-4e7d-9f48-9ea3-eecdf987d3c9", "reasoningContent": "" }, "toolCalls": [], "media": [], "text": "我可以" }, "metadata": { "finishReason": "", "contentFilters": [], "empty": true } } ], "metadata": { "id": "chatcmpl-e20dbdd1-4e7d-9f48-9ea3-eecdf987d3c9", "model": "qwen-plus", "rateLimit": { "tokensLimit": 0, "requestsReset": "PT0S", "tokensRemaining": 0, "tokensReset": "PT0S", "requestsLimit": 0, "requestsRemaining": 0 }, "usage": { "promptTokens": 0, "nativeUsage": {}, "completionTokens": 0, "totalTokens": 0 }, "promptMetadata": [], "empty": false } }

3. 流式返回手动调用接口数据

可以发现:Flux<ServerSentEvent<String>>这种写法会返回SSE部分数据,里边会包含AI的回答。而且,第一个响应和倒数第二个响应,真实数据的字段content,是空的;最后一个响应,是个统计性的数据,连content字段都没有,里边有一些token使用量等使用数据。

适合需要高度定制的业务场景。因为此法是直接使用WebFlux进行的接口调用,自由度最大。

第一次响应:

最后两个响应:

这里贴出详细数据

第一个响应:

{ "choices": [ { "delta": { "content": "", "role": "assistant" }, "index": 0, "logprobs": null, "finish_reason": null } ], "object": "chat.completion.chunk", "usage": null, "created": 1768920120, "system_fingerprint": null, "model": "qwen-plus", "id": "chatcmpl-174ca428-8fa3-9129-8567-69ccc39199d9" }

中间的响应:

{ "choices": [ { "finish_reason": null, "logprobs": null, "delta": { "content": "你好" }, "index": 0 } ], "object": "chat.completion.chunk", "usage": null, "created": 1768920120, "system_fingerprint": null, "model": "qwen-plus", "id": "chatcmpl-174ca428-8fa3-9129-8567-69ccc39199d9" }

倒数第二个响应:

{ "choices": [ { "finish_reason": "stop", "delta": { "content": "" }, "index": 0, "logprobs": null } ], "object": "chat.completion.chunk", "usage": null, "created": 1768920120, "system_fingerprint": null, "model": "qwen-plus", "id": "chatcmpl-174ca428-8fa3-9129-8567-69ccc39199d9" }

最后一个响应:

{ "choices": [], "object": "chat.completion.chunk", "usage": { "prompt_tokens": 11, "completion_tokens": 278, "total_tokens": 289, "prompt_tokens_details": { "cached_tokens": 0 } }, "created": 1768920120, "system_fingerprint": null, "model": "qwen-plus", "id": "chatcmpl-174ca428-8fa3-9129-8567-69ccc39199d9" }

代码

为便于维护,全文已转移到此网址:Spring Ai-快速入门4:流式对话 - 自学精灵

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/8 13:13:19

UnityExplorer完全指南:实时调试和修改Unity游戏的终极工具

UnityExplorer完全指南&#xff1a;实时调试和修改Unity游戏的终极工具 【免费下载链接】UnityExplorer An in-game UI for exploring, debugging and modifying IL2CPP and Mono Unity games. 项目地址: https://gitcode.com/gh_mirrors/un/UnityExplorer UnityExplore…

作者头像 李华
网站建设 2026/8/8 13:10:36

如何3分钟免费解锁Microsoft 365完整功能:Ohook实用指南

如何3分钟免费解锁Microsoft 365完整功能&#xff1a;Ohook实用指南 【免费下载链接】ohook An universal Office "activation" hook with main focus of enabling full functionality of subscription editions 项目地址: https://gitcode.com/gh_mirrors/oh/ohoo…

作者头像 李华
网站建设 2026/8/8 13:09:42

Mesen:终极NES/Famicom模拟器完整指南 - 免费复古游戏体验

Mesen&#xff1a;终极NES/Famicom模拟器完整指南 - 免费复古游戏体验 【免费下载链接】Mesen Mesen is a cross-platform (Windows & Linux) NES/Famicom emulator built in C and C# 项目地址: https://gitcode.com/gh_mirrors/me/Mesen Mesen是一款功能强大的跨平…

作者头像 李华
网站建设 2026/8/8 13:09:35

蚂蚁集团Ling-3.0-flash API免费接入指南:从申请到批量任务实践

这次我们来看一个来自蚂蚁集团的 Ling-3.0-flash 模型&#xff0c;它最近开放了 AI/ML API 服务&#xff0c;并且提供了一个重要的福利&#xff1a;免费使用至 8 月 6 日。对于开发者、研究者和 AI 应用构建者来说&#xff0c;这意味着在截止日期前&#xff0c;你可以零成本地接…

作者头像 李华
网站建设 2026/8/8 13:09:28

Minecraft世界修复终极指南:免费开源工具快速拯救损坏存档

Minecraft世界修复终极指南&#xff1a;免费开源工具快速拯救损坏存档 【免费下载链接】Minecraft-Region-Fixer Python script to fix some of the problems of the Minecraft save files (region files, *.mca). 项目地址: https://gitcode.com/gh_mirrors/mi/Minecraft-Re…

作者头像 李华
网站建设 2026/8/8 13:08:37

企微API外部群:如何区分群机器人推送与应用消息推送?

​QiWe开放平台 个人名片 API驱动企微外部群自动化&#xff0c;让开发更高效 官方站点&#xff1a;https://www.qiweapi.com 对接通道&#xff1a;进入官方站点联系客服 团队定位&#xff1a;企微生态深度服务&#xff0c;专注 APIRPA 融合技术方案 1. 权限归属与“信任链”差…

作者头像 李华