✍️

Amazon Bedrock 生成AIをアプリに組み込む完全ガイド

に公開

Amazon Bedrock:生成AIをアプリに組み込む完全ガイド

はじめに

社内システムやカスタマーサポートツールに生成AIを組み込みたいが、OpenAI APIに依存したくない、またはコスト面で悩んでいませんか?Amazon Bedrockは、AWSが提供する基盤モデルへのアクセスをマネージドで実現するサービスです。サーバレスで運用負荷がなく、セットアップから本番運用まで数時間で実現できます。

この記事を読むと、Bedrockで利用できる生成AIの種類を理解し、実際にアプリケーションに組み込むコードを書けるようになります。さらに、RAGやAgentsを使った高度な実装まで、実務で即座に応用できる知識を身につけます。


Amazon Bedrock – よく使われる全体構成図

Amazon Bedrockの役割を整理しておくと、選択肢の判断が明確になります。

Amazon Bedrockの役割と基盤モデルの選択肢

Amazon Bedrockは、複数の基盤モデルを統一APIで提供するマネージドサービスです。OpenAI APIと似ていますが、大きな違いがあります:Bedrockはモデルの運用・スケーリング・可用性をAWSが全て管理します。あなたはAPIコールするだけで、インフラを意識する必要がありません。

Bedrockで利用できる主要な基盤モデルは以下の通りです。

Claude(Anthropic製)は、テキスト生成の精度が高く、長いコンテキスト(最大200,000トークン)を処理できます。日本語対応も良好です。ただし応答速度は平均800ms程度なので、リアルタイム性が必須のチャットボットには不向きです。

Titan(AWS製)は、レイテンシが低く(平均300ms以下)、コスト効率が良好です。シンプルなテキスト生成や要約処理に適しています。ただし複雑な推論が必要なタスクでは、Claudeに劣ることがあります。

実務では「精度か速度か」で選び分けます。顧客対応の精密なメール生成にはClaude、リアルタイム分析の簡易要約にはTitanといった具合です。

料金体系:見落としやすいコスト


Amazon Bedrock – ハンズオンで構築する構成図

Amazon Bedrockの課金は、使用したトークン数(入力トークン + 出力トークン)に基づきます。

Claudeの例(2026年5月時点):

  • Claude 3.5 Sonnet: 入力0.003ドル/1,000トークン、出力0.015ドル/1,000トークン
  • Titan Text Express: 入力0.00013ドル/1,000トークン、出力0.00017ドル/1,000トークン

Titanはかなり安いですが、結果の品質が要件に達しない場合、修正プロンプトで追加トークンを消費するため、実質コストは高くなります。

AWS Free Tierでは、一定量のトークンを無料で利用できます。本番環境での課金が始まる前に、最新の無料枠を確認したうえで十分テストしましょう。

実装の第一歩:Bedrockコンソールでテスト

まず、AWS管理コンソールでBedrockが使える状態か確認します。

前提条件

  • AWSアカウント(無料枠で構いません)
  • IAM権限:AdministratorAccess、または bedrock:InvokeModel 権限を持つIAMユーザー
  • リージョン:us-east-1(N. Virginia)、us-west-2、ap-northeast-1(東京)など主要リージョンで利用可能。ただし利用できるモデルはリージョンによって異なるため、コンソールで確認してください

操作手順

  1. AWSマネジメントコンソールにサインインし、使用するリージョンを選択します。東京リージョン(ap-northeast-1)でも利用可能ですが、一部モデルが未対応の場合は us-east-1 に切り替えてください。

  2. 検索窓に「Bedrock」と入力し、「Amazon Bedrock」を選びます。コンソールが開いたら、左サイドメニューから 「Models」 をクリックします。ここで使用可能なモデル一覧が表示されます。

  3. Claude 3.5 Sonnetの行を探し、右側の 「Access model」 ボタンをクリックします。確認画面が表示されたら 「Enable model」 をクリックすると、数秒でアクセスが有効になります。他のモデル(Titanなど)も同様に有効化できます。

  4. 左サイドメニューから 「Playgrounds」「Text」 をクリックします。ここでモデルをテストできます。

  5. 上部のドロップダウンからClaude 3.5 Sonnetを選び、テキストボックスに「京都の観光地を3つ箇条書きで」と入力します。「Run」 ボタンをクリックすると、3〜5秒で回答が表示されます。

成功時の画面:テキストボックスの下に「- 伏見稲荷大社」「- 清水寺」「- 金閣寺」のような回答が表示されます。ここまで来れば、APIコール用の設定は完了です。

このテストの意義は2つです。モデルが本当に使える状態か確認できることと、プロンプトエンジニアリングの基本を手で試せることです。コマンドラインで試すより、ビジュアル確認の方が修正が早いです。

PythonコードでAPIを呼び出す

次は、実際にコードからBedrockを呼び出します。以下のPythonコードはセットアップから動作確認まで3分で完結します。

前提条件

  • Python 3.9以上
  • AWS CLI設定済み(aws configureで認証済み)
  • boto3がインストールされている(pip install boto3

コード例

bedrock_simple.py
import boto3
import json

# Bedrockクライアントを初期化
client = boto3.client('bedrock-runtime', region_name='us-east-1')

# Claudeへのリクエスト
message = "Amazon Bedrockについて100文字で説明してください"

response = client.invoke_model(
    modelId='anthropic.claude-3-5-sonnet-20241022-v2:0',
    body=json.dumps({
        "anthropic_version": "bedrock-2023-06-01",
        "max_tokens": 1024,
        "messages": [
            {
                "role": "user",
                "content": message
            }
        ]
    }),
    contentType='application/json',
    accept='application/json'
)

# レスポンス処理
response_body = json.loads(response['body'].read())
print(response_body['content'][0]['text'])

実行すると以下のような出力が得られます

レスポンス例
Amazon Bedrockは、AWSが提供するマネージドサービスで、複数の基盤モデル(Claude、Titanなど)に統一APIでアクセスできます。インフラ管理不要で、スケーリングや可用性はAWSが担当します。

このコードのポイントは3つです。

まず、modelIdにはモデルのバージョンを明記します。Claudeは定期的に更新されるため、常に最新バージョンを指定してください(執筆時点ではanthropic.claude-3-5-sonnet-20241022-v2:0)。古いバージョンを使うと、レスポンスの品質が低下したり、エラーになったりします。

次に、max_tokensは出力の最大長です。短い回答なら256、長い文章生成なら2048程度を指定します。余裕を持たせすぎるとAPI料金が増えます。

最後に、レスポンスの構造を理解しておくことが大切です。response['body']はストリーム形式で返ってくるため、read()で読み込んでからJSONパースします。ここの実装を誤ると「レスポンスが空」というバグに陥ります。

プロンプトエンジニアリング:精度を引き出す

モデルからより良い回答を得るには、プロンプトの書き方が重要です。単に「これについて説明して」ではなく、役割や制約を明示します。

bedrock_prompt_engineering.py
import boto3
import json

client = boto3.client('bedrock-runtime', region_name='us-east-1')

# システムプロンプト:モデルの役割を定義
system_prompt = """
あなたはテクニカルサポート担当者です。
以下のルールに従ってください:
1. 回答は日本語で、初心者にも分かるように説明する
2. 専門用語には( )で簡単な説明をつける
3. 解決策は3ステップ以内にまとめる
4. 回答の最後に「さらに詳しくは〇〇を参照」と情報源を示す
"""

user_message = "AWSアカウントにサインインできません。どうすればいいですか?"

response = client.invoke_model(
    modelId='anthropic.claude-3-5-sonnet-20241022-v2:0',
    body=json.dumps({
        "anthropic_version": "bedrock-2023-06-01",
        "max_tokens": 512,
        "system": system_prompt,  # システムプロンプトを追加
        "messages": [
            {
                "role": "user",
                "content": user_message
            }
        ]
    }),
    contentType='application/json',
    accept='application/json'
)

response_body = json.loads(response['body'].read())
print(response_body['content'][0]['text'])

このコードで得られる回答は、システムプロンプトなしの場合より格段に使いやすくなります。テクニカルサポートの文体で、初心者向けに3ステップで説明されるため、アプリケーションにそのまま組み込めます。

プロンプトエンジニアリングのコツ

  • 役割を明確にする(「あなたは〇〇です」)
  • 出力形式を指定する(「JSON形式で」「3箇条書きで」)
  • 制約を示す(「100文字以内」「初心者向け」)
  • 例を示す(Few-shot):「このような質問には『〇〇』と答える」

これらを組み合わせることで、API呼び出し回数(=コスト)を減らしながら、精度を大幅に向上させます。

RAG(Retrieval-Augmented Generation)で最新情報を活用

生成AIは学習データから回答を生成するため、「昨日のニュース」や「社内の最新ドキュメント」など、学習後の情報は知りません。RAGは、外部データソースから関連情報を取得し、プロンプトに含めることで、この問題を解決します

BedrockのKnowledge Base機能は、RAGを簡単に実装するためのマネージドサービスです。PDFやテキストファイルをアップロードすると、自動でベクトル化され、検索可能になります。

簡単なRAGの実装例

bedrock_rag.py
import boto3
import json

# Bedrockクライアント
bedrock = boto3.client('bedrock-runtime', region_name='us-east-1')
kb_client = boto3.client('bedrock-agent-runtime', region_name='us-east-1')

# Knowledge Base IDを指定
kb_id = 'your-knowledge-base-id'
user_query = "Amazon Bedrockの料金体系を教えてください"

# Knowledge Baseから関連ドキュメントを検索
retrieval_response = kb_client.retrieve(
    knowledgeBaseId=kb_id,
    retrievalConfiguration={
        'vectorSearchConfiguration': {
            'numberOfResults': 5  # 上位5件の関連ドキュメント
        }
    },
    text=user_query
)

# 検索結果からコンテキストを構築
contexts = "\n".join([
    f"- {result['content']['text']}"
    for result in retrieval_response['retrievalResults']
])

# コンテキストを含めたプロンプト
system_prompt = f"""
以下のドキュメントを参考に、ユーザーの質問に答えてください。
ドキュメントに記載がない場合は「詳細は不明です」と答えます。

【参考ドキュメント】
{contexts}
"""

# Claude呼び出し
response = bedrock.invoke_model(
    modelId='anthropic.claude-3-5-sonnet-20241022-v2:0',
    body=json.dumps({
        "anthropic_version": "bedrock-2023-06-01",
        "max_tokens": 512,
        "system": system_prompt,
        "messages": [
            {
                "role": "user",
                "content": user_query
            }
        ]
    }),
    contentType='application/json',
    accept='application/json'
)

response_body = json.loads(response['body'].read())
print(response_body['content'][0]['text'])

このコードは、Knowledge Baseから自動検索した関連情報をプロンプトに含めます。結果として、社内のマニュアルに基づいた正確な回答が得られます。

RAGのセットアップ手順(別途の詳細ガイドが必要なため、ここでは概要):

  1. AWS S3にドキュメント(PDF、テキスト)をアップロード
  2. Bedrockコンソールで「Knowledge Base」を作成
  3. S3バケットを指定し、インデックスを構築(10〜30分)
  4. 上記コードで検索開始

Knowledge Baseのコストは前述の通りですが、検索精度が高いため、修正プロンプトが少なくなり、実質的には元が取れる場合が多いです。

Agents:複数のツールを自動で組み合わせる

さらに高度な実装として、Agentsがあります。これはBedrockのモデルに外部ツール(APIやデータベースクエリ)を使わせ、複数のステップを自動で実行させる機能です。

例えば「2026年5月21日のAmazon Bedrockの価格を表示して」という質問に対し、Agentは自動的に以下を実行します:

  1. 価格情報APIを呼び出す
  2. 結果を解析する
  3. 最新情報を取得してユーザーに返す

これにより、静的な回答ではなく、リアルタイムデータに基づく動的な応答が可能になります。

応用:Agentsの実装例

Agentsはbedrock-agent-runtimeを使用します。invoke_agentのレスポンスはEventStreamとして返ってくるため、以下のように処理します:

bedrock_agent.py
import boto3

agent_client = boto3.client('bedrock-agent-runtime', region_name='us-east-1')

response = agent_client.invoke_agent(
    agentId='your-agent-id',
    agentAliasId='ALIZAXXXXXXXX',  # エージェントのエイリアスID
    sessionId='session-123',
    inputText='2026年5月の天気を予測して'
)

# EventStreamからレスポンスを取得
for event in response['completion']:
    if 'chunk' in event:
        chunk_text = event['chunk']['bytes'].decode('utf-8')
        print(chunk_text, end='', flush=True)

ただしAgentsは設定が複雑(ツール定義、IAM権限、トリガーアクション)なため、本番運用には専任チームの支援を推奨します。

実装のベストプラクティス

実務でBedrockを使う際の3つのポイントをまとめます。

1. エラーハンドリングとリトライ:API呼び出しは時々失敗します。ネットワーク遅延やレート制限に対応するため、リトライロジックは必須です。

error_handling.py
import boto3
import json
from botocore.exceptions import ClientError
import time

client = boto3.client('bedrock-runtime', region_name='us-east-1')

max_retries = 3
for attempt in range(max_retries):
    try:
        response = client.invoke_model(
            modelId='anthropic.claude-3-5-sonnet-20241022-v2:0',
            body=json.dumps({...}),
            contentType='application/json',
            accept='application/json'
        )
        break  # 成功したらループを抜ける
    except ClientError as e:
        if e.response['Error']['Code'] == 'ThrottlingException':
            wait_time = 2 ** attempt  # 1秒、2秒、4秒と増加
            print(f"レート制限に達しました。{wait_time}秒待機します")
            time.sleep(wait_time)
        else:
            raise  # その他のエラーはそのまま例外を発生

2. トークンコストの監視:API呼び出しごとにトークン数を記録し、月次でコスト分析します。

token_tracking.py
# レスポンスからトークン数を抽出
response_body = json.loads(response['body'].read())
input_tokens = response_body['usage']['input_tokens']
output_tokens = response_body['usage']['output_tokens']

# ログに記録(CloudWatch Logsなど)
print(f"入力: {input_tokens}トークン、出力: {output_tokens}トークン")

3. プロンプトのバージョン管理:プロンプトを変更するたびに精度が変わるため、バージョンと性能を記録します。例えば「V1:精度85%、平均200ms」「V2:精度92%、平均250ms」といった形で追跡しましょう。

他のAIサービスとの使い分け

「BedrockとSageMaker AIはどう違うか」はよくある質問です。

Amazon Bedrockは、既存の基盤モデル(Claude、Titan等)を即座に使いたい場合に選びます。セットアップが数分で済み、コストは従量課金です。

Amazon SageMaker AIは、独自のモデルを学習・デプロイしたい場合に選びます。柔軟性が高い代わりに、セットアップに数日かかり、運用負荷が大きいです。

実務では、Bedrockで素早くプロトタイプを作り、精度要件が満たされなければSageMaker AIで微調整するという流れが多いです。

まとめ

Amazon Bedrockは、生成AIをアプリケーションに組み込む最速の手段です。Claudeの精度とTitanのコスト効率から用途に応じて選べ、RAGで最新情報を参照でき、Agentsで複雑な処理を自動化できます。

次のステップ

  • AWS Free Tierで実際に触り、プロンプトエンジニアリングを試す
  • 社内ドキュメントをKnowledge Baseに登録し、RAGの効果を測定する
  • コスト監視の仕組みを作り、月単位で収支を分析する

最初のスモールスタートから始めることで、本当に必要な機能と不要な機能が見えてきます。数時間でプロトタイプが作れるのがBedrockの強みです。ぜひ試してみてください。

Discussion