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
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,
Voici un exemple du code de programme de traitement modifié pour 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.
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.