Condividi tramite


Sviluppare un flusso

Prompt flow è uno strumento di sviluppo progettato per semplificare l'intero ciclo di sviluppo delle applicazioni di IA basate su Large Language Model (LLM). Con le applicazioni di IA basate su LLM che continuano ad acquisire slancio in tutto il mondo, prompt flow offre una soluzione completa che semplifica il processo di creazione di prototipi, sperimentazioni, iterazioni e distribuzione delle applicazioni di intelligenza artificiale.

Con prompt flow sarà possibile:

  • Orchestrare flussi eseguibili che collegano LLM, prompt e strumenti Python tramite un grafo visualizzato.
  • Testare, eseguire il debug e scorrere i flussi con facilità.
  • Creare varianti di prompt e confrontarne le prestazioni.

Questo articolo illustra come creare e sviluppare il primo prompt flow nello studio di Azure Machine Learning.

Creare e sviluppare il prompt flow

In Studio selezionare la scheda Prompt flow sulla barra di spostamento sinistra. Selezionare Crea per creare il primo prompt flow. È possibile clonare gli esempi disponibili nella raccolta o creando il flusso da zero. Se sono già disponibili file di flusso in locale o in una condivisione file, è anche possibile importare i file per creare un flusso.

Screenshot della creazione del prompt flow da zero o dalla raccolta.

Creazione del flusso

A sinistra è presente la vista bidimensionale, ovvero la principale area di lavoro in cui è possibile creare il flusso, ad esempio aggiungere strumenti nel flusso, modificare il prompt, impostare i dati di input del flusso, eseguire il flusso, visualizzare l'output e così via.

Screenshot dell'area di lavoro principale del prompt flow.

In alto a destra è presente la vista file di flusso. Ogni flusso può essere rappresentato da una cartella che contiene un file 'flow.dag.yaml', i file del codice sorgente e le cartelle di sistema. È possibile aggiungere nuovi file, nonché modificare ed eliminare quelli esistenti. È anche possibile esportare i file in file locali o importarli da locale.

Oltre a modificare in linea il nodo in vista bidimensionale, è anche possibile attivare l'interruttore Raw file mode e selezionare il nome del file per modificarlo nella scheda di apertura.

In basso a destra è presente la vista grafo solo per la visualizzazione. Mostra la struttura del flusso che si sta sviluppando. È possibile fare zoom avanti e zoom indietro, definire il layout automatico e così via.

Nota

Non è possibile modificare direttamente la vista grafo, ma è possibile selezionare il nodo per passare alla scheda nodo corrispondente nella vista bidimensionale e quindi procedere alla modifica in linea.

Sessione di calcolo

Prima di iniziare a creare, è necessario avviare una sessione di calcolo. La sessione di calcolo funge da risorsa di calcolo necessaria per eseguire il prompt flow, che include un'immagine Docker contenente tutti i pacchetti di dipendenze necessari. È obbligatorio per l'esecuzione del flusso.

Screenshot della sessione di calcolo iniziale in Studio.

Input e output del flusso

L'input del flusso è costituito dai dati passati nel flusso nel complesso. Definire lo schema di input specificando il nome e il tipo. Impostare il valore di ogni input per testare il flusso. È possibile fare riferimento all'input del flusso in un secondo momento nei nodi del flusso, usando la sintassi ${input.[input name]}.

L'output del flusso è costituito dai dati generati dal flusso nel complesso, che riepilogano i risultati dell'esecuzione del flusso. È possibile visualizzare ed esportare la tabella di output al termine dell'esecuzione del flusso o dell'esecuzione batch. Definire il valore di output del flusso facendo riferimento all'output del nodo singolo del flusso, usando la sintassi ${[node name].output} o ${[node name].output.[field name]}.

 Screenshot dell'input e dell'output del flusso.

Sviluppare il flusso usando diversi strumenti

In un flusso è possibile utilizzare diversi tipi di strumenti, ad esempio LLM, Python, API Serp, Content Safety e così via.

Selezionando uno strumento, si aggiungerà un nuovo nodo al flusso. È necessario specificare il nome del nodo e impostare le configurazioni necessarie.

Ad esempio, per il nodo LLM, è necessario selezionare una connessione e una distribuzione, impostare il prompt e così via. La connessione consente di archiviare e gestire in modo sicuro chiavi private o altre credenziali riservate necessarie per interagire con OpenAI di Azure. Se non si ha già una connessione, è necessario prima crearla e assicurarsi che la risorsa OpenAI di Azure disponga delle distribuzioni di chat o completamento. Gli strumenti LLM e Prompt supportano l'uso di Jinja come linguaggio di creazione modelli per generare dinamicamente il prompt. Ad esempio, per racchiudere il nome dell'input è possibile usare {{}} invece di un testo fisso in modo che possa essere sostituito al momento.

Per usare lo strumento Python, è necessario impostare lo script Python, impostare il valore di input e così via. È necessario definire una funzione Python con input e output come indicato di seguito.

 Screenshot della scrittura di uno script Python per il nodo Python.

Dopo aver completato la composizione del prompt o dello script Python, è possibile selezionare Validate and parse input in modo che il sistema analizzi automaticamente l'input del nodo in base al modello di prompt e all'input della funzione Python. Il valore di input del nodo può essere impostato nei modi seguenti:

  • Impostare il valore direttamente nella casella di input
  • Fare riferimento all'input del flusso usando la sintassi ${input.[input name]}
  • Fare riferimento all'output del nodo usando la sintassi ${[node name].output} o ${[node name].output.[field name]}

Facendo riferimento all'output del nodo, è possibile collegare i nodi tra loro. Ad esempio, è possibile fare riferimento all'output del nodo LLM nell'input del nodo Python, in modo che il nodo Python possa utilizzare l'output del nodo LLM, quindi nella vista grafo è possibile vedere che i due nodi sono collegati tra loro.

Abilitare il controllo condizionale per il flusso

Prompt flow offre non solo un modo semplificato per eseguire il flusso, ma anche una potente funzionalità per gli sviluppatori, ovvero il controllo condizionale, che consente agli utenti di impostare condizioni per l'esecuzione di qualsiasi nodo in un flusso.

Essenzialmente, il controllo condizionale offre la possibilità di associare ogni nodo in un flusso a una configurazione di attivazione. Questa configurazione è in pratica un'istruzione "when" che determina quando deve essere eseguito un nodo. L'efficacia di questa funzionalità si realizza con i flussi complessi in cui l'esecuzione di specifiche attività dipende dal risultato di quelle precedenti. Sfruttando il controllo condizionale, è possibile configurare i nodi specifici da eseguire solo quando vengono soddisfatte le condizioni specificate.

In particolare, è possibile impostare la configurazione di attivazione per un nodo selezionando il pulsante Activate config nella scheda del nodo. È possibile aggiungere l'istruzione "when" e impostare la condizione. È possibile impostare le condizioni facendo riferimento all'input del flusso o all'output del nodo. Ad esempio, come valore specifico è possibile impostare la condizione ${input.[input name]} o ${[node name].output}.

Se la condizione non viene soddisfatta, il nodo verrà ignorato. Lo stato del nodo viene visualizzato come "Bypassed".

Screenshot dell'impostazione di Attiva configurazione per abilitare il controllo condizionale.

Testare il flusso

È possibile testare il flusso in due modi:

  • Eseguire un singolo nodo.
    • Per eseguire un singolo nodo, selezionare l'icona Esegui nella vista bidimensionale. Al termine dell'esecuzione, è possibile controllare rapidamente il risultato nella sezione output del nodo.
  • Eseguire l'intero flusso.
    • Per eseguire l'intero flusso, selezionare il pulsante Esegui in alto a destra.

Visualizzare i risultati del test e la traccia (anteprima)

Per l'esecuzione dell'intero flusso, dopo averlo eseguito, è possibile visualizzare lo stato di esecuzione nel banner di esecuzione. È quindi possibile selezionare Visualizza traccia per visualizzare la traccia, in modo da controllare il risultato e osservare l'esecuzione del flusso, in cui si possono visualizzare l'ingresso e l'uscita dell'intero flusso e di ogni nodo, oltre a informazioni più dettagliate per il debug. È disponibile durante l'esecuzione e al termine della stessa.

 Screenshot del pulsante Visualizza output in due posizioni.

Informazioni sulla visualizzazione della traccia

Il tipo di traccia di un prompt flow viene designato come Flusso. All'interno della visualizzazione della traccia è possibile osservare la sequenza chiara degli strumenti usati per l'orchestrazione del flusso.

Ogni span di livello 2 sotto la radice del flusso rappresenta un nodo nel flusso, eseguito sotto forma di chiamata di funzione, quindi il tipo di span è identificato come Funzione. È possibile visualizzare la durata di ogni esecuzione del nodo nell'albero span.

Nello spanning tree, le chiamate LLM sono facilmente identificabili come span LLM. Questi forniscono informazioni sulla durata della chiamata LLM e sul costo del token associato.

Selezionando uno span, è possibile visualizzare le informazioni dettagliate sul lato destro. Sono inclusi input e output, Json non elaborato ed Eccezione, tutti utili per l'osservazione e il debug.  Screenshot dei dettagli della traccia.

Nota

In prompt flow SDK sono stati definiti tipi di span serval, tra cui LLM, Funzione, Incorporazione, Recupero e Flusso. Inoltre, il sistema crea automaticamente intervalli con informazioni di esecuzione in attributi ed eventi designati.

Per ulteriori informazioni sui tipi di span, vedere Span di traccia.

Al termine dell'esecuzione del flusso, per controllare i risultati, è possibile selezionare il pulsante Visualizza risultati test per controllare tutti i record esecuzione storici in un elenco. Per impostazione predefinita, vengono visualizzati i record esecuzione creati negli ultimi sette giorni. È possibile selezionare il filtro per modificare la condizione.

Screenshot del risultato del test di flusso.

È anche possibile selezionare il nome del record esecuzione per visualizzare le informazioni dettagliate nella visualizzazione di traccia.

Sviluppare un flusso di chat

Il flusso di chat è progettato per lo sviluppo di applicazioni per conversazione, basandosi sulle funzionalità del flusso standard e fornendo supporto avanzato per gli input/output della chat e la gestione della cronologia della chat. Con il flusso di chat, è possibile creare facilmente un chatbot che gestisce l'input e l'output della chat.

Nella pagina di creazione il flusso di chat viene contrassegnato con un'etichetta "chat" per distinguerla dal flusso standard e dal flusso di valutazione. Per testare il flusso di chat, selezionare il pulsante "Chat" per attivare una casella di chat per la conversazione.

Screenshot della pagina di creazione del flusso di chat.

Input/output e cronologia della chat

Gli elementi più importanti che differenziano un flusso di chat da un flusso standard sono l'input, la cronologiae l'output.

  • Input: l'input della chat fa riferimento ai messaggi o alle query inviate dagli utenti al chatbot. Per il successo della conversazione, è essenziale gestire efficacemente l'input della chat, perché implica la comprensione delle intenzioni dell'utente, l'estrazione delle informazioni pertinenti e l'attivazione delle risposte appropriate.
  • Cronologia: la cronologia della chat è la registrazione di tutte le interazioni tra l'utente e il chatbot e include sia gli input dell'utente sia gli output generati dall'IA. Mantenere la cronologia della chat è essenziale per tenere traccia del contesto della conversazione e assicurarsi che l'IA possa generare risposte contestualmente pertinenti.
  • Output: l'output della chat fa riferimento ai messaggi generati dall'IA inviati all'utente in risposta agli input. La generazione di output di chat contestualmente appropriati e coinvolgenti è fondamentale per un'esperienza utente positiva.

Un flusso di chat può avere più input; la cronologia e l'input sono obbligatori nel flusso di chat.

  • Nella sezione di input del flusso di chat, un input del flusso può essere contrassegnato come input di chat. È quindi possibile compilare il valore di input digitandolo nella casella di chat.

  • Prompt flow può aiutare gli utenti a gestire la cronologia della chat. chat_history, nella sezione Input, serve per rappresentare la cronologia delle chat. Tutte le interazioni nella casella di chat, inclusi gli input utente, gli output generati e altri input e output del flusso, vengono archiviate automaticamente nella cronologia della chat. L'utente non può impostare manualmente il valore di chat_history nella sezione di input. È strutturato come un elenco di input e output:

    [
    {
        "inputs": {
        "<flow input 1>": "xxxxxxxxxxxxxxx",
        "<flow input 2>": "xxxxxxxxxxxxxxx",
        "<flow input N>""xxxxxxxxxxxxxxx"
        },
        "outputs": {
        "<flow output 1>": "xxxxxxxxxxxx",
        "<flow output 2>": "xxxxxxxxxxxxx",
        "<flow output M>": "xxxxxxxxxxxxx"
        }
    },
    {
        "inputs": {
        "<flow input 1>": "xxxxxxxxxxxxxxx",
        "<flow input 2>": "xxxxxxxxxxxxxxx",
        "<flow input N>""xxxxxxxxxxxxxxx"
        },
        "outputs": {
        "<flow output 1>": "xxxxxxxxxxxx",
        "<flow output 2>": "xxxxxxxxxxxxx",
        "<flow output M>": "xxxxxxxxxxxxx"
        }
    }
    ]
    

Nota

La possibilità di salvare o gestire automaticamente la cronologia della chat è una funzionalità della pagina di creazione quando si eseguono test nella casella di chat. Per le esecuzioni batch, è necessario che gli utenti includano la cronologia della chat all'interno del set di dati. Se non è disponibile alcuna cronologia della chat per i test, è sufficiente impostare il chat_history su un elenco vuoto [], all'interno del set di dati di esecuzione batch.

Creare una richiesta con la cronologia della chat

Incorporare la cronologia della chat nella richiesta è essenziale per creare risposte del chatbot contestuali e coinvolgenti. Nelle richieste, è possibile fare riferimento a chat_history per recuperare le interazioni passate. In questo modo è possibile fare riferimento a input e output precedenti per creare risposte contestualmente pertinenti.

Usare la grammatica for-loop del linguaggio Jinja per visualizzare un elenco di input e output da chat_history.

{% for item in chat_history %}
user:
{{item.inputs.question}}
assistant:
{{item.outputs.answer}}
{% endfor %}

Eseguire il test con la casella di chat

La casella di chat offre un modo interattivo per testare il flusso di chat simulando una conversazione con il chatbot. Per testare il flusso di chat usando la casella di chat, seguire questa procedura:

  1. Selezionare il pulsante Chat per aprire la casella di chat.
  2. Digitare gli input di test nella casella e premere INVIO per inviarli al chatbot.
  3. Esaminare le risposte del chatbot per assicurarsi che siano contestualmente appropriate e accurate.
  4. Visualizzare la traccia sul posto per osservare e eseguire rapidamente il debug.

 Screenshot dell'esperienza della chat del flusso di chat.

Passaggi successivi