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);
    }
相关推荐
云贝教育-郑老师5 小时前
8.29 杭州线下沙龙|OpenTenBase城市行:当 AI 智能体成为数据库的新生产力
学习·ai·dba
赵大仁19 小时前
Agent 安全:沙箱、权限、Prompt 注入与审计
ai·大模型·agent·ai安全·合规
AI分享猿19 小时前
从大纲到成稿:百智云PPT如何用“一段文字“驱动整套演示文稿
ai·powerpoint·ppt
运维开发王义杰21 小时前
从「被动问答」到「主动接管」:深度拆解 Gemini Chat 与 Gemini Spark 的本质区别
ai
神奇霸王龙1 天前
DeepSeek 接 Anthropic:迁移屠夫
ai·ai作画·agent·ai编程·claude·claudecode
IT Panda1 天前
【Harness Engineering】Skill 自进化 - SkillOpt
ai·agent·skill·harness·自进化·skillopt·skill自进化
燐妤1 天前
中老年智能健康管理项目
python·ai·pycharm·vue3·fastapi·项目开发·健康
VIP_CQCRE1 天前
用 LobeChat 接入 Ace Data Cloud:一个 Token 解锁 GPT、Claude、Gemini 等 60+ 模型
ai·大模型·openai·lobechat·acedatacloud
安逸sgr1 天前
RAG 检索到了正确内容,但模型回答仍然错误,可能是什么原因?
人工智能·ai·大模型·agent·智能体