Condividi tramite


Distribuire un'applicazione che usa OpenAI nel servizio Azure Kubernetes (AKS)

Questo articolo illustra come distribuire un'applicazione che usa Azure OpenAI o OpenAI nel servizio Azure Kubernetes. Con OpenAI è possibile adattare facilmente modelli di intelligenza artificiale diversi, ad esempio generazione di contenuto, riepilogo, ricerca semantica e linguaggio naturale alla generazione di codice, per le attività specifiche. Per iniziare, distribuire un cluster del servizio Azure Kubernetes nella sottoscrizione di Azure. Distribuire quindi il servizio OpenAI e l'applicazione di esempio.

L'applicazione nativa del cloud di esempio è rappresentativa delle implementazioni reali. L'applicazione multi-contenitore è costituita da applicazioni scritte in più linguaggi e framework, tra cui:

  • Golang con Gin
  • Rust con Actix-Web
  • JavaScript con Vue.js e Fastify
  • Python con FastAPI

Queste applicazioni forniscono front-end per i clienti e gli amministratori dell'archivio, le API REST per l'invio di dati alla coda di messaggi RabbitMQ e al database MongoDB e alle app console per simulare il traffico.

Nota

Non è consigliabile eseguire contenitori con stato, ad esempio MongoDB e Rabbit MQ, senza l'archiviazione permanente per la produzione. Questi vengono usati qui per semplicità, ma è consigliabile usare servizi gestiti, ad esempio Azure CosmosDB o il bus di servizio di Azure.

Per accedere alla codebase GitHub per l'applicazione di esempio, vedere Demo dello Store del servizio Azure Kubernetes.

Operazioni preliminari

  • È necessario un account Azure con una sottoscrizione attiva. Se non si dispone di un account, crearne uno gratuitamente.
  • Per questa demo è possibile usare il servizio Azure OpenAI o il servizio OpenAI.

Prerequisiti

Creare un gruppo di risorse

Un gruppo di risorse di Azure è un contenitore logico in cui vengono distribuite e gestite le risorse di Azure. Quando si crea un gruppo di risorse, viene richiesto di specificare una posizione. Questa posizione è la posizione di archiviazione dei metadati del gruppo di risorse e dove le risorse vengono eseguite in Azure se non si specifica un'altra regione durante la creazione della risorsa.

L'esempio seguente crea un gruppo di risorse denominato myResourceGroup nella località stati uniti orientali.

  • Creare un gruppo di risorse usando il comando az group create.

    az group create --name myResourceGroup --location eastus
    

    L'output di esempio seguente mostra la corretta creazione del gruppo di risorse:

    {
      "id": "/subscriptions/<guid>/resourceGroups/myResourceGroup",
      "location": "eastus",
      "managedBy": null,
      "name": "myResourceGroup",
      "properties": {
        "provisioningState": "Succeeded"
      },
      "tags": null,
      "type": "Microsoft.Resources/resourceGroups"
    }
    

Creare un cluster del servizio Azure Kubernetes

L'esempio seguente crea un cluster denominato myAKSCluster in myResourceGroup.

  • Creare un cluster del servizio Azure Kubernetes usando il comando az aks create.

    az aks create --resource-group myResourceGroup --name myAKSCluster --generate-ssh-keys
    

    Il comando viene completato dopo pochi minuti e vengono restituite informazioni in formato JSON sul cluster.

Stabilire la connessione al cluster

Per gestire un cluster Kubernetes, usare il client da riga di comando di Kubernetes kubectl. kubectl è già installato se si usa Azure Cloud Shell.

  1. Eseguire l'installazione kubectl in locale usando il comando az aks install-cli.

    az aks install-cli
    

    Nota

    Se il sistema basato su Linux richiede autorizzazioni elevate, è possibile usare il comando sudo az aks install-cli.

  2. Configurare kubectl per connettersi al cluster Kubernetes usando il comando az aks get-credentials.

    Questo comando esegue le operazioni seguenti:

    • Scarica le credenziali e configura la CLI di Kubernetes per utilizzarle.
    • Usare ~/.kube/config, il percorso predefinito per il file di configurazione kubernetes. Specificare un percorso diverso per il file di configurazione di Kubernetes usando l’argomento --file.
    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  3. Verificare la connessione al cluster usando il comando kubectl get. Questo comando restituisce un elenco dei nodi del cluster.

    kubectl get nodes
    

    L'output di esempio seguente mostra i nodi creati nei passaggi precedenti. Assicurarsi che lo stato del nodo sia Pronto.

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-nodepool1-31469198-vmss000000   Ready    agent   3h29m   v1.25.6
    aks-nodepool1-31469198-vmss000001   Ready    agent   3h29m   v1.25.6
    aks-nodepool1-31469198-vmss000002   Ready    agent   3h29m   v1.25.6
    

Nota

Per i cluster privati, i nodi potrebbero non essere raggiungibili se si tenta di connettersi tramite l'indirizzo IP pubblico. Per risolvere questo problema, è necessario creare un endpoint all'interno della stessa rete virtuale del cluster da cui connettersi. Seguire le istruzioni per creare un cluster del servizio Azure Kubernetes privato e quindi connettersi.

Distribuire l'applicazione

Diagramma dell'architettura della demo di intelligenza artificiale del servizio Azure Kubernetes.

Il manifesto dell'applicazione dello Store del servizio Azure Kubernetes include le distribuzioni e i servizi Kubernetes seguenti:

  • Servizio prodotto: mostra le informazioni sul prodotto.
  • Servizio ordini: effettua ordini.
  • Servizio Makeline: elabora gli ordini dalla coda e completa gli ordini.
  • Front-store: applicazione Web per i clienti per visualizzare i prodotti ed effettuare ordini.
  • Amministratore dello Store: applicazione Web per i dipendenti dello Store per visualizzare gli ordini nella coda e gestire le informazioni sui prodotti.
  • Cliente virtuale: simula la creazione degli ordini in base a una pianificazione.
  • Ruolo di lavoro virtuale: simula il completamento dell'ordine in base a una pianificazione.
  • Mongo DB: istanza NoSQL per i dati persistenti.
  • Rabbit MQ: coda di messaggi per una coda di ordini.

Nota

Non è consigliabile eseguire contenitori con stato, ad esempio MongoDB e Rabbit MQ, senza l'archiviazione permanente per la produzione. Questi vengono usati qui per semplicità, ma è consigliabile usare servizi gestiti, ad esempio Azure CosmosDB o il bus di servizio di Azure.

  1. Esaminare il manifesto YAML per l'applicazione.

  2. Distribuire l'applicazione usando il comando kubectl apply e specificare il nome del manifesto YAML.

    kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/aks-store-demo/main/aks-store-all-in-one.yaml
    

    L'output di esempio seguente mostra le distribuzioni e i servizi creati correttamente:

    deployment.apps/mongodb created
    service/mongodb created
    deployment.apps/rabbitmq created
    service/rabbitmq created
    deployment.apps/order-service created
    service/order-service created
    deployment.apps/makeline-service created
    service/makeline-service created
    deployment.apps/product-service created
    service/product-service created
    deployment.apps/store-front created
    service/store-front created
    deployment.apps/store-admin created
    service/store-admin created
    deployment.apps/virtual-customer created
    deployment.apps/virtual-worker created
    

Distribuire OpenAI

È possibile usare Azure OpenAI o OpenAI ed eseguire l'applicazione nel servizio Azure Kubernetes.

  1. Abilitare Azure OpenAI nella sottoscrizione di Azure compilando il modulo Richiedi accesso al Servizio OpenAI di Azure.
  2. Nel portale di Azure creare un'istanza di Azure OpenAI.
  3. Selezionare l'istanza di Azure OpenAI creata.
  4. Selezionare Chiavi ed endpoint per generare una chiave.
  5. Selezionare Distribuzioni modello> Distribuzioni gestiteper aprire Azure OpenAI Studio.
  6. Creare una nuova distribuzione usando il modello gpt-35-turbo.

Per altre informazioni su come creare una distribuzione in Azure OpenAI, vedere Introduzione alla generazione di testo con il servizio OpenAI di Azure.

Distribuire il servizio di intelligenza artificiale

Ora che l'applicazione viene distribuita, è possibile distribuire il microservizio basato su Python che usa OpenAI per generare automaticamente descrizioni per i nuovi prodotti aggiunti al catalogo dello Store.

  1. Creare un file denominato ai-service.yaml e copiarlo nel manifesto seguente:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ai-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ai-service
      template:
        metadata:
          labels:
            app: ai-service
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: ai-service
            image: ghcr.io/azure-samples/aks-store-demo/ai-service:latest
            ports:
            - containerPort: 5001
            env:
            - name: USE_AZURE_OPENAI 
              value: "True"
            - name: AZURE_OPENAI_DEPLOYMENT_NAME 
              value: ""
            - name: AZURE_OPENAI_ENDPOINT 
              value: ""
            - name: OPENAI_API_KEY 
              value: ""
            resources:
              requests:
                cpu: 20m
                memory: 50Mi
              limits:
                cpu: 50m
                memory: 128Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: ai-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 5001
        targetPort: 5001
      selector:
        app: ai-service
    
  2. Impostare la variabile di ambiente USE_AZURE_OPENAI su "True".

  3. Ottenere il nome della distribuzione Di Azure OpenAI da Azure OpenAI Studio e immettere il valore AZURE_OPENAI_DEPLOYMENT_NAME.

  4. Ottenere l'endpoint OpenAI di Azure e la chiave API OpenAI di Azure dal portale di Azure selezionando Chiavi ed endpoint nel pannello sinistro della risorsa. Aggiornare AZURE_OPENAI_ENDPOINT e OPENAI_API_KEY in YAML di conseguenza.

  5. Distribuire l'applicazione usando il comando kubectl apply e specificare il nome del manifesto YAML.

    kubectl apply -f ai-service.yaml
    

    L'output di esempio seguente mostra le distribuzioni e i servizi creati correttamente:

      deployment.apps/ai-service created
      service/ai-service created
    

Nota

L'aggiunta diretta di informazioni riservate, ad esempio le chiavi API, ai file manifesto Kubernetes non è sicura e può essere eseguito accidentalmente il commit nei repository di codice. È stato aggiunto qui per semplicità. Per i carichi di lavoro di produzione, usare l'identità gestita per eseguire l'autenticazione al servizio di Azure OpenAI o archiviare i segreti in Azure Key Vault.

Testare l'applicazione

  1. Controllare lo stato dei pod distribuiti usando il comando kubectl get pods.

    kubectl get pods
    

    Assicurarsi che tutti i pod siano in esecuzione prima di continuare con il passaggio successivo.

    NAME                                READY   STATUS    RESTARTS   AGE
    makeline-service-7db94dc7d4-8g28l   1/1     Running   0          99s
    mongodb-78f6d95f8-nptbz             1/1     Running   0          99s
    order-service-55cbd784bb-6bmfb      1/1     Running   0          99s
    product-service-6bf4d65f74-7cbvk    1/1     Running   0          99s
    rabbitmq-9855984f9-94nlm            1/1     Running   0          99s
    store-admin-7f7d768c48-9hn8l        1/1     Running   0          99s
    store-front-6786c64d97-xq5s9        1/1     Running   0          99s
    virtual-customer-79498f8667-xzsb7   1/1     Running   0          99s
    virtual-worker-6d77fff4b5-7g7rj     1/1     Running   0          99s
    
  2. Ottenere l'indirizzo IP dell'applicazione Web di amministrazione dello Store e archiviare l'applicazione Web front usando il comando kubectl get service.

    kubectl get service store-admin
    

    L'applicazione espone il sito di amministrazione dello Store a Internet tramite un servizio di bilanciamento del carico pubblico di cui è stato effettuato il provisioning dal servizio Kubernetes. Questo processo può richiedere alcuni minuti. IP ESTERNO viene inizialmente visualizzato in sospeso fino a quando il servizio non viene visualizzato e viene visualizzato l'indirizzo IP.

    NAME          TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
    store-admin   LoadBalancer   10.0.142.228   40.64.86.161    80:32494/TCP   50m    
    

    Ripetere lo stesso passaggio per il servizio denominato "store-front".

  3. Aprire un Web browser e passare all'indirizzo IP esterno del servizio. Nell'esempio illustrato qui aprire 40.64.86.161 per visualizzare l'amministratore dello Store nel browser. Ripetere lo stesso passaggio per Store Front.

  4. Nell'amministratore dello Store selezionare la scheda Prodotti, quindi selezionare Aggiungi prodotti.

  5. Quando l'esecuzione di "ai-service" viene eseguita correttamente, viene visualizzato il pulsante Ask OpenAI accanto al campo della descrizione. Immettere il nome, il prezzo e le parole chiave, quindi generare una descrizione del prodotto selezionando Chiedi OpenAI>Salva prodotto.

    Screenshot di come usare openAI per generare una descrizione del prodotto.

  6. È ora possibile visualizzare il nuovo prodotto creato nell'amministratore dello Store usato dai venditori. Nella foto, si può vedere Jungle Monkey Chew Toy è stato aggiunto.

    Screenshot che mostra il nuovo prodotto nella pagina di amministrazione dello Store.

  7. È anche possibile visualizzare il nuovo prodotto creato in Front store usato dagli acquirenti. Nella foto, si può vedere Jungle Monkey Chew Toy è stato aggiunto. Ricordarsi di ottenere l'indirizzo IP dell'archivio anteriore usando il comando kubectl get service.

    Screenshot che mostra il nuovo prodotto nella pagina iniziale dello Store.

Passaggi successivi

Dopo aver aggiunto la funzionalità OpenAI a un'applicazione servizio Azure Kubernetes, è possibile proteggere l'accesso ad Azure OpenAI dal servizio Azure Kubernetes.

Per altre informazioni sui casi d'uso generativi dell'intelligenza artificiale, vedere le risorse seguenti: