Zu Chatmodellen migrieren

Die Modelle cohere.command, cohere.command-light und meta.llama-2-70b-chat, die von den jetzt veralteten Endpunkten /generateText und /summarizeText der generativen KI von Oracle Cloud Infrastructure (OCI) verwendet werden, wurden veraltet. Sie können diese Modelle nur über ein dediziertes KI-Cluster weiter verwenden, das den dedizierten Bereitstellungsmodus verwendet. Es wird jedoch empfohlen, stattdessen den On-Demand-Servicemodus fortzusetzen, indem Sie den Endpunkt /chat mit den (neuen) Chatmodellen verwenden. Im Folgenden finden Sie ein Beispiel für diesen Endpunkt:
https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/chat
Um zu diesen Modellen zu migrieren, können Sie entweder einen neuen LLM-Service erstellen oder den vorhandenen mit dem Endpunkt /chat ändern, der auf eines der späteren Modelle abzielt, z.B. cohere.command-r-08-2024 oder meta.llama-3.2-90b-vision-instruct. Beispiel für einen aktualisierten Anforderungsbody für 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
   }
}
Im Folgenden finden Sie einen Beispielanforderungsbody für 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
  }
}
Außerdem müssen Sie den Handler-Code, der aus den generativen KI-spezifischen Transformationsvorlagen generiert wird, manuell aktualisieren, um das neue Chatmodell zu deklarieren. Für cohere.command-r-08-2024 sieht die Erklärung wie folgt aus:
let modelId = "cohere.command-r-08-2024"
let apiFormat = "COHERE";
Für meta.llama-3.2-90b-vision-instruct (oder andere Nicht-Cohere-Modelle) lautet die Modelldeklaration wie folgt. Beachten Sie, dass das Werteset für die Variablendeklaration apiFormat GENERIC ist, das für Nicht-Cohere-Modelle verwendet wird.
let modelId = "meta.llama-3.2-90b-vision-instruct"
let apiFormat = "GENERIC";
Der Handler-Code muss auch chatspezifische Parameter enthalten (der Parameter message, der beispielsweise den Parameter prompt ersetzt).
Hinweis

Wenn Sie mit den Befehlsmodellen fortfahren, die veraltet sind, müssen Sie neben dem Erstellen des dedizierten KI-Clusters den Parameter servingType sowohl in der Anforderungs-Payload als auch in dem transformRequestPayload-Handlercode der Gen AI-Vorlage von ON_DEMAND in DEDICATED ändern.
"servingMode": {
        "modelId": "cohere.command,
        "servingType": "DEDICATED"
    },
Setzen Sie für andere Modelle, wie meta.llama-3.2-90b-vision-instruct, servingType in der Anforderungs-Payload und im transformRequestPayload-Handler auf ON_DEMAND:
 "servingMode": {
        "servingType": "ON_DEMAND",
        "modelId": "meta.llama-3.2-90b-vision-instruct"
    },
Schließlich müssen die Handler-Codefunktionen geändert werden, um die aktualisierten Payloads zu unterstützen. Der Streamingfall für die event.payload.responseItems (items) muss das Attribut finishReason enthalten, das eine doppelte Nachricht im Antwortarray verhindert. Hier ist das Attribut finishReason, das den aktualisierten Handler-Code für Cohere enthält.
       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 || "" }] });
            }
          }        
Hier ist die Attributdefinition im aktualisierten Llama-Vorlagencode:
       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 || "" }] })
Hinweis

Sie müssen den Vorlagencode für den Nicht-Streamingfall nicht aktualisieren. In den folgenden Code-Snippets wird die "isStream": streamResVar durch die Eigenschaft Streaming verwenden der Komponente invokeLLM festgelegt.
Im Folgenden finden Sie ein Beispiel für den für cohere.command-r-08-2024 geänderten Handler-Code:
/**
    * 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;
    },
Im Folgenden finden Sie ein Beispiel für den Handler-Code für 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;
    },

Tipp:

Um herauszufinden, was Ihr Code benötigt, empfehlen wir Ihnen, ihn lokal zu debuggen. Da ein Transformationsereignis-Handler einer benutzerdefinierten Komponente ähnlich ist, können Sie dieselbe Debuggingmethode verwenden.