Integrare il flusso di richiesta con DevOps per applicazioni basate su LLM

Il flusso di richieste di Azure Machine Learning è un metodo code-first semplice e intuitivo per sviluppatori per sviluppare ed eseguire l'iterazione dei flussi per lo sviluppo di applicazioni basate su LLM (Large Language Model). Il flusso prompt fornisce un SDK e un'interfaccia della riga di comando, un'estensione di Visual Studio Code e un'interfaccia utente di creazione del flusso. Questi strumenti facilitano lo sviluppo del flusso locale, l'esecuzione del flusso locale e l'attivazione dell'esecuzione della valutazione e la transizione dei flussi tra ambienti dell'area di lavoro locale e cloud.

È possibile combinare l'esperienza del flusso di richiesta e le funzionalità del codice con le operazioni per sviluppatori (DevOps) per migliorare i flussi di lavoro di sviluppo di applicazioni basate su LLM. Questo articolo è incentrato sull'integrazione del flusso di richiesta e di DevOps per le applicazioni basate su LLM di Azure Machine Learning.

Il diagramma seguente illustra l'interazione dello sviluppo di flussi di richieste locali e basati sul cloud con DevOps.

Diagramma che mostra il flusso seguente: creare flusso, sviluppare e testare il flusso, il controllo delle versioni nel repository del codice, inviare le esecuzioni al cloud e l'iterazione e il debutto e l'iterazione.

Prerequisiti

Usare un'esperienza code-first nel flusso di richiesta

Lo sviluppo di applicazioni basate su LLM segue in genere un processo di progettazione di applicazioni standardizzato che include repository di codice sorgente e pipeline di integrazione continua/distribuzione continua (CI/CD). Questo processo promuove lo sviluppo semplificato, il controllo della versione e la collaborazione tra i membri del team.

L'integrazione di DevOps con l'esperienza del codice del flusso di richiesta offre agli sviluppatori di codice un processo di iterazione GenAIOps o LLMOps più efficiente, con le funzionalità e i vantaggi principali seguenti:

  • Controllo delle versioni del flusso nel repository di codice. È possibile definire i file di flusso in formato YAML e rimanere allineati ai file di origine a cui si fa riferimento nella stessa struttura di cartelle.

  • Integrazione dell'esecuzione del flusso con pipeline CI/CD. È possibile integrare facilmente il flusso di richieste nelle pipeline CI/CD e nel processo di recapito usando l'interfaccia della riga di comando del flusso di richiesta o l'SDK per attivare automaticamente le esecuzioni del flusso.

  • Transizione uniforme tra locale e cloud. È possibile esportare facilmente la cartella del flusso nel repository di codice locale o upstream per il controllo della versione, lo sviluppo locale e la condivisione. È anche possibile importare facilmente la cartella di flusso in Azure Machine Learning per altre operazioni di creazione, test e distribuzione usando le risorse cloud.

Codice del flusso di richiesta di accesso

Ogni flusso di richiesta ha una struttura di cartelle di flusso contenente file di codice essenziali che definiscono il flusso. La struttura di cartelle organizza il flusso, semplificando le transizioni tra locale e cloud.

Azure Machine Learning offre un file system condiviso per tutti gli utenti dell'area di lavoro. Al momento della creazione del flusso, una cartella del flusso corrispondente viene generata automaticamente e archiviata nella directory Users/<username>/promptflow .

Screenshot della creazione del flusso standard che mostra un nuovo flusso.

Usare i file di codice del flusso

Dopo aver creato un flusso in studio di Azure Machine Learning, è possibile visualizzare, modificare e gestire i file di flusso nella sezione File della pagina di creazione del flusso. Tutte le modifiche apportate ai file riflettono direttamente l'archiviazione della condivisione file.

Screenshot di una pagina di creazione di flussi standard che evidenzia il riquadro File.

La cartella del flusso per un flusso basato su LLM contiene i file di chiave seguenti.

  • flow.dag.yaml è il file di definizione del flusso primario in formato YAML. Questo file è integrale alla creazione e alla definizione del flusso di richiesta. Il file include informazioni su input, output, nodi, strumenti e varianti usate dal flusso.

  • I file di codice sorgente gestiti dall'utente in formato Python (.py) o Jinja 2 (jinja2) configurano gli strumenti e i nodi nel flusso. Lo strumento Python usa i file Python per definire la logica Python personalizzata. Lo strumento prompt e lo strumento LLM usano i file Jinja 2 per definire il contesto del prompt.

  • I file non di origine come utilità e file di dati possono essere inclusi nella cartella del flusso insieme ai file di origine.

Per visualizzare e modificare il codice non elaborato dei file flow.dag.yaml e di origine nell'editor di file, attivare la modalità file non elaborato.

Screenshot della modalità file non elaborata in un flusso standard.

In alternativa, è possibile accedere e modificare tutte le cartelle e i file del flusso dalla pagina studio di Azure Machine Learning Notebooks.

Screenshot dei notebook in Azure Machine Learning con la cartella del flusso di richiesta che mostra i file.

Scaricare e archiviare il codice del flusso di richiesta

Per controllare il flusso nel repository di codice, esportare la cartella del flusso da studio di Azure Machine Learning nel computer locale. Selezionare l'icona di download nella sezione File della pagina di creazione del flusso per scaricare un pacchetto ZIP contenente tutti i file di flusso. È quindi possibile controllare il file nel repository di codice o decomprimerlo per lavorare con i file in locale.

Screenshot che mostra l'icona di download in Esplora file.

Per altre informazioni sull'integrazione di DevOps con Azure Machine Learning, vedere Integrazione di Git per Azure Machine Learning.

Sviluppare e testare localmente

Quando si ottimizza e si ottimizza il flusso o le richieste durante lo sviluppo iterativo, è possibile eseguire più iterazioni in locale all'interno del repository di codice. La versione della community di VS Code, l'estensione del flusso del prompt di VS Code e l'SDK locale e l'interfaccia della riga di comando facilitano lo sviluppo e il test locali puri senza binding di Azure.

Lavorare in locale consente di apportare e testare rapidamente le modifiche, senza dover aggiornare ogni volta il repository di codice principale. Per altre informazioni e indicazioni sull'uso delle versioni locali, vedere la community gitHub del flusso prompt.

Usare l'estensione del flusso del prompt di VS Code

Usando l'estensione Prompt flow VS Code, è possibile creare facilmente il flusso in locale nell'editor di VS Code con un'esperienza di interfaccia utente simile a quella nel cloud.

Per modificare i file in locale in VS Code con l'estensione Flusso prompt:

  1. In VS Code con l'estensione Flusso prompt abilitata aprire una cartella del flusso di richiesta.

  2. Aprire il file flow.dag.yaml e selezionare il collegamento Editor visivo nella parte superiore del file.

    Screenshot del collegamento di Visual Editor nella parte superiore di un file di definizione del flusso in VS Code.

  3. Usare l'editor visivo flusso di richiesta per apportare modifiche al flusso, ad esempio l'ottimizzazione delle richieste nelle varianti o l'aggiunta di altri nodi.

    Screenshot dell'editor del flusso di prompt visivo in VS Code.

  4. Per testare il flusso, selezionare l'icona Esegui nella parte superiore dell'editor visivo o per testare qualsiasi nodo, selezionare l'icona Esegui nella parte superiore del nodo.

    Screenshot di VS Code che mostra l'esecuzione del flusso o di un nodo nell'editor visivo.

Usare l'SDK del flusso di richiesta e l'interfaccia della riga di comando

Se si preferisce lavorare direttamente nel codice o usare Jupyter, PyCharm, Visual Studio o un altro ambiente di sviluppo integrato (IDE), è possibile modificare direttamente il codice YAML nel file flow.dag.yaml .

Screenshot di un file YAML in VS Code che evidenzia la directory di input e flusso predefinita.

È quindi possibile attivare un'esecuzione di un singolo flusso per i test usando l'interfaccia della riga di comando del flusso di prompt o l'SDK nel terminale come indicato di seguito.

Per attivare un'esecuzione dalla directory di lavoro, eseguire il codice seguente:

pf flow test --flow <directory-name>

I valori restituiti sono i log di test e gli output.

Screenshot dell'output del test del flusso in PowerShell.

Inviare esecuzioni al cloud da un repository locale

Dopo aver soddisfatto i risultati del test locale, è possibile usare l'interfaccia della riga di comando del flusso di richiesta o l'SDK per inviare esecuzioni al cloud dal repository locale. La procedura e il codice seguenti si basano sul progetto demo di classificazione Web in GitHub. È possibile clonare il repository del progetto o scaricare il codice del flusso di richiesta nel computer locale.

Installare l'SDK del prompt flow

Installare l'SDK/l'interfaccia della riga di comando del prompt di Azure eseguendo pip install promptflow[azure] promptflow-tools.

Se si usa il progetto demo, ottenere l'SDK e altri pacchetti necessari installando requirements.txt con
pip install -r <path>/requirements.txt.

Connettersi all'area di lavoro di Azure Machine Learning

az login

Caricare il flusso e creare un'esecuzione

Preparare il file run.yml per definire la configurazione per l'esecuzione di questo flusso nel cloud.

$schema: https://azuremlschemas.azureedge.net/promptflow/latest/Run.schema.json
flow: <path-to-flow>
data: <path-to-flow>/<data-file>.jsonl

column_mapping:
  url: ${data.url}

# Define cloud compute resource

resources:
  instance_type: <compute-type>

# If using compute instance compute type, also specify instance name
#  compute: <compute-instance-name> 

# Specify connections

  <node-name>:
    connection: <connection-name>
    deployment_name: <deployment-name>

È possibile specificare il nome di connessione e distribuzione per ogni strumento nel flusso che richiede una connessione. Se non si specifica il nome di connessione e distribuzione, lo strumento usa la connessione e la distribuzione nel file flow.dag.yaml . Usare il codice seguente per formattare le connessioni:

...
connections:
  <node-name>:
    connection: <connection-name>
      deployment_name: <deployment-name>
...

Creare l'esecuzione.

pfazure run create --file run.yml

Creare un'esecuzione del flusso di valutazione

Preparare il file run_evaluation.yml per definire la configurazione per questo flusso di valutazione eseguito nel cloud.

$schema: https://azuremlschemas.azureedge.net/promptflow/latest/Run.schema.json
flow: <path-to-flow>
data: <path-to-flow>/<data-file>.jsonl
run: <id-of-base-flow-run>
column_mapping:
  <input-name>: ${data.<column-from-test-dataset>}
  <input-name>: ${run.outputs.<column-from-run-output>}

resources:
  instance_type: <compute-type>
  compute: <compute_instance_name> 

connections:
  <node-name>:
    connection: <connection-name>
    deployment_name: <deployment-name>
  <node-name>:
    connection: <connection-name>
    deployment_name: <deployment-name>

Creare l'esecuzione della valutazione.

pfazure run create --file run_evaluation.yml

Visualizzare i risultati dell'esecuzione

L'invio dell'esecuzione del flusso al cloud restituisce l'URL cloud dell'esecuzione. È possibile aprire l'URL per visualizzare i risultati dell'esecuzione in studio di Azure Machine Learning. È anche possibile eseguire i comandi dell'interfaccia della riga di comando o dell'SDK seguenti per visualizzare i risultati dell'esecuzione.

Eseguire lo streaming dei log

pfazure run stream --name <run-name>

Visualizzare gli output delle esecuzioni

pfazure run show-details --name <run-name>

Visualizzare le metriche di esecuzione della valutazione

pfazure run show-metrics --name <evaluation-run-name>

Integrarsi con DevOps

Una combinazione di un ambiente di sviluppo locale e di un sistema di controllo della versione, ad esempio Git, è in genere più efficace per lo sviluppo iterativo. È infatti possibile apportare modifiche e testare il codice in locale, quindi eseguire il commit delle modifiche in Git. Questo processo crea un record continuo delle modifiche e offre la possibilità di ripristinare le versioni precedenti, se necessario.

Quando è necessario condividere i flussi in ambienti diversi, è possibile eseguirne il push in un repository di codice basato sul cloud, ad esempio GitHub o Azure Repos. Questa strategia consente di accedere alla versione del codice più recente da qualsiasi posizione e fornisce strumenti per la collaborazione e la gestione del codice.

Seguendo queste procedure, i team possono creare un ambiente collaborativo facile, efficiente e produttivo per lo sviluppo di flussi di richiesta.

Ad esempio, pipeline LLMOps end-to-end che eseguono flussi di classificazione Web, vedere Configurare genAIOps end-to-end con prompt Flow e GitHub e il progetto demo di classificazione Web GitHub.

Esecuzione del flusso di trigger nelle pipeline CI

Dopo aver sviluppato e testato correttamente il flusso e averla archiviata come versione iniziale, si è pronti per l'ottimizzazione e il test delle iterazioni. In questa fase è possibile attivare le esecuzioni del flusso, inclusi i test batch e le esecuzioni di valutazione, usando l'interfaccia della riga di comando del flusso di prompt per automatizzare i passaggi nella pipeline CI.

Durante tutto il ciclo di vita delle iterazioni del flusso, è possibile usare l'interfaccia della riga di comando per automatizzare le operazioni seguenti:

  • Esecuzione del flusso di richiesta dopo una richiesta pull
  • Esecuzione della valutazione del prompt flow per garantire la qualità elevata dei risultati
  • Registrazione dei modelli di flusso dei prompt
  • Distribuzione di modelli di flusso dei prompt

Usare l'interfaccia utente di Studio per lo sviluppo continuo

In qualsiasi momento dello sviluppo del flusso, è possibile tornare all'interfaccia utente studio di Azure Machine Learning e usare le risorse e le esperienze cloud per apportare modifiche al flusso.

Per continuare a sviluppare e usare le versioni più aggiornate dei file di flusso, è possibile accedere a un terminale nella pagina Notebook ed eseguire il pull dei file di flusso più recenti dal repository. In alternativa, è possibile importare direttamente una cartella del flusso locale come nuovo flusso bozza per eseguire facilmente la transizione tra lo sviluppo locale e il cloud.

Screenshot della schermata Crea un nuovo flusso con l'opzione Carica in locale evidenziata.

Distribuire il flusso come endpoint online

L'ultimo passaggio dell'attività di produzione consiste nel distribuire il flusso come endpoint online in Azure Machine Learning. Questo processo consente di integrare il flusso nell'applicazione e di renderlo disponibile per l'uso. Per altre informazioni su come distribuire il flusso, vedere Distribuire flussi all'endpoint online gestito di Azure Machine Learning per l'inferenza in tempo reale.

Collaborare allo sviluppo di flussi

La collaborazione tra i membri del team può essere essenziale quando si sviluppa un'applicazione basata su LLM con flusso di richiesta. I membri del team possono creare e testare lo stesso flusso, lavorando su facet diversi del flusso o apportando modifiche iterative e miglioramenti simultaneamente. Questa collaborazione richiede un approccio efficiente e semplificato alla condivisione del codice, al rilevamento delle modifiche, alla gestione delle versioni e all'integrazione delle modifiche nel progetto finale.

L'SDK/l'interfaccia della riga di comando del flusso di prompt dei prompt e l'estensione del flusso di VS Code semplificano la collaborazione nello sviluppo di flussi basati su codice all'interno di un repository di codice sorgente. È possibile usare un sistema di controllo del codice sorgente basato sul cloud, ad esempio GitHub o Azure Repos, per tenere traccia delle modifiche, gestire le versioni e integrare queste modifiche nel progetto finale.

Seguire le procedure consigliate per lo sviluppo collaborativo

  1. Configurare un repository di codice centralizzato.

    Il primo passaggio del processo di collaborazione prevede la configurazione di un repository di codice come base per il codice del progetto, incluso il codice del flusso di richiesta. Questo repository centralizzato consente un'organizzazione efficiente, il rilevamento delle modifiche e la collaborazione tra i membri del team.

  2. Creare e testare il flusso in locale in VS Code con l'estensione Flusso prompt.

    Dopo aver configurato il repository, i membri del team possono usare VS Code con l'estensione Flusso prompt per la creazione locale e il test di input singolo del flusso. L'ambiente di sviluppo integrato standardizzato promuove la collaborazione tra più membri che lavorano su diversi aspetti del flusso.

    Screenshot dello sviluppo locale.

  3. Usare l'interfaccia della riga di comando o l'SDK pfazure per inviare esecuzioni batch e di valutazione dai flussi locali al cloud.

    Dopo lo sviluppo e il test locali, i membri del team possono usare l'interfaccia della riga di comando del flusso di richiesta/SDK per inviare e valutare le esecuzioni batch e di valutazione nel cloud. Questo processo consente l'utilizzo del cloud compute, l'archiviazione dei risultati permanenti, la creazione di endpoint per le distribuzioni e una gestione efficiente nell'interfaccia utente di Studio.

    Screenshot del comando pfazure per inviare l'esecuzione al cloud.

  4. Visualizzare e gestire i risultati dell'esecuzione nell'interfaccia utente dell'area di lavoro studio di Azure Machine Learning.

    Dopo l'invio delle esecuzioni al cloud, i membri del team possono accedere all'interfaccia utente di Studio per visualizzare i risultati e gestire gli esperimenti in modo efficiente. L'area di lavoro cloud offre una posizione centralizzata per la raccolta e la gestione della cronologia di esecuzione, dei log, degli snapshot, dei risultati completi e degli input e degli output a livello di istanza.

    Screenshot dello snapshot di esecuzione cloud.

  5. Usare l'elenco Esecuzioni che registra tutta la cronologia di esecuzione per confrontare facilmente i risultati di diverse esecuzioni, supportando l'analisi della qualità e le modifiche necessarie.

    Screenshot dell'elenco di esecuzioni nell'area di lavoro.

  6. Continuare a usare lo sviluppo iterativo locale.

    Dopo aver analizzato i risultati degli esperimenti, i membri del team possono tornare all'ambiente locale e al repository di codice per altre attività di sviluppo e ottimizzazione e inviare in modo iterativo le esecuzioni successive al cloud. Questo approccio iterativo garantisce un miglioramento coerente fino a quando il team non è soddisfatto della qualità per la produzione.

  7. Usare la distribuzione in un unico passaggio nell'ambiente di produzione in studio.

    Una volta che il team è completamente sicuro della qualità del flusso, può distribuirlo facilmente come endpoint online in un ambiente cloud affidabile. La distribuzione come endpoint online può essere basata su uno snapshot di esecuzione, consentendo una gestione stabile e sicura, un'ulteriore allocazione delle risorse e il monitoraggio dell'utilizzo e il monitoraggio dei log nel cloud.

    Screenshot della distribuzione del flusso da uno snapshot di esecuzione.

    La distribuzione guidata studio di Azure Machine Learning consente di configurare facilmente la distribuzione.

    Screenshot della distribuzione guidata.