 Response Streaming
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/10/15, 09:17:23
