1. Panoramica
In questo codelab imparerai ad aggiungere potenti funzionalità di ricerca alla tua app utilizzando la ricerca di somiglianze vettoriali di Firestore. Implementerai una funzionalità di ricerca semantica per un'app per prendere 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.
Che 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 disporre di 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 alla console Firebase utilizzando il tuo Account Google.
- Fai clic sul pulsante per creare un nuovo progetto, quindi inserisci un nome per il progetto (ad esempio
Firestore Vector Search Codelab
).
- Fai clic su Continua.
- Se richiesto, leggi e accetta i termini di Firebase, quindi fai clic su Continua.
- (Facoltativo) Attiva l'assistenza AI nella console Firebase (denominata "Gemini in Firebase").
- Per questo codelab non hai bisogno di Google Analytics, quindi disattiva l'opzione Google Analytics.
- Fai clic su Crea progetto, attendi il provisioning del progetto, poi fai clic su Continua.
Per saperne di più sui progetti Firebase, consulta Informazioni sui progetti Firebase.
Esegui l'upgrade del piano tariffario Firebase
Per utilizzare le estensioni Firebase e i relativi servizi cloud sottostanti, il tuo progetto Firebase deve essere incluso nel piano tariffario con pagamento a consumo (Blaze), il che significa che è 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, verifica se hai diritto a un credito di 300$e a un account Cloud Billing 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:
- Nella console Firebase, seleziona l'opzione per eseguire 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.
Abilitare 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 facilmente agli utenti di accedere alla tua app.
- Cloud Firestore per salvare dati strutturati sul cloud e ricevere una notifica immediata quando i dati cambiano.
- 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 una procedura di onboarding semplice. Per saperne di più sull'autenticazione anonima (e su come eseguire l'upgrade a un account con nome), consulta la sezione Best practice per l'autenticazione anonima.
- Nel riquadro a sinistra della console Firebase, fai clic su Build > Authentication. Poi 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 andare direttamente alla scheda).
- Fai clic su Anonimo tra le opzioni del fornitore, imposta l'opzione su Attiva 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 Build 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 posizione vicina ai tuoi utenti. - Fai clic su Avvia in modalità di test. Leggi l'esclusione di responsabilità relativa alle 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 immagini.
Ecco come configurare Cloud Storage for Firebase nel tuo progetto Firebase:
- Nel riquadro a sinistra della console Firebase, espandi Build e seleziona Storage.
- Fai clic su Inizia.
- Seleziona una posizione per il bucket di archiviazione predefinito.
I bucket inUS-WEST1
,US-CENTRAL1
eUS-EAST1
possono usufruire del 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 l'esclusione di responsabilità relativa alle regole di sicurezza.
Più avanti in questo codelab, aggiungerai regole di sicurezza per proteggere i tuoi dati. Nondistribuire o esporre pubblicamente un'app senza aggiungere regole di sicurezza per il bucket Storage. - 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 lo collegherai al progetto Firebase che hai appena creato.
Scarica l'app di esempio
- Vai a 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 connettere più applicazioni client allo stesso progetto Firebase. Ad esempio, se crei un'app web o Android, devi connetterla allo stesso progetto Firebase.
Per saperne di più sui progetti Firebase, consulta Informazioni sui progetti Firebase.
- Nella console Firebase, vai alla pagina di panoramica del tuo progetto Firebase.
- Fai clic sull'icona iOS+ per aggiungere la tua app per iOS.
- Nella schermata Aggiungi Firebase alla tua app Apple, inserisci l'ID bundle del 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 Note del progetto Xcode. Un buon modo per farlo è trascinarlo sotto il file Assets.xcassets.
- Seleziona Copia elementi se necessario, assicurati che la destinazione Note sia selezionata in Aggiungi a destinazioni e fai clic su Fine.
- Nella console Firebase, ora puoi completare il resto della procedura di configurazione: l'esempio che hai scaricato all'inizio di questa sezione ha già installato l'SDK Firebase Apple e la configurazione di inizializzazione. Puoi completare la procedura facendo clic su Continua alla console.
Esegui l'app
Ora è il momento di provare l'app.
- Torna a Xcode ed esegui l'app sul simulatore iOS. Nel menu a discesa Run Destinations (Esegui destinazioni), seleziona prima uno dei simulatori iOS.
- Quindi, fai clic sul pulsante Esegui o premi ⌘ + R.
- Una volta avviata l'app sul simulatore, aggiungi un paio di note.
- Nella console Firebase, vai al browser dei dati 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 Vector Search con Firestore e la configurerai in base ai requisiti dell'app per prendere appunti 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 "Vector Search with Firestore extension" (Ricerca vettoriale con l'estensione Firestore).
Si aprirà la pagina dei dettagli dell'estensione, in cui potrai leggere ulteriori informazioni sull'estensione, su come funziona, sui servizi Firebase che richiede 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
- Esamina le API abilitate e le risorse create.
- Attiva i servizi richiesti.
- Una volta attivati 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: note
- Limite query predefinito: 3
- Nome campo di input: text
- Nome campo di output: embedding
- Nome campo stato:* *status*
- Incorpora documenti esistenti: Sì
- Aggiorna documenti esistenti: Sì
- Località della Funzione Cloud: us-central1
- Fai clic su Installa estensione per completare l'installazione.
L'operazione potrebbe richiedere alcuni minuti. Mentre aspetti il completamento dell'installazione, puoi passare alla sezione successiva del tutorial e leggere alcune informazioni di base sugli incorporamenti vettoriali.
5. Contesto
Mentre aspetti che l'installazione venga completata, ecco alcune informazioni di base su come funziona l'estensione Vector Search con Firestore.
Che cosa sono vettori, embedding e database vettoriali?
- I vettori sono oggetti matematici che rappresentano la grandezza e la direzione di una quantità. Possono essere utilizzati per rappresentare i dati in modo da facilitarne il confronto e la ricerca.
- Gli embedding 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 vettoriale?
La ricerca vettoriale funziona confrontando il vettore della query con tutti i vettori del database. I vettori più simili al vettore della query vengono restituiti come risultati di ricerca.
La somiglianza tra due vettori può essere misurata utilizzando una serie di metriche di distanza. La metrica di distanza più comune è la similarità del coseno, che misura l'angolo tra due vettori.
6. Prova l'estensione Ricerca vettoriale con Firestore
Prima di utilizzare l'estensione Vector Search con Firestore nell'app per iOS scaricata in precedenza in questo codelab, puoi provare l'estensione nella console Firebase.
Leggi la documentazione
Le estensioni Firebase includono la documentazione sul loro funzionamento.
- Al termine dell'installazione dell'estensione, fai clic sul pulsante Inizia.
- Consulta la scheda "Come funziona questa estensione", che spiega:
- come calcolare gli incorporamenti 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
. - Spiega anche come configurare una funzione di incorporamento personalizzata, utile se nessuno degli LLM supportati dall'estensione soddisfa i tuoi requisiti e vuoi utilizzare un LLM diverso per calcolare gli incorporamenti.
- come calcolare gli incorporamenti per i documenti aggiungendoli alla raccolta
- Fai clic sul link Dashboard Cloud Firestore per andare alla tua istanza Firestore
- Vai al documento
_firestore-vector-search/index
. Dovrebbe indicare che l'estensione ha terminato il calcolo degli incorporamenti per tutti i documenti di note che hai creato in un passaggio precedente di questo codelab. - Per verificarlo, apri uno dei documenti delle note e dovresti visualizzare 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 dei 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 testo segnaposto o di altro testo casuale. Scegli un articolo di notizie, 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 momento, dovresti vedere un nuovo campo
embedding
con un valore divector<768>
.
Eseguire una query
L'estensione Ricerca vettoriale con Firestore ha una piccola funzionalità che ti consente di eseguire query sull'indice dei documenti senza dover connettere un'app.
- Nella sezione Firestore della console Firebase, vai al documento
_firestore-vector-search/index
. - Fai clic su + Avvia raccolta
- Crea una nuova sottoraccolta denominata
queries
- Crea un nuovo documento e imposta il campo
query
su un testo presente in uno dei tuoi documenti. Questa funzionalità è più efficace per le query semantiche, ad esempio "Come posso mappare i documenti Firestore con Swift" (a condizione che almeno una delle note aggiunte contenga testo che tratta 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 per il tuo progetto seguendo questo link e poi selezionando il tuo progetto dall'elenco
- In Esplora log di Cloud, ora dovresti visualizzare un messaggio di errore che indica "FAILED_PRECONDITION: Missing vector index configuration. 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 questo 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 connettere la tua app mobile all'estensione Vector Search con Firestore e implementare una funzionalità di ricerca semantica che consentirà agli utenti di cercare le note utilizzando query in linguaggio naturale.
Connetti la funzione chiamabile per eseguire query
L'estensione Vector Search con Firestore include una funzione Cloud che puoi chiamare dalla tua app mobile per eseguire query sull'indice che hai creato in precedenza in questo codelab. In questo passaggio, stabilirai una connessione tra la tua app mobile e questa funzione chiamabile. L'SDK Swift di Firebase include API che semplificano la chiamata di funzioni remote.
- Torna a Xcode e assicurati di trovarti 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 Functions chiamabile, devi fornire il nome della funzione che vuoi chiamare.
- Vai alla console Firebase per il tuo progetto e apri la voce di menu Functions nella sezione Build.
- Vedrai un elenco delle funzioni installate dall'estensione.
- Cerca quello denominato
ext-firestore-vector-search-queryCallable
e copia il suo nome. - Incolla il nome nel codice. Ora dovrebbe essere visualizzato
private lazy var vectorSearchQueryCallable: Callable<String, String> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
Chiamare la funzione di query
- Trova il metodo
performQuery
- Chiama la funzione richiamabile richiamandola
let result = try await vectorSearchQueryCallable(searchTerm)
Poiché si tratta di una chiamata remota, potrebbe non andare a buon fine.
- Aggiungi una gestione degli errori di base per rilevare 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 [] } }
Connetti l'interfaccia utente
Per consentire agli utenti di cercare nelle note, implementa una barra di ricerca nella schermata dell'elenco delle note. Quando l'utente digita un termine di ricerca, devi richiamare il metodo performQuery
che hai implementato nel passaggio precedente. Grazie ai modificatori di visualizzazione searchable
e task
forniti da SwiftUI, questa operazione richiede 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")
- Poi, richiama la funzione di ricerca aggiungendo il seguente codice appena sotto:
.task(id: searchTerm, debounce: .milliseconds(800)) {
await notesRepository.semanticSearch(searchTerm: searchTerm)
}
Questo snippet di codice chiama in modo asincrono il metodo semanticSearch
. Fornendo un timeout di 800 millisecondi, indichi al modificatore di attività di eseguire il debounce dell'input dell'utente per 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 ora 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 su iOS Simulator.
- Dovresti vedere le stesse note che hai aggiunto nell'app in precedenza in questo codelab, nonché le note che hai aggiunto tramite la console Firebase
- Nella parte superiore dell'elenco Note dovrebbe essere presente un campo di ricerca.
- Digita un termine che compare in uno dei documenti che hai aggiunto. Anche in questo caso, funziona meglio per le query semantiche, ad esempio "Come posso chiamare le API Firebase asincrone da Swift" (a condizione che almeno una delle note aggiunte contenga testo che tratta questo argomento).
- Probabilmente ti aspetti di vedere il risultato di ricerca, ma invece la visualizzazione elenco è vuota e la console Xcode mostra un messaggio di errore: "The function was called with an invalid argument" (La funzione è stata chiamata con un argomento non valido)
Ciò significa che hai inviato i dati nel formato errato.
Analizzare il messaggio di errore
- Per scoprire cosa non va, vai alla console Firebase.
- Vai alla sezione Funzioni.
- Trova la funzione
ext-firestore-vector-search-queryCallable
, apri il menu extra facendo clic sui tre puntini verticali - Seleziona Visualizza log per andare 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 hai inviato i dati nel formato errato.
Utilizzare i tipi di dati corretti
Per scoprire in quale formato l'estensione prevede che siano i parametri, consulta la documentazione dell'estensione.
- Vai alla sezione Estensioni della console Firebase.
- Fai clic su Gestisci ->
- Nella sezione Come funziona questa 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 la chiamata 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 termini inclusi in una delle tue note.
- Ora dovresti vedere un elenco filtrato di note
Pre-filtrare i dati utente
Prima di metterti a ballare per festeggiare, c'è un problema con la versione attuale dell'app: il set di risultati contiene 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 nell'altro simulatore, vedrai solo i documenti che hai creato la prima volta.
Se esegui una ricerca, noterai che la chiamata a vectorSearchQueryCallable
restituisce ID documento che potrebbero appartenere all'altro utente. Per evitare questo problema, 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)
In questo modo, i dati vengono prefiltrati in base all'ID dell'utente che ha eseguito l'accesso. Come prevedibile, è necessario aggiornare l'indice Firestore.
Esegui questo comando dalla riga di comando per definire un nuovo indice Firestore che includa sia userId
sia gli incorporamenti 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
Una volta completata la 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 chiamabile dell'SDK Firestore.
Grazie alle 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.