Akinator come fa a leggerti nel pensiero (senza “AI”)?

Dimmi la verità, ti sarà successo almeno una volta di aprire Akinator, pensare a un personaggio a caso (che sia Ronaldo o “quel tizio del meme del 2013 che conosci solo tu”), rispondere a qualche domanda… e vederlo indovinare.

Non importa se è un attore famoso o un personaggio di nicchia. Non importa se cerchi di fregarlo. Alla fine ci arriva. E la domanda è sempre inevitabile “ma come ci riesce?”.

E se ci pensiamo un attimo esiste ancora prima che l’intelligenza artificiale diventasse la spezia universale da buttare su qualsiasi cosa. Il bello è che i meccanismi che usa sono… semplici. Nel senso più affascinante del termine: semplici, intuitivi e incredibilmente furbi.

Rimani fino alla fine, perché questa volta non solo ti spiego come funziona, ma sono andato oltre e ho creato un clone di Akinator accessibile a tutti, dato che il codice sorgente ufficiale non è pubblico.

Chi è Akinator (e perché ci azzecca così spesso)?

Akinator nasce nel 2007 come gioco web creato da Arnaud Castègre.

L’obiettivo è semplice: tu pensi a un personaggio, lui ti fa domande e prova a indovinare.

Quando inizi la partita lui non sa nulla su chi hai in testa, sorprendente no?

Eppure nel “suo mondo” ci sono milioni di personaggi possibili! Persone reali, personaggi di fantasia, animali, meme viventi… tutto.

È come cercare una persona specifica in una metropoli… se parti a caso senza alcuna strategia, non finisci più.

Quindi lui fa la cosa più intelligente possibile, non prova a indovinare subito. Prima restringe lo spazio delle possibilità con domande mirate.

Tipo:

  • “Il tuo personaggio è italiano?”
  • “È femmina?”
  • “È stato scoperto grazie a YouTube?”
  • “Ha più di 35 anni?”
  • “Ti conosce?”

Domande che sembrano banali… ma sono esattamente il tipo di banalità che taglia via enormi fette di mondo.

E inoltre non ti costringe a risposte “secche”, puoi dire anche “Non lo so”, “Probabilmente”, “Probabilmente no”.

Il cuore di Akinator: un database

Internamente Akinator si regge su due grandi componenti:

  1. Personaggi: milioni di entità (reali o fittizie)
  2. Domande: attributi associati ai personaggi (italiano? maschio? sopra i 35?)

La domanda che viene spontanea è: “Ok, ma quando rispondo… quella risposta come viene collegata ai personaggi? A tutti?”

Sì, l’idea è che per ogni coppia (personaggio C, domanda Q) esista una stima del tipo: P(risposta = Sì | C).

Cioè, quanto è probabile che, se il personaggio fosse davvero quel personaggio, tu risponderesti “Sì” a quella domanda.

E queste probabilità non sono “inventate”!

Vengono stimate con i dati storici del comportamento di milioni di utenti.

È qui che si capisce perché Akinator migliora nel tempo, ogni partita è un pezzettino di informazione che viene riusato.

Inizia la partita: probabilità ovunque (e poi si fa pulizia)

All’inizio della partita, ogni personaggio parte con una probabilità iniziale uniforme, oppure pesata dalla popolarità.

Poi tu rispondi alla prima domanda… e lui aggiorna le probabilità usando il Teorema di Bayes.

P(C|risposta)P(risposta|C)×P(C)P(C \mid \text{risposta}) \propto P(\text{risposta} \mid C) \times P(C)

“La probabilità posteriore di C è proporzionale alla likelihood di quella risposta dato C, moltiplicata per la probabilità prior.”

L’idea, detta in modo più semplice, è:

“Quanto è probabile che il personaggio sia C dopo aver visto la risposta dell’utente?”

E dipende da due fattori:

  • quanto era probabile prima: P(C)
  • quanto quella risposta è coerente con quel personaggio: P(risposta | C)

Se ad esempio, prima della domanda:

  • Ronaldo: abbastanza probabile
  • Musk: abbastanza probabile
  • Trump: quasi zero

Alla domanda: “È uno sportivo?”

  • Ronaldo: ha senso
  • Musk: meh
  • Trump: no

Quindi lui non sta cercando “la risposta giusta”. Sta cercando la combinazione più compatibile, aggiorna un ranking di possibilità.

E quando rispondi “No” a “È reale?” succede quello che vogliamo… i personaggi reali collassano verso zero e quelli fittizi ricevono un boost enorme.

In pratica, è un “Indovina Chi?”… portato all’estremo.

Ok, ma Akinator quale domanda sceglie?

Fin qui tutto chiaro, per ogni personaggio aggiorni la probabilità. Ma Akinator ha un problema enorme, ha un set gigantesco di domande possibili.

Come decide qual è la prossima domanda “migliore”?

La risposta è: cerca quella che riduce di più l’incertezza. E per misurare l’incertezza usa l’entropia di Shannon, H.

H(P)=cp(c)log2p(c)H(P) = -\sum_{c} p(c)\log_2 p(c)

Se le probabilità sono tutte simili, tipo:

  • Ronaldo 20%
  • Musk 20%
  • Harry Potter 20%
  • Iron Man 20%
  • Napoleone 20%

Akinator è confuso: entropia alta.

Se invece hai:

  • Ronaldo 90%
  • altri spiccioli

entropia bassa: è quasi certo.

A quel punto calcola il guadagno informativo (Information Gain, IG): cioè quanto quella domanda, in media, dovrebbe chiarirgli le idee.

IG(Q)=H(P)[p()H(P|)+p(No)H(P|No)]IG(Q) = H(P) – \left[p(\text{Sì}) \cdot H(P \mid \text{Sì}) + p(\text{No}) \cdot H(P \mid \text{No})\right]

Detta ancora più semplice, fa una simulazione mentale del tipo “Se mi risponde Sì o No… quanto cambia la distribuzione?”

Più la domanda “spacca” le probabilità separando bene i candidati, più IG sale. E di conseguenza diventa il candidato migliore come prossima domanda da fare!

Akinator Demo
🧞

Akinator Demo

Inferenza bayesiana · 64 personaggi · 80 domande

Domanda 0 / 20
0 / 20
La mia domanda
Premi un tasto per iniziare…
Probabilità personaggi

Prova a indovinare “Elio Magliari” con questa demo! (A me sono bastate 7 domande).

Elio Magliari Demo Akinator

Un modo per pensarla: quante domande “ideali” mancano?

Facciamo un esempio semplice in modo da rendere l’entropia super intuitiva:

  • Il valore H è sempre ≥ 0, perchè?
  • minimo H = 0 → nessuna incertezza (hai già vinto)
  • Massimo: dipende da quanti personaggi hai
  • Formula H max = log₂(numero di personaggi)

Immaginiamo di avere:

  • 2 personaggi → H max = 1
  • 4 personaggi → H max = 2
  • 8 personaggi → H max = 3
  • 100.000 personaggi → H ≈ 16.6 (perché log₂(100.000) ≈ 16.6)

Quindi H è quasi come dire: “Mi mancano circa X domande binarie perfette per chiudere la partita.”

E anche IG ha senso così:

  • IG è sempre ≥ 0
  • Se IG = 0 → domanda inutile (non cambia niente)
  • IG massimo teorico = H attuale → domanda perfetta (rara)

Ipotizziamo di avere H = 10

  • IG ≈ 0 quando la domanda è pessima, quindi non riduce praticamente l’incertezza.
  • Con una domanda decente si ottiene in genere IG ≈ 1 o 2, abbastanza per restringere il campo.
  • Le domande ottimali portano invece a IG ≈ 3 o 4, massimizzando il guadagno informativo.

Quindi, possiamo riassumere che H indica quanto sei confuso sul personaggio, mentre, IG indica quanto fare quella domanda chiarisce di più le idee sul personaggio.

Il flusso di una partita

Mettiamo tutto in fila, componendo così il suo ragionamento:

1

Inizializzazione

Tutti i personaggi ricevono probabilità uniforme (o basata su popolarità/frequenza storica).

2

Selezione domanda ottimale

Viene calcolato il guadagno informativo per ogni domanda disponibile. Si sceglie quella con IG massimo rispetto alla distribuzione attuale.

3

Aggiornamento bayesiano

La risposta dell’utente (Sì / No / Non lo so / Probabilmente) aggiorna le probabilità di ogni personaggio tramite la regola di Bayes.

4

Controllo soglia di confidenza

Se un personaggio supera una soglia (es. 85-95% di probabilità) e il sistema è “stabile” nelle ultime N domande, Akinator propone la sua ipotesi.

5

Apprendimento dal feedback

Se sbaglia, l’utente rivela il personaggio e il sistema aggiorna le stime nel database globale, migliorando le partite future.

Quando arriva al punto in cui “pensa di sapere”, tenta l’indovinata finale.

E se Akinator sbaglia? (È qui che diventa sempre più forte)

Se Akinator non indovina? Fa quello che fanno tutti (o quasi)… ammette l’ignoranza e ti chiede Chi avevi in mente?“.

Tu glielo dici, e lui aggiorna le stime nel database globale, le probabilità condizionate P(risposta | personaggio) vengono corrette/raffinate in base al feedback.

Se il personaggio non esiste, viene aggiunto (dagli utenti) e Akinator impara gradualemente le loro caratteristiche correggendole nel tempo.

Ecco perché il tempo, per lui, è tutto —> anni di partite = anni di dati.

Infatti, con selezione entropica “fatta bene”, bastano circa 20 domande binarie per navigare uno spazio da 100k elementi, perché log₂(100.000) ≈ 17.

Il mio “clone”

Quindi, abbiamo capito che fare le domande giuste vale più che avere risposte perfette e non semplicemente che “Akinator è furbo”.

Perché con poche domande e un database povero, puoi imitare la logica… ma non otterrai mai la stessa precisione.

Ed è esattamente quello che ho fatto io, visto che il codice sorgente di Akinator non è pubblico, ho scritto una versione che usa lo stesso principio, però con un database limitato (pochi personaggi, poche domande).

Serve proprio a questo, a capire “a vista”, leggendo il codice, come funziona il meccanismo… e volendo eseguirlo sul proprio computer anche offline.

Il gioco lo trovi nel repository nuovo di zecca.

Salutiii.

Signature

Condividi questo articolo

Elio Magliari

Ciao, sono Elio. Lavoro come ingegnere software.

Condivido quello che scopro sul mondo digitale, le domande che mi faccio e le idee che mi aiutano a capirlo e a raccontarlo in modo più chiaro.

Scopri di più

Categorie

Condividi questo articolo

Tutti gli Articoli

NEWSLETTER
Se questi articoli ti sono utili, puoi iscriverti alla newsletter.
Scrivo solo quando ho qualcosa che vale la pena condividere.

×