当前位置: 首页 > article >正文

langchain4j+springboot流式输出

本文主要研究一下langchain4j+springboot如何实现流式输出

步骤

pom.xml

        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-reactor</artifactId>
            <version>$1.0.0-beta1</version>
        </dependency>

application.yaml

langchain4j:
  ollama:
    streaming-chat-model:
      base-url: http://localhost:11434
      model-name: deepseek-r1:8b

配置了langchain4j.ollama.streaming-chat-model.base-url的配置就可以自动开启并注入streamingChatModel

controller

    @Autowired
    StreamingChatLanguageModel streamingChatModel;

    @GetMapping("/stream")
    public Flux<String> stream(@RequestParam("prompt") String prompt, HttpServletResponse response) {
        response.setCharacterEncoding("UTF-8");
        return Flux.create(sink -> {
            streamingChatModel.chat(prompt, new StreamingChatResponseHandler() {
                @Override
                public void onPartialResponse(String partialResponse) {
                    log.info("onPartialResponse:{}", partialResponse);
                    sink.next(partialResponse);
                }

                @Override
                public void onCompleteResponse(ChatResponse completeResponse) {
                    log.info("complete:{}", completeResponse);
                    sink.complete();
                }

                @Override
                public void onError(Throwable error) {
                    sink.error(error);
                }
            });

        });
    }

StreamingChatLanguageModel提供了StreamingChatResponseHandler用于处理片段结果,结合Flux可以实现流式输出

源码

dev/langchain4j/ollama/spring/AutoConfig.java

    @Bean
    @ConditionalOnProperty(PREFIX + ".streaming-chat-model.base-url")
    OllamaStreamingChatModel ollamaStreamingChatModel(
            @Qualifier(OLLAMA_STREAMING_CHAT_MODEL_HTTP_CLIENT_BUILDER) HttpClientBuilder httpClientBuilder,
            Properties properties,
            ObjectProvider<ChatModelListener> listeners
    ) {
        ChatModelProperties chatModelProperties = properties.getStreamingChatModel();
        return OllamaStreamingChatModel.builder()
                .httpClientBuilder(httpClientBuilder)
                .baseUrl(chatModelProperties.getBaseUrl())
                .modelName(chatModelProperties.getModelName())
                .temperature(chatModelProperties.getTemperature())
                .topK(chatModelProperties.getTopK())
                .topP(chatModelProperties.getTopP())
                .repeatPenalty(chatModelProperties.getRepeatPenalty())
                .seed(chatModelProperties.getSeed())
                .numPredict(chatModelProperties.getNumPredict())
                .stop(chatModelProperties.getStop())
                .format(chatModelProperties.getFormat())
                .supportedCapabilities(chatModelProperties.getSupportedCapabilities())
                .timeout(chatModelProperties.getTimeout())
                .customHeaders(chatModelProperties.getCustomHeaders())
                .logRequests(chatModelProperties.getLogRequests())
                .logResponses(chatModelProperties.getLogResponses())
                .listeners(listeners.orderedStream().toList())
                .build();
    }

langchain4j-ollama-spring-boot-starter的AutoConfig当检测到有配置langchain4j.ollama.streaming-chat-model.base-url的时候会自动配置OllamaStreamingChatModel,它实现了StreamingChatLanguageModel接口

小结

langchain4j-ollama-spring-boot-starter提供了OllamaStreamingChatModel实现了StreamingChatLanguageModel接口,不过貌似没有提供对spring mvc的内置集成,需要自己通过Flux及StreamingChatResponseHandler去适配下。

doc

  • langchain4j+ollama+deepseek小试牛刀

http://www.kler.cn/a/559934.html

相关文章:

  • 深度解析SmartGBD助力Android音视频数据接入GB28181平台
  • 【工具篇】【深度解析字节跳动AI编程工具Trae:中文开发者的新利器】
  • git中的merge和rebase的区别
  • XGBoost 入门介绍
  • SPV技术前沿:高分辨率表面光电压测量-测试狗
  • 日本IT|SQL工程师的工作内容以及所需的技能·资格
  • Spring Boot 2/3.x 中 MultipartFile 接收问题深度解析与实战解决方案
  • C++ 继承与运算符重载的简单练习
  • 爱迪斯通虚拟针灸教学系统入选ARinChina2024 XR行业年度荣誉榜医疗榜单
  • BOOST电路设计
  • 20250212:https通信
  • Directed acyclic graph [DAG]有向无环图 应用场景汇总与知名开源库实现细节说明
  • 【Go】Go wire 依赖注入
  • 面试八股文--数据库基础知识总结(1)
  • 深度学习pytorch之19种优化算法(optimizer)解析
  • 模块化设计的力量:从「乐高积木」看组合式开发如何降低软件工程风险
  • 数据同步的中间件
  • 每日学习Java之一万个为什么
  • 【K8s】专题十六(2):Kubernetes 包管理工具之 Helm 使用
  • 启动Redis报错记录