この記事は、ケーシーエスキャロット Advent Calendar 2025の24日目の記事です。
初めに
最近全くAWS環境の利用が無く、新しめのサービスに対しても知識が追い付いていないので、何か遊びながら触る事が出来ないか調べた結果、「Amazon Bedrock」上で使える文章生成モデルの「Titan Text Express」で遊んでみる事にしました。
テーマ
まずは何をするか…という事で、出来そうでクスっとしそうなテーマを調べてみました。
そこで決まったのが、「動物のプロフィールから前世ストーリーと来世予想(スターウォーズ風)」を作って貰うというもので、
動物(今回は犬)の性格・年齢の情報を準備して、その情報を入力すると短めのストーリー(json)をBedrockが生成するという流れです。
準備
IAMユーザ/ロール
- IAM → ユーザー作成
- ポリシーに下記を付与してアカウントへ紐づけ
面倒なので今回はBedrockフル権限
AmazonBedrockFullAccess
json形式だと以下
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "bedrock:*",
"Resource": "*"
}
]
}
Bedrock を有効化
Bedrock のサーバレス基盤モデル(Nova、Claude、Llama 等)は、初回呼び出しで自動有効化される為、手動での有効化は不要になったようです。
※2025年10月以降
SDK(開発環境)
今回、pythonのコードを利用する為、以下インストールをwsl上で実施
① インストール
pip install boto3
$pip install boto3
Collecting boto3
Downloading boto3-1.37.38-py3-none-any.whl (139 kB)
|████████████████████████████████| 139 kB 4.1 MB/s
Collecting jmespath<2.0.0,>=0.7.1
Downloading jmespath-1.0.1-py3-none-any.whl (20 kB)
Collecting s3transfer<0.12.0,>=0.11.0
Downloading s3transfer-0.11.5-py3-none-any.whl (84 kB)
|████████████████████████████████| 84 kB 2.0 MB/s
Collecting botocore<1.38.0,>=1.37.38
Downloading botocore-1.37.38-py3-none-any.whl (13.5 MB)
|████████████████████████████████| 13.5 MB 5.8 kB/s
Collecting python-dateutil<3.0.0,>=2.1
Downloading python_dateutil-2.9.0.post0-py2.py3-none-any.whl (229 kB)
|████████████████████████████████| 229 kB 4.6 MB/s
Requirement already satisfied: urllib3<1.27,>=1.25.4; python_version < "3.10" in /usr/lib/python3/dist-packages (from botocore<1.38.0,>=1.37.38->boto3) (1.25.8)
Requirement already satisfied: six>=1.5 in /usr/lib/python3/dist-packages (from python-dateutil<3.0.0,>=2.1->botocore<1.38.0,>=1.37.38->boto3) (1.14.0)
Installing collected packages: jmespath, python-dateutil, botocore, s3transfer, boto3
Successfully installed boto3-1.37.38 botocore-1.37.38 jmespath-1.0.1 python-dateutil-2.9.0.post0 s3transfer-0.11.5
[root@VostroNote23 ~]$
② 認証設定
aws configure
入力する内容:
AWS Access Key ID
AWS Secret Access Key
Region → ap-northeast-1
Output → json
$aws configure
AWS Access Key ID [None]: xxxxxxxxxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: json
犬のプロフィール
犬種
バーニーズ・マウンテン・ドッグ
年齢
2歳
性格
とてもやさしく、人が大好きで少し甘えん坊
今回、写真からイメージを吸い上げるまでは実施しませんが、
私のイメージはこんな子です。
コード
import json
import boto3
# =====================
# 設定
# =====================
REGION = "ap-northeast-1"
MODEL_ID = "amazon.titan-text-express-v1"
# 犬の情報(ここを変えるだけ)
DOG_PROFILE = {
"breed": "バーニーズ・マウンテン・ドッグ",
"age": "2歳",
"personality": "とてもやさしく、人が大好きで少し甘えん坊"
}
def main():
client = boto3.client(
"bedrock-runtime",
region_name=REGION
)
# プロンプト
prompt = f"""
以下は犬のプロフィールです。
・犬種:{DOG_PROFILE['breed']}
・年齢:{DOG_PROFILE['age']}
・性格:{DOG_PROFILE['personality']}
この情報をもとに、日本語でスターウォーズ風の物語調で作ってください。
1. この犬の前世はどんな存在だったか
2. 前世の経験が、今の性格や行動にどう表れているか
3. 来世ではどんな存在に生まれ変わるか
"""
body = {
"inputText": prompt,
"textGenerationConfig": {
"maxTokenCount": 1000,
"temperature": 0.8,
"topP": 0.9
}
}
response = client.invoke_model(
modelId=MODEL_ID,
body=json.dumps(body)
)
result = json.loads(response["body"].read())
print("=== 前世と来世の物語 ===")
print(result["results"][0]["outputText"])
if __name__ == "__main__":
main()
実行結果
1回目
=== 前世と来世の物語 ===
1. この犬の前世は、精鋭のハンターであった。遠く離れた獲物を追い、忍び寄り、静かに仕留める。その敏捷さと冷静さは、類を見ないものであった。
2. 前世の経験が、今の性格や行動にどう表れているか。この犬は、静かな夜にじっと座り、遠くを見つめる。その目は、かつての狩猟の記憶がよみがえる。そして、時折、静かに吠える。それはかつての狩猟の合図であった。
3. 来世では、この犬は、新たな冒険に挑む。静かに忍び寄り、静かに獲物を追い、静かに仕留める。そして、静かに吠える。それは新たな冒険の合図である。
2回目
=== 前世と来世の物語 ===
この犬の前世は山羊だったと言われています。
山羊だった頃、この犬はとても気遣いのできる優しい子でした。
ある日、ある山羊の群れが山を移動中であったとき、群れに紛れ込んでいた他の動物に襲われそうになったとき、この犬は群れの子どもたちを救うために、自分の命を犠牲にして山羊の群れに飛び込みました。
この時、山羊の群れは自分が亡くなったことに気づき、悲しみに暮れていました。
しかし、しばらくして気が付いたときには、山羊の群れはひとり、この犬だけになっていました。
この犬はひとり残され、山羊の群れを逃げて山を彷徨い、旅をしていました。
そして、あるとき出会った夫婦が、この犬に優しく接し、家に連れて帰りました。
そして、この犬は夫婦の息子として迎え入れられました。
この犬は、かつて自分が山羊として過ごしたときのような、優しく気遣いのできる存在として、家族の一員となって幸せに暮らしました。
そして、来世ではこの犬は再び山羊として生まれ変わるであろうと、神様は告げました。
3回目
=== 前世と来世の物語 ===
この犬の前世は、かつて銀河帝国軍でバトルフロントの戦場を駆け抜けた勇敢な戦士だった。彼の勇敢な戦いぶりやチームワークの重要性を学び、その経験が今の性格や行動に表れている。来世では、宇宙の平和と正義を守るための戦士として生まれ変わるだろう。
次回は提供した写真からストーリーを考えて貰おうかと考えています。