Response Streaming
# 响应流式传输
本页面描述了使用低级 LLM API 进行响应流式传输。 关于高级 LLM API,请参见 AI 服务。
LLM 逐个生成文本标记,因此许多 LLM 提供商提供了一种方式,可以逐个标记地流式传输响应,而无需等待整个文本生成完成。 这显著提高了用户体验,因为用户无需等待未知时间,可以几乎立即开始阅读响应。
对于 ChatLanguageModel
和 LanguageModel
接口,存在相应的 StreamingChatLanguageModel
和 StreamingLanguageModel
接口。 这些接口具有类似的 API,但可以流式传输响应。 它们接受一个 StreamingResponseHandler
接口的实现作为参数。
public interface StreamingResponseHandler<T> {
void onNext(String token);
default void onComplete(Response<T> response) {}
void onError(Throwable error);
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
通过实现 StreamingResponseHandler
,您可以定义以下事件的操作:
- 当生成下一个标记时:调用
onNext(String token)
方法。例如,您可以在标记可用时将其直接发送到 UI。 - 当 LLM 完成生成时:调用
onComplete(Response<T> response)
方法。 其中,T
表示StreamingChatLanguageModel
的AiMessage
,或StreamingLanguageModel
的String
。Response
对象包含完整的响应。 - 当发生错误时:调用
onError(Throwable error)
方法。
以下是如何使用 StreamingChatLanguageModel
实现流式传输的示例:
StreamingChatLanguageModel model = OpenAiStreamingChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName(GPT_4_O_MINI)
.build();
String userMessage = "Tell me a joke";
model.generate(userMessage, new StreamingResponseHandler<AiMessage>() {
@Override
public void onNext(String token) {
System.out.println("onNext: " + token);
}
@Override
public void onComplete(Response<AiMessage> response) {
System.out.println("onComplete: " + response);
}
@Override
public void onError(Throwable error) {
error.printStackTrace();
}
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
一种更简洁的流式传输响应方式是使用 LambdaStreamingResponseHandler
类。 该实用类提供了使用 lambda 表达式创建 StreamingResponseHandler
的静态方法。 通过 lambda 表达式流式传输响应的方法非常简单。 您只需调用 onNext()
静态方法,并传入定义标记操作的 lambda 表达式:
import static dev.langchain4j.model.LambdaStreamingResponseHandler.onNext;
model.generate("Tell me a joke", onNext(System.out::print));
1
2
3
2
3
onNextAndError()
方法允许您同时定义 onNext()
和 onError()
事件的操作:
import static dev.langchain4j.model.LambdaStreamingResponseHandler.onNextAndError;
model.generate("Tell me a joke", onNextAndError(System.out::print, Throwable::printStackTrace));
1
2
3
2
3
编辑 (opens new window)
上次更新: 2025/04/01, 01:48:12