目次

Amazon Lex V2 完全ガイド v2.0

初心者から実務者向けの包括的解説

Amazon Lex V2 は、自然言語の対話インターフェース(チャットボット・音声ボット)を構築するAWSサービスです。インテント・スロット・ダイアログフローで会話を定義し、Lambda フルフィルメントでビジネスロジックを実行します。Alexa と同じ ASR(自動音声認識)・NLU(自然言語理解)エンジンを使用し、Amazon Connect との統合でコールセンター自動化を実現します。本ドキュメントは、Lex V2 の概念・アーキテクチャ・設計パターン・エコシステム・2025-2026 の最新動向を体系的に解説する包括的ガイドです。

ドキュメントの目的

本ガイドは以下を対象としています。

  • 初心者向け: Lex とは何か、インテント・スロットの基本を学びたい方
  • 開発者向け: Lambda フルフィルメント・Bedrock 統合の実装
  • コールセンター向け: Amazon Connect 統合による IVR 自動化
  • プロダクトマネージャー向け: Bedrock との組み合わせによる次世代 UX
  • 意思決定者向け: Dialogflow CX・Microsoft Bot Framework・Rasa との比較

2026 年の Lex V2 エコシステム

  • Assisted NLU: LLM で少量学習データでも高精度なインテント分類
  • 多言語カスタムボキャブラリ: 17 言語での音声認識精度向上
  • Multi-Region Replication: 複数リージョンへのボット自動複製
  • Bedrock Agents との統合: 生成 AI で柔軟なダイアログ実現
  • Amazon Q in Connect との統合: AI によるエージェントアシスタンス
  • ストリーミング会話: リアルタイムテキスト・音声ストリーミング対応

定義

AWS 公式による定義:

“Amazon Lex V2 is an AWS service for building conversational interfaces using voice and text. It provides the deep functionality of natural language understanding (NLU) and automatic speech recognition (ASR).”

特徴:

  • インテント・スロット設計: 構造化された対話フロー
  • Alexa エンジン: 高精度な自然言語理解・音声認識
  • Lambda フルフィルメント: ビジネスロジック実装
  • Amazon Connect 統合: コールセンター IVR 自動化
  • Bedrock 統合: 生成 AI による柔軟な回答生成

目次

  1. 概要
  2. Lex が解決する課題
  3. 主な特徴
  4. 基本概念
  5. Lex V1 vs V2
  6. アーキテクチャ
  7. Bot・Locale・Intent・Slot
  8. Lambda フルフィルメント
  9. Amazon Connect との統合
  10. Bedrock 統合
  11. 主要ユースケース
  12. 設定・操作の具体例
  13. CLI 操作
  14. SDK 実装例
  15. IaC (CloudFormation/Terraform)
  16. 類似サービス比較表
  17. ベストプラクティス
  18. トラブルシューティング
  19. セキュリティ・コンプライアンス
  20. パフォーマンスチューニング
  21. コスト最適化
  22. 2025-2026 最新動向
  23. 学習リソース・参考文献
  24. 実装例・チェックリスト
  25. まとめ

概要

初心者向けメモ: Lex は「チャットボット・音声ボットを構築するサービス」です。Bedrock は「自由形式の生成 AI 対話」に向いていますが、Lex は「特定のタスク完了(注文・予約・問い合わせ)」に向いています。Amazon Connect(コールセンター)との統合で IVR 自動化が標準的です。

Lex V2 は以下を実現します:

  • インテント・スロット設計: 会話フローを構造化
  • Alexa エンジン: 高精度な NLU・ASR
  • Lambda フルフィルメント: ビジネスロジック実行
  • Connect 統合: コールセンター自動化
  • Bedrock 統合: 生成 AI による柔軟な回答
  • マルチチャネル: テキスト・音声・Slack・Web

Lex が解決する課題

1. コールセンターの自動応答が困難

課題: IVR(自動音声応答)をビジネスロジックと連携させるのは複雑・コスト大

Lex + Connect の解決:

顧客通話 → Amazon Connect IVR
  ↓
Lex ボット「注文のキャンセルをしたい」を理解
  ↓
Lambda フルフィルメント(注文 DB キャンセル)
  ↓
「キャンセルが完了しました」と音声応答

2. チャットボット実装がコード量多い

課題: テキスト入力の解析・インテント判定・フルフィルメント をすべて自分で実装?

Lex の解決: インテント・スロット定義で NLU 自動構築

3. 多言語・多方言対応が難しい

課題: 「注文したい」「商品を頼みたい」「買いたい」など、同一インテントの複数表現

Lex の解決: 少数のサンプル発話で Assisted NLU が複数表現を理解


主な特徴

特徴 説明
インテント・スロット 構造化された会話フロー
Alexa ASR/NLU 高精度な音声認識・自然言語理解
Lambda 統合 バックエンド処理・DB クエリ
Amazon Connect コールセンター IVR 統合
Bedrock 統合 生成 AI による柔軟な回答
マルチチャネル テキスト・音声・Slack・Facebook
Assisted NLU LLM による少量データでの高精度
条件分岐 Lambda なしでダイアログ制御
SSML 音声の発音・ポーズ・感情制御
リアルタイムストリーミング 音声ストリーミング入力対応

基本概念

Bot(ボット)

Bot: OrderPizza
  ├── Locale: ja_JP (日本語)
  │   ├── Intent: OrderPizza
  │   │   ├── Slot: PizzaSize(S/M/L)
  │   │   └── Slot: PizzaType(Margherita 等)
  │   │
  │   └── Intent: CancelOrder
  │       └── Slot: OrderId
  │
  └── Locale: en_US (英語)
      ├── Intent: OrderPizza
      └── Intent: CancelOrder

Intent(意図)

ユーザーが何をしたいか

Intent: BookFlight
  サンプル発話:
    - "フライトを予約したい"
    - "来週月曜の便を探してほしい"
    - "東京から大阪への便"

Slot(スロット)

インテント実行に必要なパラメータ

Intent: BookFlight
  ├── Slot: DepartureCity(出発地)
  │   Type: AMAZON.City
  │   IsRequired: true
  │
  ├── Slot: DestinationCity(目的地)
  │   Type: AMAZON.City
  │   IsRequired: true
  │
  └── Slot: TravelDate(出発日)
    Type: AMAZON.Date
    IsRequired: true

Fulfillment(フルフィルメント)

すべてのスロットが揃ったらビジネスロジック実行

ユーザー: "東京から大阪へ来週月曜"
  ↓ (全スロット確認)
DepartureCity: Tokyo ✅
DestinationCity: Osaka ✅
TravelDate: 2026-05-05 ✅
  ↓
Lambda フルフィルメント実行
  → 航空券 DB クエリ・予約処理
  ↓
"東京から大阪への来週月曜の便が見つかりました..."

Lex V1 vs V2

観点 V1 V2
設定 JSON 複雑 コンソール・ビジュアル
マルチ言語 別個 Bot 1 Bot で複数 Locale
ダイアログ管理 Lambda 依存 条件分岐(Lambda 不要)
Slot 検証 Lambda で実装 ビルトイン検証
テスト機能 限定的 チャット・音声テスト
推奨 レガシー 新規プロジェクト
サポート 段階的廃止予定 最新・推奨

アーキテクチャ

graph TB
    User["ユーザー<br/>(テキスト/音声)"]
    
    subgraph "Amazon Lex V2"
        ASR["ASR<br/>(音声認識)"]
        NLU["NLU<br/>(自然言語理解)"]
        Dialog["Dialog Manager<br/>(ダイアログ管理)"]
    end
    
    Lambda["Lambda<br/>(フルフィルメント)"]
    
    DB["バックエンド<br/>(DB/API)"]
    
    Connect["Amazon Connect<br/>(コールセンター)"]
    
    Bedrock["Amazon Bedrock<br/>(生成 AI)"]
    
    Channels["Slack<br/>Facebook<br/>Web UI"]
    
    User -->|音声| ASR
    User -->|テキスト| NLU
    
    ASR --> NLU
    NLU --> Dialog
    
    Dialog -->|フルフィルメント| Lambda
    Lambda -->|クエリ| DB
    
    Dialog -->|フォールバック| Bedrock
    
    Connect -->|IVR統合| Dialog
    
    Dialog -->|出力| Channels

Bot・Locale・Intent・Slot

Bot の構成

# Bot 作成
bot = {
    'botName': 'OrderBot',
    'botLocales': [
        {
            'localeId': 'ja_JP',
            'intents': [
                {
                    'intentName': 'OrderPizza',
                    'sampleUtterances': [
                        '{"utterance": "ピザを注文したい"}',
                        '{"utterance": "マルゲリータを注文"},',
                    ],
                    'slotPriorities': [
                        {'slotName': 'PizzaSize', 'priority': 1},
                        {'slotName': 'PizzaType', 'priority': 2}
                    ]
                }
            ]
        }
    ]
}

Slot Type(カスタム)

# カスタムスロットタイプ
slot_type = {
    'slotTypeName': 'PizzaSizeType',
    'slotTypeValues': [
        {'sampleValue': {'rawValue': 'S'}, 'synonyms': ['スモール', '小']}},
        {'sampleValue': {'rawValue': 'M'}, 'synonyms': ['ミディアム', '中']}},
        {'sampleValue': {'rawValue': 'L'}, 'synonyms': ['ラージ', '大']}},
    ]
}

Lambda フルフィルメント

Python 実装

def lambda_handler(event, context):
    intent_name = event['sessionState']['intent']['name']
    slots = event['sessionState']['intent']['slots']
    
    if intent_name == 'OrderPizza':
        pizza_size = slots['PizzaSize']['value']['interpretedValue']
        pizza_type = slots['PizzaType']['value']['interpretedValue']
        
        # ビジネスロジック
        order_id = place_pizza_order(pizza_type, pizza_size)
        
        return {
            'sessionState': {
                'dialogAction': {'type': 'Close'},
                'intent': {'name': intent_name, 'state': 'Fulfilled'}
            },
            'messages': [{
                'contentType': 'PlainText',
                'content': f'ピザを注文しました。注文番号: {order_id}'
            }]
        }

def place_pizza_order(pizza_type, size):
    # DB に注文情報を保存
    order_id = str(uuid.uuid4())
    # ... DB insert
    return order_id

フォールバック・エラーハンドリング

def lambda_handler(event, context):
    try:
        # フルフィルメント処理
        ...
    except Exception as e:
        return {
            'sessionState': {
                'dialogAction': {'type': 'ElicitIntent'},
                'intent': {...}
            },
            'messages': [{
                'contentType': 'PlainText',
                'content': '申し訳ございません。問題が発生しました。'
            }]
        }

Amazon Connect との統合

IVR ボット統合フロー

顧客: "注文のキャンセルをしたい"
  ↓ (Amazon Connect 着信)
Get customer input ブロック(Lex ボット実行)
  ↓
Lex: Intent = CancelOrder → 注文 ID スロット確認
  ↓
Lambda: DB で注文をキャンセル
  ↓
Lex: "キャンセルが完了しました"
  ↓
Connect: 有人オペレーターに転送(必要に応じて)
  ↓
通話終了

Connect フロー定義

{
  "Version": "2019-10-30",
  "StartAction": "12345678-1234-1234-1234-123456789012",
  "Metadata": {...},
  "Actions": [
    {
      "Identifier": "LexBotAction",
      "Type": "TransferContactToLex",
      "Parameters": {
        "LexBotAliasArn": "arn:aws:lex:us-east-1:123456789012:bot-alias/OrderBot/ALAXXXXX",
        "LexRegion": "us-east-1"
      }
    }
  ]
}

Bedrock 統合

Generative AI + Structured Dialog の融合

ユーザー: "おすすめのピザを教えて"
  ↓
Lex: 対応インテントがない → Bedrock にフォールバック
  ↓
Bedrock(Claude): "マルゲリータとカルボナーラがおすすめです..."
  ↓
ユーザー: "ピザを注文したい"
  ↓
Lex: Intent = OrderPizza → スロット確認
  → Lambda フルフィルメント

実装例

def lambda_handler(event, context):
    intent_name = event['sessionState']['intent']['name']
    
    # 既知インテント
    if intent_name == 'OrderPizza':
        return handle_order_pizza(event)
    
    # 未知の質問 → Bedrock
    elif intent_name == 'AMAZON.FallbackIntent':
        return handle_fallback_with_bedrock(event)

def handle_fallback_with_bedrock(event):
    input_text = event['inputTranscript']
    
    # Bedrock に質問
    response = bedrock_client.invoke_model(
        modelId='anthropic.claude-3-sonnet',
        body=json.dumps({
            'messages': [
                {'role': 'user', 'content': input_text}
            ],
            'max_tokens': 500
        })
    )
    
    bedrock_response = json.loads(response['body'].read())
    
    return {
        'sessionState': {
            'dialogAction': {'type': 'Close'},
            'intent': {...}
        },
        'messages': [{
            'contentType': 'PlainText',
            'content': bedrock_response['content'][0]['text']
        }]
    }

主要ユースケース

  1. コールセンター IVR 自動化(Amazon Connect)

    • 「注文確認」「配送状況照会」「キャンセル受付」を自動対応
  2. 銀行モバイルアプリ チャットボット

    • 残高照会・振込・カード利用停止を自然言語で処理
  3. EC サイト サポート自動化

    • 返品手続き・商品問い合わせ・サイズ確認
  4. 医療機関 予約システム

    • 患者が電話で「来週月曜午前内科」と話すだけで予約完了
  5. ホテル・飲食店 予約ボット

    • テキスト・音声で予約・キャンセル処理
  6. HR チャットボット

    • 有給申請・福利厚生問い合わせ・方針確認
  7. IoT デバイス制御

    • スマートホームで「リビングの照明をつけて」と音声指示
  8. 多言語カスタマーサポート

    • 17 言語での自動応答

設定・操作の具体例

コンソールでの Bot 作成

  1. Bot 新規作成

    Bot name: OrderBot
    Runtime role: AWSLexBotRole
    COPPA: No
    
  2. Locale 追加(ja_JP)

    Locale: ja_JP (Japanese)
    Language model: Neural
    
  3. Intent 作成:OrderPizza

    Intent name: OrderPizza
    Sample utterances:
      - "ピザを注文したい"
      - "マルゲリータを頼みたい"
    
  4. Slot 追加

    Slot name: PizzaSize
    Type: AMAZON.AlphaNumeric
    IsRequired: true
    
    Slot name: PizzaType
    Type: Custom (カスタム)
    IsRequired: true
    
  5. Fulfillment

    Fulfillment type: Lambda
    Lambda function: OrderPizzaFulfillment
    

CLI 操作

Bot 作成

aws lexv2-models create-bot \
  --bot-name OrderBot \
  --role-arn arn:aws:iam::123456789012:role/LexBotRole \
  --data-privacy '{"ChildDirected": false}'

Intent 作成

aws lexv2-models create-intent \
  --bot-id <bot-id> \
  --bot-version DRAFT \
  --locale-id ja_JP \
  --intent-name OrderPizza \
  --sample-utterance-specification '[
    {"utterance": {"rawValue": "ピザを注文したい"}}
  ]'

Slot 作成

aws lexv2-models create-slot \
  --bot-id <bot-id> \
  --bot-version DRAFT \
  --locale-id ja_JP \
  --intent-id <intent-id> \
  --slot-name PizzaSize \
  --slot-type-id AMAZON.AlphaNumeric \
  --value-elicitation-setting-prompt-specification '{
    "messageGroupsList": [
      {"message": {"plainTextMessage": {"value": "どのサイズですか?"}}}
    ]
  }'

Bot ビルド・テスト

# Bot ビルド
aws lexv2-models build-bot-locale \
  --bot-id <bot-id> \
  --bot-version DRAFT \
  --locale-id ja_JP

# Bot テスト
aws lexv2-runtime recognize-text \
  --bot-id <bot-id> \
  --bot-alias-id <alias-id> \
  --locale-id ja_JP \
  --session-id user-12345 \
  --text "ピザを注文したい"

SDK 実装例

Python (Boto3)

import boto3
import json

lexv2_client = boto3.client('lexv2-models', region_name='us-east-1')
lexv2_runtime = boto3.client('lexv2-runtime', region_name='us-east-1')

# テキスト入力でボット実行
def chat_with_bot(bot_id, alias_id, locale_id, user_input):
    response = lexv2_runtime.recognize_text(
        botId=bot_id,
        botAliasId=alias_id,
        localeId=locale_id,
        sessionId='user-123',
        text=user_input
    )
    
    print(f"Bot response: {response['messages'][0]['content']}")
    print(f"Intent: {response['sessionState']['intent']['name']}")
    return response

# 音声入力でボット実行
def voice_chat_with_bot(bot_id, alias_id, locale_id, audio_bytes):
    response = lexv2_runtime.recognize_speech(
        botId=bot_id,
        botAliasId=alias_id,
        localeId=locale_id,
        sessionId='user-123',
        requestPayload={
            'audioStream': audio_bytes
        }
    )
    
    print(f"Recognized text: {response['inputTranscript']}")
    print(f"Bot response: {response['messages'][0]['content']}")
    return response

# 使用例
chat_with_bot('bot-id', 'ALAXXXXX', 'ja_JP', 'ピザを注文したい')

Node.js

const AWS = require('aws-sdk');

const lexv2Runtime = new AWS.LexRuntimeV2({region: 'us-east-1'});

async function chatWithBot(botId, aliasId, localeId, userInput) {
    const params = {
        botId: botId,
        botAliasId: aliasId,
        localeId: localeId,
        sessionId: 'user-123',
        text: userInput
    };
    
    try {
        const response = await lexv2Runtime.recognizeText(params).promise();
        console.log('Bot response:', response.messages[0].content);
        console.log('Intent:', response.sessionState.intent.name);
        return response;
    } catch (error) {
        console.error('Error:', error);
    }
}

chatWithBot('bot-id', 'ALAXXXXX', 'ja_JP', 'ピザを注文したい');

IaC (CloudFormation/Terraform)

CloudFormation

AWSTemplateFormatVersion: '2010-09-09'
Description: 'Amazon Lex V2 Bot'

Resources:
  LexBotRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: lexv2.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonLexRunBotsOnly

  OrderLambdaRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

  OrderLambda:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: OrderPizzaFulfillment
      Runtime: python3.11
      Role: !GetAtt OrderLambdaRole.Arn
      Handler: index.lambda_handler
      Code:
        ZipFile: |
          def lambda_handler(event, context):
              return {
                  'sessionState': {
                      'dialogAction': {'type': 'Close'},
                      'intent': {'name': 'OrderPizza', 'state': 'Fulfilled'}
                  },
                  'messages': [{
                      'contentType': 'PlainText',
                      'content': 'ピザを注文しました。'
                  }]
              }

  # Bot リソース定義(コンソールで作成、IaC はサポート限定)
  LexBotExport:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: /aws/lex/order-bot

Outputs:
  LambdaFunctionArn:
    Value: !GetAtt OrderLambda.Arn
  LexBotRole:
    Value: !GetAtt LexBotRole.Arn

Terraform

resource "aws_iam_role" "lex_bot_role" {
  name = "lex-bot-role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Action = "sts:AssumeRole"
      Effect = "Allow"
      Principal = {
        Service = "lexv2.amazonaws.com"
      }
    }]
  })
}

resource "aws_iam_role_policy_attachment" "lex_policy" {
  role       = aws_iam_role.lex_bot_role.name
  policy_arn = "arn:aws:iam::aws:policy/AmazonLexRunBotsOnly"
}

resource "aws_lambda_function" "order_pizza" {
  filename      = "order_pizza.zip"
  function_name = "OrderPizzaFulfillment"
  role          = aws_iam_role.lambda_role.arn
  handler       = "index.lambda_handler"
  runtime       = "python3.11"
}

# Bot リソースは Terraform 対応が限定的
# コンソール or AWS SAM で作成推奨

類似サービス比較表

比較軸 Lex V2 Dialogflow CX Bot Framework + LUIS Rasa Voiceflow
クラウド AWS GCP Azure OSS クラウド
インテント・スロット
ASR/NLU Alexa Google Microsoft Rasa 統合
Lambda 統合 Cloud Functions Azure Functions Rasa Actions ネイティブ
Connect 統合
Bedrock 統合 Vertex AI
マルチ言語 ✅ 17 言語 ✅ 多言語
学習曲線 中(AWS 環境必須) 低(GCP) 中(Azure) 中(技術者向け) 低(ビジュアル)
推奨用途 AWS Connect IVR 汎用チャットボット Microsoft エコ OSS・オンプレ ノーコード

ベストプラクティス

✅ 推奨パターン

  1. 適切なインテント設計

    • 1 インテント = 1 タスク(オーダーマジック回避)
    • 複雑なロジックは Lambda で実装
  2. Lambda フルフィルメント

    • 検証・ビジネスロジック・エラーハンドリングを実装
    • イディオマティックな応答を返す
  3. Bedrock + Lex の組み合わせ

    • 既知タスク(注文・予約)→ Lex
    • フリーフォーム質問 → Bedrock
  4. Amazon Connect 統合

    • IVR 自動化でコスト・工数削減

❌ アンチパターン

  1. 過剰なスロット数

    ❌ 1 イ ンテントで 10+ スロット
    ✅ スロット 3-5 個に抑える
    
  2. Lambda なしの複雑ロジック

    ❌ ダイアログ条件分岐だけで完結
    ✅ 複雑なビジネスロジックは Lambda
    
  3. Bedrock の過信

    ❌ すべて Bedrock に任せる
    ✅ 確実な処理は Lex + Lambda
    

トラブルシューティング

症状 原因 対策
インテント認識失敗 サンプル発話が少ない / 曖昧 サンプル発話を 10+ 個追加・多様性確保
スロット値の誤り スロットタイプ不一致 カスタムスロットタイプ見直し
Lambda タイムアウト フルフィルメント処理が遅い 非同期化・DB キャッシュ導入
音声認識精度低い ノイズ環境・口音 カスタムボキャブラリ・モデル調整
Connect 統合エラー IAM 権限不足 IAM ロール権限確認

セキュリティ・コンプライアンス

項目 実装
IAM Bot・Intent・Slot 単位の権限制御
KMS 保存時暗号化
TLS / HTTPS 転送中の暗号化
CloudTrail API 操作の監査ログ
VPC エンドポイント PrivateLink 対応(確認)
PII 検出 Comprehend Medical 連携で個人情報検出

パフォーマンスチューニング

推論レイテンシ最適化

  • インテント数削減 - 過度な数は精度低下
  • Lambda 最適化 - メモリ 512MB 以上・タイムアウト 10 秒
  • モデル選択 - Neural(推奨)vs Lexical

コスト最適化

テキスト・音声請求の確認

  • テキスト: $0.004/リクエスト
  • 音声: $0.00075/秒
  • 12 ヶ月無料枠: 10,000 テキスト + 5,000 秒音声

2025-2026 最新動向

  • Assisted NLU の強化 - 少量データでも高精度
  • 多言語カスタムボキャブラリ - 17 言語対応
  • Multi-Region Replication - グローバル対応
  • Bedrock Agents 統合 - より柔軟な AI 対話

学習リソース・参考文献

公式リソース

ベンダー・OSS リソース


実装例・チェックリスト

チェックリスト

  • [ ] インテント設計・サンプル発話作成
  • [ ] スロット・スロットタイプ定義
  • [ ] Lambda フルフィルメント実装・テスト
  • [ ] エラーハンドリング・再試行ロジック
  • [ ] Amazon Connect 統合(必要な場合)
  • [ ] Bedrock フォールバック実装(必要な場合)
  • [ ] CloudTrail ログ有効化
  • [ ] ボット公開・エイリアス設定
  • [ ] 多言語ロケール追加(必要な場合)
  • [ ] コスト見積もり・ハンドラ最適化

まとめ

Amazon Lex V2 は 「インテント・スロット・Lambda フルフィルメントでチャットボット・ボイスボットを構築するサービス」 です。Amazon Connect との統合でコールセンター IVR 自動化、Bedrock との組み合わせで生成 AI と構造化対話を融合した次世代コンタクトセンターを実現します。

最終更新:2026-04-26 バージョン:v2.0