ai开发-langchain4j-进阶-03-流式输出

1、流式输出

配置文件

复制代码
llm.config.aliQwenApiKey=sk-...........
llm.config.aliQwenModelName=qwen-plus
llm.config.aliQwenUrl=https://dashscope.aliyuncs.com/compatible-mode/v1

# 设置响应的字符编码,避免流式返回输出乱码
server.servlet.encoding.charset=utf-8
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true

controller 测试1

复制代码
    @Resource //直接使用 low-level LLM API
    private StreamingChatModel streamingChatLanguageModel;



// http://localhost:9007/chatstream/chat?prompt=济南有什么好吃的
    @GetMapping(value = "/chatstream/chat")
    public Flux<String> chat(@RequestParam("prompt") String prompt) {
        System.out.println("---come in chat");
        return Flux.create(emitter -> {
            streamingChatLanguageModel.chat(prompt, new StreamingChatResponseHandler() {
                @Override
                public void onPartialResponse(String partialResponse) {
                    emitter.next(partialResponse);
                }
                @Override
                public void onCompleteResponse(ChatResponse completeResponse) {
                    emitter.complete();
                }
                @Override
                public void onError(Throwable throwable) {
                    emitter.error(throwable);
                }
            });
        });
    }

controller 测试2

复制代码
    // http://localhost:9007/chatstream/chat2?prompt=济南有什么好吃的
    @GetMapping(value = "/chatstream/chat2")
    public void chat2(@RequestParam(value = "prompt", defaultValue = "北京有什么好吃") String prompt) {
        System.out.println("---come in chat2");
        streamingChatLanguageModel.chat(prompt, new StreamingChatResponseHandler() {
            @Override
            public void onPartialResponse(String partialResponse) {
                System.out.println(partialResponse);
            }

            @Override
            public void onCompleteResponse(ChatResponse completeResponse) {
                System.out.println("---response over: " + completeResponse);
            }

            @Override
            public void onError(Throwable throwable) {
                throwable.printStackTrace();
            }
        });
    }

2、自定义 ChatAssistant

复制代码
import reactor.core.publisher.Flux;

/**
 * @auther xulk
 * @Date 2026-06-30 16:19
 * @Description: TODO
 */
public interface ChatAssistant {
    String chat(String prompt);

    Flux<String> chatFlux(String prompt);
}

controller 测试3

复制代码
    @Resource //自己封装接口使用 high-level LLM API
    private ChatAssistant chatAssistant;

    
    // http://localhost:9007/chatstream/chat3?prompt=济南有什么好吃的
    @GetMapping(value = "/chatstream/chat3")
    public Flux<String> chat3(@RequestParam(value = "prompt", defaultValue = "南京有什么好吃") String prompt) {
        System.out.println("---come in chat3"); 
        return chatAssistant.chatFlux(prompt);
    }
相关推荐
人工智能研究所4 小时前
手机随手拍一段视频,AI 能还原出一个可以 360° 旋转视角的“数字人“
人工智能·科技·ai·数字人
潇凝子潇4 小时前
suno 音乐风格和原标签整理
ai·suno
一切皆是因缘际会5 小时前
因果确定性计算架构
ai·系统架构·计算机架构·因果状态计算机体系
TechEdu2026065 小时前
[人工智能]MiniMax(上海稀宇科技):模型、智能体与多模态应用工程实践
人工智能·ai
2601_962381865 小时前
一文看懂爆火的 Graph Engineering, Loop Engineering、Agent
ai··循环·智能体·工程
空堂与归6 小时前
南大 AI 课 Token 自费:用缓存命中率算一学期账单
人工智能·缓存·ai·deepseek
学习日记5256 小时前
第 3 章:三层记忆体系——把偏好变成项目资产
人工智能·ai·prompt
流光D6 小时前
AI时代,搭建 web 站点并配置 nginx 反向代理流程
运维·服务器·前端·人工智能·nginx·ai·ai编程
易岳群6 小时前
Vibe Coding 与 Skills、Agent、Prompt:构建 AI 辅助编程的新工作流
ai·prompt·ai编程