レスポンスストリーミング
このページでは低レベルLLM APIによるレスポンスストリーミングについて説明します。 高レベルLLM APIについてはAIサービスをご覧ください。
LLMはテキストを1トークンずつ生成するため、多くのLLMプロバイダーはテキスト全体が生成されるのを待つのではなく、 トークンごとにレスポンスをストリーミングする方法を提供しています。 これにより、ユーザーは未知の時間待つ必要がなく、ほぼ即座にレスポンスの読み始めることができるため、 ユーザーエクスペリエンスが大幅に向上します。
ChatModelとLanguageModelインターフェースには、対応する
StreamingChatModelとStreamingLanguageModelインターフェースがあります。
これらは類似したAPIを持ちますが、レスポンスをストリーミングすることができます。
これらは引数としてStreamingChatResponseHandlerインターフェースの実装を受け取ります。
public interface StreamingChatResponseHandler {
void onPartialResponse(String partialResponse);
void onCompleteResponse(ChatResponse completeResponse);
void onError(Throwable error);
}
StreamingChatResponseHandlerを実装することで、以下のイベントに対するアクションを定義できます:
- 次の部分的なレスポンスが生成されたとき:
onPartialResponse(String partialResponse)が呼び出されます。 部分的なレスポンスは単一または複数のトークンで構成されることがあります。 例えば、トークンが利用可能になり次第、直接UIに送信することができます。 - LLMが生成を完了したとき:
onCompleteResponse(ChatResponse completeResponse)が呼び出されます。ChatResponseオブジェクトには完全なレスポンス(AiMessage)とChatResponseMetadataが含まれています。 - エラーが発生したとき:
onError(Throwable error)が呼び出されます。
以下はStreamingChatModelでストリーミングを実装する方法の例です:
StreamingChatModel model = OpenAiStreamingChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName(GPT_4_O_MINI)
.build();
String userMessage = "冗談を教えて";
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クラスを使用することです。
このユーティリティクラスは、ラムダ式を使用してStreamingChatResponseHandlerを作成する静的メソッドを提供します。
ラムダを使用してレスポンスをストリーミングする方法は非常に簡単です。
onPartialResponse()静的メソッドを部分的なレスポンスの処理方法を定義するラムダ式と共に呼び出すだけです:
import static dev.langchain4j.model.LambdaStreamingResponseHandler.onPartialResponse;
model.chat("冗談を教えて", onPartialResponse(System.out::print));
onPartialResponseAndError()メソッドを使用すると、onPartialResponse()とonError()の両方のイベントに対するアクションを定義できます:
import static dev.langchain4j.model.LambdaStreamingResponseHandler.onPartialResponseAndError;
model.chat("冗談を教えて", onPartialResponseAndError(System.out::print, Throwable::printStackTrace));