本文档介绍了如何使用 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 发送请求
本部分介绍了如何使用 Vertex AI SDK for ABAP 通过 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
:Top-K 采样。MAX_OUTPUT_TOKENS
:每条消息的输出 token 数上限
如需详细了解这些参数,请参阅配置模型生成参数。
将多模态输入传递给模型
您可以使用多模态输入调用 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( ).
计算文本提示中的 token 数
如需在使用提示调用模型之前统计文本提示中的 token 数,您可以使用 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 的回答标准化为单个字词(例如“肯定”“中性”“否定”)或数值(例如 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
替换为您的文本提示。
获取请求提示中的 token 数量
如需接收模型的输入提示中的 token 数量,您可以使用 GET_PROMPT_TOKEN_COUNT
方法:
DATA(lv_prompt_token_count) = lo_model->generate_content( 'PROMPT'
)->get_prompt_token_count( ).
将 PROMPT
替换为您的文本提示。
获取模型回答中的 token 数量
如需接收模型回答中的 token 数量,您可以使用 GET_CANDIDATES_TOKEN_COUNT
方法:
DATA(lv_candidates_token_count) = lo_model->generate_content( 'PROMPT'
)->get_candidates_token_count( ).
将 PROMPT
替换为您的文本提示。
获取总 token 数(请求和回答)
如需确定包含请求和回答的 token 总数,您可以使用 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 编码原始数据。
查找提示中的 token 数和计费字符数
在使用提示调用模型之前,您可能需要检查提示中的 token 数量。
这有助于您就提示和使用情况做出明智的决策。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。