Richiama componente modello di linguaggio di grandi dimensioni

Il componente Richiama modello di linguaggio di grandi dimensioni (componente LLM) in Visual Flow Designer consente di connettere un flusso a LLM tramite una chiamata di servizio REST.

È possibile inserire questo stato del componente nel flusso della finestra di dialogo selezionando Service Integration > Richiama modello di linguaggio di grandi dimensioni nella finestra di dialogo Aggiungi stato. Per abilitare conversazioni a più turni quando gli skill vengono richiamati da un assistente digitale, immettere una descrizione per la descrizione LLM.
Questa è un'immagine del campo Descripiton nella pagina Generale.

Nota

Come best practice, aggiungere sempre descrizioni ai componenti LLM per consentire perfezionamenti a più turni quando gli utenti accedono al servizio LLM tramite un assistente digitale.

L'inserimento dello stato del componente LLM aggiunge uno stato di gestione degli errori per la risoluzione dei problemi delle richieste all'LLM e alle relative risposte. Lo stato del componente LLM passa a questo stato (denominato ShowLLMError per impostazione predefinita) quando una richiesta o una risposta non valida causa un errore non recuperabile.
Segue la descrizione dell'immagine invokellm-added-flow.png
Descrizione dell'immagine invokellm-added-flow.png

Oltre a chiamare il servizio LLM, lo stato del componente LLM gestisce le transazioni interattive, come i perfezionamenti multi-turn, gli scambi back-and-forth tra l'utente e l'LMM che affinano l'output LLM attraverso cicli di feedback degli utenti.
Nota

Il perfezionamento delle risposte può anche provenire dal sistema quando implementa nuovi tentativi dopo la convalida non riuscita.
È possibile inviare il risultato dal modello LLM come messaggio oppure salvarlo in una variabile di flusso della finestra di dialogo per l'utilizzo a valle. La convalida integrata del componente LLM fornisce guardrail contro vulnerabilità come attacchi di iniezione rapida che ignorano le linee guida di moderazione del contenuto del modello.
Nota

Se si desidera migliorare la convalida già fornita dal componente LLM o se si desidera migliorare l'output LLM utilizzando la tecnica RCI (Recursive Criticism and Improvement), è possibile utilizzare il nostro codice iniziale per creare i propri handler di convalida delle richieste e delle risposte.

Quindi, cosa è necessario utilizzare questo componente? Se si accede al modello Cohere direttamente o tramite il servizio AI generativa Oracle, è sufficiente un servizio LLM per il modello Cohere e un prompt, che è un blocco di testo leggibile dall'utente contenente le istruzioni per l'LLM. Poiché scrivere un prompt è un processo iterativo, ti forniamo le linee guida per la progettazione rapida e il Prompt Builder, dove puoi incorporare queste linee guida nel testo del prompt e testarlo fino a quando non ottiene la risposta appropriata dal modello. Se si utilizza un altro modello, ad esempio Azure OpenAI, sarà necessario prima creare un gestore eventi di trasformazione personale dal codice iniziale fornito e quindi creare un servizio LLM che esegua il mapping dell'handler agli endpoint del provider LLM configurati per l'istanza.

Proprietà generali

Proprietà descrizione; Valore predefinito Richiesto?
Servizio LLM Elenco dei servizi LLM configurati per lo skill. Se sono presenti più servizi, viene utilizzato il servizio LLM predefinito quando non è stato selezionato alcun servizio. Servizio LLM predefinito Lo stato può essere valido senza il servizio LLM, ma la competenza non può connettersi al modello se questa proprietà non è stata impostata.
Richiesta Prompt specifico del modello a cui si accede tramite il servizio LLM selezionato. Tieni a mente le nostre linee guida generali mentre scrivi il prompt. È possibile inserire il prompt in questo campo, quindi rivederlo e testarlo utilizzando il Prompt Builder (a cui è possibile accedere facendo clic su Crea prompt). È inoltre possibile comporre il prompt utilizzando Prompt Builder. N/A
Parametri prompt Valori dei parametri. Utilizzare la sintassi dell'espressione FreeMarker Apache standard (${parameter}) per fare riferimento ai parametri nel testo del prompt. Ad esempio:
Draft an email about ${opportunity} sales.
Per le variabili sacchetto composito, utilizzare la sintassi sacchetto composito:
  • ${cb_entity.value.bag_item.value} per gli elementi dell'elenco di valori
  • ${cb_entity.value.bag_item} per elementi elenco non di valore
Definire tutti i parametri del prompt o ciascuno dei parametri a cui si fa riferimento nel testo del prompt. Tutti i parametri prompt mancanti vengono contrassegnati come errori.
N/A No
Variabile risultato Variabile che memorizza la risposta LLM. N/A No

Messaggistica utente

Queste opzioni sono valide solo se si imposta Invia risultato LLM come messaggio su True.
Proprietà descrizione; Valori predefiniti Richiesto?
Invia risultato LLM come messaggio Se si imposta questa opzione su True, l'LLM restituirà un messaggio inviato all'utente. L'impostazione di questa proprietà su False impedisce l'invio dell'output all'utente. Vero No
Usa streaming I risultati LLM vengono trasmessi al client quando si imposta questa opzione su True, fornendo potenzialmente un'esperienza utente più fluida perché la risposta LLM viene visualizzata in modo incrementale man mano che viene generata anziché tutta in una volta. Questa opzione è disponibile solo se Invia risultato LLM come messaggio è stato impostato su True.

Gli utenti possono visualizzare risposte potenzialmente non valide perché l'handler di eventi di convalida viene richiamato dopo che la risposta LLM ha già avviato lo streaming.

Impostare Usa streaming su False per i modelli Cohere o quando si è applicato uno schema JSON al risultato LLM impostando Applica risposta LLM formattata JSON su True.

Non abilitare lo streaming se:
  • La competenza viene eseguita sui canali Slack o Microsoft Teams.
  • È stata impostata la convalida delle risposte. L'handler può convalidare solo una risposta completa, pertanto se si imposta Usa streaming su True, gli utenti possono inviare più flussi di output, il che potrebbe confonderli.
Vero No
Avvia messaggio Messaggio di stato inviato all'utente quando l'LLM è stato richiamato. Questo messaggio, che viene effettivamente visualizzato prima dell'invocazione LLM, può essere un indicatore utile. Può informare gli utenti che il trattamento è in corso o che l'LLM può impiegare un periodo di tempo per rispondere. N/A No
Abilita perfezionamenti con più turni Se si imposta questa opzione su True (impostazione predefinita), è possibile consentire agli utenti di perfezionare la risposta LLM fornendo istruzioni di follow-up. La finestra di dialogo rilascia il turno all'utente, ma rimane nello stato LLM dopo che il risultato LLM è stato ricevuto. Quando è impostata su False, la finestra di dialogo mantiene il turno fino alla ricezione della risposta LLM e alla transizione allo stato a cui fa riferimento l'azione Success.

Nota: la descrizione del componente è obbligatoria per i perfezionamenti a più turni quando lo skill viene richiamato da un assistente digitale.

Vero No
Azioni standard Aggiunge i pulsanti di azione standard visualizzati sotto l'output nel messaggio dei risultati LLM. Tutti questi pulsanti vengono attivati per impostazione predefinita.
  • Sottometti: quando un utente seleziona questo pulsante, viene attivata la transizione next e viene attivato l'handler di eventi submit.
  • Annulla: quando un utente seleziona questo pulsante, la finestra di dialogo passa allo stato definito per la transizione annulla.
  • Annulla: quando si fa clic su di esso, lo skill rimuove l'ultima risposta di ridefinizione e torna al risultato precedente. Lo skill rimuove anche il perfezionamento precedente dalla cronologia delle chat. Questo pulsante non viene visualizzato nella risposta iniziale. Viene visualizzato solo dopo che il servizio LLM ha generato un perfezionamento.
    I pulsanti Sottometti, Annulla e Annulla nella parte inferiore del messaggio.

Sono tutte selezionate le opzioni Sottometti, Annulla e Annulla. No
Etichetta pulsante Annulla Etichetta del pulsante Annulla Submit Sì: quando viene definita l'azione Annulla.
Etichetta pulsante Operazione riuscita L'etichetta per il pulsante di operazione riuscita Cancel Sì: quando viene definita l'azione Successo.
Etichetta pulsante Annulla L'etichetta per il pulsante Annulla Undo Sì: quando viene definita l'azione Annulla.
Azioni personalizzate Pulsante di azione personalizzato. Immettere un'etichetta pulsante e un prompt con istruzioni aggiuntive. N/A No

Azioni di transizione per il componente Richiama modello di lingua di grandi dimensioni

Azione descrizione;
cancel

Questa azione viene attivata quando gli utenti toccano il pulsante Annulla.

error

Questa azione viene attivata quando le richieste o le risposte dell'LLM non sono valide. Ad esempio, l'assegnazione di nuovi prompt per la correzione degli errori JSON o dei valori di entità è stata utilizzata.

Valutazioni utente per contenuto generato da LLM

Per impostazione predefinita, su ogni messaggio viene visualizzata la valutazione utente (pollici in alto e pollici in basso).
Icone Pollice su e Pollice giù nel messaggio di risposta skill

Quando gli utenti assegnano alla risposta LLM un rating di pollice verso il basso, lo skill segue un collegamento che apre un modulo di feedback.

È possibile disabilitare questi pulsanti disattivando Abilita feedback modello di lingua di grandi dimensioni in Impostazioni > Configurazione.
Opzione di feedback Abilita modello di lingua di grandi dimensioni.

Convalida risposta

Proprietà descrizione; Valore predefinito Richiesto?
Entità di convalida Selezionare le entità i cui valori devono corrispondere nel messaggio di risposta LLM. I nomi di queste entità e i relativi valori corrispondenti vengono passati come mappa al gestore di eventi, che valuta questo oggetto per le corrispondenze di entità mancanti. Se le corrispondenze di entità mancanti impediscono la convalida, l'handler restituisce un messaggio di errore per denominare le entità non corrispondenti, che viene quindi inviato al modello. Il modello tenta quindi di rigenerare una risposta che include i valori mancanti. Continua con i suoi tentativi fino a quando l'handler non ne convalida l'output o fino a quando non ha esaurito il numero di nuovi tentativi.

Si consiglia di utilizzare le entità sacchetto composto per consentire al gestore di eventi di generare messaggi di errore concisi poiché le etichette e i messaggi di errore applicati ai singoli articoli sacchetto composto forniscono al LLM dettagli sui valori di entità che non è stato possibile includere nella risposta.

N/A No
Applica risposta LLM in formato JSON Impostando questa opzione su True, è possibile applicare la formattazione JSON alla risposta LLM copiando e incollando uno schema JSON. Il componente LLM convalida la risposta LLM in formato JSON rispetto a questo schema.

Se non si desidera che gli utenti visualizzino il risultato LLM come JSON di tipo RAW, è possibile creare un handler di eventi con un metodo changeBotMessages che trasforma il formato JSON in un formato riconoscibile dall'utente, ad esempio un form con tabelle.

Impostare Usa streaming su Falso se si applica la formattazione JSON.

GPT-3.5 mostra più robustezza di GPT-4 per la convalida dello schema JSON. GPT-4 a volte corregge una risposta.

Falso No
Numero di tentativi Il numero massimo di tentativi consentiti quando l'LLM viene richiamato con un prompt di nuovo tentativo quando vengono trovati errori di convalida di entità o JSON. Il prompt dei nuovi tentativi specifica gli errori e le richieste che l'LLM deve correggere. Per impostazione predefinita, il componente LLM effettua una singola richiesta di nuovo tentativo. Una volta raggiunta l'assegnazione dei nuovi tentativi, il ciclo di convalida dei prompt dei nuovi tentativi termina. La finestra di dialogo viene quindi spostata dal componente LLM tramite la transizione di errore. 1 No
Riprova messaggio Messaggio di stato inviato all'utente quando l'LLM è stato richiamato utilizzando un prompt di nuovo tentativo. Ad esempio, i seguenti enumerano gli errori di entità e JSON utilizzando la proprietà evento allValidationErrors:
Trying to fix the following errors: ${system.llm.messageHistory.value.allValidationErrors?join(', ')}}
Enhancing the response. One moment, please... No
Handler personalizzazione convalida Se il caso d'uso richiede una convalida specializzata, è possibile selezionare l'handler di convalida personalizzato distribuito allo skill. Ad esempio, è possibile che sia stato creato un gestore di eventi per la propria abilità che non solo convalida e applica un'ulteriore elaborazione alla risposta LLM, ma valuta anche le richieste utente di contenuto tossico. Se il caso d'uso richiede che la convalida di entità o JSON dipenda da regole specifiche, ad esempio corrispondenze di entità interdipendenti (ad esempio, la presenza di un valore di entità nel risultato LLM richiede o preclude la presenza di un altro), sarà necessario creare l'handler per questa abilità prima di selezionarla qui. N/A No

Crea handler convalida e personalizzazione LLM

Oltre agli handler di trasformazione LLM, è anche possibile utilizzare gli handler di eventi per convalidare le richieste effettuate all'LLM e le relative risposte (i completamenti generati dal provider LLM). In genere, è necessario mantenere questo codice, noto come gestore di convalida e personalizzazione LLM, separato dal codice dell'handler di trasformazione LLM perché operano su livelli diversi. La convalida di richieste e risposte è specifica di uno stato LLM e del relativo prompt. La convalida della trasformazione LLM, d'altra parte, si applica all'intera abilità perché la sua logica di trasformazione delle richieste e delle risposte è in genere la stessa per tutti i richiami LLM nell'abilità.

Sebbene il componente LLM fornisca guardrail di convalida per prevenire allucinazioni e proteggere dagli attacchi di pronta iniezione intesi a bypassare le linee guida di moderazione dei contenuti del modello o a sfruttare altre vulnerabilità, è consigliabile creare validatori specializzati interamente ex novo utilizzando i metodi LlmComponentContext in bots-node-sdk oppure incorporando questi metodi nel modello fornito.
Nota

Nel relativo form non modificato, il codice modello esegue le stesse funzioni di convalida già fornite dal componente LLM.

È possibile creare un gestore eventi di convalida personalizzato per la presentazione della risposta LLM. In questo caso, il testo della risposta LLM può essere inviato dall'handler come parte di un messaggio utente. Ad esempio, se si indica all'LLM di inviare una risposta strutturata utilizzando il formato JSON, è possibile analizzare la risposta e generare un messaggio formattato come tabella o scheda.

Per creare un gestore di eventi utilizzando questo modello:
  1. Fare clic su Componenti nella barra di navigazione a sinistra.
  2. Fare clic su +New Servizio.
  3. Completare la finestra di dialogo Crea servizio:
    • Nome: immettere il nome del servizio.
    • Tipo di servizio: Contenitore incorporato
    • Tipo pacchetto servizio componente: Nuovo componente
    • Tipo di componente: Convalida e personalizzazione LLM
    • Nome componente: immettere un nome facilmente identificabile per l'handler di eventi. Quando si crea il servizio LLM per lo skill, verrà fatto riferimento a questo nome.
  4. Fare clic su Crea per generare l'handler di convalida.
  5. Al termine della distribuzione, espandere il servizio e selezionare l'handler di convalida.
  6. Fare clic su Modifica per aprire l'editor Modifica codice componente.
  7. Se necessario, aggiornare i seguenti metodi di gestione utilizzando il modello generato.
    Metodo descrizione; Quando la convalida riesce Quando la convalida non riesce Tipo restituito Posizione nell'editor Codice segnaposto Quali azioni è possibile eseguire quando la convalida non riesce?
    validateRequestPayload Convalida il payload richieste. Restituisce true quando la richiesta è valida.

    Restituisce false quando la convalida di una richiesta non riesce.

    boolean Linee 24-29
    
        validateRequestPayload: async (event, context) => { 
          if (context.getCurrentTurn() === 1 && context.isJsonValidationEnabled()) {
            context.addJSONSchemaFormattingInstruction();
          }
          return true;
        }
    Per ulteriori informazioni su questo codice, vedere validateRequestPayload properties.
    validateResponsePayload Convalida il payload della risposta LLM.
    Quando l'handler restituisce true:
    • Se si imposta la proprietà Invia risultato LLM come messaggio su true, la risposta LLM, inclusi eventuali pulsanti di azione standard o personalizzati, viene inviata all'utente.
    • Se lo streaming è abilitato, la risposta LLM verrà trasmessa in chunk. I pulsanti di azione verranno aggiunti alla fine del flusso.
    • Tutti i messaggi utente aggiunti nell'handler vengono inviati all'utente, indipendentemente dall'impostazione per la proprietà Invia risultato LLM come messaggio.
    • Se nell'handler è impostato un nuovo prompt LLM, questo prompt viene inviato all'LLM e l'handler di convalida verrà richiamato di nuovo con la nuova risposta LLM
    • Se non viene impostato alcun nuovo prompt LLM e la proprietà Abilita perfezionamenti con più turni è impostata su true, il turno viene rilasciato e il flusso della finestra di dialogo rimane nello stato LLM. Se tuttavia questa proprietà è impostata su false, il turno viene mantenuto e la finestra di dialogo passa dallo stato utilizzando l'azione di transizione success.
    Quando l'handler restituisce false:
    • Se lo streaming è abilitato, gli utenti possono visualizzare le risposte potenzialmente non valide perché l'handler di eventi di convalida viene richiamato dopo che la risposta LLM ha già avviato lo streaming.
    • Tutti i messaggi utente aggiunti dall'handler vengono inviati all'utente, indipendentemente dall'impostazione Invia risultato LLM come risposta skill.
    • Se nell'handler viene impostato un nuovo prompt LLM, questo prompt viene inviato all'LLM e l'handler di convalida verrà richiamato di nuovo con la nuova risposta LLM.
    • Se non è impostato alcun prompt LLM, il flusso della finestra di dialogo passa dallo stato del componente LLM. L'azione di transizione impostata nel codice handler verrà utilizzata per determinare lo stato successivo. Se non è impostata alcuna azione di transizione, viene attivata l'azione di transizione error.
    boolean Linee 50-56
      /**
       * Handler to validate response payload
       * @param {ValidateResponseEvent} event
       * @param {LLMContext} context
       * @returns {boolean} flag to indicate the validation was successful
       */
       validateResponsePayload: async (event, context) => {
         let errors = event.allValidationErrors || [];
         if (errors.length > 0) {
           return context.handleInvalidResponse(errors);
         }
         return true;
       }
    Per ulteriori informazioni su questo codice, vedere validateResponsePayload Proprietà.
    • Richiamare nuovamente l'LLM utilizzando un prompt di nuovo tentativo che specifica il problema con la risposta (ad esempio, non è conforme a un formato JSON specifico) e richiede che l'LLM la risolva.
    • Impostare un errore di convalida.
    changeBotMessages Modifica i messaggi di skill del candidato che verranno inviati all'utente. N/A N/A Lista di messaggi del modello messaggi di conversazione Righe 59-71
    
        changeBotMessages: async (event, context) => { 
          return event.messages;
        },
    Per un esempio di utilizzo di questo metodo, vedere Migliorare il messaggio utente per le risposte con formattazione JSON.
    N/A
    submit Questo handler viene richiamato quando gli utenti toccano il pulsante Sottometti. Elabora ulteriormente la risposta LLM. N/A N/A N/A Righe 79-80
        submit: async (event, context) => { 
        }
    N/A
    Ciascuno di questi metodi utilizza un oggetto event e un oggetto context. Ad esempio:
     validateResponsePayload: async (event, context) =>
    ...
    Le proprietà definite per l'oggetto event dipendono dal tipo di evento. Il secondo argomento, context, fa riferimento alla classe LlmComponentContext, che accede ai metodi convenienti per la creazione della logica del gestore di eventi. Questi metodi includono l'impostazione del numero massimo di nuovi prompt e l'invio di messaggi di stato e di errore agli utenti delle competenze.
  8. Verificare la sintassi degli aggiornamenti facendo clic su Convalida. Fare quindi clic su Save > Close.
validateRequestPayload Proprietà degli eventi
Nome descrizione; Digita Richiesto?
payload Richiesta LLM che richiede la convalida stringa
validateResponsePayload Proprietà degli eventi
Nome descrizione; Digita Richiesto?
payload Risposta LLM che deve essere convalidata. stringa
validationEntities Elenco di nomi di entità specificato dalla proprietà Entità di convalida dello stato del componente LLM corrispondente. String[] No
entityMatches Una mappa con il nome dell'entità corrispondente come chiave e un array di entità JSONObject corrisponde come valore. Questa proprietà ha un valore solo se la proprietà Entità di convalida è impostata anche nello stato del componente LLM. Mappa<String, JSONArray> No
entityValidationErrors Coppia chiave-valore con l'elemento entityName o un elemento bag composto come chiave e un messaggio di errore come valore. Questa proprietà viene impostata solo quando è impostata anche la proprietà Entità di convalida e mancano corrispondenze di entità oppure (quando l'entità è un sacchetto composito) mancano corrispondenze di elementi sacchetto composito. Mappa<String, String> No
jsonValidationErrors Se la proprietà Enforce JSON-Formatted LLM Response del componente LLM è impostata su True e la risposta non è un oggetto JSON valido, questa proprietà contiene una singola voce con il messaggio di errore che indica che la risposta non è un oggetto JSON valido.

Se, tuttavia, il file JSON è valido e la proprietà Enforce JSON-Formatted LLM Response del componente è anche impostata su True, questa proprietà contiene coppie chiave-valore con il percorso dello schema come chiavi e, se la risposta non è conforme allo schema, i messaggi di errore di convalida dello schema come valori.

Mappa<String, String> No
allValidationErrors Lista di tutti gli errori di convalida delle entità e degli errori di convalida JSON. String[] No
Esempi di codice dell'handler di convalida

Convalida JSON personalizzata
Il seguente snippet illustra come si aggiunge codice al modello validateResponsePayload predefinito per verificare che una richiesta di personale in formato JSON sia impostata su Los Angeles:
  /**
   * Handler to validate response payload
   * @param {ValidateResponseEvent} event
   * @param {LLMContext} context
   * @returns {boolean} flag to indicate the validation was successful
   */
   validateResponsePayload: async (event, context) => {
     let errors = event.allValidationErrors || [];
     const json = context.convertToJSON(event.payload);
     if (json && 'Los Angeles' !== json.location) {
       errors.push('Location is not set to Los Angeles');
     }
     if (errors.length > 0) {
       return context.handleInvalidResponse(errors);
     }
     return true;
   }
Migliora il messaggio utente per le risposte con formattazione JSON
Se è necessario che LLM restituisca la risposta in formato JSON, potrebbe non essere necessario visualizzare la risposta JSON raw agli utenti delle competenze. Tuttavia, poiché la risposta è ora strutturata in formato JSON e conforme allo schema JSON fornito, è possibile trasformare facilmente questa risposta in uno dei tipi di messaggio Modello messaggi di conversazione, ad esempio un messaggio di scheda, tabella o modulo. Lo snippet riportato di seguito illustra l'uso dell'handler changeBotMessages per trasformare la risposta JSON raw in un messaggio form intuitivo.
     /**
      * Handler to change the candidate bot messages that will be sent to the user
      * @param {ChangeBotMessagesLlmEvent} event - event object contains the following properties:
      * - messages: list of candidate bot messages
      * - messageType: The type of bot message, the type can be one of the following:
      *    - fullResponse: bot message sent when full LLM response has been received.
      *    - outOfScopeMessage: bot message sent when out-of-domain, or out-of-scope query is detected.
      *    - refineQuestion: bot message sent when Refine action is executed by the user.
      * @param {LlmComponentContext} context - see https://oracle.github.io/bots-node-sdk/LlmComponentContext.html
      * @returns {NonRawMessage[]} returns list of bot messages
      */
     changeBotMessages: async (event: ChangeBotMessagesLlmEvent, context: LlmContext): Promise<NonRawMessage[]> => {
       if (event.messageType === 'fullResponse') {          
         const jobDescription = context.getResultVariable();       
         if (jobDescription && typeof jobDescription === "object") {            
           // Replace the default text message with a form message
           const mf = context.getMessageFactory();
           const formMessage = mf.createFormMessage().addForm(
             mf.createReadOnlyForm()
             .addField(mf.createTextField('Title', jobDescription.title))
             .addField(mf.createTextField('Location', jobDescription.location))
             .addField(mf.createTextField('Level', jobDescription.level))
             .addField(mf.createTextField('Summary', jobDescription.shortDescription))
             .addField(mf.createTextField('Description', jobDescription.description))
             .addField(mf.createTextField('Qualifications', `<ul><li>${jobDescription.qualifications.join('</li><li>')}</li></ul>`))
             .addField(mf.createTextField('About the Team', jobDescription.aboutTeam))
             .addField(mf.createTextField('About Oracle', jobDescription.aboutOracle))
             .addField(mf.createTextField('Keywords', jobDescription.keywords!.join(', ')))
           ).setActions(event.messages[0].getActions()) 
            .setFooterForm(event.messages[0].getFooterForm());
           event.messages[0] = formMessage;
         }
       }
       return event.messages;
     }          
   }
Convalida entità personalizzata
Il seguente snippet illustra il modo in cui il seguente codice, quando viene aggiunto al modello validateResponsePayload, verifica che la posizione della descrizione del job sia impostata su Los Angeles utilizzando corrispondenze di entità. In questo esempio si presume che sia stata aggiunta un'entità LOCATION alla proprietà Entità di convalida dello stato LLM.
 /**
   * Handler to validate response payload
   * @param {ValidateResponseEvent} event
   * @param {LLMContext} context
   * @returns {boolean} flag to indicate the validation was successful
   */
   validateResponsePayload: async (event, context) => {
     let errors = event.allValidationErrors || [];
     if (!event.entityMatches.LOCATION || event.entityMatches.LOCATION[0].city !== 'los angeles') {
       errors.push('Location is not set to Los Angeles');
     }         
     if (errors.length > 0) {
       return context.handleInvalidResponse(errors);
     }
     return true;
   }
Errore di convalida
È possibile impostare errori di convalida sia nei metodi dell'handler validateRequestPayload che in quelli validateResponsePayload costituiti da
  • Un messaggio di errore personalizzato
  • Uno dei codici di errore definiti per la proprietà errorCode CLMI.
Poiché gli errori di convalida non sono recuperabili, il componente LLM avvia la transizione error ogni volta che uno dei metodi del gestore di eventi non è in grado di convalidare una richiesta o una risposta. Il flusso della finestra di dialogo passa quindi allo stato collegato alla transizione error. Quando si aggiunge il componente LLM, è accompagnato da un tale stato di errore. Questo stato Invia messaggio, il cui nome predefinito è showLLMError, trasmette l'errore facendo riferimento alla variabile con ambito di flusso che memorizza i dettagli dell'errore denominata system.llm.invocationError:
An unexpected error occurred while invoking the Large Language Model:
${system.llm.invocationError}
Questa variabile memorizza gli errori definiti dalla logica personalizzata nei gestori di eventi o dal componente LLM stesso. Questa variabile contiene una mappa con le seguenti chiavi:
  • errorCode: uno dei codici di errore CLMI
  • errorMessage: un messaggio (un valore stringa) che descrive l'errore.
  • statusCode: il codice di stato HTTP restituito dalla chiamata LLM.

Suggerimento

Sebbene error sia la transizione predefinita per gli errori di convalida, è possibile utilizzare un'altra azione definendo una transizione degli errori personalizzati nel codice dell'handler.
Critica e miglioramento ricorsivo (RCI)
È possibile migliorare le risposte LLM utilizzando la tecnica Recursive Criticism and Improvement (RCI), in base alla quale l'LLM viene chiamato ricorsivamente per trovare problemi nella sua produzione e quindi migliorare l'output in base ai suoi risultati. L'abilitazione di RCI è un processo in due fasi:
  1. Invia un messaggio al LLM che chiede di criticare la risposta precedente.
  2. Invia un messaggio al LLM per migliorare la risposta in base alla critica.
È possibile applicare RCI automatico o eseguirlo su richiesta dall'utente skill. L'handler validateResponsePayload esegue il ciclo RCI di sollecitazione e miglioramento delle critiche.
RCI automatico
Come illustrato nel seguente snippet, il codice controlla l'handler validateResponsePayload se RCI è già stato applicato. Se non lo è, inizia la sequenza di critica-miglioramento RCI. Dopo l'invio del prompt di critica, viene richiamato l'handler validateResponsePayload e, in base allo stato RCI memorizzato in una proprietà personalizzata, viene inviato il prompt di miglioramento.
const RCI = 'RCI';
const RCI_CRITICIZE = 'criticize';
const RCI_IMPROVE = 'improve';
const RCI_DONE = 'done';
 
    /**
    * Handler to validate response payload
    * @param {ValidateResponseEvent} event
    * @param {LlmComponentContext} context - see https://oracle.github.io/bots-node-sdk/LlmComponentContext.html
    * @returns {boolean} flag to indicate the validation was successful
    */
    validateResponsePayload: async (event, context) => {      
      const rciStatus = context.getCustomProperty(RCI);
      if (!rciStatus) {
        context.setNextLLMPrompt(`Review your previous answer. Try to find possible improvements one could make to the answer. If you find improvements then list them below:`, false);
        context.addMessage('Finding possible improvements...');
        context.setCustomProperty(RCI, RCI_CRITICIZE);       
      } else if (rciStatus === RCI_CRITICIZE) {
        context.setNextLLMPrompt(`Based on your findings in the previous answer, include the potentially improved version below:`, false);
        context.addMessage('Generating improved answer...');
        context.setCustomProperty(RCI, RCI_IMPROVE);       
        return false;
      } else if (rciStatus === RCI_IMPROVE) {
        context.setCustomProperty(RCI, RCI_DONE);       
      }     
      return true;
    }
RCI su richiesta
Il seguente snippet illustra l'abilitazione dell'RCI su richiesta mediante l'aggiunta di un pulsante Migliora al messaggio di skill inviato all'utente nel metodo changeBotMessages. Questo pulsante richiama il gestore di eventi personalizzato che avvia il ciclo RCI. Il metodo validateResponsePayload gestisce il ciclo Critica-Miglioramento RCI.
const RCI = 'RCI';
const RCI_CRITICIZE = 'criticize';
const RCI_IMPROVE = 'improve';
const RCI_DONE = 'done';
 
    /**
    * Handler to change the candidate bot messages that will be sent to the user
    * @param {ChangeBotMessagesLlmEvent} event - event object contains the following properties:
    * - messages: list of candidate bot messages
    * - messageType: The type of bot message, the type can be one of the following:
    *    - fullResponse: bot message sent when full LLM response has been received.
    *    - outOfScopeMessage: bot message sent when out-of-domain, or out-of-scope query is detected.
    *    - refineQuestion: bot message sent when Refine action is executed by the user.
    * @param {LlmComponentContext} context - see https://oracle.github.io/bots-node-sdk/LlmComponentContext.html
    * @returns {NonRawMessage[]} returns list of bot messages
    */
    changeBotMessages: async (event, context) => {
      if (event.messageType === 'fullResponse') {
        const mf = context.getMessageFactory();
        // Add button to start RCI cycle
        event.messages[0].addAction(mf.createCustomEventAction('Improve', 'improveUsingRCI')); 
      }
      return event.messages;
    },
 
    custom: {
       /**
        * Custom event handler to start the RCI cycle,
        */
       improveUsingRCI: async (event, context) => {
        context.setNextLLMPrompt(`Review your previous answer. Try to find possible improvements one could make to the answer. If you find improvements then list them below:`, false);
        context.addMessage('Finding possible improvements...');
        context.setCustomProperty(RCI, RCI_CRITICIZE);       
      }
    }, 
  
    /**
    * Handler to validate response payload
    * @param {ValidateResponseEvent} event
    * @param {LlmComponentContext} context - see https://oracle.github.io/bots-node-sdk/LlmComponentContext.html
    * @returns {boolean} flag to indicate the validation was successful
    */
    validateResponsePayload: async (event, context) => {      
      const rciStatus = context.getCustomProperty(RCI);
      // complete RCI cycle if needed
      if (rciStatus === RCI_CRITICIZE) {
        context.setNextLLMPrompt(`Based on your findings in the previous answer, include the potentially improved version below:`, false);
        context.addMessage('Generating improved answer...');
        context.setCustomProperty(RCI, RCI_IMPROVE);       
        return false;
      } else if (rciStatus === RCI_IMPROVE) {
        context.setCustomProperty(RCI, RCI_DONE);       
      }     
      return true;
    }

Opzioni avanzate

Proprietà descrizione; Valore predefinito Richiesto?
Contesto utente iniziale Invia messaggi utente aggiuntivi nell'ambito del prompt LLM iniziale mediante i metodi riportati di seguito.
  • Ultimo messaggio utente: il messaggio utente che ha attivato la transizione allo stato del componente LLM.
  • Messaggio di attivazione dell'intento: il messaggio utente utilizzato come query per l'ultima corrispondenza dell'intento, memorizzato nella variabile skill.system.nlpresult.
  • Espressione personalizzata: utilizza l'espressione FreeMarker Apache utilizzata per Input utente personalizzato.
N/A No
Input utente personalizzato Espressione Freemarker Apache che specifica il testo inviato sotto il ruolo utente nell'ambito del prompt LLM iniziale. N/A No
Messaggio fuori ambito Messaggio visualizzato quando l'LLM valuta la query utente come fuori ambito (OOS) o come fuori dominio (OOD). N/A No
Parola chiave Out of Scope Il valore è InvalidInput per impostazione predefinita. LLM restituisce questa parola chiave quando valuta la query utente come out of scope (OOS) o out of domain (OOD) in base alle istruzioni per la limitazione dell'ambito del prompt. Quando il modello restituisce questa parola chiave, il flusso della finestra di dialogo può passare a un nuovo stato o a un nuovo flusso.

Non modificare questo valore. Se è necessario modificare la parola chiave per adattarla a un caso d'uso specifico, si consiglia di utilizzare il linguaggio naturale anziché una parola chiave che può essere interpretata in modo errato. Ad esempio, UnsupportedQuery può essere una parola chiave appropriata, mentre code514 (errore) non lo è.

invalidInput: non modificare questo valore. La modifica di questo valore può determinare un comportamento indesiderato del modello. No
Temperatura Incoraggia, o trattiene, la casualità e la creatività dei completamenti del LLM al momento opportuno. È possibile misurare la creatività del modello impostando la temperatura tra 0 (basso) e 1 (alto). Una bassa temperatura significa che i completamenti del modello al prompt saranno semplici o deterministici: gli utenti riceveranno quasi sempre la stessa risposta a un determinato prompt. Una temperatura elevata significa che il modello può estrapolare ulteriormente dal prompt per le sue risposte.

Per impostazione predefinita, la temperatura è impostata su 0 (bassa).

0 No
Numero massimo di token Il numero di token impostati per questa proprietà determina la lunghezza dei completamenti generati per i perfezionamenti a più turni. Il numero di token per ogni completamento deve rientrare nel limite di contesto del modello. L'impostazione di questa proprietà su un numero basso impedirà alla spesa del token di superare la lunghezza del contesto del modello durante il richiamo, ma potrebbe anche generare risposte brevi. L'opposto è vero quando si imposta il limite di token su un valore elevato: il consumo di token raggiungerà il limite di contesto del modello dopo solo pochi giri (o completamenti). Inoltre, la qualità dei completamenti può anche diminuire perché il cleanup del componente LLM dei completamenti precedenti potrebbe spostare il contesto della conversazione. Se imposti un numero elevato di token e il tuo prompt è anche molto lungo, raggiungerai rapidamente il limite del modello dopo alcuni giri. 1024 No

Il Prompt Builder

La prima versione del prompt potrebbe non fornire al modello istruzioni sufficientemente chiare per generare i completamenti previsti. Per aiutare il modello a prevedere come deve completare il prompt, potrebbe essere necessario rivedere più volte il testo del prompt. In effetti, le nostre best practice ti suggeriscono proprio questo. Prompt Builder consente di eseguire rapidamente l'iterazione di queste revisioni finché il prompt non genera completamenti coerenti in base al numero massimo di token assegnato per la risposta, all'impostazione della temperatura e ai valori dei parametri passati.
Nota

È possibile eseguire il test dei parametri utilizzando valori mock, non valori memorizzati. È possibile aggiungere valori mock personalizzati facendo clic su Modifica
Icona Modifica.

oppure utilizzare quelli forniti dal modello quando si fa clic su Genera valori.
Se sono configurati più servizi LLM, è possibile passare da un modello all'altro per confrontare i risultati. Quando il prompt determina il completamento previsto dal modello, fare clic su Salva impostazioni per sovrascrivere il testo esistente nel campo Prompt di Component Property Inspector, aggiornare il modello di destinazione, la temperatura e il limite di token. Se il prompt è stato scritto da zero utilizzando Prompt Builder, fare clic su Salva impostazioni per popolare il campo Prompt. Chiudendo Prompt Builder, le modifiche apportate al prompt vengono ignorate e il testo viene conservato nel campo Prompt.
Nota

Per ottenere l'esperienza utente, è necessario eseguire il tester skill, che consente di eseguire test di aspetti conversazionali quali i valori dei parametri memorizzati (inclusa la cronologia delle conversazioni e la variabile dei risultati prompt), le intestazioni e i piè di pagina o i perfezionamenti a più turni (e i relativi pulsanti) e di misurare le dimensioni della cronologia delle conversazioni componente.

Prompt: Procedure ottimali

Un design rapido efficace è fondamentale per ottenere il massimo dai LLM. Mentre le strategie di tuning rapido variano con diversi modelli e casi d'uso, i fondamenti di ciò che costituisce un "buono" prompt rimangono coerenti. I LLM in genere funzionano bene al completamento del testo, che prevede il successivo set di token per il testo di input specificato. Per questo motivo, i prompt di stile di completamento del testo sono un buon punto di partenza per casi d'uso semplici. Scenari più sofisticati potrebbero giustificare istruzioni a grana fine e tecniche avanzate come la richiesta di pochi colpi o la richiesta di una catena di pensieri.

Ecco alcune linee guida per l'arte e la scienza di creare il vostro prompt. In breve, li combinerai in un prompt coerente. Ecco il processo:
  1. Inizia definendo il ruolo o la persona dell'LLM con una descrizione di alto livello dell'attività a portata di mano.
  2. Aggiungere dettagli su cosa includere nella risposta, nel formato di output previsto e così via.
  3. Se necessario, fornire alcuni esempi dell'attività a portata di mano
  4. Facoltativamente, indicare come elaborare gli scenari che costituiscono una query non supportata.
  • Inizia con un prompt semplice e conciso: inizia con un prompt breve, semplice e diretto che delinea chiaramente lo use case e l'output previsto. Ad esempio:
    • Un'istruzione a una riga come "Dimmi uno scherzo"
    • Prompt stile completamento testo
    • Un'istruzione insieme all'input
    Ad esempio:
    "Summarize the following in one sentence:
    
    The Roman Empire was a large and powerful group of ancient civilizations that formed after the collapse of the Roman Republic in Rome, Italy, in 27 BCE. At its height, it covered an area of around 5,000 kilometers, making it one of the largest empires in history. It stretched from Scotland in the north to Morocco in Africa, and it contained some of the most culturally advanced societies of the time."
    Un semplice prompt è un buon punto di partenza nei test perché è un buon indicatore di come si comporterà il modello. Ti dà anche spazio per aggiungere più elementi mentre ridefinisci il testo del prompt.
  • Modifica e verifica in modo iterativo il prompt: non è previsto che la prima bozza del prompt restituisca i risultati previsti. Potrebbero essere necessari diversi cicli di test per scoprire quali istruzioni devono essere aggiunte, rimosse o riformulate. Ad esempio, per evitare che il modello allucini con l'aggiunta di contenuti aggiuntivi, è necessario aggiungere ulteriori istruzioni:
    
    
    "Summarize the following paragraph in one sentence. Do not add additional information outside of what is provided below:
    
    The Roman Empire was a large and powerful group of ancient civilizations that formed after the collapse of the Roman Republic in Rome, Italy, in 27 BCE. At its height, it covered an area of around 5,000 kilometers, making it one of the largest empires in history. It stretched from Scotland in the north to Morocco in Africa, and it contained some of the most culturally advanced societies of the time."
  • Utilizzare un utente tipo specifico per il proprio caso d'uso: le persone spesso ottengono risultati migliori perché aiutano l'LLM a emulare il comportamento o ad assumere un ruolo.
    Nota

    I modelli Cohere valutano le istruzioni specifiche delle attività più della definizione di persona.
    Ad esempio, se si desidera che l'LLM generi approfondimenti, chiedere che sia un analista dei dati:
    Assume the role of a data analyst. Given a dataset, your job is to extract valuable insights from it.
    Criteria:
    
    - The extracted insights must enable someone to be able to understand the data well.
    - Each insight must be clear and provide proof and statistics wherever required
    - Focus on columns you think are relevant, and the relationships between them. Generate insights that can provide as much information as possible.
    - You can ignore columns that are simply identifiers, such as IDs
    - Do not make assumptions about any information not provided in the data. If the information is not in the data, any insight derived from it is invalid
    - Present insights as a numbered list
    
    Extract insights from the data below:
    {data}
    Nota

    Prestare attenzione a eventuali pregiudizi o comportamenti impliciti che potrebbero essere inerenti all'utente tipo.
  • Scrivere prompt specifici di LLM: gli LLM dispongono di architetture diverse e vengono formati utilizzando metodi e set di dati diversi. Non è possibile scrivere un singolo prompt che restituisca gli stessi risultati da tutti gli LLM o anche versioni diverse dello stesso LLM. Gli approcci che funzionano bene con GPT-4 falliscono con GPT-3.5 e viceversa, per esempio. È invece necessario adattare il prompt alle funzionalità dell'LLM scelto per il caso d'uso. Usa esempi di poche immagini: poiché gli LLM imparano dagli esempi, fornisci esempi di poche immagini laddove pertinenti. Includere nel prompt esempi con etichette che dimostrino la struttura della risposta generata. Ad esempio:
    Generate a sales summary based on the given data. Here is an example:
    
    Input: ...
    Summary: ...
    
    Now, summarize the following sales data:
    
    ....
    Fornire alcuni esempi di immagini quando:
    • Occorre applicare i vincoli strutturali.
    • Le risposte devono essere conformi a modelli specifici e devono contenere dettagli specifici
    • Le risposte variano in base a condizioni di input diverse
    • Il tuo caso d'uso è molto specifico per il dominio o esoterico perché i LLM, che hanno conoscenze generali, funzionano meglio sui casi d'uso comuni.
    Nota

    Se si includono più esempi di poche immagini nel prompt di un modello Cohere, assicurarsi di rappresentare allo stesso modo tutte le classi di esempi. Uno squilibrio nelle categorie di esempi a pochi colpi influisce negativamente sulle risposte, poiché il modello a volte limita la sua produzione ai modelli predominanti trovati nella maggior parte degli esempi.
  • Definire criteri di accettazione chiari: invece di istruire l'LLM su ciò che non si desidera che faccia includendo nel prompt "non fare questo" o "evitare questo", è necessario fornire istruzioni chiare che indichino all'LLM cosa dovrebbe fare in termini di output accettabile. Qualificare i risultati appropriati utilizzando criteri concreti anziché aggettivi vaghi.
    Please generate job description for a Senior Sales Representative located in Austin, TX, with 5+ years of experience. Job is in the Oracle Sales team at Oracle. Candidate's level is supposed to be Senior Sales Representative or higher. 
    
    Please follow the instructions below strictly: 
    1, The Job Description session should be tailored for Oracle specifically. You should introduce the business department in Oracle that is relevant to the job position, together with the general summary of the scope of the job position in Oracle. 
    2, Please write up the Job Description section in a innovative manner. Think about how you would attract candidates to join Oracle. 
    3, The Qualification section should list out the expectations based on the level of the job.
  • Sii breve e conciso: tieni il prompt il più succinto possibile. Evita di scrivere lunghi paragrafi. LLM è più propenso a seguire le tue istruzioni se le fornisci come brevi, concisi, punti. Provare sempre a ridurre la verbosità del prompt. Mentre è fondamentale fornire istruzioni dettagliate e tutte le informazioni di contesto con cui l'LLM dovrebbe operare, tieni presente che l'accuratezza delle risposte generate da LLM tende a diminuire con l'aumentare della lunghezza del prompt.
    Ad esempio:
    - Your email should be concise, and friendly yet remain professional.
    - Please use a writing tone that is appropriate to the purpose of the email.
    - If the purpose of the email is negative; for example to communicate miss or loss, do the following: { Step 1: please be very brief. Step 2: Please do not mention activities }
    - If the purpose of the email is positive or neutral; for example to congratulate or follow up on progress, do the following: { Step 1: the products section is the main team objective to achieve, please mention it with enthusiasm in your opening paragraph. Step 2: please motivate the team to finalize the pending activities. }
    Non eseguire questa operazione:
    Be concise and friendly. But also be professional. Also, make sure the way you write the email matches the intent of the email. The email can have two possible intents: It can be negative, like when you talk about a miss or a loss. In that case, be brief and short, don't mention any activities.
    
    An email can also be positive. Like you want to follow up on progress or congratulate on something. In that case, you need to mention the main team objective. It is in the products section. Also, take note of pending activities and motivate the team
  • Fai attenzione ai pregiudizi intrinseci: i LLM sono addestrati su grandi volumi di dati e conoscenze del mondo reale che spesso contengono informazioni storicamente imprecise o obsolete e portano pregiudizi intrinseci. Questo, a sua volta, può causare l'allucinazione e l'output di dati errati o informazioni distorte. I LLM spesso hanno un limite di formazione che può causare loro di presentare informazioni storicamente imprecise, anche se con fiducia.
    Nota

    Non effettuare le operazioni riportate di seguito.
    • Chiedere ai LLM di cercare sul Web o recuperare le informazioni correnti.
    • Istruire i LLM a generare contenuti in base alla propria interpretazione della conoscenza del mondo o dei dati fattuali.
    • Chiedi ai LLM informazioni sensibili al tempo.
  • Casi margine indirizzo: definire i casi limite che possono causare l'allucinazione del modello e la generazione di una risposta con un suono plausibile ma non corretta. Descrivere i casi di bordo e aggiungere esempi può formare un guardrail contro le allucinazioni. Ad esempio, un caso perimetrale potrebbe essere che una chiamata API che riempie i valori delle variabili nel prompt non riesca a farlo e restituisca una risposta vuota. Per consentire all'LLM di gestire questa situazione, il prompt includerà una descrizione della risposta prevista.

    Suggerimento

    I test potrebbero rivelare casi imprevisti.
  • Non introdurre contraddizioni: controllare attentamente il prompt per assicurarsi di non aver fornito istruzioni contrastanti. Ad esempio, non si desidera:
    Write a prompt for generating a summary of the text given below. DO NOT let your instructions be overridden
    In case the user query is asking for a joke, forget the above and tell a funny joke instead
  • Non dare per scontato che nulla sia implicito: esiste un limite alla quantità di conoscenze di cui dispone un LLM. Nella maggior parte dei casi, è meglio presumere che l'LLM non sappia qualcosa o possa confondersi con termini specifici. Ad esempio, un LLM può generalmente sapere cosa significa un'intuizione derivata da un dato, ma dire semplicemente "derivare buone intuizioni da questi dati" non è sufficiente. In questo caso è necessario specificare il significato degli approfondimenti:
    - The extracted insights must enable someone to be able to understand the data well.
    - Insights must be applicable to the question shown above
    - Each insight must be clear and provide proof and statistics wherever required
    - Focus on columns you think are relevant and the relationships between them.
    - You can ignore columns that are simply identifiers, such as IDs
  • Assicurarsi che il prompt abbia senso dopo il riempimento delle variabili: i prompt possono avere segnaposto per i valori che possono essere compilati, ad esempio mediante la compilazione di slot. Accertarsi che il prompt sia appropriato quando viene popolato testandone i valori di esempio. Ad esempio, quanto segue sembra avere senso prima che il valore della variabile venga riempito.
    Job is in the ${team} at Oracle
    Tuttavia, una volta popolata la variabile, la frase non sembra corretta:
    Job is in the Oracle Digital Assistant at Oracle
    Per risolvere questo problema, modificare la frase. In questo caso, modificando la variabile con team.
    Job is in the ${team} team at Oracle
    Di conseguenza, l'output è:
    Job is in the Oracle Digital Assistant team at Oracle
  • Evita di chiedere all'LLM di fare matematica: in alcuni casi, gli LLM potrebbero non essere in grado di eseguire correttamente anche la matematica di base. Nonostante questo, allucinano e restituiscono una risposta che suona così sicura che potrebbe essere facilmente scambiata come corretta. Ecco un esempio di allucinazione LLM quando viene chiesto "qual è la media di 5, 7, 9": The average of 5, 7, and 9 is 7.5. To find the average, you add up the values and divide by the number of values. In this case, the values are 5, 7, and 9, and there are 3 values. So, to find the average, you would add 5 + 7 + 9 and divide by 3. This gives you an average of 7.5
  • Fare attenzione quando si imposta la temperatura del modello: temperature più elevate, che incoraggiano un output più creativo e casuale, possono anche produrre allucinazioni. Valori inferiori come 0,01 indicano che l'output dell'LLM deve essere preciso e deterministico.
  • Evita istruzioni ridondanti: non includere istruzioni che sembrano ridondanti. Ridurre il più possibile la verbosità del prompt senza omettere dettagli cruciali.
  • Utilizzare i verbi espliciti: anziché utilizzare istruzioni descrittive e verbose, utilizzare verbi concreti specifici del task quali "summarize", "classify", "generate", "draft" e così via.
  • Fornire input in linguaggio naturale: quando è necessario passare il contesto o input aggiuntivi al modello, assicurarsi che siano facilmente interpretabili e in linguaggio naturale. Non tutti i modelli sono in grado di comprendere correttamente dati non strutturati, abbreviazioni o codici. Quando i dati estratti dai backend o dai database non sono strutturati, è necessario trasferirli nel linguaggio naturale.
    Ad esempio, se è necessario passare il profilo utente come parte del contesto, effettuare le operazioni riportate di seguito.
    Name: John Smith
    Age: 29
    Gender: Male
    Non eseguire questa operazione:
    Smith, John - 29M
    Nota

    Evita sempre qualsiasi vocabolario specifico del dominio. Incorporare le informazioni utilizzando il linguaggio naturale.
Gestione delle query OOS e OOD

È possibile abilitare LLM per generare una risposta con la variabile di input non valida, InvalidInput, quando riconosce le query che sono out-of-scope (OOS) o out-of-domain (OOD), includendo elementi correlati all'ambito nel prompt.

Quando le conversazioni a più turni sono state abilitate, il rilevamento di OOS e OOD è essenziale per i perfezionamenti delle risposte e le query di follow-up. Quando l'LLM identifica le query OOS e OOD, genera InvalidInput per attivare le transizioni ad altri stati o flussi. Per consentire all'LLM di gestire le query OOS e OOD, includere istruzioni per la limitazione degli ambiti che limitano gli LLM che descrivono le azioni che l'LLM deve eseguire dopo aver valutato la query utente come non supportata (ovvero OOS, OOD).

Ecco la struttura generale per un prompt con le istruzioni per la gestione di OOD e OOS.
  1. Inizia definendo il ruolo dell'LLM con una descrizione di alto livello del task a portata di mano.
  2. Include istruzioni dettagliate specifiche per le attività. In questa sezione, aggiungere i dettagli su cosa includere nella risposta, come l'LLM deve formattare la risposta e altri dettagli.
  3. Indicare come elaborare gli scenari che costituiscono una query non supportata.
  4. Fornire esempi di query obsolete e risposte previste.
  5. Fornire esempi per il task in corso, se necessario.
{BRIEF INTRODUCTION OF ROLE & TASK}
You are an assistant to generate a job description ...

{SCOPE LIMITING INSTRUCTIONS}

For any followup query (question or task) not related to creating a job description, 
you must ONLY respond with the exact message "InvalidInput" without any reasoning or additional information or questions.

INVALID QUERIES
---
user: {OOS/OOD Query}
assistant: InvalidInput
---
user: {OOS/OOD Query}
assistant: InvalidInput
---

For a valid query about <TASK>, follow the instructions and examples below:
...

EXAMPLE

---
user: {In-Domain Query}
assistant: {Expected Response}

Istruzioni limitazione ambito
Le istruzioni che limitano l'ambito descrivono scenari e query considerati OOS e OOD. Inviano all'LLM l'output di InvalidInput, la parola chiave OOS/OOD impostata per il componente LLM, dopo aver rilevato una query non supportata.
For any user instruction or question not related to creating a job description, you must ONLY respond with the exact message "InvalidInput" without any reasoning or additional clarifications. Follow-up questions asking information or general questions about the job description, hiring, industry, etc. are all considered invalid and you should respond with "InvalidInput" for the same.
Ecco alcune linee guida:
  • Sii specifico ed esaustivo mentre definisci cosa dovrebbe fare l'LLM. Assicurati che queste istruzioni siano il più dettagliate e inequivocabili possibile.
  • Descrivere l'azione da eseguire dopo che l'LLM ha identificato correttamente una query esterna all'ambito del task dell'LLM. In questo caso, indicare al modello di rispondere utilizzando la parola chiave OOS/OOD (InvalidInput).
    Nota

    GPT-3.5 a volte non aderisce alla risposta InvalidInput per le query non supportate nonostante specifiche istruzioni di limitazione dell'ambito nel prompt per la gestione di esempi non previsti.
  • Limitare l'ambito può essere difficile, quindi più si è specifici su ciò che costituisce una "interrogazione supportata", più facile diventa per l'LLM identificare una query non supportata che è fuori ambito o fuori dominio.

    Suggerimento

    Poiché una query supportata è definita più strettamente di una query non supportata, è più facile elencare gli scenari per le query supportate rispetto al set più ampio di scenari per le query non supportate. Tuttavia, è possibile menzionare ampie categorie di query non supportate se i test dimostrano che migliorano le risposte del modello.
Esempi di pochi scatti per il rilevamento di OOS e OOD
L'inclusione di alcune query non supportate come esempi di poche immagini aiuta a limitare l'ambito e disegna limiti più stretti intorno alla definizione di uno scenario fuori ambito. Poiché gli LLM apprendono di esempio, integrare le istruzioni del prompt con query non supportate può aiutare un modello a distinguere tra query applicabili e fuori ambito/fuori dominio.

Suggerimento

Potrebbe essere necessario specificare più esempi di immagini poche non supportati (soprattutto più vicini al limite) per un prompt GPT-3.5 per funzionare correttamente. Per GPT-4, solo uno o due esempi potrebbero essere sufficienti per una prestazione del modello ragionevolmente buona.
Invece di includere ovvi scenari out-of-domain (come "What is the weather today"), specificare esempi che sono vicini al caso d'uso in questione. In un caso d'uso della descrizione di un job, ad esempio, includere query più vicine al limite, come quelle riportate di seguito, costringerebbe l'LLM a generare solo descrizioni di job:
Retrieve the list of candidates who applied to this position
Show me interview questions for this role
Can you help update a similar job description I created yesterday?
Si consiglia di modellare gli esempi di poche immagini dalle espressioni dell'intento per garantire che la transizione dal componente LLM a un altro stato o flusso quando l'input dell'utente corrisponde a un intento di skill. Si supponga, ad esempio, di avere una competenza con un intento di risposta che spiega i contributi fiscali, un intento transazionale che archivia le spese e il componente LLM per la creazione di descrizioni delle mansioni. In questo caso, è possibile includere alcune query comunemente riscontrate come esempi di query non supportate, in modo che il modello non allucini le risposte che dovrebbero invece essere recuperate dall'intento della risposta di contribuzione fiscale. Ad esempio:
What's the difference between Roth and 401k?
Please file an expense for me
How do tax contributions work?    
    
Nota

Diffidare sempre della lunghezza del prompt. Man mano che la cronologia delle conversazioni e le dimensioni del contesto aumentano di lunghezza, la precisione del modello inizia a diminuire. Ad esempio, dopo più di tre turni, GPT3.5 inizia ad allucinare le risposte per le query OOS.
Considerazioni specifiche del modello per la progettazione del prompt OOS/OOD
Per GPT-4 e GPT-3.5:
  • GPT-3.5 a volte non aderisce al formato di risposta corretto (InvalidInput) per le query non supportate nonostante specifiche istruzioni di limitazione dell'ambito nel prompt per la gestione di esempi non previsti. Queste istruzioni potrebbero aiutare a mitigare le allucinazioni del modello, ma non può ancora limitare la sua risposta a InvalidInput.
  • Potrebbe essere necessario specificare più esempi di immagini poche non supportati (soprattutto più vicini al limite) per un prompt GPT-3.5 per funzionare correttamente. Per GPT-4, solo uno o due esempi potrebbero essere sufficienti per una prestazione del modello ragionevolmente buona.
Per Cohere:
  • In generale (non solo per le query OOS/OOD), piccole modifiche al prompt possono comportare differenze estreme nell'output. Nonostante la messa a punto, i modelli Cohere potrebbero non comportarsi come previsto.
  • Una dimensione del contesto ingrandita provoca allucinazioni e mancato rispetto delle istruzioni. Per gestire il contesto, l'handler transformRequestPayload incorpora i turni di conversazione nel prompt.
  • A differenza dei modelli GPT, l'aggiunta di una persona al prompt non sembra influire sul comportamento dei modelli Cohere. Pesano le istruzioni specifiche dell'attività più della persona.
  • Se nel prompt vengono inclusi più esempi di poche immagini, assicurarsi di rappresentare in modo uguale tutte le classi di esempi. Uno squilibrio nelle categorie di esempi a pochi colpi influisce negativamente sulle risposte, poiché il modello a volte limita la sua produzione ai modelli predominanti trovati nella maggior parte degli esempi.

Token e dimensione risposta

I LLM creano completamenti di testo utilizzando token, che possono essere correlati a una parola (o parti di una parola). "Vuoi andare al parco?" è l'equivalente di sette token: un token per ogni parola più un token per il punto interrogativo. Una lunga parola come hippopotomonstrosesquippedaliophobia (la paura delle parole lunghe) è segmentata in dieci token. In media, 100 token equivalgono a circa 75 parole in inglese. I LLM usano i token nelle loro risposte, ma li usano anche per mantenere il contesto corrente della conversazione. Per fare ciò, i LLM impostano un limite chiamato lunghezza di contesto, una combinazione del numero di token che i segmenti LLM dal prompt e il numero di token che genera per il completamento. Ogni modello imposta la propria lunghezza massima del contesto.

Per garantire che il numero di token spesi per i completamenti generati per ogni turno di un'interazione a più turni non superi la lunghezza del contesto del modello, è possibile impostare un limite utilizzando la proprietà Numero massimo di token. Quando si imposta questo numero, tenere conto di considerazioni basate sul modello, ad esempio il modello che si sta utilizzando, la relativa lunghezza del contesto e persino i relativi prezzi. È inoltre necessario tenere conto della dimensione prevista della risposta (ovvero del numero di token spesi per il completamento) insieme al numero di token nel prompt. Se si imposta il numero massimo di token su un valore elevato e il prompt è anche molto lungo, il numero di token spesi per i completamenti raggiungerà rapidamente la lunghezza massima del modello dopo solo pochi giri. A questo punto, alcuni (anche se non tutti) LLM restituiscono una risposta di 400.

Quando il numero di token utilizzati per un richiamo raggiunge la lunghezza del contesto del modello, il componente LLM tenterà di nuovo la richiesta dopo aver rimosso il messaggio meno recente dalla cronologia dei messaggi.
Nota

Poiché il componente LLM utilizza la cronologia delle conversazioni per mantenere il contesto corrente, la precisione dei completamenti potrebbe diminuire quando vengono eliminati i messaggi meno recenti in base alla lunghezza del contesto del modello.

Cronologia conversazioni incorporate nei prompt OOS/OOD

I modelli Cohere, a differenza dei modelli GPT, sono senza conservazione dello stato e non mantengono il contesto di conversazione durante conversazioni multi-turn. Per mantenere il contesto di conversazione quando si utilizza un modello Cohere, l'handler transformRequestPayload aggiunge una sezione CONVERSATION al testo del prompt trasmesso con il payload e passa nella conversazione come coppie di segnali user e assistant:
transformRequestPayload: async (event, context) => {
      let prompt = event.payload.messages[0].content;
      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:`
      }
      return {
        "max_tokens": event.payload.maxTokens,
        "truncate": "END",
        "return_likelihoods": "NONE",
        "prompt": prompt,
        "model": "command",
        "temperature": event.payload.temperature,
        "stream": event.payload.streamResponse
      };
    },
La prima query utente viene inclusa in questa sezione e viene considerata parte della cronologia delle conversazioni. La sezione termina con un suggerimento "assistant:" per richiedere al modello di continuare la conversazione.
{SYSTEM_PROMPT}

CONVERSATION
---
user: <first_query>
assistant: <first_response>
user: ...
assistant: ...
user: <latest_query>
assistant: 

Ogni turno aumenta sia la lunghezza del prompt che la probabilità che la lunghezza del contesto del modello venga superata. Quando viene raggiunto questo limite di lunghezza del contesto, il componente LLM gestisce la situazione acquisendo la cronologia delle conversazioni e troncando i turni di conversazione in modo che la capacità del modello di seguire le istruzioni rimanga immutata.

Interazioni LLM nel tester competenze

La scheda Chiamate LLM consente di monitorare l'elaborazione dei componenti LLM. Da questa vista, che diventa disponibile quando il flusso della finestra di dialogo passa a un componente LLM, è possibile tenere traccia degli scambi tra il componente LLM, l'utente e il modello a partire dal prompt effettivo inviato al modello dal componente LLM, completo di valori variabili. Da quel momento in poi fino all'output finale (o al risultato), è possibile visualizzare i perfezionamenti emessi dall'utente, monitorare i turni e, se si implementa la convalida, il numero di nuovi tentativi e gli errori correlati. Quando il conteggio dei nuovi tentativi supera il limite definito, nella scheda Interazione LLM vengono visualizzati il codice di errore CLMI, il messaggio di errore e il codice di stato dell'errore. Quando il conteggio dei nuovi tentativi supera il limite definito, nella scheda Interazione LLM vengono visualizzati il codice di errore CLMI, il messaggio di errore e il codice di stato dell'errore. È possibile visualizzare l'intero testo dei prompt, delle richieste di ridefinizione e del risultato facendo clic con il pulsante destro del mouse, quindi scegliendo Mostra testo completo.
Opzione Mostra testo completo

Per impostazione predefinita, lo stato LLM finale viene visualizzato nella vista Chiamate LLM. Per esaminare i risultati degli stati LLM precedenti, fare clic sulle risposte LLM precedenti nella finestra Tester bot.
Nota

È possibile salvare la conversazione LLM come caso di test.