粘贴可运行:Java调用大模型(LLM) 流式Flux stream 输出;基于spring ai alibaba

在Java中,使用Spring AI Alibaba框架调用国产大模型通义千问,实现流式输出,是一种高效的方式。通过Spring AI Alibaba,开发者可以轻松地集成通义千问模型,并利用其流式处理能力,实时获取模型生成的文本。这种流式输出方式,使得模型能够持续不断地生成文本,直到达到指定的长度或满足特定的条件。通过这种方式,开发者可以更灵活地处理模型生成的文本,提高应用程序的响应速度和用户体验。

本例子使用spring ai alibaba + QWen千问api 完成,你可以跑通以后换自己的实现。

QWen 目前 有100万免费Token额度,可以快速实现需求。同时,因为qwen 也是个开源的模型,我们可以自己搭建模型来实现免费使用

Spring AI概述

在当前Java调用大模型时,缺乏优秀的AI应用框架是一个显著的问题。Spring作为老牌的Java应用框架厂商,提出了Spring AI以解决这一问题。它参考了langchain的核心理念,并结合了Java面向对象编程的优势,为开发者提供了统一且灵活的接口来与不同的大模型交互。这种设计使得用户能够轻松切换底层实现,同时享受到由专门团队维护的好处。本次样例将演示如何使用Spring AI Alibaba接入通义大模型,但请记住,一旦掌握了基本配置方法,您也可以方便地更换为自己所需的其他Java大模型实现。

### Java 调用大模型 API 实现流式输出 在现代应用开发中,通过 Java 实现对大模型流式调用是一种常见的需求。这种场景下可以利用 Spring WebFlux 和 `Server-Sent Events` 技术来完成高效的实时通信[^3]。 以下是基于 Spring Boot 的一个完整示例代码,用于演示如何实现流式调用并返回结果: #### 后端实现(Spring Boot) ```java import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class StreamController { @GetMapping(value = "/api/ai/stream-chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<String> streamChat(@RequestParam String message) { // 模拟异步处理逻辑 return Flux.interval(Duration.ofMillis(500)) .take(10) .map(i -> "data: This is chunk " + i + "\n\n"); } } ``` 上述代码展示了如何创建一个支持 SSE(Server-Sent Events)的 RESTful 接口 `/api/ai/stream-chat`,它会每隔 500ms 返回一段数据直到达到指定次数[^2]。 如果需要实际对接大模型 API,则可以通过 WebClient 发起 HTTP 请求,并将接收到的数据逐块传递给客户端: ```java import reactor.core.publisher.Flux; import java.time.Duration; @RestController public class AiStreamController { private final WebClient webClient; public AiStreamController(WebClient.Builder builder) { this.webClient = builder.baseUrl("https://apis.ydxiaoshuai.cn/xai/rest/llm/baidu/qianfan/chat") .build(); } @GetMapping(value = "/stream-llm", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<String> streamLlm(@RequestParam String prompt, @RequestParam String accessToken) { return webClient.get() .uri(uriBuilder -> uriBuilder.queryParam("accessToken", accessToken) .queryParam("prompt", prompt).build()) .accept(MediaType.APPLICATION_JSON) .retrieve() .bodyToFlux(String.class); } } ``` 此部分实现了从外部 API 获取流式数据的功能[^4]。 #### 前端实现(UniApp 或其他框架) 对于前端而言,可采用标准的 JavaScript `EventSource` 对象监听服务器发送事件。以下是一个简单的 UniApp 集成案例: ```javascript startStreamChat() { this.answer = ''; const eventSource = new EventSource( 'http://localhost:8080/api/ai/stream-chat?message=' + encodeURIComponent(this.inputMessage) ); eventSource.onmessage = (event) => { try { const data = JSON.parse(event.data); if (data && data.result) { this.answer += data.result; } } catch (e) { console.warn('Invalid JSON received', e); } }; eventSource.onerror = () => { console.error('Connection to server failed.'); eventSource.close(); }; } ``` 以上脚本负责连接至后端服务并将逐步接收的内容拼接到最终答案上。 --- ### 总结 整个流程涉及前后端协作:后端借助 Reactor 类型库管理异步操作;而前端则依赖于浏览器原生的支持机制解析来自后台的消息推送。这样既满足了低延迟交互的需求又保持了良好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值