Response Streaming

本页介绍使用低级 LLM API 的响应流式处理。有关高级 LLM API,请参阅 AI 服务 https://docs.langchain4j.dev/tutorials/ai-services/#streaming。

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

对于 ChatLanguageModel 和 LanguageModel 接口,有相应的 StreamingChatLanguageModel 和 StreamingLanguageModel 接口。这些具有类似的 API,但可以流式传输响应。它们接受 StreamingChatResponseHandler 接口的实现作为参数。

public interface StreamingChatResponseHandler {

    void onPartialResponse(String partialResponse);

    void onCompleteResponse(ChatResponse completeResponse);

    void onError(Throwable error);
}

通过实现 StreamingChatResponseHandler,您可以为以下事件定义作:

  • 当生成下一个部分响应时: onPartialResponse(String partialResponse) 被调用。部分响应可以由单个或多个标记组成。例如,您可以在令牌可用后立即将其直接发送到 UI。
  • 当 LLM has completed generation: onCompleteResponse(ChatResponse completeResponse) 被调用时。ChatResponse 对象包含完整的响应 (AiMessage) 以及 ChatResponseMetadata。
  • 发生错误时:调用 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.chat(userMessage, new StreamingChatResponseHandler() {

    @Override
    public void onPartialResponse(String partialResponse) {
        System.out.println("onPartialResponse: " + partialResponse);
    }

    @Override
    public void onCompleteResponse(ChatResponse completeResponse) {
        System.out.println("onCompleteResponse: " + completeResponse);
    }

    @Override
    public void onError(Throwable error) {
        error.printStackTrace();
    }
});

流式传输响应的一种更紧凑的方法是使用 LambdaStreamingResponseHandler class。此实用程序类提供静态方法,以使用 lambda 表达式创建 StreamingChatResponseHandler。使用 lambda 流式传输响应的方法非常简单。您只需使用 lambda 表达式调用 onPartialResponse() 静态方法,该表达式定义如何处理部分响应:

import static dev.langchain4j.model.LambdaStreamingResponseHandler.onPartialResponse;

model.chat("Tell me a joke", onPartialResponse(System.out::print));

onPartialResponseAndError() 方法允许您为 onPartialResponse() 和 onError() 事件定义作:

import static dev.langchain4j.model.LambdaStreamingResponseHandler.onPartialResponseAndError;

model.chat("Tell me a joke", onPartialResponseAndError(System.out::print, Throwable::printStackTrace));
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐