En este documento, se describe cómo invocar los modelos de Claude de Anthropic para generar respuestas a entradas de texto y multimodales con el SDK de Vertex AI para ABAP. Los modelos de Claude pueden aceptar varios modos de entrada, incluidos texto, imágenes y documentos. Puedes usar los modelos de Claude para casos de uso como los siguientes:
- Resume texto sin formato
- Describir o interpretar recursos multimedia
- Traducción entre idiomas
El uso de modelos generativos para crear funciones centradas en la IA no requiere experiencia en aprendizaje automático (AA). No necesitas recopilar un conjunto de datos grande ni entrenar un modelo. Para comenzar tu primer programa, solo debes describir en pocas oraciones lo que quieres que haga el modelo. El SDK de Vertex AI para ABAP proporciona clases y métodos de ABAP para acceder a los modelos de Claude desde tu entorno de SAP.
Antes de comenzar
Antes de usar el SDK de Vertex AI para ABAP con los modelos de Claude, asegúrate de que tú o tus administradores hayan completado los siguientes requisitos previos:
- Habilitaste la API de Vertex AI en tu proyecto Google Cloud .
- Habilitaste un modelo de Claude compatible desde Model Garden en tu proyecto Google Cloud .
- Instalaste el SDK de Vertex AI para ABAP en tu entorno de SAP.
- Configura la autenticación para acceder a la API de Vertex AI.
- Configuraste los parámetros de generación del modelo.
Envía la solicitud a Claude
En esta sección, se explica cómo enviar solicitudes a los modelos de Claude a través de la API de Vertex AI con el SDK de Vertex AI para ABAP.
Crea una instancia de la clase de invocador multimodal de Claude
Para invocar los modelos multimodales y de texto de Claude con instrucciones multimodales o de texto, puedes usar la clase /GOOG/CL_MODEL_CLAUDE
.
Para crear una instancia de la clase, debes pasar la clave de modelo configurada en los parámetros de generación del modelo:
DATA(lo_model) = NEW /goog/cl_model_claude( iv_model_key = 'MODEL_KEY' ).
Reemplaza MODEL_KEY
por el nombre de la clave de modelo, que se configura en los parámetros de generación del modelo.
Genera contenido con una instrucción
Para generar contenido proporcionando una instrucción de texto al modelo, puedes usar el método GENERATE_CONTENT
:
lo_model->generate_content( 'PROMPT' ).
Reemplaza PROMPT
por tu instrucción de texto.
Proporciona instrucciones del sistema al modelo
Para pasar instrucciones del sistema basadas en texto al modelo, puedes usar el método SET_SYSTEM_INSTRUCTIONS
:
lo_model->set_system_instructions( 'SYSTEM_INSTRUCTIONS' ).
Reemplaza SYSTEM_INSTRUCTIONS
por tus instrucciones del sistema para el modelo.
Establece la configuración de generación para el modelo
Mantienes la configuración de generación para los modelos en la tabla /GOOG/AI_CONFIG
.
Para anular la configuración de generación de una llamada en particular, puedes usar el método SET_GENERATION_CONFIG
.
Si se establece el parámetro de importación para una propiedad de generación, se tendrá en cuenta el valor del parámetro que se pasó.
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' ).
Reemplaza lo siguiente:
TEMPERATURE
: Temperatura de aleatoriedad.TOP_P
: Muestreo de Top-P.TOP_K
: Muestreo de Top-K.MAX_OUTPUT_TOKENS
: Cantidad máxima de tokens de salida por mensaje
Para obtener más información sobre estos parámetros, consulta Cómo configurar los parámetros de generación del modelo.
Pasa la entrada multimodal al modelo
Puedes invocar los modelos de Gemini con entradas multimodales, que pueden ser texto, imágenes o documentos. Puedes pasar la entrada para imágenes y PDFs como datos sin procesar. En el caso de los PDFs, también puedes proporcionar un URI si el PDF es accesible públicamente.
En la siguiente tabla, se enumeran los tipos de MIME admitidos:
Tipo de medio | Tipos de MIME admitidos |
---|---|
Imágenes |
|
Documentos |
|
Configura datos sin procesar
Para proporcionar los datos sin procesar de un archivo como entrada para el modelo, junto con su tipo de MIME, puedes usar el método SET_INLINE_DATA
:
lo_model->set_inline_data( iv_mime_type = 'MIME_TYPE'
iv_data = 'RAW_DATA'
iv_type = 'base64' ).
Reemplaza lo siguiente:
MIME_TYPE
: Es el tipo de MIME estándar de IANA de los datos sin procesar. De forma predeterminada, el tipo MIME se establece enimage/jpeg
.RAW_DATA
: Son los datos sin procesar codificados en Base64 de la imagen o el PDF que se incluirán intercalados en la instrucción.
Para borrar los datos sin procesar de los archivos de la entrada del modelo con la misma instancia de la clase /GOOG/CL_MODEL_CLAUDE
, puedes usar el método CLEAR_INLINE_DATA
:
lo_model->clear_inline_data( ).
Cómo contar la cantidad de tokens en una instrucción de texto
Para contar la cantidad de tokens en una instrucción de texto antes de invocar el modelo con la instrucción, puedes usar el método COUNT_TOKENS
:
DATA(lv_total_tokens) = lo_model->count_tokens( iv_prompt_text = 'PROMPT'
iv_system_instructions = 'SYSTEM_INSTRUCTIONS'
)->get_total_tokens( ).
Reemplaza lo siguiente:
PROMPT
: Tu sugerencia de texto.SYSTEM_INSTRUCTIONS
: Son tus instrucciones del sistema para el modelo.
Cómo agregar secuencias de detención
Un stop_sequence
es un conjunto de cadenas que le indica a Claude que detenga la generación cuando encuentre cualquiera de estas cadenas en su respuesta. Básicamente, es una instrucción que le dice a Claude: "Si generas esta secuencia, deja de hacerlo de inmediato".
La siguiente muestra de código no incluye un 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( ).
Este muestra de código devuelve la siguiente respuesta:
{
"name": "Dana A",
"email": "dana@example.com",
"phoneNumber": "800-555-0199"
}
La siguiente muestra de código incluye un 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( ).
Este muestra de código devuelve la siguiente respuesta:
Este es un objeto JSON que representa a una persona con un nombre, un correo electrónico y un número de teléfono:
{
"name": "Dana A",
"email": "dana@example.com",
"phoneNumber": "800-555-0199"
Ten en cuenta que el resultado no incluye la secuencia de detención }
. Para analizarlo como JSON, debes agregar el }
de cierre.
Cuando un modelo de Claude proporciona una respuesta, su propiedad stop_reason
indica por qué el modelo dejó de generar texto.
Para obtener el motivo de detención, puedes usar la siguiente muestra de código:
lv_stop_reason = lo_model->set_stop_sequence( lt_stop_sequences
)->generate_content( lv_prompt
)->get_stop_reason( ).
Agregar ejemplos
La instrucción con ejemplos limitados es una estrategia eficaz en la que proporcionas a un modelo un pequeño conjunto de ejemplos para guiar su resultado. Para lograrlo, puedes usar el historial de conversaciones para proporcionarle a Claude estos ejemplos.
Por ejemplo, para analizar la opinión de un tweet con Claude, puedes comenzar preguntando: "Analiza la opinión de este tweet: " y, luego, observar el resultado.
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( ).
Resultado:
# 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.
Si bien una respuesta integral es valiosa, para el análisis de opiniones automatizado de numerosos tweets, es preferible un resultado más conciso de Claude. Puedes estandarizar las respuestas de Claude en una sola palabra, como POSITIVO, NEUTRO o NEGATIVO, o en un valor numérico, como 1, 0 o -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( ).
Resultado:
POSITIVE
Establece el texto del asistente
Otra estrategia común para obtener resultados muy específicos es "poner palabras en la boca de Claude". En lugar de solo proporcionar mensajes user
a Claude, también puedes proporcionar un mensaje assistant
que Claude use cuando genere resultados.
Si proporcionas un mensaje assistant
, Claude continúa la conversación desde el último token assistant
. Solo recuerda que debes comenzar con un mensaje 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( ).
Este fragmento de código muestra el siguiente resultado: C) Mars
.
Establece la versión de Anthropic
Puedes establecer el parámetro anthropic_version
.
De forma predeterminada, vertex-2023-10-16
es el valor establecido para este parámetro. Solo debes cambiar su valor si deseas acceder a otra versión de Anthropic admitida.
Si necesitas cambiar la versión de Anthropic, puedes usar el método SET_ANTHROPIC_VERSION
:
lo_model->set_anthropic_version( 'ANTHROPIC_VERSION' ).
Reemplaza ANTHROPIC_VERSION
por la versión de Anthropic que se usará.
Para obtener más información, consulta la documentación de Anthropic.
Recibe una respuesta de Claude
Para recibir respuestas procesadas del modelo y presentarlas de una manera significativa para los desarrolladores de ABAP, el SDK proporciona la clase /GOOG/CL_RESPONSE_CLAUDE
.
La respuesta que captura la clase /GOOG/CL_RESPONSE_CLAUDE
se encadena a las solicitudes realizadas a través de los métodos de la clase /GOOG/CL_MODEL_CLAUDE
, de modo que puedas acceder directamente a la respuesta en una sola sentencia sin necesidad de variables para almacenar los resultados intermedios.
Obtén una respuesta de texto
Para recibir una respuesta de texto del modelo, puedes usar el método GET_TEXT
:
DATA(lv_response_text) = lo_model->generate_content( 'PROMPT'
)->get_text( ).
Reemplaza PROMPT
por tu instrucción de texto.
Obtén la cantidad de tokens en la instrucción de la solicitud
Para recibir la cantidad de tokens en la instrucción de entrada al modelo, puedes usar el método GET_PROMPT_TOKEN_COUNT
:
DATA(lv_prompt_token_count) = lo_model->generate_content( 'PROMPT'
)->get_prompt_token_count( ).
Reemplaza PROMPT
por tu instrucción de texto.
Obtén la cantidad de tokens en la respuesta del modelo
Para recibir la cantidad de tokens en la respuesta del modelo, puedes usar el método GET_CANDIDATES_TOKEN_COUNT
:
DATA(lv_candidates_token_count) = lo_model->generate_content( 'PROMPT'
)->get_candidates_token_count( ).
Reemplaza PROMPT
por tu instrucción de texto.
Obtén el recuento total de tokens (solicitud y respuesta)
Para determinar el recuento total de tokens, que abarca tanto la solicitud como la respuesta, puedes usar el método GET_TOTAL_TOKEN_COUNT
:
DATA(lv_stop_reason) = lo_model->generate_content( 'PROMPT'
)->get_total_token_count( ).
Reemplaza PROMPT
por tu instrucción de texto.
Obtén el motivo de la detención
Para recibir el motivo por el que el modelo bloqueó la generación de respuestas, puedes usar el método GET_STOP_REASON
:
DATA(lv_stop_reason) = lo_model->generate_content( 'PROMPT'
)->get_stop_reason( ).
Replace PROMPT with your text prompt.
Reemplaza PROMPT
por tu instrucción de texto.
Muestras de código
En las siguientes muestras de código, se muestra cómo invocar los modelos de Claude para generar respuestas para diferentes tipos de entradas.
Generación basada en texto
En la siguiente muestra de código, se muestra cómo generar una respuesta a partir de una instrucción del sistema junto con una instrucción de texto. La instrucción del sistema es opcional y se puede pasar junto con la instrucción para indicarle al modelo que se comporte de una manera específica.
Muestra de código
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.
Reemplaza lo siguiente:
MODEL_KEY
: El nombre de la clave del modelo, que se configura en los parámetros de generación del modelo.PROMPT
: Tu sugerencia de texto.SYSTEM_INSTRUCTIONS
: Son tus instrucciones del sistema para el modelo.
Generación multimodal
En la siguiente muestra de código, se muestra cómo generar una respuesta a partir de una entrada multimodal, como texto y una imagen. Proporcionas la entrada como una cadena codificada en base64. La instrucción del sistema es opcional y se puede pasar junto con la instrucción para indicarle al modelo que se comporte de una manera específica.
Muestra de código
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.
Reemplaza lo siguiente:
MODEL_KEY
: El nombre de la clave del modelo, que se configura en los parámetros de generación del modelo.PROMPT
: Tu sugerencia de texto.SYSTEM_INSTRUCTIONS
: Son tus instrucciones del sistema para el modelo.MIME_TYPE
: Es el tipo de MIME estándar de IANA de los datos del archivo. De forma predeterminada, el tipo MIME se establece enapplication/pdf
.INLINE_DATA
: Son los datos sin procesar codificados en base64 de la imagen o el PDF que se incluirán intercalados en el mensaje.
Busca la cantidad de tokens y caracteres facturables en una instrucción
Antes de invocar el modelo con una instrucción, es posible que desees verificar la cantidad de tokens que contiene.
Esto te ayuda a tomar decisiones fundamentadas sobre tus instrucciones y tu uso. El extremo count-tokens no tiene costo. En el siguiente muestra de código, se muestra cómo encontrar estos números antes de invocar la API:
Muestra de código
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.
Reemplaza lo siguiente:
PROMPT
: Tu instrucción de texto.MODEL_KEY
: El nombre de la clave del modelo, que se configura en los parámetros de generación del modelo.
¿Qué sigue?
- Obtén información sobre el desarrollo de aplicaciones con la edición local o cualquier edición en la nube del SDK de ABAP para Google Cloud.
- Haz tus preguntas y analiza el SDK de Vertex AI para ABAP con la comunidad en Cloud Forums.