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);
    }
相关推荐
感谢地心引力1 天前
我用 Doubao-Seed-2.1-pro 做了一个深度融入 AI 功能的本地知识库软件
ai·开源·seed·markdown·豆包
阿昌喜欢吃黄桃1 天前
提示词工程:User Prompt 与 System Prompt
ai·prompt·提示词·提示词工程
AI产品测评官1 天前
海内外AI招聘工具分赛道横向对比:五大品类的技术路线与选型参考
人工智能·ai·求职招聘
俊哥V1 天前
每日 AI 研究简报 · 2026-09-21
人工智能·ai
omenkk71 天前
上下文工程:优化系统提示词,利用 KV Cache 降低 Token 成本
ai
代码方舟1 天前
零信任架构实战:基于天远手机在网状态V即时版构建自动化通信分发网关
人工智能·ai·工具分享
MicrosoftReactor2 天前
技术速递|GitHub Copilot App 入门指南:使用 Diff、终端和浏览器
ai·copilot·agent
TechEdu2026062 天前
[人工智能]人工智能时代的零日漏洞与零日攻击
人工智能·网络安全·ai·信息安全
程序员无隅2 天前
Pi Agent Loop 完整流程源码解析:从 Agent.prompt() 到 agent_end
ai