LangChain4j 快速入门:流式响应(Streaming Response)

LLM 每次生成一个Token,因此许多 LLM 提供商都提供逐个Token的流式传输响应方法,而不是等待生成整个文本。这显著改善了用户体验,因为用户无需等待未知的时间,几乎可以立即开始阅读响应。

对于ChatLanguageModelLanguageModel接口,有对应的 StreamingChatLanguageModelStreamingLanguageModel接口。它们具有类似的 API,但可以流式传输响应。它们接受StreamingResponseHandler接口的实现作为参数。

public interface StreamingResponseHandler<T> {

    void onNext(String token);

    default void onComplete(Response<T> response) {}

    void onError(Throwable error);
}

通过实现 StreamingResponseHandler,你可以为以下事件定义操作:

  1. 生成下一个令牌时onNext(String token) 被调用。例如,您可以在令牌可用时立即将其直接发送到 UI。
  2. 当 LLM 完成生成时onComplete(Response<T> response) 被调用。这里,T 在使用 StreamingChatLanguageModel 代表 AiMessage,在使用 StreamingLanguageModel 的情况下代表 String 。Response 对象包含完整的响应。
  3. 当发生错误时:onError(Throwable error) 被调用。

下面是一个如何使用StreamingChatLanguageModel实现流式传输的示例:

StreamingChatLanguageModel model = OpenAiStreamingChatModel.withApiKey(System.getenv("OPENAI_API_KEY"));

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();
    }
});

https://docs.langchain4j.dev/tutorials/response-streaming/

作者:Jeebiz  创建时间:2024-08-18 23:47
最后编辑:Jeebiz  更新时间:2024-08-18 23:51