Migrer vers les modèles de discussion

Les modèles cohere.command, cohere.command-light et meta.llama-2-70b-chat utilisés par les adresses /generateText et /summarizeText d'Oracle Cloud Infrastructure (OCI) Generative AI en phase d'abandon ont été retraités. Vous pouvez uniquement continuer à utiliser ces modèles via un cluster d'IA dédié, qui utilise le mode de service dédié. Toutefois, nous vous recommandons de continuer avec le mode de service à la demande en utilisant l'adresse /chat avec les (nouveaux) modèles de discussion. Voici un exemple de cette adresse :
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 service LLM ou modifier le service existant à l'aide de l'adresse /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 de gestionnaire généré à partir des modèles de transformation spécifiques à l'IA générative pour déclarer le nouveau modèle de discussion. 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 non-Cohere), la déclaration de modèle est la suivante. La valeur définie 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 gestionnaire devra également inclure des paramètres spécifiques à la discussion (paramètre message qui remplace le paramètre prompt, par exemple).
Remarque

Si vous continuez avec les modèles de commande, qui sont retraités, vous devrez modifier le paramètre servingType dans la charge utile de la demande et le code de gestionnaire transformRequestPayload du modèle d'IA générative de ON_DEMAND à DEDICATED en plus de créer le cluster d'IA dédié.
"servingMode": {
        "modelId": "cohere.command,
        "servingType": "DEDICATED"
    },
Pour les autres modèles, tels que meta.llama-3.2-90b-vision-instruct, définissez servingType dans la charge utile de la demande et le gestionnaire transformRequestPayload sur ON_DEMAND :
 "servingMode": {
        "servingType": "ON_DEMAND",
        "modelId": "meta.llama-3.2-90b-vision-instruct"
    },
Enfin, les fonctions de code du gestionnaire devront être modifiées pour prendre en charge les charges utiles mises à jour. Le cas de transmission en continu pour event.payload.responseItems (items) doit inclure l'attribut finishReason qui empêche la présence d'un message en double dans le tableau de réponses. Voici l'attribut finishReason du code de gestionnaire 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 de l'attribut dans le code 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 || "" }] })
Remarque

Vous n'avez pas besoin de mettre à jour le code modèle pour le dossier non transmissible. Dans les fragments de code suivants, "isStream": streamResVar est défini par la propriété Utiliser Streaming du composant invokeLLM.
Voici un exemple de code de gestionnaire 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 gestionnaire 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 gestionnaire d'événements de transformation est similaire à un composant personnalisé, vous pouvez utiliser la même technique de débogage.