SpringBoot整合LangChain4j实现流式AI对话

勾选上Spring Web点击创建即可。

修改pom.xml文件

javascript 复制代码
    <properties>
        <java.version>17</java.version>
        <langchain4j.version>1.14.1-beta24</langchain4j.version>

    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>dev.langchain4j</groupId>
                <artifactId>langchain4j-community-bom</artifactId>
                <version>${langchain4j.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!--百炼-->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-community-dashscope-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

创建controller包以及ChatController类

java 复制代码
package org.example.langchain4j_springboot.controller;

import dev.langchain4j.model.chat.ChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/ai")
public class ChatControler {

    @Autowired
    ChatModel qwenChatModel;
    @RequestMapping("/chat")
    public String test(@RequestParam(defaultValue="你是谁") String message) {
        String chat = qwenChatModel.chat(message);
        return chat;
    }
}

为什么直接这么写就能调用了呢?

springboot自动装配 。

  • Bean 的类型是 QwenChatModel(它实现了 ChatModel 接口)

  • 只有在 application.yml 中配置了 langchain4j.community.dashscope.chat-model.api-key 时,才会创建这个 Bean

  • QwenChatModel 是 ChatModel 接口的实现类,所以它可以直接注入到 @Autowired ChatModel qwenChatModel

然后配置api-key以及模型

java 复制代码
server.port=8080
langchain4j.community.dashscope.chat-model.api-key=
langchain4j.community.dashscope.chat-model.model-name=qwen-max

这样就可以了。

那么如果想要他流式的输出返回呢?

那么我们就需要注入

java 复制代码
@Autowired
    QwenStreamingChatModel  streamingChatModel;

然后流式代码改写成

java 复制代码
@RequestMapping("/stream")
    public String test2(@RequestParam(defaultValue="你是谁") String message) {
        streamingChatModel.chat(message, new StreamingChatResponseHandler() {

            @Override
            public void onPartialResponse(String partialResponse) {
                System.out.println(partialResponse);
            }
            @Override
            public void onCompleteResponse(ChatResponse chatResponse) {
                System.out.println("结束");
            }

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

然后配置配置项

java 复制代码
langchain4j.community.dashscope.streaming-chat-model.api-key=
langchain4j.community.dashscope.streaming-chat-model.model-name=qwen-plus

看输出就变成流式的了

那么在前端我们如何看到流式响应呢?

因为langchain4j不是spring家族, 所以我们在wen应用中需要引入webflux

java 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
java 复制代码
@RequestMapping(value = "/stream_chat",produces ="text/stream;charset=UTF-8")
    public Flux<String> test(@RequestParam(defaultValue="你是谁") String message) {
        return Flux.create(sink -> {
            qwenStreamingChatModel.chat(message, new StreamingChatResponseHandler() {
                @Override
                public void onPartialResponse(String partialResponse) {
                    sink.next(partialResponse);  // 逐次返回部分响应
                }

                @Override
                public void onCompleteResponse(ChatResponse completeResponse) {
                    sink.complete();  // 完成整个响应流
                }

                @Override
                public void onError(Throwable error) {
                    sink.error(error);  // 异常处理
                }
            });
        });
    }

就可以了。

相关推荐
学长毕设4 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw5 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号6 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场6 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠7 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David7 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
外收内放8 小时前
Python基础语法练习题(73)
java·前端·python
Wang's Blog8 小时前
Java 项目实战: 交友项目 - 环信后台发送消息测试
java·交友
用户3721574261358 小时前
Java 操作 Word 脚注和尾注:添加、读取与删除
java
小嘉丶学长8 小时前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节