Amazon Bedrockのプロンプト最適化を試してみた

記事タイトルとURLをコピーする

こんにちは、近藤(りょう)です!

生成AIの活用が広がる中で、回答の精度を高めるうえでプロンプトの最適化は非常に有効だと思います。

効果的なプロンプトを設計するには、それなりの知識や経験、多くの試行錯誤が必要ですぐにできるというわけではありませんが、Amazon Bedrockのプロンプト最適化 を利用することで AI がプロンプトを自動的に生成してくれるので、専門知識がなくても、気軽に短時間で質の高いプロンプトを用意できます。

さらに、質の高いプロンプトは、無駄な出力を減らすことで使うトークン数も抑えられるので、コスト面でもうれしいポイントです。

プロンプト最適化とは?

プロンプト最適化とは、入力されたプロンプトを分析し、選択した基盤モデルにとってより効果的な形に自動的に質の高いプロンプトを生成してくれる機能です。

2025年4月に Amazon Bedrock で プロンプト最適化機能 が GA しました。

aws.amazon.com

プロンプト最適化のベストプラクティスは以下の観点があります。

■ 明確かつ具体的なプロンプトを設計する
プロンプトには、モデルに期待するタスクの意図と出力の形式をはっきり記述することが重要です。明瞭なプロンプトは最適化処理の精度も高めます。

■ 入力言語は英語が推奨である
現時点では、英語で記述されたプロンプトの方が最適化効果が高い傾向があります。

■ プロンプトや例文は長すぎないようにする
長すぎるププロンプトや過剰な例文は、処理の難易度が高まり最適化の効果が下がる可能性があります。また、プレースホルダーは文中に詰め込まず 項目ごとに分けて記述することが効果的です。

たとえば、以下のような1文で詰め込んだ形は避けたほうが無難です。

「{{author}}の{{paragraph}}を読んで{{question}}に答えてください」

代わりに、項目ごとに分けて記述する形式が推奨されます。

段落:
{{paragraph}}
著者:
{{author}}
次の質問に答えてください:
{{question}}

■ 初期段階でプロンプト最適化を活用することが効果的である
プロンプト最適化は、まだ構造が曖昧な「レイジープロンプト(ラフなプロンプト)」に対して特に効果的です。
試行錯誤の初期段階で活用することで、完成度の高いプロンプト設計を効率的に進めることができます。

以下、プロンプト最適化のベストプラクティスの参考ドキュメントとなります。 aws.amazon.com

プロンプト最適化のコスト

プロンプト最適化の実行には、1,000 トークンあたり $0.030 USD のコストが発生し、 入力プロンプトと最適化されたプロンプトのトークン数に基づいて課金されるようです。
aws.amazon.com

プロンプト最適化の対応リージョンとモデル

2025年4月時点で、以下のリージョンとモデルがプロンプト最適化に対応しています。
まだ、東京リージョンでは利用できません。

  • 対応リージョン
    • 米国東部 (バージニア北部)
    • 米国西部 (オレゴン)
    • アジアパシフィック (ムンバイ)
    • アジアパシフィック (シドニー)
    • カナダ (中部)
    • 欧州 (フランクフルト)
    • 欧州 (アイルランド)
    • 欧州 (ロンドン)
    • 欧州 (パリ)
    • 南米 (サンパウロ)


  • 対応モデル
    • Amazon Nova Lite
    • Amazon Nova Micro
    • Amazon Nova Pro
    • Amazon Titan Text G1 - Premier
    • Anthropic Claude 3 Haiku
    • Anthropic Claude 3 Opus
    • Anthropic Claude 3 Sonnet
    • Anthropic Claude 3.5 Haiku
    • Anthropic Claude 3.5 Sonnet v2
    • Anthropic Claude 3.5 Sonnet
    • DeepSeek DeepSeek-R1
    • Meta Llama 3 70B Instruct
    • Meta Llama 3.1 70B Instruct
    • Meta Llama 3.2 11B Instruct
    • Meta Llama 3.3 70B Instruct
    • Mistral AI Mistral Large (24.02)
    • Mistral AI Mistral Large (24.07)

最新の情報については 以下、プロンプト最適化の対応リージョンとモデルをご確認下さい。 docs.aws.amazon.com

実際に使ってみた:コンソールでのプロンプト最適化

Amazon Bedrock の playground から Chat / Text でモデルを選択して利用します。
今回は、「Anthropic Claude 3.5 Sonnet v2」を利用しました。
実施手順は 公式ドキュメントを参考下さい。

playground でプロンプトを入力した後に「プロンプトを最適化」(魔法のステッキ?)ボタンを押下します。 今回は 「初心者でもわかりやすく簡単にAWSについて教えて 」としてみました。

プロンプト最適化前

最適化されたプロンプトが英語表記になっていました。
プロンプト最適化(英語表記)

そのまま、最適化されたプロンプトを使用すると task が 英語なのでそのままプロンプトを利用すると英語で回答が返ってきてしまいました。
プロンプト最適化(英語表記)回答

実行する前にプロンプト最適化された task の内容を「初心者でもわかりやすく簡単にAWSについて教えて」変更してから実行すると想定通り日本語で回答されます。
プロンプト最適化(英語表記)日本語回答

検証として今度は 「初心者でもわかりやすく簡単にAWSについて日本語で教えて 」としてみました。
プロンプト最適化前その②

日本語で」を追加した場合は、最適化されたプロンプトが日本語になりました。
日本語にならない場合は「日本語」という記載すれば回避できるかもしれません。
プロンプト最適化(日本語表記)

実際に使ってみた: APIを使用したプロンプト最適化

Amazon Bedrock では、API経由でもプロンプト最適化を実行することができます。
以下の例では、Python の boto3 ライブラリを使用したプロンプト最適化の API の実行方法とその出力例を紹介しています。

なお、公式ドキュメントに記載されているサンプルコードでは、最適化結果に含まれる日本語が Unicodeエスケープされた状態(\uXXXX)で表示されるため、読みやすくするために Unicodeのデコード処理を追加してみました。

import boto3
import json

TARGET_MODEL_ID = "anthropic.claude-3-5-sonnet-20241022-v2:0"
PROMPT = "初心者でもわかりやすくAWSについて日本語で教えて"

def get_input(prompt):
    return {
        "textPrompt": {
            "text": prompt
        }
    }

def handle_event_stream(event_stream):
    has_output = False
    for event in event_stream:
        if isinstance(event, dict):
            if "optimizedPromptEvent" in event:
                text = event["optimizedPromptEvent"]["optimizedPrompt"]["textPrompt"]["text"]
                decoded_text = json.loads(json.dumps(text))  # Unicodeデコード
                print("========================== OPTIMIZED PROMPT ======================\n")
                print(json.loads(decoded_text))
                has_output = True

            elif "analyzePromptEvent" in event:
                print("========================= ANALYZE PROMPT =======================\n")
                analyze_prompt = event['analyzePromptEvent']
                print(analyze_prompt)

    if not has_output:
        print(" 最適化プロンプトが返されませんでした。")

if __name__ == '__main__':
    client = boto3.client("bedrock-agent-runtime", region_name="us-east-1")

    try:
        response = client.optimize_prompt(
            input=get_input(PROMPT),
            targetModelId=TARGET_MODEL_ID
        )

        print("\n========================== INPUT PROMPT ======================\n")
        print(PROMPT)

        event_stream = response['optimizedPrompt']
        handle_event_stream(event_stream)

    except Exception as e:
        print("エラーが発生しました:", str(e))


■ 出力結果

========================== INPUT PROMPT ======================

初心者でもわかりやすくAWSについて日本語で教えて
========================= ANALYZE PROMPT =======================

{'message': 'Analysis of your prompt is complete'}
========================== OPTIMIZED PROMPT ======================

<rewriter_output>
<task>
あなたは、初心者向けにAWSについて日本語で分かりやすく説明するAIアシスタントです。以下の指示に従って、説明を行ってください。

<instructions>
1. AWSの概要と主な機能について簡潔に説明してください。
2. 初心者が理解しやすいように、専門用語は避け、平易な言葉を使用してください。
3. AWSの利点と一般的な使用例を挙げてください。
4. AWSを使い始める際の手順や参考資料を提示してください。
5. 説明は構造化され、論理的な流れになるようにしてください。
6. 冗長な前置きは避け、コンパクトで的確な説明を心がけてください。
</instructions>

<response>
[あなたの分かりやすいAWSの説明をここに記入してください]
</response>
</task>

APIでもプロンプト最適化が実施ができることを確認することができました。

参考:より高精度な出力を目指すための追加手法

プロンプト最適化は優良な機能ですが、それだけでは対応が難しいユースケースも存在します。 さらに高精度な出力が求められる場合には、以下のような追加的なアプローチを検討すると効果的です。

ここでは参考情報として、Amazon Bedrock 上で利用可能な各種手法をご紹介します。

■ 適切な基盤モデルの選定
Amazon Bedrockでは Claude、Titan、Mistral など複数のモデルが提供されています。
ユースケースに応じて、チャットプレイグラウンドやモデル評価ジョブを活用し、最も適したモデルを選定しましょう。

■ 推論パラメータの調整
temperature や top-p の値を下げることで、出力のばらつきを抑え、一貫性のある応答を得やすくなります。

■ ファインチューニング
独自データセットを用いてモデルを調整することで、特定用途に最適化された応答を引き出せます。

■ 出力の結合と調整(アンサンブル)
複数モデルの出力を組み合わせることで、信頼性の高い回答が得られます。

■ プロンプトチェイニング
複雑なタスクを複数のプロンプトに分けて段階的に処理することで、精度と制御性を向上できます。

■ ガードレールの設定
特定トピックの制限、有害表現のブロック、機密情報の除外などをガードレールで制御することで、出力の安全性と一貫性を担保できます。

概要については 以下の参考ドキュメントをご確認下さい。 repost.aws docs.aws.amazon.com


ただし、これらの手法を過剰に組み合わせると、運用や保守が複雑化する可能性があります。ビジネス要件や実装コストに応じて適切に判断することが重要ですので、導入をご検討の際は十分ご留意ください。

まとめ

Amazon Bedrock のプロンプト最適化は、生成AIをもっとラクに、もっと高品質に使えるようにしてくれる、とても便利な機能です。

現時点では英語での利用のほうが精度が高いようですが、今後は日本語など他言語にも対応が広がっていくことを期待します。

プロンプトが自動で最適化されることで、生成AIを使いこなすハードルがぐっと下がるため、初心者から上級者まで、幅広いユーザーにとって心強いサポートになると感じました。

近藤 諒都

(記事一覧)

カスタマーサクセス部CS5課

夜行性ではありません。朝活派です。

趣味:お酒、旅行、バスケ、掃除、家庭用パン作り(ピザも)など