Condividi tramite


Sessioni dell'interprete di codice serverless nelle app Azure Container

Le sessioni dinamiche di App contenitore di Azure offrono accesso rapido e scalabile a un interprete di codice. Ogni sessione dell'interprete di codice è completamente isolata da un limite Hyper-V ed è progettata per eseguire codice non attendibile.

Usi per le sessioni dell'interprete di codice

Le sessioni dell'interprete di codice sono ideali per scenari in cui è necessario eseguire codice potenzialmente dannoso o che potrebbe causare danni al sistema host o ad altri utenti, ad esempio:

  • Codice generato da un modello linguistico di grandi dimensioni (LLM).
  • Codice inviato da un utente finale in un'applicazione Web o SaaS.

Per i framework LLM più diffusi, ad esempio LangChain, LlamaIndex o Semantic Kernel, è possibile usare strumenti e plug-in per integrare le app di intelligenza artificiale con sessioni di interprete del codice.

Le applicazioni possono anche integrarsi con la sessione dell'interprete del codice usando un'API REST. L'API consente di eseguire codice in una sessione e recuperare i risultati. È anche possibile caricare e scaricare file da e verso la sessione. È possibile caricare e scaricare file di codice eseguibile o file di dati che il codice può elaborare.

Le sessioni di interprete di codice predefinite supportano gli scenari di esecuzione del codice più comuni senza la necessità di gestire l'infrastruttura o i contenitori. Se è necessario il controllo completo sull'ambiente di esecuzione del codice o si dispone di uno scenario diverso che richiede sandbox isolate, è possibile usare sessioni di interprete del codice personalizzate.

Pool di sessioni dell'interprete di codice

Per usare le sessioni dell'interprete del codice, è necessaria una risorsa di Azure denominata pool di sessioni che definisce la configurazione per le sessioni dell'interprete del codice. Nel pool di sessioni è possibile specificare impostazioni quali il numero massimo di sessioni simultanee e il tempo di inattività di una sessione prima che la sessione venga terminata.

È possibile creare un pool di sessioni usando il portale di Azure, l'interfaccia della riga di comando di Azure o i modelli di Azure Resource Manager. Dopo aver creato un pool di sessioni, è possibile usare gli endpoint API di gestione del pool per gestire ed eseguire il codice all'interno di una sessione.

Creare un pool di sessioni con l'interfaccia della riga di comando di Azure

Per creare un pool di sessioni di interprete di codice personalizzato usando l'interfaccia della riga di comando di Azure, assicurarsi di disporre delle versioni più recenti dell'interfaccia della riga di comando di Azure e dell'estensione App contenitore di Azure con i comandi seguenti:

# Upgrade the Azure CLI
az upgrade

# Install or upgrade the Azure Container Apps extension
az extension add --name containerapp --upgrade --allow-preview true -y

Usare il comando az containerapps sessionpool create per creare il pool. L'esempio seguente crea un pool di sessioni dell'interprete del codice Python denominato my-session-pool. Assicurarsi di sostituire <RESOURCE_GROUP> con il nome del gruppo di risorse prima di eseguire il comando.

az containerapp sessionpool create \
    --name my-session-pool \
    --resource-group <RESOURCE_GROUP> \
    --location westus2 \
    --container-type PythonLTS \
    --max-sessions 100 \
    --cooldown-period 300 \
    --network-status EgressDisabled

Quando si crea un pool di sessioni, è possibile definire le impostazioni seguenti:

Impostazione Descrizione
--container-type Tipo di interprete di codice da usare. L'unico valore supportato è PythonLTS.
--max-sessions Numero massimo di sessioni allocate consentite contemporaneamente. Il valore massimo è 600.
--cooldown-period Numero di secondi di inattività consentiti prima della terminazione. Il periodo di inattività viene reimpostato ogni volta che viene chiamata l'API della sessione. L'intervallo consentito è compreso tra 300 e 3600.
--network-status Indica se il traffico di rete in uscita è consentito dalla sessione. I valori validi sono EgressDisabled (valore predefinito) e EgressEnabled.

Importante

Se si abilita l'uscita, il codice in esecuzione nella sessione può accedere a Internet. Prestare attenzione quando il codice non è attendibile perché può essere usato per eseguire attività dannose, ad esempio attacchi Denial of Service.

Ottenere l'endpoint dell'API di gestione del pool con l'interfaccia della riga di comando di Azure

Per usare le sessioni dell'interprete del codice con integrazioni del framework LLM o chiamando direttamente gli endpoint dell'API di gestione, è necessario l'endpoint dell'API di gestione del pool. L'endpoint è nel formato https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>.

Per recuperare l'endpoint dell'API di gestione per un pool di sessioni, usare il comando az containerapps sessionpool show. Assicurarsi di sostituire <RESOURCE_GROUP> con il nome del gruppo di risorse prima di eseguire il comando.

az containerapp sessionpool show \
    --name my-session-pool \
    --resource-group <RESOURCE_GROUP> \
    --query 'properties.poolManagementEndpoint' -o tsv

Esecuzione del codice in una sessione

Dopo aver creato un pool di sessioni, l'applicazione può interagire con le sessioni nel pool usando un'integrazione con un framework LLM o usando direttamente gli endpoint API di gestione del pool.

Identificatori di sessione

Importante

L'identificatore di sessione è costituito da informazioni riservate che richiedono un processo sicuro per la gestione del valore. Parte di questo processo richiede che l'applicazione garantisca che ogni utente o tenant abbia accesso solo alle proprie sessioni. L'impossibilità di proteggere l'accesso alle sessioni può comportare l'uso improprio o l'accesso non autorizzato ai dati archiviati nelle sessioni degli utenti. Per altre informazioni, vedere Identificatori di sessione

Quando si interagisce con le sessioni in un pool, si usa un identificatore di sessione per fare riferimento a ogni sessione. Un identificatore di sessione è una stringa definita dall'utente univoca all'interno del pool di sessioni. Se si sta creando un'applicazione Web, è possibile usare l'ID dell'utente. Se si sta creando un chatbot, è possibile usare l'ID conversazione.

Se è presente una sessione in esecuzione con l'identificatore, la sessione viene riutilizzata. Se non è presente alcuna sessione in esecuzione con l'identificatore, viene creata automaticamente una nuova sessione.

Per altre informazioni sugli identificatori di sessione, vedere Panoramica sulla sessione.

Autenticazione

L'autenticazione viene gestita usando i token di Microsoft Entra (in precedenza Azure Active Directory). I token Microsoft Entra validi vengono generati da un'identità appartenente ai ruoli Esecutore di sessioni Azure ContainerApps e Collaboratore nel pool di sessioni.

Se si usa un'integrazione del framework LLM, il framework gestisce automaticamente la generazione e la gestione dei token. Assicurarsi che l'applicazione sia configurata con un'identità gestita con le assegnazioni di ruolo necessarie nel pool di sessioni.

Se si usano direttamente gli endpoint API di gestione del pool, è necessario generare un token e includerlo nell'intestazione Authorization delle richieste HTTP. Oltre alle assegnazioni di ruolo indicate in precedenza, il token deve contenere un'attestazione del gruppo di destinatari (aud) con il valore https://dynamicsessions.io.

Per altre informazioni, vedere Autenticazione.

Integrazioni del framework LLM

Anziché usare direttamente l'API di gestione del pool di sessioni, i framework LLM seguenti forniscono integrazioni con sessioni di interprete del codice:

Framework Pacchetto Esercitazione
LangChain Python: langchain-azure-dynamic-sessions Esercitazione
LlamaIndex Python: llama-index-tools-azure-code-interpreter Esercitazione
Kernel semantico Python: semantic-kernel (versione 0.9.8-b1 o successiva) Esercitazione

Endpoint dell'API di gestione

Se non si usa un'integrazione del framework LLM, è possibile interagire con il pool di sessioni direttamente usando gli endpoint dell'API di gestione.

Per la gestione delle sessioni in un pool sono disponibili gli endpoint seguenti:

Percorso endpoint metodo Descrizione
code/execute POST Eseguire il codice in una sessione.
files/upload POST Caricare un file in una sessione.
files/content/{filename} GET Scaricare un file da una sessione.
files GET Elencare i file in una sessione.

Compilare l'URL completo per ogni endpoint concatenando l'endpoint dell'API di gestione del pool con il percorso dell'endpoint. La stringa di query deve includere un parametro identifier contenente l'identificatore di sessione e un parametro api-version con il valore 2024-02-02-preview.

Ad esempio: https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/code/execute?api-version=2024-02-02-preview&identifier=<IDENTIFIER>

Eseguire il codice in una sessione

Per eseguire il codice in una sessione, inviare una richiesta POST all'endpoint code/execute con il codice da eseguire nel corpo della richiesta. Questo esempio riporta "Hello, world!" in Python.

Prima di inviare la richiesta, sostituire i segnaposto tra le parentesi <> con i valori appropriati per il pool di sessioni e l'identificatore di sessione.

POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/code/execute?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: application/json
Authorization: Bearer <token>

{
    "properties": {
        "codeInputType": "inline",
        "executionType": "synchronous",
        "code": "print('Hello, world!')"
    }
}

Per riutilizzare una sessione, specificare lo stesso identificatore di sessione nelle richieste successive.

Caricare un file in una sessione

Per caricare un file in una sessione, inviare una richiesta POST all'endpoint uploadFile in una richiesta di dati in formato multipart. Includere i dati del file nel corpo della richiesta. Il file deve includere un nome file.

I file caricati vengono archiviati nel file system della sessione nella directory /mnt/data.

Prima di inviare la richiesta, sostituire i segnaposto tra le parentesi <> con valori specifici della richiesta.

POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files/upload?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Authorization: Bearer <token>

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="<FILE_NAME_AND_EXTENSION>"
Content-Type: application/octet-stream

(data)
------WebKitFormBoundary7MA4YWxkTrZu0gW--

Scaricare un file da una sessione

Per scaricare un file dalla directory /mnt/data di una sessione, inviare una richiesta GET all'endpoint file/content/{filename}. La risposta include i dati del file.

Prima di inviare la richiesta, sostituire i segnaposto tra le parentesi <> con valori specifici della richiesta.

GET https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files/content/<FILE_NAME_AND_EXTENSION>?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Authorization: Bearer <TOKEN>

Elencare i file in una sessione

Per elencare i file nella directory /mnt/data di una sessione, inviare una richiesta GET all'endpoint files.

Prima di inviare la richiesta, sostituire i segnaposto tra le parentesi <> con valori specifici della richiesta.

GET https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Authorization: Bearer <TOKEN>

La risposta contiene un elenco di file nella sessione.

L'elenco seguente mostra un esempio del tipo di risposta che è possibile prevedere dalla richiesta del contenuto della sessione.

{
    "$id": "1",
    "value": [
        {
            "$id": "2",
            "properties": {
                "$id": "3",
                "filename": "test1.txt",
                "size": 16,
                "lastModifiedTime": "2024-05-02T07:21:07.9922617Z"
            }
        },
        {
            "$id": "4",
            "properties": {
                "$id": "5",
                "filename": "test2.txt",
                "size": 17,
                "lastModifiedTime": "2024-05-02T07:21:08.8802793Z"
            }
        }
    ]
}

Pacchetti preinstallati

Le sessioni dell'interprete di codice Python includono pacchetti Python più diffusi, ad esempio NumPy, pandas e scikit-learn.

Per restituire l'elenco dei pacchetti preinstallati, chiamare l'endpoint code/execute con il codice seguente.

Prima di inviare la richiesta, sostituire i segnaposto tra le parentesi <> con valori specifici della richiesta.

POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/identifier/<SESSION_ID>/code/execute?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: application/json
Authorization: Bearer <TOKEN>

{
    "properties": {
        "codeInputType": "inline",
        "executionType": "synchronous",
        "code": "import pkg_resources\n[(d.project_name, d.version) for d in pkg_resources.working_set]"
    }
}

Registrazione

Le sessioni dell'interprete del codice non supportano direttamente la registrazione. L'applicazione che interagisce con le sessioni può registrare le richieste all'API di gestione del pool di sessioni e alle relative risposte.

Fatturazione

Le sessioni dell'interprete del codice vengono fatturate in base alla durata di ogni sessione. Per altre informazioni, vedere Fatturazione .

Passaggi successivi