Migración a los modelos de chat

Los modelos cohere.command, cohere.command-light, meta.llama-2-70b-chat que utilizan los puntos finales /generateText y /summarizeText de Oracle Cloud Infrastructure (OCI) Generative AI ahora en desuso se retiraron. Solo puede seguir utilizando estos modelos a través de un cluster de IA dedicado, que utiliza el modo de servicio dedicado. Sin embargo, le recomendamos que, en su lugar, continúe con el modo de servicio bajo demanda mediante el punto final /chat con los (nuevos) modelos de chat. A continuación, se muestra un ejemplo de este punto final:
https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat
Para migrar a estos modelos, puede crear un nuevo servicio de LLM o modificar el existente mediante el punto final /chat que tiene como destino uno de los modelos posteriores, como cohere.command-r-08-2024 o meta.llama-3.2-90b-vision-instruct. A continuación se muestra un ejemplo de un cuerpo de solicitud actualizado para cohere.command-r-08-2024:
{
   "compartmentId": "ocid1.tenancy.oc1..XXXXXXX",
   "servingMode": {
       "servingType": "ON_DEMAND",
       "modelId": "cohere.command-r-08-2024"
   },
   "chatRequest": {
       "apiFormat": "COHERE",
       "message": "what you want to ask goes here …",
       "maxTokens": 1000,
       "isStream": true,
       "frequencyPenalty": 0,
       "topP": 0.75,
       "temperature": 1
   }
}
A continuación se muestra un cuerpo de solicitud de ejemplo para meta.llama-3.2-90b-vision-instruct:
{

    "compartmentId": "ocid1.tenancy.oc1..XXXXXXX",
    "servingMode": {
        "servingType": "ON_DEMAND",
        "modelId": "meta.llama-3.2-90b-vision-instruct"
    },

    "chatRequest": {
        "messages": [
            {
                "role": "USER",
                "content": [
                    {
                        "type": "TEXT",
                        "text": "what you want to ask goes here …"
                    }
                ]
            }
        ],
        "apiFormat": "GENERIC",
        "maxTokens": 600,
        "isStream": false,
        "numGenerations": 1,
        "frequencyPenalty": 0,
        "presencePenalty": 0
  }
}
Además, también tendrá que actualizar manualmente el código de controlador que se genera a partir de las plantillas de transformación específicas de IA generativa para declarar el nuevo modelo de chat. Para cohere.command-r-08-2024, la declaración tiene el siguiente aspecto:
let modelId = "cohere.command-r-08-2024"
let apiFormat = "COHERE";
Para meta.llama-3.2-90b-vision-instruct (u otros modelos que no sean de Cohere), la declaración del modelo es la siguiente. Tenga en cuenta que el valor definido para la declaración de variable apiFormat es GENERIC, que se utiliza para modelos que no son de Cohere.
let modelId = "meta.llama-3.2-90b-vision-instruct"
let apiFormat = "GENERIC";
El código del manejador también deberá incluir parámetros específicos del chat (el parámetro message que reemplaza el parámetro prompt, por ejemplo).
Nota

Si continúa con los modelos de comandos, que están retirados, además de crear el cluster de AI dedicado, tendrá que cambiar el parámetro servingType tanto en la carga útil de solicitud como en el código de manejador transformRequestPayload de la plantilla de Gen AI de ON_DEMAND a DEDICATED.
"servingMode": {
        "modelId": "cohere.command,
        "servingType": "DEDICATED"
    },
Para otros modelos, como meta.llama-3.2-90b-vision-instruct, defina servingType en la carga útil de solicitud y el manejador transformRequestPayload en ON_DEMAND:
 "servingMode": {
        "servingType": "ON_DEMAND",
        "modelId": "meta.llama-3.2-90b-vision-instruct"
    },
Por último, las funciones de código de manejador se tendrán que modificar para soportar las cargas útiles actualizadas; el caso de transmisión para event.payload.responseItems (items) debe incluir el atributo finishReason que impide un mensaje duplicado en la matriz de respuestas. Este es el atributo finishReason del código de manejador actualizado para Cohere.
       if (item.text) {
            let finshReasonVar = item.finishReason;
            if (finshReasonVar != 'COMPLETE') {
              // check for only the stream items and not the 'complete' message (e.g. the last message returned by the API)
              llmPayload.responseItems.push({ "candidates": [{ "content" : item.text || "" }] });
            }
          }        
Esta es la definición de atributo en el código de plantilla de Llama actualizado:
       let finshReasonVar = item.finishReason;
          if (finshReasonVar != 'stop') {
              let msgcontent = item.message.content[0];
              let text = msgcontent.text;
              if (text !== "") {
                llmPayload.responseItems.push({ "candidates": [{ "content" : text || "" }] })
Nota

No tiene que actualizar el código de plantilla para el caso que no sea de flujo. En los siguientes fragmentos de código, la propiedad Usar flujo del componente invokeLLM define "isStream": streamResVar.
A continuación, se muestra un ejemplo del código de manejador modificado para cohere.command-r-08-2024:
/**
    * Handler to transform the request payload
    * @param {TransformPayloadEvent} event - event object contains the following properties:
    * - payload: the request payload object
    * @param {LlmTransformationContext} context - see https://oracle.github.io/bots-node-sdk/LlmTransformationContext.html
    * @returns {object} the transformed request payload
    */
    transformRequestPayload: async (event, context) => {
      // Cohere doesn't support chat completions, so we first print the system prompt, and if there
      // are additional chat entries, we add these to the system prompt under the heading CONVERSATION HISTORY
      let prompt = event.payload.messages[0].content;
      let streamResVar = event.payload.streamResponse;
      if (event.payload.messages.length > 1) {
        let history = event.payload.messages.slice(1).reduce((acc, cur) => `${acc}\n${cur.role}: ${cur.content}`, '');
        prompt += `\n\nCONVERSATION HISTORY:${history}\nassistant:`
      }
      // using Cohere new OCI gen-ai /chat endpoint
      let modelId = "cohere.command-r-08-2024"
      let apiFormat = "COHERE";
      return {
        "compartmentId": event.compartmentId,
        "servingMode": {
          "servingType": "ON_DEMAND",
          "modelId": modelId
        },

        "chatRequest": {
          "apiFormat": apiFormat,
          "message": prompt,
          "maxTokens": 4000,
          "isStream": streamResVar,
          "frequencyPenalty": 0,
          "topP": 0.75,
          "temperature": 0
        }
      };
    },

    /**
    * Handler to transform the response payload
    * @param {TransformPayloadEvent} event - event object contains the following properties:
    * - payload: the response payload object
    * @param {LlmTransformationContext} context - see https://oracle.github.io/bots-node-sdk/LlmTransformationContext.html
    * @returns {object} the transformed response payload
    */

    transformResponsePayload: async (event, context) => {
      let llmPayload = {};
      if (event.payload.responseItems) {
        // streaming case		
        llmPayload.responseItems = [];
        event.payload.responseItems.forEach(item => {
          // only grab the text items, since last item in the responseItems[] is the finished reason not part of the sentence

if (item.text) {

            let finshReasonVar = item.finishReason;
            if (finshReasonVar != 'COMPLETE') {
              // check for only the stream items and not the 'complete' message (e.g., the last message returned by the API)
              llmPayload.responseItems.push({ "candidates": [{ "content" : item.text || "" }] });
            }
          } 
       });
      } else {
        llmPayload.candidates = [{ "content" : event.payload.chatResponse.text || "" }];
      }
     return llmPayload;
    },
A continuación, se muestra un ejemplo del código de manejador para meta.llama-3.2-90b-vision-instruct:
    /**
    * Handler to transform the request payload
    * @param {TransformPayloadEvent} event - event object contains the following properties:
    * - payload: the request payload object
    * @param {LlmTransformationContext} context - see https://oracle.github.io/bots-node-sdk/LlmTransformationContext.html
    * @returns {object} the transformed request payload
    */

    transformRequestPayload: async (event, context) => {
      // are additional chat entries, we add these to the system prompt under the heading CONVERSATION HISTORY
      let prompt = event.payload.messages[0].content;
      let streamResVar = event.payload.streamResponse;
      if (event.payload.messages.length > 1) {
        let history = event.payload.messages.slice(1).reduce((acc, cur) => `${acc}\n${cur.role}: ${cur.content}`, '');
        prompt += `\n\nCONVERSATION HISTORY:${history}\nassistant:
      }
      let modelId = "meta.llama-3.2-90b-vision-instruct"
      let apiFormat = "GENERIC";
      return {
        "compartmentId": event.compartmentId,
        "servingMode": {
          "servingType": "ON_DEMAND",
          "modelId": modelId
        },

        "chatRequest": {
          "messages": [
              {
                  "role": "USER",
                  "content": [
                      {
                          "type": "TEXT",
                          "text": prompt
                      }
                  ]
              }
          ],
          "apiFormat": apiFormat,
          "maxTokens": 4000,
          "isStream": streamResVar,
          "numGenerations": 1,
          "frequencyPenalty": 0,
          "presencePenalty": 0,
          "temperature": 1,
          "topP": 1,
          "topK": 1
      }
      };
    },
 

    /**
    * Handler to transform the response payload
    * @param {TransformPayloadEvent} event - event object contains the following properties:
    * - payload: the response payload object
    * @param {LlmTransformationContext} context - see https://oracle.github.io/bots-node-sdk/LlmTransformationContext.html
    * @returns {object} the transformed response payload
    */

    transformResponsePayload: async (event, context) => {
      let llmPayload = {};
      if (event.payload.responseItems) {
        // streaming case
        llmPayload.responseItems = [];
        event.payload.responseItems.forEach(item => {

          let finshReasonVar = item.finishReason;
          if (finshReasonVar != 'stop') {
              let msgcontent = item.message.content[0];
              let text = msgcontent.text;
              if (text !== "") {
                llmPayload.responseItems.push({ "candidates": [{ "content" : text || "" }] });
              }       
          }       
        });
      } else {
          event.payload.chatResponse.choices.forEach(item => {
          let msgcontent = item.message.content[0];
          let text = msgcontent.text;
          llmPayload.candidates = [{ "content" : text || "" }];
         });
  
      }
    return llmPayload;
    },

Consejo:

Para averiguar qué necesita su código, le recomendamos que lo depure localmente. Debido a que un manejador de eventos de transformación es similar a un componente personalizado, puede utilizar la misma técnica de depuración.