本文說明如何使用 Vertex AI SDK for ABAP,叫用 Anthropic Claude 模型,為文字和多模態輸入內容生成回應。Claude 模型可接受多種輸入模式,包括文字、圖片和文件。 您可以將 Claude 模型用於下列用途:
- 產生任意形式文字的摘要
- 描述或解讀媒體資產
- 翻譯不同語言的內容
使用生成模型建構以 AI 為中心的功能時,不需要任何機器學習 (ML) 專業知識。您不需要收集大量資料集或訓練模型。只要用幾句話描述您希望模型執行的動作,就能開始第一個程式。Vertex AI SDK for ABAP 提供 ABAP 類別和方法,方便您從 SAP 環境存取 Claude 模型。
事前準備
使用 Vertex AI SDK for ABAP 搭配 Claude 模型前,請確認您或管理員已完成下列必要條件:
- 在 Google Cloud 專案中啟用 Vertex AI API。
- 在 Google Cloud 專案中啟用 Model Garden 支援的 Claude 模型。
- 在 SAP 環境中安裝了 Vertex AI SDK for ABAP。
- 設定驗證,存取 Vertex AI API。
- 設定模型生成參數。
傳送要求給 Claude
本節說明如何使用 ABAP 適用的 Vertex AI SDK,透過 Vertex AI API 將要求傳送至 Claude 模型。
建立 Claude 多模態呼叫器類別的例項
如要使用文字或多模態提示叫用 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
:前 K 個取樣。MAX_OUTPUT_TOKENS
:每則訊息的輸出符記數量上限
如要進一步瞭解這些參數,請參閱「設定模型生成參數」。
將多模態輸入內容傳送至模型
您可以使用多模態輸入內容 (文字、圖片或文件) 呼叫 Gemini 模型。您可以將圖片和 PDF 的輸入內容當做原始資料傳遞。如果是 PDF,只要 PDF 可公開存取,您也可以提供 URI。
下表列出支援的 MIME 類型:
媒體類型 | 支援的 MIME 類型 |
---|---|
圖片 |
|
文件 |
|
設定原始資料
如要將檔案的原始資料連同 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 分析推文情緒,可以先詢問「Analyze the sentiment in this tweet:」(分析這則推文的情緒:),然後觀察結果。
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 的回覆標準化為單一字詞,例如「正面」、「中立」、「負面」,或是數值,例如 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
設定助理文字
如要取得非常具體的輸出內容,另一個常見策略是「讓 Claude 說出特定字詞」。除了只向 Claude 提供 user
訊息
外,您也可以提供 assistant
訊息,供 Claude 在生成輸出內容時使用。
如果您提供 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
類別方法提出的要求,因此您可以在單一陳述式中直接存取回應,不必使用變數儲存中繼結果。
取得文字回覆
如要接收模型傳回的文字回覆,可以使用 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.
更改下列內容:
後續步驟
- 瞭解如何使用 ABAP SDK for Google Cloud 的內部部署或任何雲端版本開發應用程式。
- 在 Cloud 論壇上向社群提問並討論 Vertex AI SDK for ABAP。