使用Langchain4J整合springboot+流式数据响应示例

一、POM依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.3.8</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>ai.langchain</groupId>
	<artifactId>langcain-demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>langcain-demo</name>
	<description>Demo project for Spring Boot</description>
	<url/>
	<licenses>
		<license/>
	</licenses>
	<developers>
		<developer/>
	</developers>
	<scm>
		<connection/>
		<developerConnection/>
		<tag/>
		<url/>
	</scm>
	<properties>
		<java.version>17</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>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>
		<dependency>
			<groupId>dev.langchain4j</groupId>
			<artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
			<version>1.0.0-beta2</version>
		</dependency>
	</dependencies>

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

</project>

二、application.properties

spring.application.name=langcain-demo
server.port=8081
OPENAI_API_KEY=you-api-key
langchain4j.open-ai.streaming-chat-model.api-key=${OPENAI_API_KEY}
# 这里是使用阿里云的qwq-32b模型
langchain4j.open-ai.streaming-chat-model.base-url=https://dashscope.aliyuncs.com/compatible-mode/v1
langchain4j.open-ai.streaming-chat-model.model-name=qwq-32b
langchain4j.open-ai.streaming-chat-model.log-requests=true
langchain4j.open-ai.streaming-chat-model.log-responses=true

三、Controller

@RestController
public class ChatController {

    StreamingChatLanguageModel streamingLanguageModel;

    public ChatController(StreamingChatLanguageModel chatLanguageModel) {
        this.streamingLanguageModel = chatLanguageModel;
    }

    @GetMapping(value = "/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public SseEmitter model(@RequestParam(value = "message", defaultValue = "Hello") String message) {

        SseEmitter emitter = new SseEmitter();
        System.out.println("接收到请求");
        streamingLanguageModel.chat(message, new StreamingChatResponseHandler() {
            @Override
            public void onPartialResponse(String partialResponse) {
                try {
                    emitter.send(partialResponse);
                } catch (IOException e) {
                    emitter.complete();
                }
                System.out.println("partialResponse:" + partialResponse);
            }

            @Override
            public void onCompleteResponse(ChatResponse completeResponse) {
                emitter.complete();
            }

            @Override
            public void onError(Throwable error) {

            }
        });
        return emitter;
    }
<think>好的,用户问的是如何在LangChain4j中实现流式响应。首先,我得回忆一下LangChain4j的相关知识。LangChain4j是一个Java库,用于构建基于大型语言模型(LLM)的应用程序。流式响应通常指的是逐步获取生成的文本,而不是等待整个结果返回,这对于提升用户体验很重要,特别是在生成较长的响应时。首先,我需要确定LangChain4j是否支持流式处理。根据之前的了解,LangChain4j的模型接口如ChatLanguageModel可能有一个返回流的方法,比如streaming()。可能还需要使用特定的请求和响应类来处理流式数据。例如,使用StreamingResponseHandler来处理分块接收的数据。 然后,我需要考虑具体的代码结构。首先创建模型实例,比如OpenAiChatModel,然后调用生成方法,并传递一个处理流式响应的回调。可能还需要设置API密钥和其他参数,如temperature和timeout。 接下来,要确保代码示例的正确性。例如,使用OpenAiStreamingResponseHandler来监听每个token的到达,并在完成或出错时处理相应的事件。可能还需要处理异常情况,比如网络错误或API限制。 另外,用户可能需要了解如何自定义处理逻辑,比如将流式数据发送到前端或保存到数据库。这时候需要修改handle()方法中的逻辑,比如将每个token添加到StringBuilder中,并在完成后处理整个响应。 最后,需要验证代码是否确实实现了流式响应。比如,检查是否每次接收到token时都会立即打印出来,而不是等待所有内容生成完毕。同时,需要确保正确关闭资源,比如在onComplete()中处理后续步骤。 总结步骤:引入依赖、创建模型实例、实现处理程序、调用流式方法。并注意处理各个事件回调,如onNext、onComplete、onError。</think>在LangChain4j中实现流式响应需要使用`StreamingResponseHandler`,以下是完整示例代码: ```java import dev.langchain4j.model.openai.OpenAiChatModel; import dev.langchain4j.model.openai.OpenAiStreamingResponseHandler; import dev.langchain4j.model.output.Response; import java.util.concurrent.CompletableFuture; public class StreamResponseExample { public static void main(String[] args) { OpenAiChatModel model = OpenAiChatModel.builder() .apiKey("your-api-key") .temperature(0.7) .timeout(60) .build(); String prompt = "解释量子计算的基本原理"; CompletableFuture<Response<String>> future = model.generate( prompt, new OpenAiStreamingResponseHandler<String>() { final StringBuilder answerBuilder = new StringBuilder(); @Override public void onNext(String token) { // 实时处理每个token System.out.print(token); answerBuilder.append(token); } @Override public void onComplete(Response<String> response) { // 完整响应处理 System.out.println("\n\n完整响应:"); System.out.println(answerBuilder.toString()); } @Override public void onError(Throwable error) { System.err.println("发生错误: " + error.getMessage()); } }); // 等待异步操作完成 future.join(); } } ``` 代码解释: 1. 创建`OpenAiChatModel`实例时需配置API密钥和其他参数 2. `generate()`方法的第二个参数需要实现`StreamingResponseHandler`接口 3. `onNext()`方法会实时接收每个生成的token 4. `onComplete()`在所有内容生成完成后触发 5. `onError()`处理可能发生的异常 流式响应实现的关键点: - 使用支持流式的模型实现(如OpenAI) - 实现`StreamingResponseHandler`的三个回调方法 - 异步处理机制(使用CompletableFuture) - 实时内容拼接和错误处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值