ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

【Bedrock AgentCore】ストリーミング応答を試してみた

この記事を共有する

目次

はじめに

皆さんこんにちは!パーソル&サーバーワークスの小泉です。
Bedrock AgentCoreのupdateの内容で双方向ストリーミングに対応したという内容がありました。
双方向ストリーミングを試してみたかったですが、「そもそもストリーミング応答と非ストリーミング応答の違いをきちんと理解できていないかも?」と感じたため、まずは基本的な挙動を整理しつつ、実際に動作を確認してみました。
本記事では、ストリーミング/非ストリーミングの違いについて、サンプルコードを基に記載します。

ストリーミング応答とは

ストリーミング応答とは、AIモデルからの応答をリアルタイムに近いかたちで受け取ることができます。
非ストリーミング応答では、ユーザーがプロンプトを送信した後、AIモデルが完全な回答を生成し終わるまで待つ必要がありました。
一方、ストリーミング応答では、AIモデルが回答を生成するたびに小さな断片(トークン)を順次クライアントに送信します。
これにより、完全な回答が生成される前に、部分的な回答が表示されるため、ユーザーは待ち時間を短く感じられ体感的な応答速度が向上します。

コード例(Bedrock AgentCore用)

ストリーミング応答が有効な場合

from dotenv import load_dotenv
from strands import Agent
from strands.models import BedrockModel
from bedrock_agentcore import BedrockAgentCoreApp
load_dotenv()
app = BedrockAgentCoreApp()
bedrock_model = BedrockModel(
    region_name="us-west-2",
    model_id="us.anthropic.claude-sonnet-4-20250514-v1:0",
)
agent = Agent(
    model=bedrock_model,
    system_prompt="You are a helpful AI assistant"
)
@app.entrypoint
async def agent_invocation(payload):
    """Handler for agent invocation"""
    user_message = payload.get(
        "prompt", "No prompt found in input, please guide customer to create a json payload with prompt key"
    )
    stream = agent.stream_async(user_message)
    async for event in stream:
        print(event)
        yield (event)
if __name__ == "__main__":
    app.run()

ストリーミング応答が無効な場合

from dotenv import load_dotenv
from strands import Agent
from strands.models import BedrockModel
from bedrock_agentcore import BedrockAgentCoreApp
load_dotenv()
app = BedrockAgentCoreApp()
bedrock_model = BedrockModel(
    region_name="us-west-2",
    model_id="us.anthropic.claude-sonnet-4-20250514-v1:0",
)
agent = Agent(
    model=bedrock_model,
    system_prompt="You are a helpful AI assistant"
)
@app.entrypoint
def invoke(payload):
    """Process user input and return a response"""
    user_message = payload.get("prompt", "Hello")
    response = agent(user_message)
    return str(response)
if __name__ == "__main__":
    app.run()

試してみた

上記のコードをBedrock AgentCoreにデプロイしたので、違いを見ていきます。

ストリーミング応答

stream.png

非ストリーミング応答

nostream.png

画像ではわかりにくいですが、ストリーミング応答の場合は順次回答が生成されています。
一方、非ストリーミングでは完全な回答が出力されてからレスポンスが返ってきます。

まとめ

今後、AI Agentやチャットボットを作成する際にはユーザ体験を考えて、ストリーミング応答を意識したツールを作成しようと思いました。
次回はストリーミングレスポンスを試してみたいです。

参考

この記事は私が書きました

小泉 和貴

記事一覧

全国を旅行することを目標に、仕事を頑張っています。

小泉 和貴

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。