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
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
Im Folgenden finden Sie ein Beispiel für den für 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.
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.