一、简单介绍
LLM每次生成一个令牌,所以基本上LLM都会提供一种逐个令牌传输响应的方法,而不是等待整个文本的生成。这可以极大地改善用户体验,因为此时用户不需要待待未知的时间,几乎可以立即开始阅读响应。
对于ChatLanguageModel和LanguageModel接口有对应的StreamingChatLanguageModel和StreamingLanguageModel接口。他们的API是类似的,但是可以流式传输响应。
对于流式响应的Model,它们接收StreamResponseHandler接口的实现作为参数。在这个实现中我们可以对于流式响应的结果进行处理。
下面是关于StreamingResponseHandler<T>的定义
public interface StreamingResponseHandler<T> {
void onNext(String token);
default void onComplete(Response<T> response) {}
void onError(Throwable error);
}
通过实现StreamingResponseHandler,可以为以下事件定义动作:
- 当生成下一个令牌时会调用onNext(String token),这样的话可以在令牌可用后立即发送到UI
- 当LLM生成完成时,调用onComplete(Response<T> response),这里的T表示StreamingChatLanguageModel中的AiMessage,所以response中包含了完整响应
- 当发生错误时,调用onError(Throwable error)
二、示例
我们如果需要使用到流式响应,我们需要添加依赖
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-reactor</artifactId>
</dependency>
由于此时我们做流式响应不再是使用ChatLanguageModel而是StreamingChatLanguageModel,而我们又导入了SpringBo