1. Panoramica
In questo codelab imparerai ad aggiungere potenti funzionalità di ricerca alla tua app utilizzando la ricerca di somiglianza di vettori di Firestore. Implementerai una funzionalità di ricerca semantica per un'app di appunti scritta in Swift e SwiftUI.
Cosa imparerai a fare
- Come installare l'estensione Ricerca vettoriale con Firestore per calcolare gli embedding vettoriali.
- Come chiamare Firebase Cloud Functions da un'applicazione Swift.
- Come prefiltrare i dati in base all'utente che ha eseguito l'accesso.
Cosa ti serve
- Xcode 15.3
- Il codice campione del codelab. Lo scaricherai in un passaggio successivo del codelab.
2. Crea e configura un progetto Firebase
Per utilizzare l'estensione Firebase Vector Search, devi avere un progetto Firebase. In questa parte del codelab, creerai un nuovo progetto Firebase e attiverai i servizi richiesti, come Cloud Firestore e Firebase Authentication.
Crea un progetto Firebase
- Accedi a Firebase
- Nella console Firebase, fai clic su Aggiungi progetto, quindi assegna al progetto il nome Firestore Vector Search Lab
- Fai clic sulle opzioni di creazione del progetto. Accetta i Termini di Firebase, se richiesto.
- Nella schermata di Google Analytics, deseleziona la casella Attiva Google Analytics per questo progetto, perché non utilizzerai Analytics per questa app.
- Infine, fai clic su Crea progetto.
Per saperne di più sui progetti Firebase, consulta Informazioni sui progetti Firebase.
Eseguire l'upgrade del piano tariffario di Firebase
Per utilizzare Firebase Extensions e i relativi servizi cloud sottostanti, il progetto Firebase deve utilizzare il piano tariffario Blaze con pagamento a consumo, il che significa che deve essere collegato a un account di fatturazione Cloud.
- Un account di fatturazione Cloud richiede un metodo di pagamento, ad esempio una carta di credito.
- Se non hai mai utilizzato Firebase e Google Cloud, controlla se hai diritto a un credito di 300$e a un account di fatturazione Cloud di prova senza costi.
- Se stai svolgendo questo codelab nell'ambito di un evento, chiedi all'organizzatore se sono disponibili crediti Cloud.
Per eseguire l'upgrade del progetto al piano Blaze, segui questi passaggi:
- Nella console Firebase, seleziona l'upgrade del piano.
- Seleziona il piano Blaze. Segui le istruzioni sullo schermo per collegare un account di fatturazione Cloud al tuo progetto.
Se hai dovuto creare un account di fatturazione Cloud nell'ambito di questo upgrade, potresti dover tornare al flusso di upgrade nella console Firebase per completarlo.
Attivare e configurare i prodotti Firebase nella console
L'app che stai creando utilizza diversi prodotti Firebase disponibili per le app Apple:
- Firebase Authentication per consentire agli utenti di accedere facilmente alla tua app.
- Cloud Firestore per salvare i dati strutturati sul cloud e ricevere notifiche immediate quando i dati subiscono modifiche.
- Regole di sicurezza Firebase per proteggere il tuo database.
Alcuni di questi prodotti richiedono una configurazione speciale o devono essere attivati utilizzando la console Firebase.
Attivare l'autenticazione anonima per Firebase Authentication
Questa applicazione utilizza l'autenticazione anonima per consentire agli utenti di iniziare a utilizzare l'app senza dover prima creare un account. Ciò si traduce in un processo di onboarding a basso attrito. Per scoprire di più sull'autenticazione anonima (e su come eseguire l'upgrade a un account denominato), consulta le Best practice per l'autenticazione anonima.
- Nel riquadro a sinistra della console Firebase, fai clic su Build > Autenticazione. Quindi, fai clic su Inizia.
- Ora ti trovi nella dashboard Autenticazione, dove puoi visualizzare gli utenti registrati, configurare i provider di accesso e gestire le impostazioni.
- Seleziona la scheda Metodo di accesso (o fai clic qui per passare direttamente alla scheda).
- Fai clic su Anonimo dalle opzioni del provider, imposta l'opzione su Abilita e poi fai clic su Salva.
Configura Cloud Firestore
Questa applicazione Swift utilizza Cloud Firestore per salvare le note.
Ecco come configurare Cloud Firestore nel tuo progetto Firebase:
- Nel riquadro a sinistra della console Firebase, espandi Crea e seleziona Database Firestore.
- Fai clic su Crea database.
- Lascia l'ID database impostato su
(default)
. - Seleziona una posizione per il database, poi fai clic su Avanti.
Per un'app reale, devi scegliere una località vicina agli utenti. - Fai clic su Avvia in modalità di test. Leggi il disclaimer sulle regole di sicurezza.
Più avanti in questo codelab aggiungerai Regole di sicurezza per proteggere i tuoi dati. Non distribuire o esporre pubblicamente un'app senza aggiungere regole di sicurezza per il tuo database. - Fai clic su Crea.
Configurare Cloud Storage for Firebase
L'app web utilizza Cloud Storage per Firebase per archiviare, caricare e condividere le foto.
Ecco come configurare Cloud Storage for Firebase nel tuo progetto Firebase:
- Nel riquadro a sinistra della console Firebase, espandi Build e seleziona Archiviazione.
- Fai clic su Inizia.
- Seleziona una località per il bucket di archiviazione predefinito.
I bucket inUS-WEST1
,US-CENTRAL1
eUS-EAST1
possono sfruttare il livello "Sempre senza costi" per Google Cloud Storage. I bucket in tutte le altre località seguono i prezzi e l'utilizzo di Google Cloud Storage. - Fai clic su Avvia in modalità di test. Leggi il disclaimer relativo alle regole di sicurezza.
Più avanti in questo codelab, aggiungerai regole di sicurezza per proteggere i tuoi dati. Non distribuire o esporre un'app pubblicamente senza aggiungere regole di sicurezza per il bucket di archiviazione. - Fai clic su Crea.
3. Collegare l'app mobile
In questa sezione del codelab, scaricherai il codice sorgente di una semplice app per prendere appunti e la collegherai al progetto Firebase che hai appena creato.
Scarica l'app di esempio
- Vai alla pagina https://github.com/FirebaseExtended/codelab-firestore-vectorsearch-ios e clona il repository sulla tua macchina locale.
- Apri il progetto Notes.xcodeproj in Xcode
Collega l'app al tuo progetto Firebase
Affinché la tua app possa accedere ai servizi Firebase, devi configurarla nella console Firebase. Puoi collegare più applicazioni client allo stesso progetto Firebase. Ad esempio, se crei un'app per Android o web, devi collegarle allo stesso progetto Firebase.
Per saperne di più sui progetti Firebase, consulta Informazioni sui progetti Firebase.
- Nella Console Firebase, vai alla pagina Panoramica del tuo progetto Firebase.
- Fai clic sull'icona iOS+ per aggiungere la tua app per iOS.
- Nella schermata Aggiungi Firebase all'app Apple, inserisci l'ID pacchetto dal progetto Xcode (com.google.firebase.codelab.Notes).
- Se vuoi, puoi inserire un nickname per l'app (Note per iOS).
- Fai clic su Registra app per passare al passaggio successivo.
- Scarica il file GoogleServices-Info.plist.
- Trascina GoogleServices-Info.plist nella cartella Notes del progetto Xcode. Un buon modo per farlo è inserirlo sotto il file Assets.xcassets.
- Seleziona Copia elementi se necessario, assicurati che il target Note sia selezionato in Aggiungi a target e fai clic su Fine.
- Nella console Firebase ora puoi fare clic sul resto del processo di configurazione: nell'esempio che hai scaricato all'inizio di questa sezione, l'SDK Firebase Apple è già installato e l'inizializzazione è stata configurata. Puoi completare la procedura facendo clic su Vai alla console.
Esegui l'app
È arrivato il momento di provare a usare l'app.
- Torna in Xcode ed esegui l'app sul simulatore iOS. Nel menu a discesa Destinazioni di esecuzione, seleziona innanzitutto uno dei simulatori iOS.
- Poi fai clic sul pulsante Esegui o premi ⌘ + R.
- Una volta che l'app è stata avviata correttamente sul Simulatore, aggiungi un paio di note.
- Nella Console Firebase, vai al browser dei dati di Firestore per visualizzare i nuovi documenti creati man mano che aggiungi nuove note nell'app.
4. Installa l'estensione Vector Search con Firestore
In questa parte del codelab, installerai l'estensione Ricerca vettoriale con Firestore e la configurerai in base ai requisiti dell'app di annotazione su cui stai lavorando.
Avvia l'installazione dell'estensione
- Sempre nella sezione Firestore, fai clic sulla scheda Estensioni.
- Fai clic su Esplora l'hub di Extensions.
- Digita "vettore".
- Fai clic su "Ricerca vettoriale con estensione Firestore". Si aprirà la pagina dei dettagli dell'estensione, in cui puoi scoprire di più sull'estensione, sul suo funzionamento, sui servizi Firebase richiesti e su come configurarla.
- Fai clic su Installa nella console Firebase.
- Viene visualizzato un elenco di tutti i tuoi progetti.
- Scegli il progetto che hai creato nel primo passaggio di questo codelab.
Configurare l'estensione
- Rivedi le API abilitate e le risorse create.
- Attiva i servizi richiesti.
- Una volta abilitati tutti i servizi, fai clic su Avanti.
- Esamina l'accesso concesso a questa estensione.
- Configura l'estensione:
- Seleziona Vertex AI come LLM
- Percorso della raccolta: notes
- Limite di query predefinito: 3
- Nome campo di immissione: text
- Nome del campo di output: embedding
- Nome del campo stato:* *status*
- Incorpora i documenti esistenti: Sì
- Aggiorna i documenti esistenti: Sì
- Località della Funzione Cloud: us-central1
- Fai clic su Installa estensione per terminare l'installazione.
L'operazione potrebbe richiedere alcuni minuti. Mentre aspetti il completamento dell'installazione, non esitare a passare alla sezione successiva del tutorial e a leggere alcune informazioni di base sugli incorporamenti vettoriali.
5. Contesto
Mentre attendi il completamento dell'installazione, ecco alcune informazioni di base sul funzionamento dell'estensione Ricerca vettoriale con Firestore.
Che cosa sono i vettori, gli embedding e i database vettoriali?
- I vettori sono oggetti matematici che rappresentano l'intensità e la direzione di una quantità. Possono essere utilizzati per rappresentare i dati in modo da semplificare il confronto e la ricerca.
- Le rappresentazioni distribuite sono vettori che rappresentano il significato di una parola o una frase. Vengono creati addestrando una rete neurale su un ampio corpus di testo e apprendendo le relazioni tra le parole.
- I database vettoriali sono database ottimizzati per l'archiviazione e la ricerca di dati vettoriali. Consentono una ricerca efficiente del vicino più prossimo, ovvero il processo di ricerca dei vettori più simili a un determinato vettore di query.
Come funziona la ricerca di vettori?
La ricerca vettoriale funziona confrontando il vettore di query con tutti i vettori del database. I vettori più simili al vettore di query vengono restituiti come risultati della ricerca.
La somiglianza tra due vettori può essere misurata utilizzando una varietà di metriche di distanza. La metrica di distanza più comune è la somiglianza del coseno, che misura l'angolo tra due vettori.
6. Prova l'estensione Vector Search with Firestore
Prima di utilizzare l'estensione Ricerca di vettori con Firestore nell'app per iOS scaricata in precedenza in questo codelab, puoi provarla nella console Firebase.
Leggi la documentazione
Le Estensioni Firebase includono la documentazione relativa al loro funzionamento.
- Al termine dell'installazione dell'estensione, fai clic sul pulsante Inizia.
- Consulta la scheda "Modalità di funzionamento dell'estensione", che spiega:
- come calcolare gli embedding per i documenti aggiungendoli alla raccolta
notes
, - come eseguire query sull'indice chiamando la funzione richiamabile
ext-firestore-vector-search-queryCallable
, - o come eseguire query sull'indice aggiungendo un documento di query alla raccolta
_firestore-vector-search/index/queries
. - Inoltre, spiega come configurare una funzione di embedding personalizzata, utile se nessuno degli LLM supportati dall'estensione soddisfa i tuoi requisiti e vuoi utilizzare un LLM diverso per calcolare gli embedding.
- come calcolare gli embedding per i documenti aggiungendoli alla raccolta
- Fai clic sul link Dashboard di Cloud Firestore per accedere all'istanza Firestore
- Vai al documento
_firestore-vector-search/index
. Dovrebbe mostrare che l'estensione ha terminato il calcolo degli incorporamenti per tutti i documenti di note che hai creato in un passaggio precedente in questo codelab. - Per verificare, apri uno dei documenti delle note e dovresti vedere un campo aggiuntivo denominato
embedding
di tipovector<768>
, nonché un campostatus
.
Crea un documento di esempio
Puoi creare un nuovo documento nella Console Firebase per vedere l'estensione in azione.
- Sempre nel browser di dati Firestore, vai alla raccolta
notes
e fai clic su + Aggiungi documento nella colonna centrale. - Fai clic su ID automatico per generare un nuovo ID documento univoco.
- Aggiungi un campo denominato
text
di tipo stringa e incolla del testo nel campo valore. È importante che non si tratti di lorem ipsum o di un altro testo casuale. Scegli un articolo, ad esempio. - Fai clic su Salva.
- Nota come l'estensione aggiunge un campo di stato per indicare che sta elaborando i dati.
- Dopo un breve istante, dovresti vedere un nuovo campo
embedding
con un valorevector<768>
.
Esegui una query
L'estensione Ricerca vettoriale con Firestore ha una piccola funzionalità utile che ti consente di eseguire query sull'indice dei documenti senza dover collegare un'app.
- Nella sezione Firestore della console Firebase, vai al documento
_firestore-vector-search/index
- Fai clic su + Inizia raccolta.
- Crea una nuova raccolta secondaria denominata
queries
- Crea un nuovo documento e imposta il campo
query
su un testo che si trova in uno dei tuoi documenti. Questa opzione è più adatta per le query semantiche, come "Come posso mappare i documenti Firestore con Swift" (a condizione che almeno una delle note che hai aggiunto contenga un testo che illustra questo argomento). - Potresti visualizzare un errore nello stato
- Ciò è dovuto a un indice mancante. Per configurare la configurazione dell'indice mancante, vai alla console Google Cloud del tuo progetto seguendo questo link e selezionando il progetto dall'elenco
- In Cloud Log Explorer, ora dovresti visualizzare il messaggio di errore "FAILED_PRECONDITION: configurazione dell'indice vettoriale mancante. Crea l'indice richiesto con il seguente comando gcloud: ..."
- Il messaggio di errore contiene anche un comando
gcloud
che devi eseguire per configurare l'indice mancante. - Esegui il seguente comando dalla riga di comando. Se non hai installato l'interfaccia a riga di comando
gcloud
sulla tua macchina, segui le istruzioni riportate qui per installarla. La creazione dell'indice richiede alcuni minuti. Puoi controllare lo stato di avanzamento nella scheda Indici della sezione Firestore della Console Firebase.gcloud alpha firestore indexes composite create --project=INSERT-YOUR=PROJECT-ID-HERE --collection-group=notes --query-scope=COLLECTION --field-config=vector-config='{"dimension":"768","flat": "{}"}',field-path=embedding
- Una volta configurato l'indice, puoi creare un nuovo documento di query.
- Ora dovresti vedere un elenco di ID documento corrispondenti nel campo dei risultati
- Copia uno di questi ID e torna alla raccolta
notes
. - Utilizza ⌘ + F per cercare l'ID documento che hai copiato: questo documento è quello che corrisponde meglio alla tua query.
7. Implementare la ricerca semantica
È finalmente arrivato il momento di collegare la tua app mobile all'estensione Ricerca vettoriale con Firestore e di implementare una funzionalità di ricerca semantica che consenta agli utenti di cercare nelle loro note utilizzando query in linguaggio naturale.
Collega la funzione richiamabile per eseguire query
L'estensione Ricerca vettoriale con Firestore include una funzione Cloud che puoi chiamare dalla tua app mobile per eseguire query sull'indice creato in precedenza in questo codelab. In questo passaggio, stabilirai una connessione tra la tua app mobile e questa funzione richiamabile. L'SDK Swift di Firebase include API che semplificano le chiamate alle funzioni remote.
- Torna a Xcode e assicurati di essere nel progetto che hai clonato in un passaggio precedente di questo codelab.
- Apri il file
NotesRepository.swift
. - Trova la riga contenente
private lazy var vectorSearchQueryCallable: Callable
= functions.httpsCallable("")
Per richiamare una funzione Cloud invocabile, devi fornire il nome della funzione che vuoi chiamare.
- Vai alla console Firebase del tuo progetto e apri l'elemento di menu Funzioni nella sezione Compilazione.
- Viene visualizzato un elenco delle funzioni installate dall'estensione.
- Cerca quello denominato
ext-firestore-vector-search-queryCallable
e copia il nome. - Incolla il nome nel codice. Ora dovrebbe essere visualizzato
private lazy var vectorSearchQueryCallable: Callable<String, String> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
Chiama la funzione di query
- Trova il metodo
performQuery
- Chiama la funzione richiamabile richiamando
let result = try await vectorSearchQueryCallable(searchTerm)
Poiché si tratta di una chiamata remota, potrebbe non riuscire.
- Aggiungi alcune funzionalità di base per la gestione degli errori per individuare eventuali errori e registrarli nella console di Xcode.
private func performQuery(searchTerm: String) async -> [String] { do { let result = try await vectorSearchQueryCallable(searchTerm) return [result] } catch { print(error.localizedDescription) return [] } }
Collega l'interfaccia utente
Per consentire agli utenti di cercare le note, implementerai una barra di ricerca nella schermata dell'elenco delle note. Quando l'utente digita un termine di ricerca, devi invocare il metodo performQuery
implementato nel passaggio precedente. Grazie ai modificatori di visualizzazione searchable
e task
forniti da SwiftUI, sono necessarie solo un paio di righe di codice.
- Innanzitutto, apri
NotesListScreen.swift
- Per aggiungere una casella di ricerca alla visualizzazione elenco, aggiungi il modificatore di visualizzazione
.searchable(text: $searchTerm, prompt: "Search")
appena sopra la riga.navigationTitle("Notes")
- Quindi, invoca la funzione di ricerca aggiungendo il seguente codice subito sotto:
.task(id: searchTerm, debounce: .milliseconds(800)) {
await notesRepository.semanticSearch(searchTerm: searchTerm)
}
Questo snippet di codice chiama il metodo semanticSearch
in modo asincrono. Fornendo un timeout di 800 millisecondi, indichi al modificatore dell'attività di eliminare il ritardo dell'input dell'utente di 0,8 secondi. Ciò significa che semanticSearch
verrà chiamato solo quando l'utente interrompe la digitazione per più di 0,8 secondi.
Il codice dovrebbe avere il seguente aspetto:
...
List(repository.notes) { note in
NavigationLink(value: note) {
NoteRowView(note: note)
}
.swipeActions {
Button(role: .destructive, action: { deleteNote(note: note) }) {
Label("Delete", systemImage: "trash")
}
}
}
.searchable(text: $searchTerm, prompt: "Search")
.task(id: searchTerm, debounce: .milliseconds(800)) {
await notesRepository.semanticSearch(searchTerm: searchTerm)
}
.navigationTitle("Notes")
...
Esegui l'app
- Premi ⌘ + R (o fai clic sul pulsante Esegui) per avviare l'app sul simulatore di iOS
- Dovresti vedere le stesse note che hai aggiunto nell'app in precedenza in questo codelab, nonché le note aggiunte tramite la console Firebase
- Nella parte superiore dell'elenco Note dovresti vedere un campo di ricerca.
- Digita un termine che appare in uno dei documenti che hai aggiunto. Anche in questo caso, funziona meglio per le query semantiche, ad esempio "Come faccio a chiamare le API Firebase asincrone da Swift" (a condizione che almeno una delle note aggiunte contenga del testo che tratta questo argomento).
- Probabilmente ti aspetti di vedere il risultato di ricerca, ma la visualizzazione elenco è vuota e la console Xcode mostra un messaggio di errore: "La funzione è stata chiamata con un argomento non valido"
Ciò significa che hai inviato i dati nel formato sbagliato.
Analizza il messaggio di errore
- Per individuare il problema, vai alla console Firebase
- Vai alla sezione Funzioni
- Individua la funzione
ext-firestore-vector-search-queryCallable
e apri il menu extra facendo clic sui tre puntini verticali. - Seleziona Visualizza log per accedere a Esplora log
- Dovresti visualizzare un errore
Unhandled error ZodError: [
{
"code": "invalid_type",
"expected": "object",
"received": "string",
"path": [],
"message": "Expected object, received string"
}
]
Ciò significa che i dati sono stati inviati nel formato sbagliato.
Utilizza i tipi di dati corretti
Per scoprire in quale formato l'estensione si aspetta i parametri, consulta la documentazione dell'estensione.
- Vai alla sezione Estensioni della Console Firebase
- Fai clic su Gestisci ->
- Nella sezione Modalità di funzionamento dell'estensione troverai una specifica dei parametri di input e output.
- Torna a Xcode e vai a
NotesRepository.swift
- Aggiungi il seguente codice all'inizio del file:
private struct QueryRequest: Codable { var query: String var limit: Int? var prefilters: [QueryFilter]? } private struct QueryFilter: Codable { var field: String var `operator`: String var value: String } private struct QueryResponse: Codable { var ids: [String] }
QueryRequest
corrisponde alla struttura del parametro di input previsto dall'estensione, in base alla documentazione dell'estensione. Contiene anche un attributoprefilter
nidificato che ti servirà in seguito.QueryResponse
corrisponde alla struttura della risposta dell'estensione. - Trova la specifica della funzione chiamabile e aggiorna i tipi di input e output
private lazy var vectorSearchQueryCallable: Callable<QueryRequest, QueryResponse> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
- Aggiorna l'invocazione della funzione richiamabile in
performQuery
private func performQuery(searchTerm: String) async -> [String] { do { let queryRequest = QueryRequest(query: searchTerm, limit: 2) let result = try await vectorSearchQueryCallable(queryRequest) print(result.ids) return result.ids } catch { print(error.localizedDescription) return [] } }
Esegui di nuovo l'app
- Esegui di nuovo l'app
- Digita una query di ricerca che contenga i termini inclusi in una delle tue note
- Ora dovresti vedere un elenco filtrato di note
Prefiltrare i dati utente
Prima di ballare per festeggiare, si è verificato un problema con la versione attuale dell'app: il set di risultati contiene i dati di tutti gli utenti.
Puoi verificarlo eseguendo l'app su un altro simulatore e aggiungendo altri documenti. I nuovi documenti verranno visualizzati solo in quel simulatore. Se esegui di nuovo l'app sull'altro simulatore, vedrai solo i documenti creati la prima volta.
Se esegui una ricerca, noterai che la chiamata a vectorSearchQueryCallable
restituisce ID documento che potrebbero appartenere all'altro utente. Per evitare che ciò accada, dobbiamo utilizzare un prefiltro.
In performQuery
, aggiorna il codice come segue:
let prefilters: [QueryFilter] = if let uid = user?.uid {
[QueryFilter(field: "userId", operator: "==", value: uid)]
}
else {
[]
}
let queryRequest = QueryRequest(query: searchTerm,
limit: 2,
prefilters: prefilters)
I dati verranno prefiltrati in base all'ID dell'utente che ha eseguito l'accesso. Come è facile immaginare, questa operazione richiede l'aggiornamento dell'indice Firestore.
Esegui il seguente comando dalla riga di comando per definire un nuovo indice Firestore che includa sia gli embedding userId
sia quelli vettoriali nel campo embedding
.
gcloud alpha firestore indexes composite create --project=INSERT-YOUR-PROJECT-ID-HERE --collection-group=notes --query-scope=COLLECTION --field-config=order=ASCENDING,field-path=userId --field-config=vector-config='{"dimension":"768","flat": "{}"}',field-path=embedding
Al termine della creazione dell'indice, esegui di nuovo l'app per verificare che funzioni come previsto.
8. Complimenti
Congratulazioni per aver completato questo codelab.
In questo codelab hai imparato a:
- Configura un database Cloud Firestore con la ricerca semantica abilitata.
- Crea una semplice app SwiftUI per interagire con il database.
- Implementa una barra di ricerca utilizzando il modificatore di visualizzazione ricercabile e il modificatore di attività di SwiftUI.
- Chiama una funzione Cloud per eseguire una ricerca semantica nel database utilizzando l'interfaccia Callable dell'SDK Firestore.
Con le conoscenze acquisite in questo codelab, ora puoi creare applicazioni potenti che sfruttano le funzionalità di ricerca semantica di Cloud Firestore per offrire agli utenti un'esperienza di ricerca più intuitiva ed efficiente.
Per scoprire di più sul nuovo campo vettoriale di Firestore e su come calcolare gli embedding vettoriali, consulta la documentazione.