Nel mondo odierno, dove la sicurezza dei dati e la privacy sono diventati temi di fondamentale importanza, con l’aumentare dell’utilizzo di modelli linguistici dall’ambito privato a quello aziendale, è necessario iniziare a interrogarsi sulla sicurezza e la privacy che questi strumenti possono fornire.

Il rischio è quello che si finisca per fornire informazioni private o riservate ad aziende che utilizzeranno quei dati per l’apprendimento dei propri modelli e per i loro scopi.

ChatGPT, ad esempio, utilizza tutte le chat per allenare i propri modelli, anche nella versione a pagamento ChatGPT Plus a 25 EUR al mese. Sono esclusi dal training i piani ChatGPT Team (25 EUR al mese per utente, minimo 2 utenti) e le API utilizzabili dagli sviluppatori.

Per questo motivo secondo me è importante prendere in considerazione l’utilizzo di interfacce alternative che permettano di avere un ambiente privato e controllato.

Questo articolo esplorerà come implementare un’interfaccia di Chat AI utilizzando OpenWebUI.

OpenWebUI

OpenWebUI è un framework open-source progettato per semplificare la creazione di interfacce utente per applicazioni AI. Offre agli sviluppatori una base solida su cui costruire consentendo a chiunque di implementare la propria soluzione.

OpenWebUI include un’interfaccia utente intuitiva permettendo di gestire conversazioni contestuali e personalizzate con la possibilità anche di caricare documenti o effettuare ricerche sul web.

Inoltre, OpenWebUI è dotato di strumenti per la gestione degli utenti e delle sessioni, supporta anche l’integrazione con vari modelli permettendo così agli sviluppatori di scegliere la tecnologia che meglio si adatta alle loro esigenze.

Integrazione con gli LLM

OpenWeUi può interfacciarsi in due modi con gli LLM, in modalità locale eseguendo un modello sulla macchina o con API esterne compatibili con lo standard di OpenAI.

Per eseguire un modello in locale è possibile usare Ollama, un software permette di scaricare ed eseguire in locale una lunga lista di LLM.

I requisiti per far girare un modello anche piccolo però non sono da sottovalutare, per prestazioni ottimali è necessaria una GPU e memoria video in base alle dimensioni del modello:

7B model requires ~4 GB VRAM

13B model requires ~8 GB VRAM

30B model needs ~16 GB VRAM

65B model needs ~32 GB VRAM

L’altro metodo è quello di utilizzare delle API “OpenAI compatibili” per accedere ad un modello hostato da qualcun’altro, il fornitore può essere OpenAI stessa o altre aziende come OpenRouter che permettono di accedere a una lunga serie di LLM e non solo GPT.

Gli LLM disponibili nel mercato non sono solo infatti quelli di OpenAI ma anche vari modelli open source sviluppati da altre aziende.

Ad esempio Meta rende disponibile Llama in maniera libera.

I modelli oltre a differire per precisione e prestazioni, differiscono anche di prezzo quando si usano delle API fornite da servizi terzi, le interazioni con un LLM vengono infatti misurate in token utilizzati, un token equivalgono a circa 4 parole, i token vengono contati in input e output.

Ecco alcuni esempi di prezzo attuali per 1M di token sono:

  • GPT-4o-mini: Input $0.15, Output $0.6
  • Meta: Llama 3.1 70B Instruct: Input $0.4, Output $0.4
  • Meta: Llama 3.1 8B Instruct: Input $0.055, Output $0.055
  • OpenAI: GPT-4o (2024-08-06): Input $2.5, Output $10

Installazione

OpenWebUI può essere installato seguendo le istruzioni ufficiali nella documentazione, io utilizzerò Docker Compose.

Vi basterà creare un file docker-compose.yaml con il contenuto che trovate nel repository del progetto:

services:
  ollama:
    volumes:
      - ollama:/root/.ollama
    container_name: ollama
    pull_policy: always
    tty: true
    restart: unless-stopped
    image: ollama/ollama:${OLLAMA_DOCKER_TAG-latest}

  open-webui:
    build:
      context: .
      args:
        OLLAMA_BASE_URL: '/ollama'
      dockerfile: Dockerfile
    image: ghcr.io/open-webui/open-webui:${WEBUI_DOCKER_TAG-main}
    container_name: open-webui
    volumes:
      - open-webui:/app/backend/data
    depends_on:
      - ollama
    ports:
      - ${OPEN_WEBUI_PORT-3000}:8080
    environment:
      - 'OLLAMA_BASE_URL=http://ollama:11434'
      - 'WEBUI_SECRET_KEY='
    extra_hosts:
      - host.docker.internal:host-gateway
    restart: unless-stopped

volumes:
  ollama: {}
  open-webui: {}

Potete lanciare il container con sudo docker compose up -d e accedere all’interfaccia all’indirizzo http://localhost:3000.

Il primo account che viene creato sarà quello amministratore, tramite l’Admin Panel nella sezione “Connections” potrete scegliere se utilizzare un modello con Ollama o delle API.

Reverse proxy

In un ambiente di produzione è sempre consigliato servire le applicazioni con un web server come Nginx configurato come reverse proxy:

server {
    server_name openwebui.site.it;
    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_buffering off;
        proxy_set_header Origin '';
        proxy_set_header Referer '';
    }

    listen 80;
}

Text-to-speech in italiano

Una funzione interessante di OpenWebUI è quella che permette di comunicare con la propria voce con il modello linguistico.

L’output vocale deve essere gestito da un TTS server come openedai-speech che mette a disposizione delle API OpenAI audio/speech in locale da utilizzare con OpenWebUi

L’installazione è documentata nel repository ufficiale.

Per personalizzare le voci è possibile usare Piper samples, io utilizzerò “Paola”, per farlo è necessario scaricare il dataset da questo URL.

Copiate i file it_IT-paola-medium.onnx e it_IT-paola-medium.onnx.json nella cartella voices.

Modificate il file config/voice_to_speaker.yaml aggiungendo queste righe:

  paola:
    model: voices/it_IT-paola-medium.onnx
    speaker:

Ora dall’interfaccia di OpenWebUI, nella sesione Audio dell’Admin Panel impostate paola in TTS Voice.