Java实现AI流式输出(打字机效果):从原理到实战
一、前言
现在主流的AI应用都有"打字机"效果——AI一个字一个字地往外蹦,实时显示生成内容。这个体验比等AI整段话生成完再展示要好太多。本文教你用Java实现这个效果。
二、流式输出的原理
2.1 普通API vs 流式API
| 对比项 | 普通API | 流式API(Server-Sent Events) |
|---|---|---|
| 返回方式 | 等全部结果一次性返回 | 分批返回,一段一段吐出来 |
| 用户等待 | 等待时间长,体验差 | 立刻看到内容,体验好 |
| 技术实现 | 同步REST调用 | HTTP分块传输(Chunked Transfer) |
| 前端配合 | 普通ajax | EventSource / Fetch API |
2.2 Server-Sent Events(SSE)原理
AI服务(比如OpenAI)会通过HTTP分块传输(Chunked Transfer Encoding),把数据切成一个个小块发送给客户端。每收到一个chunk,就触发一次事件,前端可以立即更新界面。
三、后端Java实现(OpenAI流式调用)
3.1 使用Spring AI(推荐)
Spring AI已经封装好了流式调用,非常简单:
@GetMapping(value="/stream/chat",produces=MediaType.TEXT_EVENT_STREAM_VALUE)publicFlux<String>streamChat(@RequestParamStringmessage){Promptprompt=newPrompt(newUserMessage(message));returnchatClient.stream(prompt).map(response->response.getResult().getOutput().getText());}3.2 使用原生HttpClient实现
不用Spring AI的话,可以用Java 11的HttpClient实现:
importjava.net.http.HttpClient;importjava.net.http.HttpRequest;importjava.net.http.HttpResponse;importjava.net.URI;importjava.util.stream.Collectors;publicclassStreamingAIClient{privatestaticfinalStringAPI_URL="https://api.openai.com/v1/chat/completions";privatestaticfinalStringAPI_KEY="你的API Key";/** * 流式调用AI,返回每个chunk的内容 */publicFlux<String>streamChat(StringuserMessage