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(東京)など主要リージョンで利用可能。ただし利用できるモデルはリージョンによって異なるため、コンソールで確認してください
操作手順:
-
AWSマネジメントコンソールにサインインし、使用するリージョンを選択します。東京リージョン(ap-northeast-1)でも利用可能ですが、一部モデルが未対応の場合は us-east-1 に切り替えてください。
-
検索窓に「Bedrock」と入力し、「Amazon Bedrock」を選びます。コンソールが開いたら、左サイドメニューから 「Models」 をクリックします。ここで使用可能なモデル一覧が表示されます。
-
Claude 3.5 Sonnetの行を探し、右側の 「Access model」 ボタンをクリックします。確認画面が表示されたら 「Enable model」 をクリックすると、数秒でアクセスが有効になります。他のモデル(Titanなど)も同様に有効化できます。
-
左サイドメニューから 「Playgrounds」 → 「Text」 をクリックします。ここでモデルをテストできます。
-
上部のドロップダウンから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)
コード例:
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パースします。ここの実装を誤ると「レスポンスが空」というバグに陥ります。
プロンプトエンジニアリング:精度を引き出す
モデルからより良い回答を得るには、プロンプトの書き方が重要です。単に「これについて説明して」ではなく、役割や制約を明示します。
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の実装例:
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のセットアップ手順(別途の詳細ガイドが必要なため、ここでは概要):
- AWS S3にドキュメント(PDF、テキスト)をアップロード
- Bedrockコンソールで「Knowledge Base」を作成
- S3バケットを指定し、インデックスを構築(10〜30分)
- 上記コードで検索開始
Knowledge Baseのコストは前述の通りですが、検索精度が高いため、修正プロンプトが少なくなり、実質的には元が取れる場合が多いです。
Agents:複数のツールを自動で組み合わせる
さらに高度な実装として、Agentsがあります。これはBedrockのモデルに外部ツール(APIやデータベースクエリ)を使わせ、複数のステップを自動で実行させる機能です。
例えば「2026年5月21日のAmazon Bedrockの価格を表示して」という質問に対し、Agentは自動的に以下を実行します:
- 価格情報APIを呼び出す
- 結果を解析する
- 最新情報を取得してユーザーに返す
これにより、静的な回答ではなく、リアルタイムデータに基づく動的な応答が可能になります。
応用:Agentsの実装例
Agentsはbedrock-agent-runtimeを使用します。invoke_agentのレスポンスはEventStreamとして返ってくるため、以下のように処理します:
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呼び出しは時々失敗します。ネットワーク遅延やレート制限に対応するため、リトライロジックは必須です。
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呼び出しごとにトークン数を記録し、月次でコスト分析します。
# レスポンスからトークン数を抽出
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