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);
    }
相关推荐
howdoyoudo2026067 小时前
AI审计手记 #28:从“暂停训练”到“切断联网”——AI安全控制手段的极限升级
大数据·人工智能·安全·ai·语言模型
·云扬·12 小时前
Prompt 工程与安全:从 System 设计到注入防御
java·人工智能·安全·ai·prompt
九卷12 小时前
企业级Agent系统整体技术架构介绍
ai·架构·大模型·llm·agent·智能体
俊哥V16 小时前
每日 AI 研究简报 · 2026-10-12
人工智能·ai
空堂与归18 小时前
REA登顶GitHub:AI如何逆向一切软件
ai·大模型·agent
效率工作实验室18 小时前
2026年企业级 AI 智能体平台选型指南:关键评估维度
ai·agent·企业级·智能体平台·智能体平台选型
Am-Chestnuts20 小时前
DeepSeek 内容转 Word 总翻车?用 DS随心转
ai
EEET智选20 小时前
科技晨间速报 | AI 安全警钟、开源新模型与苹果智能家居
人工智能·科技·算法·机器学习·ai