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