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. 流式返回字符串结果可以发现FluxString这种写法直接返回了回答的内容没有额外的数据。适合只需要结果的业务场景。2. 流式返回全量SSE数据可以发现FluxServerSentEventChatResponse这种写法会返回全量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. 流式返回手动调用接口数据可以发现FluxServerSentEventString这种写法会返回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流式对话 - 自学精灵