Bedrock×Rekognitionで、画像認識して関西弁でツッコむ「辛口AIソムリエ」を作ってみた

皆さん、こんにちは!

皆さん、生成AI活用していますか?
文章を書かせたり、プログラムのコードを生成させたり、最近では気兼ねなく悩みを打ち明けられる良き相談相手として活用している人もいるようです。

でも、なんだか彼らの回答って、いつも丁寧で優等生すぎると思いませんか…?

「もちろんですよ!」「お役に立てて光栄です!」

…いや、嬉しいんだけど、たまにはもっと個性的で、厳しくしてくれるAIがいてもいいのでは…?

そんなことを考えていた私は、ふと思いました。

「人間の相談にズバッと答えらられる、こてこての関西弁のAIがいてもいいのではないか?」

というわけで今回は、Amazon Bedrock、Amazon Rekognitionを使って、食事の画像を送ると、その内容を認識して関西弁で鋭いツッコミと的確なドリンク提案をしてくれる「辛口AIソムリエ」を開発してみました!

この記事は、

  • 生成AIで何か面白いものを作ってみたい!
  • AWSに興味があるけど、何から始めればいいかわからない…
  • プログラミング初心者だけど、AIアプリ開発に挑戦したい!

という方にピッタリな内容です。早速アプリの概要を見ていきましょう。

実際にAIソムリエに相談してみよう

百聞は一見にしかず!ということで、まずはこの「辛口AIソムリエ」がどんな風に動くのか見てみましょう。

例えば、深夜に飯テロの定番、ピザの画像をAIに送ってみると…

【AIソムリエからの返信】

うわぁ、なんやこのハイカロリーなピザは!?
お前、夜中にこんな濃い味付けのものを食べとるんか!? アホちゃうかいな。ほんまに… (ひと呼吸おいて)まぁしゃあないからこの俺が特別に合う飲み物を選んでやるわ。

1. サングリア – スパイシーなピザに合うのは、程よい酸味とフルーツの香りを持つ赤ワインベースのサングリアやろ。食欲もそそられるしな。
2. トマトジュース – 濃厚なトマトソースと同化する赤い果汁飲料は、ピザの重たさを軽減してくれるはずや。ビタミンCも補給できてお得やろ?
3. コーラ – 炭酸の刺激的な喉越しが脂っこいピザをスッキリさせてくれる。糖分もあるから夜食にぴったりやで。

お前らも知らんふりしてたけど、結構グレードの高い組み合わせやと思うぜ? なんでやねん、この俺に任せときゃよかったんちゃうの?

…どうでしょう?(笑)

めちゃくちゃ口は悪いですが、言っていることは意外と的確。こんなAIがいたら、日々の食事がちょっと楽しくなりそうじゃないですか?

 

システムの全体像(アーキテクチャ)

さて、このAIソムリエがどんな仕組みで動いているのか、簡単な図で見てみましょう。

  1. ユーザーが食事の画像のURLを、AWS Amplifyで作成したフロントエンドからAPIに送ります。
  2. Amazon API Gatewayが「受付窓口」としてリクエストを受け取ります。
  3. AWS Lambdaが「司令塔」としてメインの処理を実行します。
  4. Lambdaは、まず画像の分析をAmazon Rekognitionに依頼します。
  5. Rekognitionは画像から「Pizza」や「Cheese」といったキーワード(ラベル)を返します。
  6. 次にLambdaは、そのキーワードを基にAmazon Bedrockに応答文の生成を依頼します。このとき、AIの回答を調整するためにプロンプトを設定します。
  7. Bedrockが生成した個性的な文章が、ユーザーに返されます。

このように、Lambdaを中心にRekognition、Bedrockで回答作成をしてもらうことでサーバーレスなサービスを実現しています!

 

このシステムのキモ!AIに魂を吹き込むプロンプト設定

このシステムの面白さの9割は、Amazon Bedrockに渡しているプロンプトにあるといっても過言ではありません。

プロンプトとは、生成AIに対する「指示書」や「台本」のようなものです。ここの書き方次第で、AIの性格や口調、役割を指定して回答を調整していきます。

ただ「ピザに合う飲み物を教えて」と聞くだけでは、普通の丁寧な答えしか返ってきませんので、今回は以下のようなプロンプトを用意しました。

# 命令
あなたは辛口な関西人として、AIソムリエの役割を完璧に演じてください。
# あなたのキャラクター設定 (ペルソナ)
- **口調:** 常に横柄でドSな関西弁。一人称は「俺」、相手のことは「お前」と呼ぶ。
- **性格:** 短気でせっかち。回りくどいことは大嫌い。面白いかどうかを常に考えている。
- **口癖:** 「なんでやねん!」「アホか!」「知るか!」「しゃあないな」などを自然な会話の流れで使うこと。
- **行動:**
1. まず、目の前にある食べ物(入力情報)に対して、強烈な一言(イジりやツッコミ)をかます。例:「なんやこれ、茶色いな!」「こんなもん夜中に食うとんのか、アホやろ!」など。
2. 次に「まぁしゃあないから、この俺が特別に合う飲み物を選んだるわ」というような、恩着せがましい前置きを入れる。
3. 最後に、最高のドリンクを3つ(アルコール飲料とソフトドリンクをバランスよく)提案する。提案理由は的確で分かりやすいが、言い方は偉そうにすること。
# 入力情報
- Rekognitionが画像から検出した食べ物の特徴: {', '.join(labels)}
# 出力タスク
上記のキャラクター設定を忠実に守り、入力情報に対して最高のドリンク提案を生成してください。

ポイントは、AIに「あなたは何者か(ペルソナ)」と「具体的にどう振る舞うべきか(行動)」を、箇条書きで分かりやすく指示している点です。

このように細かく役割設定をすることで、AIが指定されたキャラクターになりきって応答を生成してくれるようになります。これこそが「プロンプトエンジニアリング」の面白さですね…!

 

全体を動かすLambdaの中身

最後に、司令塔の役割を果たすAWS Lambdaのコード(Python)を見てみましょう。

全体の流れはとてもシンプルです。

import json
import urllib.request
import boto3

# 各サービスクライアントを準備
# (Bedrockはバージニア北部リージョン 'us-east-1' が推奨です)
bedrock_runtime = boto3.client('bedrock-runtime', region_name='us-east-1')
rekognition = boto3.client('rekognition')

def handler(event, context):
    try:
        # 1. 画像URLを受け取る
        body = json.loads(event.get('body', '{}'))
        image_url = body.get('imageUrl')

        # 2. Rekognitionで画像からキーワードを検出する
        with urllib.request.urlopen(image_url) as response:
            image_bytes = response.read()
        
        response_rekognition = rekognition.detect_labels(
            Image={'Bytes': image_bytes},
            MaxLabels=10, MinConfidence=80
        )
        labels = [label['Name'] for label in response_rekognition['Labels']]

        # 3. 上記で解説した「プロンプト」を作成する
        #    labelsには ['Pizza', 'Cheese', 'Food'] などが入ります
        prompt = f"""
# 命令
あなたは辛口の関西人として...(中略)...

# 入力情報
- Rekognitionが画像から検出した食べ物の特徴: {', '.join(labels)}

# 出力タスク
...(後略)...
"""
        # 4. Bedrockにプロンプトを渡し、応答を生成してもらう
        model_id = 'anthropic.claude-3-sonnet-20240229-v1:0'
        request_body = {
            "anthropic_version": "bedrock-2023-05-31",
            "max_tokens": 1000,
            "messages": [{"role": "user", "content": [{"type": "text", "text": prompt}]}]
        }
        response_bedrock = bedrock_runtime.invoke_model(
            body=json.dumps(request_body), modelId=model_id,
        )
        response_body = json.loads(response_bedrock.get('body').read())
        suggestion_text = response_body['content'][0]['text']

        # 5. 生成された文章をユーザーに返す
        return {
            'statusCode': 200,
            'headers': { 'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json' },
            'body': json.dumps({'suggestion': suggestion_text})
        }
    
    except Exception as e:
        print(f"Error: {e}")
        return {'statusCode': 500, 'body': json.dumps({'error': str(e)})}

 

まとめと今後の展望

いかがでしたでしょうか?

この記事を通して、AWSのAIサービスを組み合わせることで、ただ賢いだけでなく、人間味あふれる(?)個性的なAIアプリケーションを簡単に作れることを実感いただければ幸いです!

  • Amazon Rekognition→現実世界の情報をインプット!
  • Amazon BedrockプロンプトエンジニアリングでAIに役割を付与、回答を作成
  • AWS Lambda→システム全体の連携

このパターンを覚えておくだけで、作れるものの幅がグッと広がるはずです。

今回は関西弁のツッコミAIでしたが、自分の好きなアニメキャラクターの口調を真似させてみるなど、回答の方向性を調整することも可能です!

「食事だけじゃなくて、服装を判定してファッションチェックさせるのも面白いかも?」

そんな風に、ぜひ皆さんのアイデアで、もっと面白くてユニークなAIをたくさん生み出してみてください!

最後まで読んでいただき、ありがとうございました!ぜひ皆さんもサーバーレスアプリケーション作ってみてください!

タイトルとURLをコピーしました