1. Übersicht
In diesem Codelab erfahren Sie, wie Sie Ihrer App mithilfe der Firestore-Vektorähnlichkeitssuche leistungsstarke Suchfunktionen hinzufügen. Sie implementieren eine semantische Suchfunktion für eine Notiz-App, die in Swift und SwiftUI geschrieben ist.
Lerninhalte
- Informationen zum Installieren der Erweiterung „Vector Search with Firestore“ zum Berechnen von Vektoreinbettungen.
- Firebase Cloud Functions aus einer Swift-Anwendung aufrufen
- So können Sie Daten basierend auf dem angemeldeten Nutzer vorfiltern.
Voraussetzungen
- Xcode 15.3
- Codelab-Beispielcode. Sie laden ihn in einem späteren Schritt des Codelabs herunter.
2. Firebase-Projekt erstellen und einrichten
Zur Verwendung der Erweiterung für die Firebase-Vektorsuche benötigen Sie ein Firebase-Projekt. In diesem Teil des Codelabs erstellen Sie ein neues Firebase-Projekt und aktivieren die erforderlichen Dienste wie Cloud Firestore und Firebase Authentication.
Firebase-Projekt erstellen
- Melden Sie sich in Firebase an.
- Klicken Sie in der Firebase Console auf Projekt hinzufügen und nennen Sie Ihr Projekt Firestore Vector Search Lab.
- Klicken Sie sich durch die Optionen zur Projekterstellung. Akzeptieren Sie die Firebase-Nutzungsbedingungen, wenn Sie dazu aufgefordert werden.
- Entfernen Sie auf dem Google Analytics-Bildschirm das Häkchen aus dem Kästchen Google Analytics für dieses Projekt aktivieren, da Sie Analytics für diese App nicht verwenden werden.
- Klicken Sie abschließend auf Projekt erstellen.
Weitere Informationen zu Firebase-Projekten finden Sie unter Firebase-Projekte verstehen.
Firebase-Preismodell upgraden
Wenn Sie Firebase Extensions und die zugrunde liegenden Cloud-Dienste verwenden möchten, muss Ihr Firebase-Projekt den Pay-as-you-go-Tarif (Blaze) haben. Das bedeutet, dass es mit einem Cloud-Rechnungskonto verknüpft sein muss.
- Für ein Cloud-Rechnungskonto ist eine Zahlungsmethode wie eine Kreditkarte erforderlich.
- Wenn Sie neu bei Firebase und Google Cloud sind, prüfen Sie, ob Sie Anspruch auf ein Guthaben in Höhe von 300 $ und ein kostenloses Cloud Billing-Konto haben.
- Wenn Sie dieses Codelab im Rahmen einer Veranstaltung absolvieren, fragen Sie den Organisator, ob Cloud-Guthaben verfügbar ist.
So führen Sie ein Upgrade Ihres Projekts auf den Tarif „Blaze“ aus:
- Wählen Sie in der Firebase Console Tarif upgraden aus.
- Wählen Sie den Tarif „Blaze“ aus. Folgen Sie der Anleitung auf dem Bildschirm, um ein Cloud-Rechnungskonto mit Ihrem Projekt zu verknüpfen.
Wenn Sie im Rahmen dieses Upgrades ein Cloud-Rechnungskonto erstellen mussten, müssen Sie möglicherweise zum Upgradevorgang in der Firebase Console zurückkehren, um das Upgrade abzuschließen.
Firebase-Produkte in der Console aktivieren und einrichten
Die App, die Sie erstellen, verwendet mehrere Firebase-Produkte, die für Apple-Apps verfügbar sind:
- Firebase Authentication ermöglicht es Ihren Nutzern, sich mühelos in der App anzumelden.
- Cloud Firestore speichert strukturierte Daten in der Cloud und benachrichtigt Sie sofort, wenn sich Daten ändern.
- Firebase-Sicherheitsregeln zum Schutz Ihrer Datenbank
Einige dieser Produkte erfordern eine spezielle Konfiguration oder müssen über die Firebase Console aktiviert werden.
Anonyme Authentifizierung für Firebase Authentication aktivieren
Diese App nutzt eine anonyme Authentifizierung, damit Nutzer die App verwenden können, ohne ein Konto erstellen zu müssen. Das sorgt für einen reibungslosen Onboarding-Prozess. Weitere Informationen zur anonymen Authentifizierung und zum Upgrade auf ein benanntes Konto finden Sie unter Best Practices für die anonyme Authentifizierung.
- Klicken Sie im linken Bereich der Firebase Console auf Build > Authentication (Build > Authentifizierung). Klicken Sie dann auf Jetzt starten.
- Sie befinden sich jetzt im Dashboard „Authentifizierung“. Dort können Sie registrierte Nutzer sehen, Anmeldeanbieter konfigurieren und Einstellungen verwalten.
- Wählen Sie den Tab Sign-in method (Anmeldemethode) aus oder klicken Sie hier, um direkt zum Tab zu gelangen.
- Klicken Sie in den Anbieteroptionen auf Anonym, stellen Sie den Schalter auf Aktivieren und klicken Sie dann auf Speichern.
Cloud Firestore einrichten
Diese Swift-Anwendung verwendet Cloud Firestore, um Notizen zu speichern.
So richten Sie Cloud Firestore in Ihrem Firebase-Projekt ein:
- Maximieren Sie im linken Bereich der Firebase Console Build und wählen Sie dann Firestore-Datenbank aus.
- Klicken Sie auf Datenbank erstellen.
- Lassen Sie die Datenbank-ID auf
(default)
. - Wählen Sie einen Speicherort für die Datenbank aus und klicken Sie auf Weiter.
Für eine echte App sollten Sie einen Speicherort in der Nähe Ihrer Nutzer auswählen. - Klicken Sie auf Im Testmodus starten. Lesen Sie den Haftungsausschluss zu den Sicherheitsregeln.
Später in diesem Codelab fügen Sie Sicherheitsregeln hinzu, um Ihre Daten zu schützen. Apps dürfen nicht veröffentlicht oder veröffentlicht werden, ohne Sicherheitsregeln für Ihre Datenbank hinzuzufügen. - Klicken Sie auf Erstellen.
Cloud Storage for Firebase einrichten
Die Web-App verwendet Cloud Storage for Firebase, um Bilder zu speichern, hochzuladen und zu teilen.
So richten Sie Cloud Storage for Firebase in Ihrem Firebase-Projekt ein:
- Maximieren Sie im linken Bereich der Firebase Console die Option Build und wählen Sie dann Storage aus.
- Klicken Sie auf Starten.
- Wählen Sie einen Speicherort für Ihren Standard-Storage-Bucket aus.
Für Buckets inUS-WEST1
,US-CENTRAL1
undUS-EAST1
können Sie die Stufe „Immer kostenlos“ für Google Cloud Storage nutzen. Für Buckets an allen anderen Speicherorten gelten die Preise und Nutzungsbedingungen für Google Cloud Storage. - Klicken Sie auf Im Testmodus starten. Lesen Sie den Haftungsausschluss zu den Sicherheitsregeln.
Später in diesem Codelab fügen Sie Sicherheitsregeln hinzu, um Ihre Daten zu schützen. Veröffentlichen oder verteilen Sie keine App, ohne Sicherheitsregeln für Ihren Speicher-Bucket hinzuzufügen. - Klicken Sie auf Erstellen.
3. Mobile App verknüpfen
In diesem Abschnitt des Codelabs laden Sie den Quellcode für eine einfache Notizen-App herunter und verbinden sie mit dem Firebase-Projekt, das Sie gerade erstellt haben.
Beispielanwendung herunterladen
- Rufen Sie https://github.com/FirebaseExtended/codelab-firestore-vectorsearch-ios auf und klonen Sie das Repository auf Ihren lokalen Computer.
- Öffnen Sie das Projekt Notes.xcodeproj in Xcode.
App mit Ihrem Firebase-Projekt verbinden
Damit Ihre App auf Firebase-Dienste zugreifen kann, müssen Sie sie in der Firebase Console einrichten. Sie können mehrere Clientanwendungen mit demselben Firebase-Projekt verbinden. Wenn Sie beispielsweise eine Android- oder Web-App erstellen, sollten Sie sie mit demselben Firebase-Projekt verbinden.
Weitere Informationen zu Firebase-Projekten finden Sie unter Firebase-Projekte verstehen.
- Rufen Sie in der Firebase Console die Übersichtsseite Ihres Firebase-Projekts auf.
- Klicken Sie auf das iOS-Symbol +, um Ihre iOS-App hinzuzufügen.
- Fügen Sie auf dem Bildschirm Firebase zu Ihrer Apple-App hinzufügen die Bundle-ID aus dem Xcode-Projekt ein (com.google.firebase.codelab.Notes).
- Sie können auch einen Alias für die App eingeben (Notizen für iOS).
- Klicken Sie auf „App registrieren“, um mit dem nächsten Schritt fortzufahren.
- Laden Sie die Datei GoogleServices-Info.plist herunter.
- Ziehen Sie GoogleServices-Info.plist in den Ordner Notes Ihres Xcode-Projekts. Sie können sie beispielsweise unter der Datei Assets.xcassets ablegen.
- Wählen Sie Elemente bei Bedarf kopieren aus, achten Sie darauf, dass unter Zielen hinzufügen das Ziel Notizen ausgewählt ist, und klicken Sie auf Fertigstellen.
- In der Firebase Console können Sie jetzt den Rest des Einrichtungsvorgangs durchklicken. In der Beispieldatei, die Sie zu Beginn dieses Abschnitts heruntergeladen haben, ist das Firebase Apple SDK bereits installiert und die Initialisierung eingerichtet. Klicken Sie auf Weiter zur Konsole, um den Vorgang abzuschließen.
Anwendung ausführen
Jetzt ist es an der Zeit, die App auszuprobieren!
- Führen Sie die App in Xcode im iOS-Simulator aus. Wählen Sie im Drop-down-Menü Ausführungsziele zuerst einen der iOS-Simulatoren aus.
- Klicken Sie dann auf die Schaltfläche Ausführen oder drücken Sie ⌘ + R.
- Nachdem die App im Simulator gestartet wurde, fügen Sie einige Notizen hinzu.
- Rufen Sie in der Firebase Console den Firestore-Datenbrowser auf, um zu sehen, welche neuen Dokumente erstellt werden, wenn Sie in der App neue Notizen hinzufügen.
4. Erweiterung „Vektorsuche mit Firestore“ installieren
In diesem Teil des Codelabs installieren Sie die Erweiterung „Vector Search with Firestore“ und konfigurieren sie für die Notiz-App, an der Sie gerade arbeiten.
Installation der Erweiterung starten
- Klicken Sie im Bereich „Firestore“ auf den Tab Erweiterungen.
- Klicken Sie auf Im Extensions Hub umsehen.
- Geben Sie „vector“ ein.
- Klicken Sie auf „Vektorsuche mit Firestore-Erweiterung“. Daraufhin wird die Seite mit den Details zur Erweiterung geöffnet. Dort finden Sie weitere Informationen zur Erweiterung, zu ihrer Funktionsweise, zu den erforderlichen Firebase-Diensten und zur Konfiguration.
- Klicken Sie auf In der Firebase Console installieren.
- Daraufhin wird eine Liste aller Ihrer Projekte angezeigt.
- Wählen Sie das Projekt aus, das Sie im ersten Schritt dieses Codelabs erstellt haben.
Erweiterung konfigurieren
- Prüfen Sie die aktivierten APIs und erstellten Ressourcen.
- Aktivieren Sie die erforderlichen Dienste.
- Klicken Sie auf Weiter, sobald alle Dienste aktiviert sind.
- Prüfen Sie den Zugriff, der dieser Erweiterung gewährt wurde.
- Konfigurieren Sie die Erweiterung:
- Wählen Sie Vertex AI als LLM aus.
- Aufrufpfad der Sammlung: notes
- Standardlimit für Suchanfragen: 3
- Name des Eingabefelds: text
- Name des Ausgabefelds: embedding
- Name des Statusfelds:* *status*
- Vorhandene Dokumente einbetten: Ja
- Vorhandene Dokumente aktualisieren: Ja
- Speicherort der Cloud-Funktion: us-central1
- Klicken Sie auf Erweiterung installieren, um die Installation abzuschließen.
Das kann einige Minuten dauern. Während Sie auf den Abschluss der Installation warten, können Sie mit dem nächsten Abschnitt der Anleitung fortfahren und sich Hintergrundinformationen zu Vektoreinbettungen durchlesen.
5. Hintergrund
Während die Installation läuft, finden Sie hier einige Hintergrundinformationen zur Funktionsweise der Erweiterung „Vektorsuche mit Firestore“.
Was sind Vektoren, Einbettungen und Vektordatenbanken?
- Vektoren sind mathematische Objekte, die die Größe und Richtung einer Größe darstellen. Sie können verwendet werden, um Daten so darzustellen, dass sie leichter zu vergleichen und zu suchen sind.
- Einbettungen sind Vektoren, die die Bedeutung eines Wortes oder einer Wortgruppe darstellen. Sie werden erstellt, indem ein neuronales Netzwerk mit einem großen Textkorpus trainiert und die Beziehungen zwischen Wörtern gelernt werden.
- Vektordatenbanken sind Datenbanken, die für das Speichern und Suchen von Vektordaten optimiert sind. Sie ermöglichen eine effiziente Suche nach dem nächsten Nachbarn. Dabei werden die Vektoren ermittelt, die einem bestimmten Abfragevektor am ähnlichsten sind.
Wie funktioniert die Vektorsuche?
Bei der Vektorsuche wird der Abfragevektor mit allen Vektoren in der Datenbank verglichen. Die Vektoren, die dem Abfragevektor am ähnlichsten sind, werden als Suchergebnisse zurückgegeben.
Die Ähnlichkeit zwischen zwei Vektoren kann mit einer Vielzahl von Entfernungsmesswerten gemessen werden. Der gängigste Entfernungsmesswert ist die Kosinus-Ähnlichkeit, mit der der Winkel zwischen zwei Vektoren gemessen wird.
6. Vektorsuche mit Firestore-Erweiterung ausprobieren
Bevor Sie die Erweiterung Vektorsuche mit Firestore in der iOS-App verwenden, die Sie zuvor in diesem Codelab heruntergeladen haben, können Sie die Erweiterung in der Firebase Console ausprobieren.
Dokumentation lesen
Firebase Extensions enthalten eine Dokumentation zur Funktionsweise.
- Klicken Sie nach Abschluss der Installation auf die Schaltfläche Jetzt starten.
- Auf dem Tab „Funktionsweise dieser Erweiterung“ finden Sie folgende Informationen:
- wie Sie Einbettungen für Dokumente berechnen, indem Sie sie der Sammlung
notes
hinzufügen, - wie Sie den Index durch Aufrufen der aufrufbaren Funktion
ext-firestore-vector-search-queryCallable
abfragen. - oder wie Sie den Index abfragen, indem Sie der Sammlung „
_firestore-vector-search/index/queries
“ ein Abfragedokument hinzufügen. - Außerdem wird erläutert, wie Sie eine benutzerdefinierte Einbettungsfunktion einrichten. Das ist nützlich, wenn keines der von der Erweiterung unterstützten LLMs Ihre Anforderungen erfüllt und Sie ein anderes LLM zum Berechnen von Einbettungen verwenden möchten.
- wie Sie Einbettungen für Dokumente berechnen, indem Sie sie der Sammlung
- Klicken Sie auf den Link Cloud Firestore-Dashboard, um zu Ihrer Firestore-Instanz zu gelangen.
- Rufen Sie das Dokument
_firestore-vector-search/index
auf. Hier sollte angezeigt werden, dass die Erweiterung die Einbettungen für alle Notizendokumente abgeschlossen hat, die du in einem früheren Schritt in diesem Codelab erstellt hast. - Öffnen Sie dazu eines der Notizendokumente. Sie sollten ein zusätzliches Feld namens
embedding
vom Typvector<768>
sowie einstatus
-Feld sehen.
Beispieldokument erstellen
Sie können in der Firebase Console ein neues Dokument erstellen, um die Erweiterung in Aktion zu sehen.
- Rufen Sie im Firestore-Datenbrowser die Sammlung
notes
auf und klicken Sie in der mittleren Spalte auf + Dokument hinzufügen. - Klicken Sie auf Automatisch generierte ID, um eine neue eindeutige Dokument-ID zu generieren.
- Fügen Sie ein Feld mit dem Namen
text
vom Typ „String“ hinzu und fügen Sie Text in das Feld Wert ein. Es ist wichtig, dass es sich dabei nicht um Lorem Ipsum oder einen anderen zufälligen Text handelt. Wählen Sie beispielsweise einen Nachrichtenartikel aus. - Klicken Sie auf Speichern.
- Beachten Sie, dass die Erweiterung ein Statusfeld hinzufügt, um anzugeben, dass Daten verarbeitet werden.
- Nach kurzer Zeit sollte ein neues Feld
embedding
mit dem Wertvector<768>
angezeigt werden.
Abfrage ausführen
Die Vektorsuche mit Firestore-Erweiterung hat eine raffinierte kleine Funktion, mit der Sie den Dokumentindex abfragen können, ohne eine Verbindung zu einer App herstellen zu müssen.
- Rufen Sie im Firestore-Abschnitt der Firebase Console das Dokument
_firestore-vector-search/index
auf. - Klicken Sie auf + Sammlung starten.
- Erstellen Sie eine neue Untersammlung mit dem Namen
queries
. - Erstellen Sie ein neues Dokument und geben Sie im Feld
query
einen Text ein, der in einem Ihrer Dokumente vorkommt. Das funktioniert am besten bei semantischen Suchanfragen wie „Wie kann ich Firestore-Dokumente mit Swift abgleichen?“, vorausgesetzt, mindestens eine der hinzugefügten Notizen enthält Text zu diesem Thema. - Möglicherweise wird im Status ein Fehler angezeigt.
- Das liegt an einem fehlenden Index. Rufen Sie die Google Cloud Console für Ihr Projekt auf (diesen Link anklicken) und wählen Sie Ihr Projekt aus der Liste aus, um die fehlende Indexkonfiguration einzurichten.
- Im Cloud Log Explorer sollten Sie jetzt die Fehlermeldung „FAILED_PRECONDITION: Missing vector Index configuration“ sehen. Erstellen Sie den erforderlichen Index mit dem folgenden gcloud-Befehl: ..."
- Die Fehlermeldung enthält auch einen
gcloud
-Befehl, den Sie ausführen müssen, um den fehlenden Index zu konfigurieren. - Führen Sie in der Befehlszeile den folgenden Befehl aus. Wenn die
gcloud
CLI nicht auf Ihrem Computer installiert ist, folgen Sie dieser Anleitung, um sie zu installieren. Das Erstellen des Index dauert einige Minuten. Sie können den Fortschritt im Abschnitt „Firestore“ der Firebase Console auf dem Tab Indexe prüfen.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
- Sobald der Index eingerichtet ist, können Sie ein neues Abfragedokument erstellen.
- Im Ergebnisfeld sollte jetzt eine Liste der übereinstimmenden Dokument-IDs angezeigt werden.
- Kopieren Sie eine dieser IDs und kehren Sie zur Sammlung
notes
zurück. - Mit ⌘+F können Sie nach der Dokument-ID suchen, die Sie kopiert haben. Dieses Dokument entspricht am besten Ihrer Suchanfrage.
7. Semantische Suche implementieren
Jetzt ist es an der Zeit, Ihre mobile App mit der Vector Search-Erweiterung für Firestore zu verbinden und eine semantische Suchfunktion zu implementieren, mit der Nutzer ihre Notizen mithilfe von Suchanfragen in natürlicher Sprache durchsuchen können.
Aufrufbare Funktion für die Ausführung von Abfragen verbinden
Die Erweiterung „Vector Search with Firestore“ enthält eine Cloud-Funktion, die Sie von Ihrer mobilen App aus aufrufen können, um den Index abzufragen, den Sie zuvor in diesem Codelab erstellt haben. In diesem Schritt stellen Sie eine Verbindung zwischen Ihrer mobilen App und dieser aufrufbaren Funktion her. Das Swift SDK von Firebase enthält APIs, die den Aufruf von Remotefunktionen nahtlos ermöglichen.
- Kehren Sie zu Xcode zurück und prüfen Sie, ob Sie sich im Projekt befinden, das Sie in einem vorherigen Schritt in diesem Codelab geklont haben.
- Öffnen Sie die Datei
NotesRepository.swift
. - Suchen Sie die Zeile, die
private lazy var vectorSearchQueryCallable: Callable
enthält.= functions.httpsCallable("")
Wenn Sie eine aufrufbare Cloud-Funktion aufrufen möchten, müssen Sie den Namen der Funktion angeben, die Sie aufrufen möchten.
- Rufen Sie die Firebase Console für Ihr Projekt auf und öffnen Sie im Bereich Build den Menüpunkt Functions.
- Es wird eine Liste der Funktionen angezeigt, die von der Erweiterung installiert wurden.
- Suchen Sie nach
ext-firestore-vector-search-queryCallable
und kopieren Sie den Namen. - Fügen Sie den Namen in den Code ein. Es sollte jetzt so aussehen:
private lazy var vectorSearchQueryCallable: Callable<String, String> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
Abfragefunktion aufrufen
- Methode
performQuery
finden - Rufen Sie die aufrufbare Funktion mit
let result = try await vectorSearchQueryCallable(searchTerm)
Da es sich um einen Remote-Aufruf handelt, kann er fehlschlagen.
- Fügen Sie eine einfache Fehlerbehandlung hinzu, um Fehler abzufangen und in der Xcode-Konsole zu protokollieren.
private func performQuery(searchTerm: String) async -> [String] { do { let result = try await vectorSearchQueryCallable(searchTerm) return [result] } catch { print(error.localizedDescription) return [] } }
Benutzeroberfläche verbinden
Damit Nutzende in ihren Notizen suchen können, implementieren Sie eine Suchleiste im Bildschirm mit der Notizenliste. Wenn der Nutzer einen Suchbegriff eingibt, müssen Sie die performQuery
-Methode aufrufen, die Sie im vorherigen Schritt implementiert haben. Dank der SwiftUI-Ansichtsmodifikatoren searchable
und task
sind dafür nur wenige Codezeilen erforderlich.
- Öffnen Sie zuerst
NotesListScreen.swift
. - Wenn Sie der Listenansicht ein Suchfeld hinzufügen möchten, fügen Sie den Ansichtsmodifikatoren
.searchable(text: $searchTerm, prompt: "Search")
direkt über der Zeile.navigationTitle("Notes")
hinzu. - Rufen Sie dann die Suchfunktion auf, indem Sie den folgenden Code hinzufügen:
.task(id: searchTerm, debounce: .milliseconds(800)) {
await notesRepository.semanticSearch(searchTerm: searchTerm)
}
In diesem Code-Snippet wird die semanticSearch
-Methode asynchron aufgerufen. Wenn Sie eine Zeitüberschreitung von 800 Millisekunden angeben, weisen Sie den Aufgaben-Modifier an, die Eingabe des Nutzers um 0,8 Sekunden zu verzögern. Das bedeutet, dass semanticSearch
nur aufgerufen wird, wenn der Nutzer länger als 0,8 Sekunden nicht tippt.
Ihr Code sollte jetzt so aussehen:
...
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")
...
Anwendung ausführen
- Drücken Sie ⌘ + R (oder klicken Sie auf die Schaltfläche „Ausführen“), um die App im iOS-Simulator zu starten.
- Sie sollten dieselben Notizen sehen, die Sie zuvor in diesem Codelab in der App hinzugefügt haben, sowie alle Notizen, die Sie über die Firebase Console hinzugefügt haben.
- Oben in der Liste Notizen sollte ein Suchfeld angezeigt werden.
- Geben Sie einen Begriff ein, der in einem der hinzugefügten Dokumente vorkommt. Auch hier funktioniert das am besten bei semantischen Suchanfragen wie „Wie kann ich asynchrone Firebase APIs von Swift aus aufrufen?“, vorausgesetzt, mindestens eine der hinzugefügten Notizen enthält Text zu diesem Thema.
- Sie erwarten wahrscheinlich, dass das Suchergebnis angezeigt wird. Stattdessen ist die Listenansicht leer und in der Xcode-Konsole wird die Fehlermeldung „Die Funktion wurde mit einem ungültigen Argument aufgerufen“ angezeigt.
Das bedeutet, dass Sie die Daten im falschen Format gesendet haben.
Fehlermeldung analysieren
- Rufen Sie die Firebase Console auf, um herauszufinden, was das Problem ist.
- Gehen Sie zum Abschnitt Funktionen.
- Suchen Sie die Funktion
ext-firestore-vector-search-queryCallable
und öffnen Sie das Dreipunkt-Menü. - Wählen Sie Protokolle ansehen aus, um den Log-Explorer aufzurufen.
- Es sollte ein Fehler angezeigt werden.
Unhandled error ZodError: [
{
"code": "invalid_type",
"expected": "object",
"received": "string",
"path": [],
"message": "Expected object, received string"
}
]
Das bedeutet, dass Sie die Daten im falschen Format gesendet haben.
Die richtigen Datentypen verwenden
Informationen dazu, in welchem Format die Erweiterung die Parameter erwartet, finden Sie in der Dokumentation der Erweiterung.
- Rufen Sie in der Firebase Console den Bereich Erweiterungen auf.
- Klicken Sie auf Verwalten ->.
- Im Abschnitt Funktionsweise dieser Erweiterung finden Sie eine Beschreibung der Eingabe- und Ausgabeparameter.
- Kehren Sie zu Xcode zurück und gehen Sie zu
NotesRepository.swift
. - Fügen Sie am Anfang der Datei den folgenden Code ein:
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
stimmt mit der Struktur des Eingabeparameters überein, der von der Erweiterung gemäß der Dokumentation der Erweiterung erwartet wird. Außerdem enthält es ein verschachteltesprefilter
-Attribut, das Sie später benötigen.QueryResponse
entspricht der Struktur der Antwort der Erweiterung. - Spezifikation der aufrufbaren Funktion suchen und Eingabe- und Ausgabetypen aktualisieren
private lazy var vectorSearchQueryCallable: Callable<QueryRequest, QueryResponse> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
- Aufruf der aufrufbaren Funktion in
performQuery
aktualisierenprivate 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 [] } }
App noch einmal ausführen
- App noch einmal ausführen
- Geben Sie eine Suchanfrage ein, die Begriffe enthält, die in einer Ihrer Notizen enthalten sind.
- Sie sollten jetzt eine gefilterte Liste der Notizen sehen.
Nutzerdaten vorfiltern
Bevor Sie in Jubel ausbrechen: Es gibt ein Problem mit der aktuellen Version der App: Die Ergebnismenge enthält Daten aller Nutzer.
Sie können das überprüfen, indem Sie die App auf einem anderen Simulator ausführen und weitere Dokumente hinzufügen. Die neuen Dokumente werden nur in diesem Simulator angezeigt. Wenn Sie die App noch einmal auf dem anderen Simulator ausführen, sehen Sie nur Dokumente, die Sie beim ersten Mal erstellt haben.
Wenn Sie eine Suche durchführen, stellen Sie fest, dass der Aufruf von vectorSearchQueryCallable
Dokument-IDs zurückgibt, die möglicherweise dem anderen Nutzer gehören. Um dies zu verhindern, müssen wir einen Vorfilter verwenden.
Aktualisieren Sie den Code in performQuery
so:
let prefilters: [QueryFilter] = if let uid = user?.uid {
[QueryFilter(field: "userId", operator: "==", value: uid)]
}
else {
[]
}
let queryRequest = QueryRequest(query: searchTerm,
limit: 2,
prefilters: prefilters)
Dadurch werden die Daten basierend auf der ID des angemeldeten Nutzers vorgefiltert. Dazu muss der Firestore-Index aktualisiert werden.
Führen Sie den folgenden Befehl in der Befehlszeile aus, um einen neuen Firestore-Index zu definieren, der sowohl die userId
als auch die Vektor-Embeddings im Feld embedding
enthält.
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
Führen Sie die App nach Abschluss des Indexaufbaus noch einmal aus, um zu prüfen, ob sie wie erwartet funktioniert.
8. Glückwunsch
Herzlichen Glückwunsch zum erfolgreichen Abschluss dieses Codelabs.
In diesem Codelab haben Sie Folgendes gelernt:
- Richten Sie eine Cloud Firestore-Datenbank mit aktivierter semantischer Suche ein.
- Erstellen Sie eine einfache SwiftUI-App, um mit der Datenbank zu interagieren.
- Implementieren Sie eine Suchleiste mit dem SwiftUI-Modifikator für die suchbare Ansicht und dem Aufgabenmodifikator.
- Rufen Sie eine Cloud Function auf, um mithilfe der aufrufbaren Schnittstelle des Firestore SDK eine semantische Suche in der Datenbank durchzuführen.
Mit dem Wissen, das Sie in diesem Codelab erworben haben, können Sie jetzt leistungsstarke Anwendungen erstellen, die die semantischen Suchfunktionen von Cloud Firestore nutzen, um Nutzern eine intuitivere und effizientere Suche zu bieten.
Weitere Informationen zum neuen Vektorfeld in Firestore und zum Berechnen von Vektoreinbettungen finden Sie in der Dokumentation.