Vai al contenuto
EDwareLab

Articoli · Applicazioni

Un Assistente AI per Ristoranti: come automatizzare gli ordini con Gemini e i QR Code

5 minuti di lettura

Nel mondo della ristorazione moderna, l'automazione dei processi può semplificare significativamente l'esperienza sia per i clienti che per il personale. In questo articolo, esploreremo come creare un semplice ma efficace sistema di ordinazione automatizzata utilizzando il modello Gemini di Google, Python e la generazione di codici QR.

Guarda il video su YouTube

L'idea del progetto

Il nostro sistema si presenta come un cameriere virtuale che:

  1. Conosce il menù del ristorante
  2. Interagisce con i clienti per prendere gli ordini
  3. Genera automaticamente un codice QR contenente l'ordine finale

Il tutto funziona da terminale Ubuntu, rendendolo perfetto come prototipo e per ristoranti che vogliono esaminare una soluzione spartana ma funzionale. Il prodotto finale andrebbe pensato nella forma di un'app per Android e per iOS.


Architettura del Sistema

Componenti Principali
A) Il Menù Digitale:
Un semplice file di testo ( menu.txt ) che contiene l'elenco dei piatti:
B) Generazione QR Code:
Utilizziamo qrencode, un tool da riga di comando disponibile su Ubuntu (sudo apt install qrencode)
C) Script ed LLM:
Uno script Python che utilizza il modello Gemini per simulare un cameriere esperto.

Implementazione del codice


import google.generativeai as genai
import subprocess
import os
from datetime import datetime

class RistoranteAI:
    def __init__(self, api_key, menu_file="menu.txt"):
        # Configurazione Gemini
        genai.configure(api_key=api_key)

			 	# Selezione del modello
        self.model = genai.GenerativeModel('gemini-2.0-flash-lite')

        # Caricamento menù
        self.menu = self.carica_menu(menu_file)

        # Prepara le istruzioni di sistema per includerle nella history
        # Il "system instruction" dedicato non è supportato dal vecchio pacchetto.
        self.system_instruction = f"""
        Sei un cameriere esperto e cordiale in un ristorante italiano.
        Il tuo compito è prendere gli ordini dai clienti basandoti esclusivamente
        su questo menù:

        {self.menu}

        Comportamenti da seguire:
        - Saluta cordialmente il cliente
        - Presenta il menù se richiesto
        - Aiuta nella scelta dei piatti
        - Conferma sempre l'ordine prima di concludere
        - Quando il cliente conferma l'ordine finale, includi nella risposta
          la stringa "##ORDINE CONCLUSO##" seguita dall'ordine dettagliato
        - Sii professionale ma amichevole
        """

    def carica_menu(self, file_path):
        """Carica il menù dal file di testo"""
        try:
            with open(file_path, 'r', encoding='utf-8') as file:
                return file.read()
        except FileNotFoundError:
            return "Menù non disponibile al momento."

    def genera_qr_code(self, ordine_text):
        """Genera un QR code contenente l'ordine"""
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        qr_filename = f"ordine_{timestamp}.png"

        try:
            # Comando per generare il QR code
            cmd = [
                'qrencode',
                '-o', qr_filename,
                '-s', '8',  # Dimensione
                ordine_text
            ]

            subprocess.run(cmd, check=True)
            print(f"\n🔲 QR Code generato: {qr_filename}")
            print("Il codice contiene l'ordine del cliente per la cucina.")

        except subprocess.CalledProcessError:
            print("❌ Errore nella generazione del QR code")
        except FileNotFoundError:
            print("❌ qrencode non installato. Installa con: sudo apt install qrencode")

    def avvia_conversazione(self):
        """Avvia la conversazione con il cliente"""
        print("=== RISTORANTE AI - SISTEMA ORDINAZIONE ===\n")
        print("Premi Ctrl+C per uscire\n")

        # Inizializza la chat includendo le istruzioni di sistema all'inizio della history.
        # Il parametro 'system_instruction' non è supportato dal vecchio pacchetto.
        chat = self.model.start_chat(history=[
            # Inseriamo il system_instruction come primo messaggio del "modello" o "utente"
            # per guidare il comportamento. Useremo "user" per coerenza con l'inizializzazione.
            {"role": "user", "parts": self.system_instruction},
            {"role": "model", "parts": "Benvenuto! Sono il tuo cameriere virtuale. In cosa posso aiutarti oggi?"}
        ])

        print(f"🤖 Cameriere: Benvenuto! Sono il tuo cameriere virtuale. In cosa posso aiutarti oggi?\n")

        try:
            while True:
                # Input del cliente
                user_input = input("👤 Cliente: ")

                # Invia messaggio a Gemini
                response = chat.send_message(user_input)
                ai_response = response.text

                print(f"\n🤖 Cameriere: {ai_response}\n")

                # Verifica se l'ordine è concluso
                if "##ORDINE CONCLUSO##" in ai_response:
                    self.gestisci_ordine_concluso(ai_response)
                    break

        except KeyboardInterrupt:
            print("\n\n👋 Arrivederci e grazie per aver utilizzato il nostro sistema!")

    def gestisci_ordine_concluso(self, response):
        """Gestisce la conclusione dell'ordine e genera il QR"""
        print("\n" + "="*50)
        print("🎉 ORDINE CONFERMATO!")
        print("="*50)

        # Estrae l'ordine dalla risposta
        ordine_dettagliato = response.split("##ORDINE CONCLUSO##")[1].strip()

        # Genera il QR code
        ordine_completo = f"ORDINE RISTORANTE\n{datetime.now().strftime('%d/%m/%Y %H:%M')}\n\n{ordine_dettagliato}"
        self.genera_qr_code(ordine_completo)

        print(f"\n📋 Dettagli ordine:\n{ordine_dettagliato}")
        print("\n✅ Sistema pronto per il prossimo cliente.")

# Utilizzo del sistema
if __name__ == "__main__":
    # Inserisci qui la tua API key di Gemini
    # Assicurati di non esporre la tua API key in un ambiente di produzione.
    # Considera di caricarla da variabili d'ambiente (es. os.getenv("GEMINI_API_KEY"))
    API_KEY = "*****************************"

    # Avvia il sistema
    ristorante = RistoranteAI(API_KEY)
    ristorante.avvia_conversazione()


File di configurazione del Menù

Il file menu.txt contiene l'elenco dei piatti e risiede nella stessa cartella del file python. Ecco un esempio:


Antipasti
Bruschette Miste - €7.00
Antipasto della Casa - €12.00

Primi Piatti
Spaghetti alla Carbonara - €12.00
Penne all'Arrabbiata - €10.00
Risotto ai Funghi Porcini - €14.00

Secondi Piatti
Bistecca alla Griglia - €18.00
Salmone in Crosta - €16.00
Pollo alle Erbe - €13.00

Dolci
Tiramisu della Casa - €6.00
Panna Cotta ai Frutti di Bosco - €5.50

Bevande
Acqua Naturale - €2.00
Vino della Casa (bicchiere) - €4.00
Caffè Espresso - €1.50

Come Funziona il Sistema

Flusso Operativo

  1. Avvio: Il sistema carica il menù e inizializza Gemini con le istruzioni del cameriere
  2. Accoglienza: L'AI saluta il cliente e si presenta
  3. Ordinazione: Il cliente può chiedere informazioni sui piatti e fare l'ordine
  4. Conferma: L'AI riepiloga l'ordine e chiede conferma
  5. Generazione QR: Quando il cliente conferma, viene generato automaticamente un QR code
  6. Completamento: Il sistema è pronto per il prossimo cliente

Il Trigger dell'Ordine

L'elemento chiave del sistema è il trigger ##ORDINE CONCLUSO## . Quando Gemini include questa stringa nella risposta, il sistema:

  • Estrae i dettagli dell'ordine
  • Genera un timestamp
  • Crea un QR code contenente tutte le informazioni
  • Salva il file PNG del QR code

Vantaggi del Sistema

Semplicità: Funziona da terminale, non richiede interfacce grafiche complesse
Flessibilità: Il menù può essere facilmente modificato editando il file di testo
Automazione: Il QR code viene generato automaticamente senza intervento umano
Tracciabilità: Ogni ordine ha un timestamp e un file QR univoco


Possibili Estensioni

Questo prototipo può essere esteso in vari modi:

  • Integrazione con sistemi di pagamento
  • Database per memorizzare ordini e statistiche
  • Interfaccia web per una migliore user experience
  • Integrazione con stampanti per ricevute automatiche
  • Sistema di notifiche per la cucina


Conclusioni

Questo progetto dimostra come l'intelligenza artificiale possa essere integrata efficacemente nei processi di ristorazione. Con poche righe di codice Python e gli strumenti giusti, è possibile creare un assistente digitale che migliora l'efficienza del servizio mantenendo un'interazione naturale e cordiale con i clienti.

Il sistema rappresenta un ottimo punto di partenza per ristoranti che vogliono sperimentare con l'automazione senza investimenti significativi in infrastrutture complesse.

Da dove si comincia

Un audit gratuito.
Non ore gratis.

Ci sediamo, guardo come lavorate, e vi lascio un documento con tre-cinque punti dove l'intelligenza artificiale vi farebbe risparmiare tempo davvero — e dove invece non serve a niente. Il documento è vostro: vale anche se poi non lavoriamo insieme.

Scrivimi per fissarlo

Come funziona

  1. Una call di un'oraMi raccontate come lavorate oggi, senza preparare niente.
  2. Guardo i vostri processiDove si perde tempo, dove si ricopiano dati a mano.
  3. Ricevete il documentoLe opportunità concrete, in ordine di convenienza.