真没招了, 关于 SpringAI 大模型流式输出问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiaobucvg
0.06D
V2EX    问与答

真没招了, 关于 SpringAI 大模型流式输出问题

  •  
  •   xiaobucvg 1 月 28 日 967 次点击
    @Slf4j @RestController @AllArgsConstructor public class AiController implements ApplicationContextAware { private final ChatClient chatClient; private final ObjectMapper objectMapper; private ApplicationContext applicationContext; private static final List<String> mockChunks = List.of( "# 人工智能的发展与应用综述\n\n", "## 一、引言\n\n", "人工智能( Artificial Intelligence ,AI )是计算机科学中最具变革性的研究方向之一。自二十世纪中叶提出以来,人工智能经历了从符号主义到统计学习,再到深度学习和大模型时代的多次范式转移。当前,以大语言模型为代表的生成式人工智能,正在深刻改变软件工程、内容生产以及人机交互的方式。\n\n", "本文将从技术演进、核心能力、典型应用以及未来挑战四个方面,对人工智能的发展进行系统性梳理。\n\n", "## 二、技术演进路径\n\n", "### 1. 早期人工智能\n\n", "早期人工智能主要基于规则与逻辑推理,例如专家系统和基于知识库的推理引擎。这一阶段的系统依赖人工构建规则,开发成本高,泛化能力弱,难以应对复杂多变的现实问题。\n\n", "### 2. 机器学习阶段\n\n", "随着统计学方法的引入,机器学习逐渐成为主流。通过特征工程和监督学习,模型可以从数据中自动学习规律,在图像识别、语音识别等领域取得突破性进展。\n\n", "### 3. 深度学习与大模型\n\n", "深度学习利用多层神经网络显著提升了模型的表达能力。近年来,基于 Transformer 架构的大模型通过海量数据和参数规模扩展,实现了跨任务、跨模态的统一建模能力。\n\n", "## 三、大模型的核心能力\n\n", "- **自然语言理解与生成**:能够进行高质量的文本生成、摘要、翻译与对话。\n", "- **上下文建模能力**:通过长上下文窗口,模型可以理解复杂指令和多轮对话。\n", "- **知识整合能力**:在一定程度上融合通用知识与领域知识,辅助决策与分析。\n\n", "这些能力使大模型从“工具型算法”转变为“通用智能接口”,成为新一代软件系统的重要组成部分。\n\n", "## 四、典型应用场景\n\n", "### 1. 软件工程\n\n", "在软件开发领域,大模型可以用于代码生成、代码审查、测试用例补全以及架构设计辅助,显著提升开发效率,并降低初级错误的发生率。\n\n", "### 2. 内容生产\n\n", "在文本、图像和视频生成领域,人工智能已经能够完成初稿撰写、创意延展和风格迁移,为创作者提供强有力的生产工具。\n\n", "### 3. 企业与行业应用\n\n", "在客服、金融分析、医疗辅助诊断等场景中,大模型通过与业务系统结合,逐步承担信息检索、分析和初步判断的角色。\n\n", "## 五、挑战与风险\n\n", "尽管人工智能取得了显著进展,但仍面临一系列挑战,包括:\n\n", "1. **幻觉问题**:模型可能生成看似合理但事实错误的内容。\n", "2. **可解释性不足**:模型决策过程难以被完全理解和审计。\n", "3. **数据与隐私风险**:训练与推理过程涉及大量数据,必须严格合规。\n\n", "这些问题要求在技术、制度和工程层面进行系统性治理。\n\n", "## 六、未来展望\n\n", "未来的人工智能系统将更加注重可靠性、可控性与工程化落地。大模型可能不再以“单体智能”存在,而是作为多智能体系统中的核心组件,与规则系统、检索系统以及人类专家协同工作。\n\n", "从长远来看,人工智能并非取代人类,而是扩展人类能力边界的重要工具。如何合理使用并约束其能力,将成为未来社会的重要课题。\n\n", "## 七、结语\n\n", "人工智能正处于高速发展阶段。理解其技术本质、应用边界和潜在风险,对于开发者和决策者而言都至关重要。只有在理性和审慎的前提下,人工智能才能真正释放其长期价值。\n" ); @CrossOrigin(origins = "*") @PostMapping(value = "/ai/ask", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<ServerSentEvent<String>> askStream(@RequestBody Map<String, String> map) { String query = map.get("q"); ChatClientRequestSpec requestSpec = chatClient.prompt("你假装自己是一个很美丽可爱娇小的女人, 内容输出使用 markdown").user(query).tools(new BaseTools()); Flux<String> coldFlux = Flux.create(emitter -> { Executors.newSingleThreadExecutor().submit(() -> { try { for (String c : mockChunks) { Thread.sleep(1000); emitter.next(c); } emitter.complete(); } catch (Exception e) { emitter.error(e); } }); }); return requestSpec.stream().content() .doOnNext(chunk -> log.info("chunk: {}", chunk)) .map(t -> buildServerSentEvent("delta", t)); } private ServerSentEvent<String> buildServerSentEvent(String type, String content) { String template = """ {"type":"%s","content":%s} """.trim(); String jsOnChunk= objectMapper.writeValueAsString(content); return ServerSentEvent.builder(template.formatted(type, jsonChunk)).build(); } @Override public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException { this.applicatiOnContext= applicationContext; } } 

    这是我的接口

    当我用 coldFlux 模拟数据的时候, 前端可以正常分块渲染

    但是使用 requestSpec.stream().content() 的时候, 明明 log 打印是正常的, 但是前端就是要等到全部打印完了, 才一次把全部的内容输出

    问了各个 AI, 试了一堆解决方案, 全都没有作用.

    4 条回复    2026-01-29 10:28:46 +08:00
    thetbw
        1
    thetbw  
       1 月 28 日
    看下浏览器网络面板就行了,如果是 sse,一眼能辨别出来的,不然就是请求头漏了什么,例如 keep-alive 之类的
    luman
        2
    luman  
       1 月 29 日
    先别看前端,直接 curl 访问下看下。
    PerFectTime
        3
    PerFectTime  
       1 月 29 日
    curl 看一下是不是流式输出返回,如果是的话,大概率是前端在反代 api 的时候缓存了结果,前几天刚遇到过
    xiaobucvg
        4
    xiaobucvg  
    OP
       1 月 29 日
    破案了, 没引入依赖, 引入后就好了
    ```
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    ```

    AI 给了各种方案, 加延时, 改配置, 都没有, 最后没办法换成了使用 sseEmitter 能用了

    解决经过:

    今天准备接入 gemini-3-pro-image-preview-nano-banana 生图, 但是 spring-ai-starter-model-google-genai 没有 ImageModel 的实现, 于是询问 AI , 给出了用 WebClient 自行调用 API 的方案, 结果发现项目中没有 WebClient, WebClient 是在 spring-webflux 里面定义的的, 突然意识到之前的问题会不会是没引入 spring-webflux 的原因, 引入以后果然好用了

    >_<
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3075 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 13:15 PVG 21:15 LAX 05:15 JFK 08:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86