[レポート]Nova Sonic、Bedrock AgentCore、MCPを活用したエージェント型音声チャットアプリの構築 (AIM302) #AWSreInvent

[レポート]Nova Sonic、Bedrock AgentCore、MCPを活用したエージェント型音声チャットアプリの構築 (AIM302) #AWSreInvent

2025.12.04

こんにちは、AI事業本部の洲崎です。
AWS re:Invent 2025に参加しています!
今回は「Build Agentic Voice Chat with Nova Sonic, Bedrock AgentCore, MCP & more(AIM302)」というワークショップに参加してきました。

ワークショップ概要

このワークショップでは、Amazon Nova Sonicを使った音声入力と、Bedrock Knowledge BasesやAgentCoreを組み合わせたエージェント型の音声チャットシステムを構築しました。

ワークショップの内容は以下で公開されているため、詳細な手順はそちらをご参照ください。
このブログでは実際に構築してみた体験や感想をお伝えします。
https://catalog.workshops.aws/amazon-nova-sonic-s2s/en-US
https://github.com/aws-samples/amazon-nova-samples/tree/main/speech-to-speech

構築した画面

ワークショップで構築した画面はこちらです。
試しに「Start Conversation」を押して、マイクに「hello」と話しかけると、リアルタイムで音声による返信が返ってきました。
スクリーンショット 2025-12-02 15.55.24
右側の「Events」パネルでは、リアルタイムでやり取りされるJSONログを確認することができます。
スクリーンショット 2025-12-02 15.56.56

Tool Use:日時取得

Nova SonicのTool Use機能を利用して、「今の時間は?」と聞いてみると、正確な情報が返ってきました。
スクリーンショット 2025-12-02 16.00.46

参考までに、ツールが組み込まれているコードの一部は以下です。
UTC時刻を取得し、曜日と日時を含む形式で返却する内容です。

# Simple toolUse to get system time in UTC
if toolName == "getdatetool":
    from datetime import datetime, timezone
    result = datetime.now(timezone.utc).strftime('%A, %Y-%m-%d %H-%M-%S')

Knowledge Basesとの連携

次に、Bedrock Knowledge Basesと連携してRAGを試してみます。

データソースの同期

ワークショップではすでに環境が用意されているため、「同期」をクリックしてデータソースを最新化します。
スクリーンショット 2025-12-02 16.07.29

マネジメントコンソールでのテスト

マネジメントコンソール上で、モデルを設定してテストを行います。
スクリーンショット 2025-12-02 16.12.36

RAGテスト

テストで問題がなければ、Nova Sonicで「What is Amazon Nova?」と聞いてみます。
すると、Knowledge Bases経由でデータを参照して回答してくれました。
スクリーンショット 2025-12-02 16.30.24

参考までに、実装コードの一部を紹介します。
ツールが呼ばれた際、クエリを受け取ってKnowledge Basesから関連情報を検索します。
ツール呼び出し部分

# Bedrock Knowledge Bases (RAG)
if toolName == "getkbtool":
    result = kb.retrieve_kb(content)

Knowledge Bases検索の実装

def retrieve_kb(query):
    results = []
    # Bedrock Agent Runtimeでナレッジベースを検索
    response = bedrock_agent_runtime.retrieve(
        knowledgeBaseId=KB_ID,
        retrievalConfiguration={
            'vectorSearchConfiguration': {
                'numberOfResults': 1,  # 取得件数
                'overrideSearchType': 'SEMANTIC',  # セマンティック検索
            }
        },
        retrievalQuery={
            'text': query
        }
    )
    # 検索結果からテキストを抽出
    if "retrievalResults" in response:
        for r in response["retrievalResults"]:
            results.append(r["content"]["text"])
    return results

この実装により、ユーザーの質問に対して関連するドキュメントを動的に取得し、LLMに渡すことができます。

MCPとの連携

最後に、MCPを使った外部サービス連携を試してみます。

MCP設定

右上の設定ボタンからMCPの設定を行います。
スクリーンショット 2025-12-02 16.32.34
今回はAWS Location Service MCP サーバーを利用します。
ツール定義は以下です。

{
    "toolSpec": {
        "name": "locationMcpTool",
        "description": "Access location services to find places, addresses, nearby locations.",
        "inputSchema": {
            "json": JSON.stringify({
                "type": "object",
                "properties": {
                  "tool": {
                    "type": "string",
                    "description": "The function name to search the location service. One of: search_places, get_place, search_nearby, reverse_geocode",
                  },
                  "query": {
                    "type": "string",
                    "description": "The search query to find relevant information"
                  }
                },
                "required": ["query"]
              }
            )
          }
    }
}

テスト実行

「What is the largest shopping mall in New York City?」と質問してみます。
すると、場所を検索して、New York Cityの近くにあるショッピングモールを教えてくれました。
スクリーンショット 2025-12-02 16.33.43

最後に

音声入力から始まり、RAGやMCPなどの複数のツールを組み合わせて回答を得る一連の流れを体験できました。
これらの技術の組み合わせはとても強力だと感じました。音声エージェントを作る際には参考にしてみてください。

また、ワークショップ自体はRAGやMCP以外にも、StrandsAgentとの統合や、AgentCoreのマルチエージェント実装もあるので、興味がある方はぜひ試してみてください。

ではまた!AI事業本部の洲崎でした。

この記事をシェアする

FacebookHatena blogX

関連記事