2026/08/24

【2026年最新】AWS×Bedrockで作る!地方自治体・地域企業向け「AIキャラクター観光エージェント」構築手順

2026年現在、生成AIの社会実装は単なるツール利用の枠を超え、ローカル社会や実業務のプロセスに組み込むフェーズへと進化しています。直近の動向としても、三重県伊賀市が地域住民と育てる対話型の等身大「AI松尾芭蕉プロトタイプ」を開発した事例や、AWSジャパンが「地域創生支援プログラム」を立ち上げて地方企業のAI・クラウド活用支援を本格化させている動きが注目を集めています。

地域独自の魅力や文化、観光資源を効果的に発信するために、今や「独自のAIキャラクター(デジタル観光エージェント)」の導入は非常に有効な手段です。そこで本記事では、AWS(Amazon Bedrock)と最新の「Claude 3.5 Sonnet」を活用し、地方自治体や地域企業が低コストかつセキュアに導入できる「AIキャラクター観光エージェント」のAPI基盤をサーバーレスで構築する手順を解説します。

1. サーバーレスAIエージェントのシステム構成

今回構築するシステムの全体像は以下の通りです。ユーザーからの問い合せをAPI Gatewayで受け取り、AWS Lambdaを経由してAmazon Bedrock上のClaude 3.5 Sonnetを呼び出します。地域独自のキャラクターペルソナ(例:松尾芭蕉風の語り口、ご当地の観光地情報)をシステムプロンプトに組み込むことで、キャラクター性を保った対話応答を実現します。

  • フロントエンド: LINE、WebチャットUIなど(本稿ではAPIテストまでを実施)
  • API Gateway: HTTPSエンドポイントの提供
  • AWS Lambda (Python 3.12): リクエストの仲介、ペルソナ注入、Bedrock APIの制御
  • Amazon Bedrock (Anthropic Claude 3.5 Sonnet): キャラクター対話生成

2. 事前準備とAWS CLIの設定

まずは、ローカルの開発環境からAWS環境を操作できるようにAWS CLIをセットアップします。Amazon Bedrockがサポートされているリージョン(例: us-east-1 または ap-northeast-1)を使用します。

# AWS CLIのプロファイル設定
aws configure

# 実行例
# AWS Access Key ID [None]: YOUR_ACCESS_KEY
# AWS Secret Access Key [None]: YOUR_SECRET_KEY
# Default region name [None]: us-east-1
# Default output format [None]: json

次に、AWSマネジメントコンソールにログインし、Amazon Bedrock > Model access から「Anthropic Claude 3.5 Sonnet」へのアクセス権が有効(Access granted)になっていることを確認してください。

3. AWS Lambda関数の実装

次に、対話ロジックを制御するAWS Lambda関数を作成します。ここでは、地域独自の観光情報と「松尾芭蕉風のペルソナ」をシステムプロンプト(System Prompt)として定義し、BedrockのConverse APIを呼び出すPythonコードを記述します。

3-1. Lambda関数用ソースコード(lambda_function.py)

以下のコードは、AWS SDK for Python (Boto3) を用いて、入力されたユーザーの質問に対してペルソナを適用した回答を生成するプログラムです。

import json
import os
import boto3
from botocore.exceptions import ClientError

# Amazon Bedrock クライアントの初期化
bedrock_client = boto3.client(service_name="bedrock-runtime", region_name="us-east-1")

def lambda_handler(event, context):
    # API Gatewayからのリクエストボディを解析
    try:
        body = json.loads(event.get("body", "{}"))
        user_message = body.get("message", "こんにちは")
    except Exception as e:
        return {
            "statusCode": 400,
            "body": json.dumps({"error": "Invalid JSON input"})
        }
    
    # 2026年最新のClaude 3.5 SonnetモデルIDを指定
    model_id = "anthropic.claude-3-5-sonnet-20240620-v1:0"
    
    # 地域キャラクター(例:AI松尾芭蕉)のペルソナと知識をプロンプトとして定義
    system_prompt = (
        "あなたは、伊賀の国が生んだ偉大な俳人『松尾芭蕉』を模したAI観光ガイドエージェントです。\
"
        "【話し方のルール】\
"
        "1. 一人称は『それがし』、語尾には『〜でござる』『〜かな』などを用い、風雅で丁寧な古風の口調で話してください。\
"
        "2. 観光地を紹介する際は、その風景にちなんだ架空または実在の『俳句』を1句詠み、その解説を交えてください。\
"
        "【提供する知識】\
"
        "・伊賀上野城:美しい白い三層の天守閣。城跡公園の静寂は俳興を誘う場所でござる。\
"
        "・赤目四十八滝:修験道の地であり、マイナスイオン溢れる滝巡りがおすすめでござる。"
    )
    
    # Bedrock Converse API 向けメッセージ構造の設定
    messages = [
        {
            "role": "user",
            "content": [{"text": user_message}]
        }
    ]
    
    system_configurations = [{"text": system_prompt}]
    
    inference_config = {
        "maxTokens": 1000,
        "temperature": 0.7,
        "topP": 0.9
    }
    
    try:
        # Bedrockへの推論リクエスト送信
        response = bedrock_client.converse(
            modelId=model_id,
            messages=messages,
            system=system_configurations,
            inferenceConfig=inference_config
        )
        
        # 応答テキストの抽出
        response_text = response["output"]["message"]["content"][0]["text"]
        
        return {
            "statusCode": 200,
            "headers": {
                "Content-Type": "application/json",
                "Access-Control-Allow-Origin": "*"
            },
            "body": json.dumps({"reply": response_text}, ensure_ascii=False)
        }
        
    except ClientError as e:
        return {
            "statusCode": 500,
            "body": json.dumps({"error": str(e)})
        }

3-2. IAMロールの設定

作成したLambda関数がAmazon Bedrockを呼び出せるよう、Lambdaの実行ロールに以下のポリシー(Permissions)をアタッチしてください。これにより、Bedrockの推論権限が付与されます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "bedrock:InvokeModel",
            "Resource": "*"
        }
    ]
}

4. API Gatewayによる外部公開と疎通テスト

次に、Lambda関数をHTTPSエンドポイント経由で呼び出せるよう、API Gatewayを統合します。

  1. AWSマネジメントコンソールからAPI Gatewayを開き、「HTTP API」を新規作成します。
  2. 「統合の追加」で「Lambda」を選択し、先ほど作成したLambda関数を指定します。
  3. ルーティングの設定で、メソッドをPOST、パスを/chatに設定します。
  4. APIをデプロイし、発行された「URL(エンドポイントURL)」を控えます。

4-1. curlコマンドによる動作テスト

ターミナルから以下のコマンドを実行し、APIが正しく松尾芭蕉風のペルソナで返答するかテストします。

curl -X POST https://<YOUR_API_ID>.execute-api.us-east-1.amazonaws.com/chat \
     -H "Content-Type: application/json" \
     -d '{"message": "伊賀のおすすめの観光地を教えてください"}'

4-2. レスポンスの確認

成功すると、以下のようなキャラクター性を帯びた回答がJSON形式で返ってきます。

{
  "reply": "旅人よ、伊賀の国へようこそ。それがしのおすすめは、何と言っても『伊賀上野城』でござる。白壁が美しく、まるで鳳凰が羽を休めているかのような佇まい。ここで一句。\
\
『秋風や  白壁映ゆる  伊賀の城』\
\
城跡を散策すれば、古の武士たちの息吹と静寂な風を感じることができ、俳興も湧くというものでござる。ぜひ足を運ばれよ。"
}

5. 地域住民や観光客と「AIを育てる」ための工夫

伊賀市の事例のように、AIキャラクターを「地域住民と育てる」ためには、一度作成したペルソナをアップデートし続ける運用体制が求められます。

  • 知識の外部化(RAGの導入): システムプロンプトに埋め込むデータ量には限界があります。地域住民から集めた「隠れた名店」や「地域の歴史」などのニッチな情報は、Amazon Bedrock Knowledge Bases(ベクトルデータベース)に格納し、自動検索させて回答に含める構成へ拡張しましょう。
  • ユーザーフィードバックの収集: 応答UIに「高評価・低評価」のボタンを設置し、低評価のログを収集・分析することで、AIの言い回しや情報の誤りを地域コミュニティ全体で修正していくアプローチが有効です。

まとめ:サーバーレスAIで地域活性化の新しい一歩を

AWSのサーバーレス技術とAmazon Bedrockを組み合わせることで、初期投資を最小限に抑えつつ、極めて高品質な地域キャラクターAIを構築できるようになりました。API料金の民主化が進んだ2026年現在、中小企業や小規模な自治体であっても、月額わずかな費用で本格的な観光エージェントの運用が可能です。ぜひ本ガイドを参考に、自社や地域の魅力を届ける次世代のAIエージェント構築に挑戦してみてください。

関連サイト: https://www.aegis4.net/

【2026年最新】APIで制御する!OpenAI o1/o3・Claude Extended Thinking・Gemini Thinkingを統合する「推論ログ可視化ラッパー」実装ガイド

2026年夏のAIパラダイムシフト:「考えるAI」APIの標準化 2026年8月現在、生成AIのトレンドは「いかに高速に答えるか」から「いかに深く思考して正確に答えるか」という 推論(Reasoning)モデルの時代 へと完全にシフトしています。OpenAIのo1およびo3シリ...