Langchaine4j 流式输出
大模型的流式输出是指大模型在生成文本或其他类型的数据时,不是等到整个生成过程完成后再一次性
返回所有内容,而是生成一部分就立即发送一部分给用户或下游系统,以逐步、逐块的方式返回结果。
这样,用户就不需要等待整个文本生成完成再看到结果。通过这种方式可以改善用户体验,因为用户不
需要等待太长时间,几乎可以立即开始阅读响应。
流式输出
添加流式输出依赖
<!--流式输出-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-reactor</artifactId>
</dependency>
使用流式输出模型
langchain4j:
# 接入阿里百炼平台
community:
dashscope:
streaming-chat-model:
api-key: ${ALI_BAILIAN_TOKEN}
model-name: qwen-plus
创建流式Assistant
@AiService(wiringMode = AiServiceWiringMode.EXPLICIT,
streamingChatModel = "qwenStreamingChatModel", // 这里注入 千问流式模型
chatMemory = "chatMemory")
public interface StreamAssistant {
// 使用WebFlux接受流式模型返回
Flux<String> chat( String userMessage);
}
测试流式输出
- 单元测试流式输出
@SpringBootTest
public class StreamModelTest {
@Resource
private StreamAssistant streamAssistant;
@Test
public void testStreamModel() throws InterruptedException {
Flux<String> responseFlux = streamAssistant.chat("1+2等于几,322233222345的平方根是多少?");
CountDownLatch latch = new CountDownLatch(1);
responseFlux
.doOnSubscribe(sub -> System.out.println("Subscribed to flux"))
.subscribe(
chunk -> System.out.println("Received: " + chunk),
throwable -> {
System.err.println("Error occurred: " + throwable.getMessage());
latch.countDown();
},
() -> {
System.out.println("Completed");
latch.countDown();
}
);
latch.await();
}
}
接口流式测试
创建对外接口:
@RestController @RequestMapping("/stream") public class StreamController { @Resource private StreamAssistant streamAssistant; @Operation(summary = "对话") @GetMapping(value = "/chat", produces = "text/stream;charset=utf-8") // 设置响应类型为流式文本,并指定字符集为UTF-8 public Flux<String> chat() { return streamAssistant.chat("1+2等于几,322233222345的平方根是多少?"); } }