响应流式传输
本页面描述了使用低级 LLM API 进行响应流式传输。 关于高级 LLM API,请参见 AI 服务。
LLM 逐个生成文本标记,因此许多 LLM 提供商提供了一种方式,可以逐个标记地流式传输响应,而无需等待整个文本生成完成。 这显著提高了用户体验,因为用户无需等待未知时间,可以几乎立即开始阅读响应。
对于 ChatLanguageModel 和 LanguageModel 接口,存在相应的 StreamingChatLanguageModel 和 StreamingLanguageModel 接口。 这些接口具有类似的 API,但可以流式传输响应。 它们接受一个 StreamingResponseHandler 接口的实现作为参数。
java
public interface StreamingResponseHandler<T> {
void onNext(String token);
default void onComplete(Response<T> response) {}
void onError(Throwable error);
}通过实现 StreamingResponseHandler,您可以定义以下事件的操作:
- 当生成下一个标记时:调用
onNext(String token)方法。例如,您可以在标记可用时将其直接发送到 UI。 - 当 LLM 完成生成时:调用
onComplete(Response<T> response)方法。 其中,T表示StreamingChatLanguageModel的AiMessage,或StreamingLanguageModel的String。Response对象包含完整的响应。 - 当发生错误时:调用
onError(Throwable error)方法。
以下是如何使用 StreamingChatLanguageModel 实现流式传输的示例:
java
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();
}
});一种更简洁的流式传输响应方式是使用 LambdaStreamingResponseHandler 类。 该实用类提供了使用 lambda 表达式创建 StreamingResponseHandler 的静态方法。 通过 lambda 表达式流式传输响应的方法非常简单。 您只需调用 onNext() 静态方法,并传入定义标记操作的 lambda 表达式:
java
import static dev.langchain4j.model.LambdaStreamingResponseHandler.onNext;
model.generate("Tell me a joke", onNext(System.out::print));onNextAndError() 方法允许您同时定义 onNext() 和 onError() 事件的操作:
java
import static dev.langchain4j.model.LambdaStreamingResponseHandler.onNextAndError;
model.generate("Tell me a joke", onNextAndError(System.out::print, Throwable::printStackTrace));

评论区
欢迎分享你的思考、补充或问题。