产生背景
LLM 生成完整回答通常需要一定时间,如果等所有 token 都生成完再返回,用户会感觉首包响应慢、等待时间长。
流式传输特点
模型每生成一部分 token,就可以立即推送给客户端,
客户端可以边接收边展示,无需等待完整回答全部生成。
优点:
1. 降低用户感知延迟;
2. 提升交互体验,类似 ChatGPT 逐字输出;
3. 适合长文本生成、代码生成、报告生成等耗时场景。
注意:
流式传输通常不能缩短模型生成完整内容的总耗时,
主要是让用户更早看到部分结果。
基础用法
OpenAiStreamingChatModel streamChatModel = OpenAiStreamingChatModel.builder()
.apiKey(System.getenv("AI_KEY"))
.modelName("qwen-plus")
.baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
.build();
//防止在发送消息后,还没等到响应程序就退出
CountDownLatch latch = new CountDownLatch(1);
//发送消息,并配置响应相关配置
streamChatModel.chat("你好呀", new StreamingChatResponseHandler() {
//在部分token响应时调用
@Override
public void onPartialResponse(String partialResponse) {
System.out.printf("part_response:"+partialResponse);
StreamingChatResponseHandler.super.onPartialResponse(partialResponse);
}
//在全部响应完后调用
@Override
public void onCompleteResponse(ChatResponse chatResponse) {
System.out.println("响应完成");
}
@Override
public void onError(Throwable throwable) {
}
});
//阻塞程序,防止退出
latch.await();
简化响应配置
方式1:
//使用LambdaStreamingResponseHandler.onPartialResponse简化响应配置(只配置在部分响应时的操作)
streamChatModel.chat("Tell me a joke", onPartialResponse(System.out::print));
方式2:
//使用LambdaStreamingResponseHandler.onPartialResponseAndError(配置在 部分响应 和 错误 时的操作)
streamChatModel.chat("Tell me a joke", onPartialResponseAndError(System.out::print, Throwable::printStackTrace));
评论区