【2025年最新】掌握响应流技术:提升LLM应用性能与用户体验 | LangChain4j教程

发布于:2025-03-02 ⋅ 阅读:(160) ⋅ 点赞:(0)

响应流 | LangChain4j

介绍

本页描述了如何使用低级别的LLM(大语言模型)API实现响应流。如果需要高级别的LLM API,请参阅AI服务。

LLMs以逐个token的方式生成文本,因此许多LLM提供商提供了逐个token流式传输响应的功能,而无需等待整个文本生成完成。这显著提升了用户体验,因为用户不需要等待未知的时间,并且可以几乎立即开始阅读响应。

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


StreamingResponseHandler 接口定义

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

public interface StreamingResponseHandler<T> {
    void onNext(String token); // 当下一个token生成时调用
    default void onComplete(Response<T> response) {} // 当LLM完成生成时调用
    void onError(Throwable error); // 当发生错误时调用
}
  • 当生成下一个token时onNext(String token) 方法会被调用。例如,您可以立即将token发送到UI。
  • 当LLM完成生成时onComplete(Response<T> response) 方法会被调用。这里的 TStreamingChatLanguageModel 中表示 AiMessage,在 StreamingLanguageModel 中表示 StringResponse 对象包含完整的响应。
  • 当发生错误时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();
    }
});

使用 Lambda 表达式简化流式传输

为了更简洁地实现流式传输,可以使用 LambdaStreamingResponseHandler 类。该工具类提供了静态方法,允许您使用 lambda 表达式创建 StreamingResponseHandler

使用 lambda 表达式流式传输响应非常简单。只需调用 onNext() 静态方法,并提供一个定义如何处理 token 的 lambda 表达式:

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

model.generate("Tell me a joke", onNext(System.out::print));

同时定义 onNextonError 操作

onNextAndError() 方法允许您同时定义 onNext()onError() 事件的操作:

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

model.generate("Tell me a joke", onNextAndError(System.out::print, Throwable::printStackTrace));

总结

通过响应流功能,LLM 可以逐个token生成文本并实时传递给用户,从而提升用户体验。无论是通过实现 StreamingResponseHandler 接口还是使用 LambdaStreamingResponseHandler 工具类,都可以灵活地处理流式传输的响应。



网站公告

今日签到

点亮在社区的每一天
去签到