Anthropic Claude モデルを呼び出す

このドキュメントでは、Vertex AI SDK for ABAP を使用して Anthropic Claude モデルを呼び出し、テキストとマルチモーダル入力に対するレスポンスを生成する方法について説明します。Claude モデルは、テキスト画像ドキュメントなど、複数の入力モードに対応しています。Claude モデルは、次のようなユースケースに使用できます。

  • 自由形式のテキストの要約
  • メディア アセットの説明や解釈
  • 言語間の翻訳

生成モデルを使用して AI 中心の機能をビルドする場合、機械学習(ML)の専門知識は必要ありません。大規模なデータセットの収集やモデルのトレーニングは不要です。最初のプログラムを開始するために必要なことは、モデルに何をさせたいかを数個の文で記述するだけです。Vertex AI SDK for ABAP には、SAP 環境から Claude モデルにアクセスするための ABAP クラスとメソッドが用意されています。

始める前に

Claude モデルで Vertex AI SDK for ABAP を使用する前に、自身または管理者によって次の前提条件が満たされていることを確認してください。

Claude にリクエストを送信する

このセクションでは、Vertex AI SDK for ABAP を使用して Vertex AI API を介して Claude モデルにリクエストを送信する方法について説明します。

Claude マルチモーダル Invoker クラスをインスタンス化する

テキストまたはマルチモーダル プロンプトを使用して Claude のテキストモデルとマルチモーダル モデルを呼び出すには、/GOOG/CL_MODEL_CLAUDE クラスを使用します。クラスをインスタンス化するには、モデル生成パラメータで構成されたモデルキーを渡します。

DATA(lo_model) = NEW /goog/cl_model_claude( iv_model_key = 'MODEL_KEY' ).

MODEL_KEY は、モデル生成パラメータで構成されているモデルキー名に置き換えます。

プロンプトを使用してコンテンツを生成する

モデルにテキスト プロンプトを指定してコンテンツを生成する場合は、GENERATE_CONTENT メソッドを使用します。

lo_model->generate_content( 'PROMPT' ).

PROMPT は、テキスト プロンプトに置き換えます。

モデルにシステム指示を提供する

テキストベースのシステム指示をモデルに渡すには、SET_SYSTEM_INSTRUCTIONS メソッドを使用します。

lo_model->set_system_instructions( 'SYSTEM_INSTRUCTIONS' ).

SYSTEM_INSTRUCTIONS は、モデルに対するシステム指示に置き換えます。

モデルの生成構成を設定する

モデルの生成構成は、テーブル /GOOG/AI_CONFIG で維持します。特定の呼び出しの生成構成をオーバーライドするには、SET_GENERATION_CONFIG メソッドを使用します。生成プロパティのインポート パラメータが設定されている場合、渡されたパラメータ値が有効になります。

lo_model->set_generation_config(
                                iv_temperature        = 'TEMPERATURE'
                                iv_top_p              = 'TOP_P'
                                iv_top_k              = 'TOP_K'
                                iv_max_output_tokens  = 'MAX_OUTPUT_TOKENS' ).

次のように置き換えます。

  • TEMPERATURE: ランダム性の温度。
  • TOP_P: Top-P サンプリング。
  • TOP_K: Top-K サンプリング。
  • MAX_OUTPUT_TOKENS: メッセージあたりの出力トークンの最大数

これらのパラメータの詳細については、モデル生成パラメータを構成するをご覧ください。

マルチモーダル入力をモデルに渡す

Gemini モデルは、マルチモーダル入力を使用して呼び出すことができます。マルチモーダル入力には、テキスト画像ドキュメントのいずれかを使用できます。画像と PDF の入力を元データとして渡すことができます。PDF の場合は、PDF が一般公開されていれば URI を提供することもできます。

次の表に、サポートされている MIME タイプを示します。

メディアタイプ サポートされている MIME タイプ
画像
  • image/jpeg
  • image/png
  • image/gif
  • image/webp
ドキュメント
  • application/pdf

元データを設定する

ファイルの元データを MIME タイプとともにモデルへの入力として提供するには、SET_INLINE_DATA メソッドを使用します。

lo_model->set_inline_data( iv_mime_type = 'MIME_TYPE'
                          iv_data      = 'RAW_DATA'
                          iv_type      = 'base64' ).

次のように置き換えます。

  • MIME_TYPE: 元データの IANA 標準 MIME タイプ。デフォルトでは、MIME タイプは image/jpeg に設定されます。
  • RAW_DATA: プロンプトにインラインで含める画像または PDF の Base64 でエンコードされた元データ。

/GOOG/CL_MODEL_CLAUDE クラスの同じインスタンスを使用してモデルの入力からファイルの元データを消去するには、CLEAR_INLINE_DATA メソッドを使用します。

lo_model->clear_inline_data( ).

テキスト プロンプト内のトークン数をカウントする

プロンプトを使用してモデルを呼び出す前に、テキスト プロンプト内のトークン数をカウントするには、COUNT_TOKENS メソッドを使用します。

DATA(lv_total_tokens) = lo_model->count_tokens( iv_prompt_text         = 'PROMPT'
                                                iv_system_instructions = 'SYSTEM_INSTRUCTIONS'
                              )->get_total_tokens( ).

次のように置き換えます。

停止シーケンスを追加する

stop_sequence は、レスポンスでこれらの文字列のいずれかが検出された場合に生成を停止するよう Claude に指示する文字列のセットです。これは、Claude に「このシーケンスを生成したら、すぐに生成を停止して」と伝えるコマンドです。

次のコードサンプルには stop_sequence が含まれていません。

lv_prompt = 'Generate a JSON object representing a person with a name, email, and phone number'.

lv_response = lo_model->generate_content( lv_prompt )->get_text( ).

このコードサンプルは、次のようなレスポンスを返します。

{
  "name": "Dana A",
  "email": "dana@example.com",
  "phoneNumber": "800-555-0199"
}

次のコードサンプルには stop_sequence が含まれています。

DATA: lt_stop_sequences TYPE TABLE OF STRING.

lv_prompt = 'Generate a JSON object representing a person with a name, email, and phone number'.

APPEND '}' to lt_stop_sequences.

lv_response = lo_model->set_stop_sequence( lt_stop_sequences
                )->generate_content( lv_prompt
                )->get_text( ).

このコードサンプルは、次のようなレスポンスを返します。

ここで、この JSON オブジェクトは、名前、メールアドレス、電話番号を含むプロフィールを表しています。

{
  "name": "Dana A",
  "email": "dana@example.com",
  "phoneNumber": "800-555-0199"

出力に } 停止シーケンスが含まれていないことに注意してください。これを JSON として解析するには、閉じ括弧 } を追加する必要があります。

Claude モデルがレスポンスを提供するとき、モデルがテキストの生成を停止した理由が stop_reason プロパティで示されます。

停止理由を取得するには、次のコードサンプルを使用できます。

lv_stop_reason = lo_model->set_stop_sequence( lt_stop_sequences
                )->generate_content( lv_prompt
                )->get_stop_reason( ).

例を追加

少数ショット プロンプトは、モデルに少数の例を提供して出力をガイドする効果的な戦略です。これを行うには、会話履歴を使用して Claude にこれらの例を提供します。

たとえば、Claude を使用してツイートの感情を分析するには、「このツイートの感情を分析して」と指示してから、結果の出力を確認します。

lv_prompt = 'The Burger was delicious and my taste buds were on fire, too yummy!'
lv_system_instruction = 'Please do the sentiment analysis of the review'.
lv_response = lo_model->set_system_instructions( lv_system_instructions
                     )->generate_text( lv_prompt
                     )->get_text( ).

出力:

# Sentiment Analysis

This tweet expresses a strongly positive sentiment:

- Words like "delicious" and "yummy" directly convey enjoyment
- The phrase "taste buds were on fire" is used positively to indicate intense flavor enjoyment
- The exclamation mark adds enthusiasm
- "too yummy" emphasizes the exceptional quality

Overall, this is a very positive tweet expressing high satisfaction with the burger.

包括的なレスポンスは価値がありますが、多数のツイートの自動化された感情分析には、より簡潔な Claude 出力が向いています。Claude のレスポンスを、POSITIVE、NEUTRAL、NEGATIVE などの単語や、1、0、-1 などの数値に標準化できます。

lv_prompt = 'The Burger was delicious and my taste buds were on fire, too yummy!'.
lv_response = lo_model->add_examples( iv_input = |Unpopular opinion: Pickles are disgusting. Don't hate me|
        iv_output = |NEGATIVE|
        )->add_examples( iv_input = |I think my love for burgers might be getting out of hand. I just bought a burger sticker for my crocs|
        iv_output =  |POSITIVE|
        )->add_examples( iv_input = |Seriously why would anyone ever eat a brugers?  Those things are unhealthy!|
        iv_output =  |NEGATIVE|
        )->generate_content( lv_prompt
        )->get_text( ).

出力:

POSITIVE

アシスタントのテキストを設定する

非常に具体的な出力を得るためのもう 1 つの一般的な戦略は、「Claude に言葉を言わせる」ことです。Claude に user メッセージのみを提供する代わりに、Claude が出力を生成するときに使用する assistant メッセージを指定することもできます。

assistant メッセージを指定すると、Claude は最後の assistant トークンから会話を続けます。user メッセージから始める必要があることを覚えておいてください。

  lv_prompt = 'The fourth nearest planet to sun is: A) Mercury B) Venus C) Mars D ) Andromeda'.
 lv_assistant_text = 'The answer is:'.
    lv_response = lo_model->set_assistant_text( lv_instruction
                                       )->generate_content( lv_prompt
                                       )->get_text( ).

このコード スニペットの出力は C) Mars となります。

Anthropic のバージョンを設定する

パラメータ anthropic_version は設定が可能です。デフォルトでは、このパラメータの値は vertex-2023-10-16 に設定されています。サポートされている他の Anthropic バージョンにアクセスする場合に必要なのは、この値を変更することだけです。

Anthropic のバージョンを変更する必要がある場合は、SET_ANTHROPIC_VERSION メソッドを使用します。

lo_model->set_anthropic_version( 'ANTHROPIC_VERSION' ).

ANTHROPIC_VERSION は、使用する Anthropic のバージョンに置き換えます。詳細については、Anthropic のドキュメントをご覧ください。

Claude からレスポンスを受け取る

モデルから処理済みのレスポンスを受け取り、ABAP デベロッパーにとって意味のある方法で提示するために、SDK には /GOOG/CL_RESPONSE_CLAUDE クラスが用意されています。

/GOOG/CL_RESPONSE_CLAUDE クラスによってキャプチャされたレスポンスは、/GOOG/CL_MODEL_CLAUDE クラスのメソッドを介して行われたリクエストに連結されるため、中間結果を格納する変数を必要とせずに、1 つのステートメントでレスポンスに直接アクセスできます。

テキスト レスポンスを取得する

モデルからテキスト レスポンスを受け取るには、GET_TEXT メソッドを使用します。

DATA(lv_response_text) = lo_model->generate_content( 'PROMPT'
                                )->get_text( ).

PROMPT は、テキスト プロンプトに置き換えます。

リクエスト プロンプト内のトークン数を取得する

モデルへの入力プロンプト内のトークン数を取得するには、GET_PROMPT_TOKEN_COUNT メソッドを使用します。

DATA(lv_prompt_token_count) = lo_model->generate_content( 'PROMPT'
                                    )->get_prompt_token_count( ).

PROMPT は、テキスト プロンプトに置き換えます。

モデルのレスポンス内のトークン数を取得する

モデルからレスポンス内のトークン数を受け取るには、GET_CANDIDATES_TOKEN_COUNT メソッドを使用します。

DATA(lv_candidates_token_count) = lo_model->generate_content( 'PROMPT'
                                        )->get_candidates_token_count( ).

PROMPT は、テキスト プロンプトに置き換えます。

トークンの合計数(リクエストとレスポンス)を取得する

リクエストとレスポンスの両方を含むトークンの合計数を取得するには、GET_TOTAL_TOKEN_COUNT メソッドを使用します。

DATA(lv_stop_reason) = lo_model->generate_content( 'PROMPT'
                              )->get_total_token_count( ).

PROMPT は、テキスト プロンプトに置き換えます。

停止理由を取得する

モデルがレスポンスの生成をブロックした理由を取得するには、GET_STOP_REASON メソッドを使用します。

DATA(lv_stop_reason) = lo_model->generate_content( 'PROMPT'
                              )->get_stop_reason( ).
Replace PROMPT with your text prompt.

PROMPT は、テキスト プロンプトに置き換えます。

コードサンプル

次のコードサンプルは、Claude モデルを呼び出して、さまざまな種類の入力に対するレスポンスを生成する方法を示しています。

テキストベースの生成

次のコードサンプルは、システム指示とともにテキスト プロンプトからレスポンスを生成する方法を示しています。システム指示は省略可能であり、プロンプトとともに渡して、モデルに特定の動作を指示できます。

コードサンプル

DATA:
  lv_instruction TYPE string,
  lv_prompt      TYPE string.

lv_instruction = 'SYSTEM_INSTRUCTIONS'.
lv_prompt      = 'PROMPT'.

TRY.
    DATA(lo_model) = NEW /goog/cl_model_claude( iv_model_key = 'MODEL_KEY' ).

    DATA(lv_response) = lo_model->set_system_instructions( lv_instruction
                              )->generate_content( lv_prompt
                              )->get_text( ).
    IF lv_response IS NOT INITIAL.
      cl_demo_output=>display( lv_response ).

    ENDIF.
  CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
    cl_demo_output=>display( lo_cx_sdk->get_text( ) ).

ENDTRY.

次のように置き換えます。

マルチモーダル生成

次のコードサンプルは、テキストや画像などのマルチモーダル入力からレスポンスを生成する方法を示しています。入力は Base64 エンコード文字列として提供します。システム指示は省略可能であり、プロンプトとともに渡して、モデルに特定の動作を指示できます。

コードサンプル

DATA:
lv_instruction TYPE string,
lv_prompt      TYPE string.

lv_instruction = 'SYSTEM_INSTRUCTIONS'.
lv_prompt      = 'PROMPT'.

TRY.
    DATA(lo_model) = NEW /goog/cl_model_claude( iv_model_key = 'MODEL_KEY' ).

    DATA(lv_response) = lo_model->set_system_instructions( lv_instruction
                            )->set_inline_data( iv_mime_type = 'MIME_TYPE'
                                                iv_data      = 'INLINE_DATA'
                            )->generate_content( lv_prompt
                            )->get_text( ).
IF lv_response IS NOT INITIAL.
      cl_demo_output=>display( lv_response ).
ENDIF.
  CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
    cl_demo_output=>display( lo_cx_sdk->get_text( ) ).
ENDTRY.

次のように置き換えます。

  • MODEL_KEY: モデルキー名。モデル生成パラメータで構成されます。
  • PROMPT: テキスト プロンプト
  • SYSTEM_INSTRUCTIONS: モデルに対するシステム指示
  • MIME_TYPE: ファイルデータの IANA 標準 MIME タイプ。デフォルトでは、MIME タイプは application/pdf に設定されます。
  • INLINE_DATA: プロンプトにインラインで含める画像または PDF の Base64 でエンコードされた元データ。

プロンプト内のトークン数と課金対象文字数を確認する

プロンプトを使用してモデルを呼び出す前に、プロンプト内のトークン数を確認することをおすすめします。

これにより、プロンプトと使用状況について十分な情報に基づいて判断できるようになります。count-tokens エンドポイントには費用はかかりません。次のコードサンプルは、実際に API を呼び出す前にこれらの数値を調べる方法を示しています。

コードサンプル

DATA:
  lv_prompt      TYPE string.

lv_prompt      = 'PROMPT'.

TRY.
    DATA(lo_model) = NEW /goog/cl_model_claude( iv_model_key = 'MODEL_KEY' ).

    DATA(lv_total_tokens) = lo_model->count_tokens( lv_prompt
                                  )->get_total_tokens( ).

IF lv_total_tokens IS NOT INITIAL.
      cl_demo_output=>display( 'Total Tokens -' && lv_total_tokens ).
ENDIF.

  CATCH /goog/cx_sdk INTO DATA(lo_cx_sdk).
    cl_demo_output=>display( lo_cx_sdk->get_text( ) ).

ENDTRY.

次のように置き換えます。

次のステップ