ストリーミングレスポンス ─ LLMの出力をリアルタイムに受け取る
結論から言うと、ストリーミングを使うと「考え中…」の待ち時間がなくなり、LLMが生成しながら文字を流せるようになります。チャットAIがリアルタイムで文字が打ち出されているように見えるのはこの仕組みのおかげです。エージェントの応答をUIに反映する場面で必ず知っておきたい技術です。
なぜストリーミングが必要か
LLMは文章を一気に作るのではなく、トークン(単語や記号のかけら)を1つずつ確率的に選んで出力します。通常のAPIリクエストでは全トークンが生成し終わるまでサーバーが待ってからまとめて返すため、長い回答ほど待ち時間が長くなります。
ストリーミングを使うと、生成されたトークンをその都度クライアントへ送り続けます。ユーザーには最初の数文字がすぐ表示されるため、体感的な速度(知覚レイテンシ)が大幅に改善します。
仕組みはServer-Sent Events(SSE)
ストリーミングの通信には**Server-Sent Events(SSE)**という標準プロトコルが使われています。SSEはHTTP接続を維持したままサーバーからクライアントへ一方向にデータを"流し続ける"仕組みで、ブラウザに標準搭載されています。
Anthropic APIでは stream: true を指定するとSSEで応答が届きます。各イベントは次のような形式です。
event: content_block_delta
data: {"type":"content_block_delta","delta":{"type":"text_delta","text":"こんに"}}
event: content_block_delta
data: {"type":"content_block_delta","delta":{"type":"text_delta","text":"ちは"}}
event: message_stop
data: {"type":"message_stop"}
重要なイベント種別を覚えておきましょう。
| イベント | タイミング |
|---|---|
message_start |
応答全体の開始。モデル名や使用量の初期値を含む |
content_block_delta |
テキストやツール呼び出しの断片が届くたびに発火 |
message_delta |
終了理由・最終トークン使用量などを含む |
message_stop |
応答完了 |
SDKを使った実装例
Anthropic SDK(Python)を使えば、SSEの解析は不要です。
import anthropic
client = anthropic.Anthropic()
# stream コンテキストマネージャで受け取る
with client.messages.stream(
model="claude-opus-4-8",
max_tokens=1024,
messages=[{"role": "user", "content": "エージェントとは?"}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True) # トークンが届くたびに即出力
TypeScript SDKでも .on("text", callback) で同様に扱えます。内部でSSEの解析・再接続を自動処理してくれるため、アプリ側はテキストの断片を受け取るだけで済みます。
ストリーミングを使うべき場面
- チャットUI: ユーザーが即座に応答の一部を読み始められる
- 長文生成: 数百トークン以上の回答では待ち時間の差が顕著
- エージェントの思考過程の可視化: ツール選択や途中の推論をリアルタイムに表示
逆にバッチ処理や後続コードが完全なテキストを必要とする場面では、非ストリーミングの方がシンプルです。ストリーミングを選ぶかどうかは「途中結果を使うかどうか」で判断するとよいとされています。
ツール呼び出しとストリーミング
エージェントがツールを使う場合も、ストリーミングで対応できます。content_block_delta に tool_use 型のイベントが流れ、JSON形式の引数が少しずつ届きます。引数全体が揃ってから実行するため、ツール呼び出しのデルタは最終的に結合してから使います。
まとめ
- ストリーミングは
stream: trueを指定するだけで有効。内部はSSEプロトコル。 content_block_deltaイベントでテキストの断片が次々届き、画面に即表示できる。- AnthropicのSDKはSSEを抽象化してくれるためアプリ側の実装はシンプル。
- 長い回答や対話UIではストリーミングを基本とし、バッチ処理では非ストリーミングを選ぶと判断しやすい。