Un motore di ricerca privato per il modello, senza account da intermediari
Un modello linguistico conosce il mondo fino al giorno in cui è finito il suo addestramento. Perché risponda a domande sull'oggi, deve saper cercare. Per questo abbiamo costruito un motore di ricerca tutto nostro, sulla stessa macchina — e già che c'eravamo abbiamo misurato quanto lavoro serve perché i risultati arrivino nella lingua di chi cerca.
Come fa il modello a cercare
Contrariamente alle apparenze, il modello non ha accesso a internet. Le cose funzionano diversamente, e vale la pena capirlo, perché tocca la privacy dell’intera soluzione.
Il modello riceve in partenza l’informazione che esistono due strumenti: uno restituisce la lista dei risultati di ricerca, l’altro scarica il contenuto della pagina indicata. Quando ritiene che la domanda richieda dati freschi, non esegue nulla da solo — scrive una richiesta: «chiama la ricerca con la frase X». Il programma dal lato dell’utente esegue la richiesta, interroga il nostro motore e incolla i risultati di nuovo nella conversazione. Il modello li legge come testo normale e formula la risposta.
Tutto il traffico passa quindi per la nostra macchina. Nessun fornitore di modelli vede né la domanda né che cosa si è fatto con la risposta.
Che cosa c’è sotto
Lo strato che cerca è SearXNG — un metamotore open source che facciamo girare da noi. Interroga una fonte esterna (nel nostro caso l’API ufficiale del motore Brave, con una chiave) e restituisce una lista unificata di risultati. Il fornitore esterno vede la richiesta, ma non vede né chi chiede, né perché, né che cosa è successo prima nella conversazione. Non c’è account utente, né cronologia, né profilazione.
Una trappola di configurazione che merita nota, perché ci è costata un po’ di tempo: abbiamo scelto il motore che usa l’API ufficiale, non la lettura automatica della pagina dei risultati. Il secondo metodo è a volte il default in installazioni simili e si becca un blocco dopo una quindicina di richieste.
I risultati nella tua lingua richiedono due impostazioni, non una
Per default un’installazione così risponde con risultati in inglese, anche a una domanda in un’altra lingua. L’abbiamo misurato sul nostro polacco, con una frase tecnica, contando i risultati in polacco tra i primi venti:
| Impostazione della lingua | Risultati in polacco su 20 |
|---|---|
| nessuna / «tutte» | 0 |
| solo il codice lingua («pl») | 10 |
| il locale completo («pl-PL») | 17 |
La differenza tra «pl» e «pl-PL» non è cosmetica: sono sette risultati su venti — e per l’italiano vale la stessa regola, «it» contro «it-IT». Da impostare sono due strati: il valore predefinito del server e i parametri passati al motore stesso. Cambiarne uno solo non basta, perché l’altro viene sovrascritto dal client.
Il modello può sovrascrivere tutto questo per una singola richiesta — e lo fa con giudizio, passando all’inglese quando cerca documentazione tecnica.
Il risultato predefinito era troppo povero — abbiamo migliorato il motore
La versione standard del motore salva di ogni risultato soltanto una breve descrizione — due frasi, spesso tagliate a metà della frase chiave. Eppure il fornitore restituisce insieme frammenti aggiuntivi dal contenuto della pagina, che nessuno aveva chiesto e che venivano semplicemente buttati via.
Abbiamo sostituito quel pezzo con una versione nostra che incolla questi frammenti e li allega al risultato. L’effetto: circa 4,7 volte più testo per risultato. Il modello riceve contenuto vero invece di un’anteprima, quindi più spesso risponde subito, senza scaricare pagine intere.
La seconda modifica è piccola ma risolve un problema frequente: davanti a ogni risultato aggiungiamo la data di pubblicazione. Senza, il modello non ha modo di distinguere una guida di cinque anni fa da una di quest’anno, e confondeva regolarmente le versioni dei programmi.
Quando il modello scende più in profondità
Nell’istruzione di sistema abbiamo una regola: se i frammenti sono tagliati, contraddittori o non contengono il dato cercato — scarica la pagina intera. Risolve le situazioni in cui la sola lista dei risultati finge di essere la risposta ma non la contiene.
Un dettaglio che vale la pena imitare: la regola la descriviamo con il ruolo dello strumento, non con il suo nome («accetta un indirizzo, restituisce il contenuto»). Programmi diversi chiamano questo strumento in modi diversi, e un’istruzione aggrappata al nome smette di funzionare al cambio di client.
Quanto costa in contesto
I dati freschi non sono gratis — occupano spazio nella memoria della conversazione:
- una ricerca con i frammenti completi: circa 4 mila token,
- lo scaricamento di una pagina intera: anche una quindicina di migliaia.
Con un contesto da 262 mila token è una situazione comoda: una quindicina di ricerche in una conversazione non si fa notare. Su una macchina con poco contesto il gioco finirebbe proprio qui — ed è uno dei motivi per cui valeva la pena battersi per la capienza del contesto.
Che cosa dà in pratica
Tre cose, in ordine di importanza per l’utente domestico:
Attualità. Il modello smette di inventare davanti a domande su cose nuove, perché ha come verificare.
Privacy. Le ricerche non costruiscono un profilo pubblicitario né una cronologia legata a un account. Da casa esce solo la frase di ricerca, senza il contesto della conversazione.
Indipendenza. Il motore è sostituibile — la fonte si può cambiare senza toccare i modelli e senza aspettare che il fornitore cambi idea su listino o condizioni.
Configurazione nostra, sulla stessa macchina dei modelli. Le misurazioni sulla lingua dei risultati sono state fatte sulla nostra istanza.