Migrer vers les modèles de clavardage

Les modèles cohere.command, cohere.command-light, meta.llama-2-70b-chat utilisés par les points d'extrémité /generateText et /summarizeText du service d'intelligence artificielle générative pour Oracle Cloud Infrastructure (OCI) obsolètes ont été abandonnés. Vous ne pouvez continuer à utiliser ces modèles qu'au moyen d'une grappe dédiée à l'IA, qui utilise le mode de service dédié. Toutefois, nous vous recommandons de passer au mode de service sur demande en utilisant le point d'extrémité /chat avec les (nouveaux) modèles de clavardage. Voici un exemple de ce point d'extrémité :
https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat
Pour effectuer une migration vers ces modèles, vous pouvez créer un nouveau service de GML ou modifier le service existant à l'aide du point d'extrémité /chat qui cible l'un des modèles ultérieurs, tels que cohere.command-r-08-2024 ou meta.llama-3.2-90b-vision-instruct. Voici un exemple de corps de demande mis à jour pour 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
   }
}
Voici un exemple de corps de demande pour 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
  }
}
En outre, vous devrez également mettre à jour manuellement le code du programme de traitement généré à partir des modèles de transformation propres à l'IA générative pour déclarer le nouveau modèle de clavardage. Pour cohere.command-r-08-2024, la déclaration se présente comme suit :
let modelId = "cohere.command-r-08-2024"
let apiFormat = "COHERE";
Pour meta.llama-3.2-90b-vision-instruct (ou d'autres modèles autres que Cohere), la déclaration du modèle est la suivante. Notez que le jeu de valeurs pour la déclaration de variable apiFormat est GENERIC, qui est utilisé pour les modèles autres que Cohere.
let modelId = "meta.llama-3.2-90b-vision-instruct"
let apiFormat = "GENERIC";
Le code du programme de traitement devra également inclure des paramètres propres au clavardage (paramètre message qui remplace le paramètre prompt, par exemple).
Note

Si vous continuez avec les modèles de commande, qui sont abandonnés, vous devrez, en plus de créer la grappe dédiée à l'IA, modifier le paramètre servingType dans les données utiles de la demande et le code du programme de traitement transformRequestPayload du modèle d'IA générative de ON_DEMAND à DEDICATED.
"servingMode": {
        "modelId": "cohere.command,
        "servingType": "DEDICATED"
    },
Pour d'autres modèles, tels que meta.llama-3.2-90b-vision-instruct, réglez servingType dans les données utiles de la demande et le programme de traitement transformRequestPayload à ON_DEMAND :
 "servingMode": {
        "servingType": "ON_DEMAND",
        "modelId": "meta.llama-3.2-90b-vision-instruct"
    },
Enfin, les fonctions de code du programme de traitement devront être modifiées pour prendre en charge les données utiles mises à jour. La casse de diffusion en continu pour event.payload.responseItems (items) doit inclure l'attribut finishReason qui empêche un message en double dans le tableau de réponses. Voici l'attribut finishReason du code de programme de traitement mis à jour pour 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 || "" }] });
            }
          }        
Voici la définition d'attribut dans le code de modèle Llama mis à jour :
       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 || "" }] })
Note

Vous n'avez pas besoin de mettre à jour le code de modèle pour le cas sans diffusion en continu. Dans les extraits de code suivants, "isStream": streamResVar est défini par la propriété Utiliser le service de diffusion en continu du composant invokeLLM.
Voici un exemple du code de programme de traitement modifié pour 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;
    },
Voici un exemple de code de programme de traitement pour 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;
    },

Conseil :

Pour savoir ce dont votre code a besoin, nous vous recommandons de le déboguer localement. Comme un programme de traitement d'événements de transformation est similaire à un composant personnalisé, vous pouvez utiliser la même technique de débogage.