Dodawanie wyszukiwania wektorów Firestore do aplikacji mobilnych za pomocą rozszerzeń Firebase

1. Przegląd

Z tego samouczka dowiesz się, jak dodać do aplikacji zaawansowane funkcje wyszukiwania za pomocą wyszukiwania podobieństwa wektorowego w Firestore. Wdrożysz funkcję wyszukiwania semantycznego w aplikacji do robienia notatek napisanej w języku Swift i przy użyciu SwiftUI.

Konsola Cloud Firestore z widocznymi dokumentami, które są też widoczne w aplikacji na iOS po prawej stronie.

Czego się nauczysz

  • Jak zainstalować rozszerzenie Wyszukiwanie wektorowe w Firestore, aby obliczać wektory dystrybucyjne.
  • Jak wywoływać funkcje Cloud Functions dla Firebase z aplikacji w Swift.
  • Jak wstępnie filtrować dane na podstawie zalogowanego użytkownika.

Wymagania

  • Xcode 15.3
  • Przykładowy kod z warsztatów. Pobierzesz go w dalszej części tego laboratorium.

2. Tworzenie i konfigurowanie projektu Firebase

Aby używać rozszerzenia Firebase Vector Search, musisz mieć projekt Firebase. W tej części laboratorium utworzysz nowy projekt Firebase i aktywujesz wymagane usługi, takie jak Cloud Firestore i Uwierzytelnianie Firebase.

Tworzenie projektu Firebase

  1. Zaloguj się w konsoli Firebase, korzystając ze swojego konta Google.
  2. Kliknij przycisk, aby utworzyć nowy projekt, a potem wpisz jego nazwę (np. Firestore Vector Search Codelab).
  3. Kliknij Dalej.
  4. Po wyświetleniu monitu przeczytaj i zaakceptuj warunki usługi Firebase, a potem kliknij Dalej.
  5. (Opcjonalnie) Włącz w konsoli Firebase pomoc AI (nazywaną „Gemini w Firebase”).
  6. W tym samouczku nie potrzebujesz Google Analytics, więc wyłącz opcję Google Analytics.
  7. Kliknij Utwórz projekt, poczekaj, aż projekt zostanie udostępniony, a następnie kliknij Dalej.

Więcej informacji o projektach Firebase znajdziesz w artykule Projekty w Firebase.

Przejście na wyższy abonament Firebase

Aby korzystać z rozszerzeń Firebase i ich usług w chmurze, Twój projekt Firebase musi być objęty abonamentem z płatnością za wykorzystanie (Blaze), co oznacza, że musi być połączony z kontem rozliczeniowym Cloud.

  • Konto rozliczeniowe Cloud wymaga formy płatności, np. karty kredytowej.
  • Jeśli dopiero zaczynasz korzystać z Firebase i Google Cloud, sprawdź, czy możesz otrzymać środki w wysokości 300 USD i bezpłatne konto rozliczeniowe Cloud.
  • Jeśli wykonujesz te ćwiczenia w ramach wydarzenia, zapytaj organizatora, czy są dostępne środki w Google Cloud.

Aby przenieść projekt na abonament Blaze:

  1. W konsoli Firebase wybierz przejście na wyższy abonament.
  2. Wybierz pakiet Blaze. Postępuj zgodnie z instrukcjami wyświetlanymi na ekranie, aby połączyć konto rozliczeniowe Cloud z projektem.
    Jeśli w ramach tego przejścia na wyższy abonament konieczne było utworzenie konta rozliczeniowego Cloud, może być konieczne powrócenie do procesu przejścia na wyższy abonament w konsoli Firebase, aby go dokończyć.

Włączanie i konfigurowanie usług Firebase w konsoli

Tworzona przez Ciebie aplikacja korzysta z kilku usług Firebase dostępnych w przypadku aplikacji na urządzenia Apple:

  • Uwierzytelnianie Firebase, aby umożliwić użytkownikom łatwe logowanie się w aplikacji.
  • Cloud Firestore – zapisywanie danych strukturalnych w chmurze i otrzymywanie natychmiastowych powiadomień o zmianach danych.
  • Reguły zabezpieczeń Firebase, aby zabezpieczyć bazę danych.

Niektóre z tych usług wymagają specjalnej konfiguracji lub włączenia w konsoli Firebase.

Włączanie anonimowego uwierzytelniania w usłudze Uwierzytelnianie Firebase

Ta aplikacja korzysta z uwierzytelniania anonimowego, aby umożliwić użytkownikom rozpoczęcie korzystania z niej bez konieczności tworzenia konta. Dzięki temu proces wprowadzania jest prosty i szybki. Więcej informacji o anonimowym uwierzytelnianiu (i o tym, jak przejść na konto z nazwą) znajdziesz w artykule Sprawdzone metody anonimowego uwierzytelniania.

  1. W panelu po lewej stronie w konsoli Firebase kliknij Kompilacja > Uwierzytelnianie. Następnie kliknij Rozpocznij.Włączanie Uwierzytelniania Firebase
  2. Otworzy się panel Uwierzytelnianie, w którym możesz wyświetlać zarejestrowanych użytkowników, konfigurować dostawców logowania i zarządzać ustawieniami.
  3. Wybierz kartę Metoda logowania (lub kliknij tutaj, aby przejść bezpośrednio do tej karty).
  4. W opcjach dostawcy kliknij Anonimowy, włącz przełącznik Włącz, a potem kliknij Zapisz.

Konfigurowanie Cloud Firestore

Ta aplikacja w Swift używa Cloud Firestore do zapisywania notatek.

Aby skonfigurować Cloud Firestore w projekcie Firebase:

  1. W panelu po lewej stronie konsoli Firebase rozwiń Kompilacja, a następnie wybierz Baza danych Firestore.
  2. Kliknij Utwórz bazę danych.
  3. W polu Identyfikator bazy danych pozostaw wartość (default).
  4. Wybierz lokalizację bazy danych i kliknij Dalej.
    W przypadku prawdziwej aplikacji wybierz lokalizację, która jest blisko użytkowników.
  5. Kliknij Uruchom w trybie testowym. Przeczytaj wyłączenie odpowiedzialności dotyczące reguł bezpieczeństwa.
    W dalszej części tego laboratorium dodasz reguły bezpieczeństwa, aby zabezpieczyć swoje dane. Nierozpowszechniajani nie udostępniaj publicznie aplikacji bez dodania reguł bezpieczeństwa do bazy danych.
  6. Kliknij Utwórz.

Konfigurowanie Cloud Storage dla Firebase

Aplikacja internetowa używa Cloud Storage dla Firebase do przechowywania, przesyłania i udostępniania zdjęć.

Aby skonfigurować Cloud Storage dla Firebase w projekcie Firebase:

  1. W panelu po lewej stronie konsoli Firebase rozwiń Kompilacja, a następnie wybierz Storage.
  2. Kliknij Rozpocznij.
  3. Wybierz lokalizację domyślnego zasobnika Storage.
    Zasobniki w regionach US-WEST1, US-CENTRAL1 i US-EAST1 mogą korzystać z poziomu „Zawsze bezpłatny” w Google Cloud Storage. W przypadku zasobników w innych lokalizacjach obowiązuje cennik i wykorzystanie Google Cloud Storage.
  4. Kliknij Uruchom w trybie testowym. Przeczytaj wyłączenie odpowiedzialności dotyczące reguł bezpieczeństwa.
    W dalszej części tego laboratorium dodasz reguły bezpieczeństwa, aby zabezpieczyć swoje dane. Nieudostępniaj aplikacji publicznie bez dodania reguł bezpieczeństwa do zasobnika Storage.
  5. Kliknij Utwórz.

3. Łączenie aplikacji mobilnej

W tej sekcji laboratorium kodowania pobierzesz kod źródłowy prostej aplikacji do robienia notatek i połączysz go z utworzonym przed chwilą projektem Firebase.

Pobieranie przykładowej aplikacji

  1. Otwórz stronę https://github.com/FirebaseExtended/codelab-firestore-vectorsearch-ios i sklonuj repozytorium na komputer lokalny.
  2. Otwórz projekt Notes.xcodeproj w Xcode.

Połącz aplikację z projektem Firebase.

Aby aplikacja mogła korzystać z usług Firebase, musisz ją skonfigurować w konsoli Firebase. Z tym samym projektem Firebase możesz połączyć wiele aplikacji klienckich, np. jeśli tworzysz aplikację na Androida lub aplikację internetową, połącz je z tym samym projektem Firebase.

Więcej informacji o projektach Firebase znajdziesz w artykule Projekty w Firebase.

  1. W konsoli Firebase otwórz stronę przeglądu projektu Firebase.Strona przeglądu w konsoli Firebase
  2. Aby dodać aplikację na iOS, kliknij ikonę iOS+.
  3. Na ekranie Dodaj Firebase do aplikacji na iOS wstaw identyfikator pakietu z projektu Xcode (com.google.firebase.codelab.Notes).
  4. Możesz wpisać pseudonim aplikacji (np. Notatki na iOS).
  5. Aby przejść do następnego kroku, kliknij Zarejestruj aplikację.
  6. Pobierz plik GoogleServices-Info.plist.
  7. Przeciągnij plik GoogleServices-Info.plist do folderu Notes w projekcie Xcode. Dobrym sposobem jest umieszczenie go pod plikiem Assets.xcassets.Przeciąganie pliku plist do Xcode
  8. Zaznacz W razie potrzeby skopiuj elementy, upewnij się, że w sekcji Dodaj do miejsc docelowych wybrano miejsce docelowe Notatki, a następnie kliknij Zakończ.Wybieranie opcji „Kopiuj w razie potrzeby” w oknie dialogowym wyboru opcji dodawania plików
  9. W konsoli Firebase możesz teraz przejść przez pozostałą część procesu konfiguracji: pobrana na początku tej sekcji próbka ma już zainstalowany pakiet SDK Firebase na iOS i skonfigurowaną inicjację. Aby zakończyć proces, kliknij Przejdź do konsoli.

Uruchamianie aplikacji

Czas wypróbować aplikację.

  1. Wróć do Xcode i uruchom aplikację w symulatorze iOS. W menu Run Destinations (Uruchom miejsca docelowe) wybierz najpierw jeden z symulatorów iOS.Wybierz symulator iOS w menu „Miejsca docelowe uruchomienia”.
  2. Następnie kliknij przycisk Uruchom lub naciśnij ⌘ + R.
  3. Gdy aplikacja zostanie uruchomiona w symulatorze, dodaj kilka notatek.
  4. W konsoli Firebase otwórz przeglądarkę danych Firestore, aby zobaczyć, jak podczas dodawania nowych notatek w aplikacji tworzone są nowe dokumenty.Konsola Cloud Firestore z kilkoma dokumentami oraz symulator iOS z tymi samymi dokumentami

4. Instalowanie rozszerzenia Wyszukiwanie wektorowe w Firestore

W tej części laboratorium zainstalujesz rozszerzenie Vector Search with Firestore i skonfigurujesz je zgodnie z wymaganiami aplikacji do robienia notatek, nad którą pracujesz.

Rozpoczęcie instalacji rozszerzenia

  1. W sekcji Firestore kliknij kartę Rozszerzenia.Wybieranie karty Rozszerzenia Firebase w konsoli Firestore
  2. Kliknij Przeglądaj Centrum rozszerzeń.Karta Rozszerzenia Firebase w konsoli Firestore
  3. Wpisz „wektor”.
  4. Kliknij „Wyszukiwanie wektorowe z rozszerzeniem Firestore”.Strona docelowa Centrum Rozszerzeń Firebase Spowoduje to przejście do strony szczegółów rozszerzenia, na której możesz dowiedzieć się więcej o rozszerzeniu, jego działaniu, wymaganych usługach Firebase i sposobie jego konfigurowania.
  5. Kliknij Zainstaluj w konsoli Firebase.Przycisk instalacji rozszerzenia Wyszukiwanie wektorowe w Firestore
  6. Pojawi się lista wszystkich Twoich projektów.
  7. Wybierz projekt utworzony w pierwszym kroku tego laboratorium.Ekran selektora projektów Firebase

Konfigurowanie rozszerzenia

  1. Sprawdź włączone interfejsy API i utworzone zasoby.Sprawdzanie włączonych interfejsów API
  2. Włącz wymagane usługi.Włączanie wymaganych usług
  3. Gdy wszystkie usługi zostaną włączone, kliknij Dalej.Po włączeniu wszystkich usług kliknij Dalej
  4. Sprawdź uprawnienia dostępu przyznane temu rozszerzeniu.
  5. Skonfiguruj rozszerzenie:
    • Wybierz Vertex AI jako LLM.
    • Ścieżka kolekcji: notes
    • Domyślny limit zapytań: 3
    • Nazwa pola wejściowego: text
    • Nazwa pola wyjściowego: embedding
    • Nazwa pola stanu:* *status*
    • Umieszczanie istniejących dokumentów: tak
    • Aktualizuj istniejące dokumenty: Tak
    • Lokalizacja funkcji w Cloud Functions: us-central1
  6. Aby zakończyć instalację, kliknij Zainstaluj rozszerzenie.

Może to potrwać kilka minut. Podczas oczekiwania na zakończenie instalacji możesz przejść do następnej sekcji samouczka i zapoznać się z informacjami o wektorach osadzania.

5. Tło

Podczas oczekiwania na zakończenie instalacji zapoznaj się z informacjami o działaniu rozszerzenia wyszukiwania wektorowego w Firestore.

Czym są wektory, wektory dystrybucyjne i bazy danych wektorów?

  • Wektory to obiekty matematyczne, które reprezentują wielkość i kierunek danej wartości. Można ich używać do przedstawiania danych w sposób, który ułatwia porównywanie i wyszukiwanie.
  • Wektory dystrybucyjne to wektory reprezentujące znaczenie słowa lub wyrażenia. Są one tworzone przez trenowanie sieci neuronowej na dużym korpusie tekstu i uczenie się relacji między słowami.
  • Bazy danych wektorowych są zoptymalizowane pod kątem przechowywania i wyszukiwania danych wektorowych. Umożliwiają one wydajne wyszukiwanie najbliższych sąsiadów, czyli proces znajdowania wektorów najbardziej podobnych do danego wektora zapytania.

Jak działa wyszukiwanie wektorowe?

Wyszukiwanie wektorowe polega na porównaniu wektora zapytania ze wszystkimi wektorami w bazie danych. Wektory najbardziej podobne do wektora zapytania są zwracane jako wyniki wyszukiwania.

Podobieństwo między dwoma wektorami można zmierzyć za pomocą różnych miar odległości. Najpopularniejszym wskaźnikiem odległości jest podobieństwo cosinusowe, które mierzy kąt między dwoma wektorami.

6. Wypróbuj rozszerzenie Wyszukiwanie wektorowe w Firestore

Zanim użyjesz rozszerzenia Vector Search z Firestore w aplikacji na iOS pobranej wcześniej w tym laboratorium, możesz wypróbować to rozszerzenie w konsoli Firebase.

Przeczytaj dokumentację

Rozszerzenia Firebase zawierają dokumentację opisującą ich działanie.

  1. Po zakończeniu instalacji kliknij przycisk Rozpocznij. strona przeglądu Rozszerzeń w Firebase w konsoli Firebase;
  2. Na karcie „Jak działa to rozszerzenie” znajdziesz informacje o tym:
    • jak obliczać wektory osadzeń dokumentów, dodając je do kolekcji notes,
    • jak wysyłać zapytania do indeksu, wywołując funkcję wywoływalną ext-firestore-vector-search-queryCallable,
    • lub jak wysyłać zapytania do indeksu, dodając dokument zapytania do kolekcji _firestore-vector-search/index/queries.
    • Wyjaśniamy też, jak skonfigurować niestandardową funkcję osadzania. Jest to przydatne, jeśli żaden z modeli LLM obsługiwanych przez rozszerzenie nie spełnia Twoich wymagań i chcesz użyć innego modelu LLM do obliczania osadzeń. Dokumentacja rozszerzenia Wyszukiwanie wektorowe w Firestore
  3. Kliknij link Panel Cloud Firestore, aby przejść do instancji Firestore.
  4. Otwórz dokument _firestore-vector-search/index. Powinno się wyświetlić powiadomienie, że rozszerzenie zakończyło obliczanie wektorów osadzania dla wszystkich dokumentów z notatkami utworzonych w poprzednim kroku tego kursu.Konfiguracja indeksu w konsoli Firestore
  5. Aby to sprawdzić, otwórz jeden z dokumentów z notatkami. Powinno się w nim pojawić dodatkowe pole o nazwie embedding typu vector<768> oraz pole status.Pole wektora dystrybucyjnego w konsoli Firestore

Tworzenie przykładowego dokumentu

Aby zobaczyć działanie rozszerzenia, możesz utworzyć nowy dokument w konsoli Firebase.

  1. W przeglądarce danych Firestore przejdź do kolekcji notes i w środkowej kolumnie kliknij + Dodaj dokument.Dodawanie nowego dokumentu
  2. Kliknij Automatyczny identyfikator, aby wygenerować nowy, niepowtarzalny identyfikator dokumentu.
  3. Dodaj pole o nazwie text typu ciąg znaków i wklej tekst w polu wartość. Ważne jest, aby nie był to tekst Lorem Ipsum ani żaden inny losowy tekst. Wybierz na przykład artykuł informacyjny.Dodawanie pola tekstowego
  4. Kliknij Zapisz.
    • Zwróć uwagę, że rozszerzenie dodaje pole stanu, aby wskazać, że przetwarza dane.
    • Po chwili powinno się pojawić nowe pole embedding o wartości vector<768>.
    Aktualizacja stanu wektorów dystrybucyjnych w przypadku nowego dokumentu

Wykonywanie zapytania

Rozszerzenie wyszukiwania wektorowego w Firestore ma przydatną funkcję, która umożliwia wysyłanie zapytań do indeksu dokumentów bez konieczności łączenia aplikacji.

  1. W sekcji Firestore w konsoli Firebase otwórz dokument _firestore-vector-search/index.
  2. Kliknij + Rozpocznij kolekcjęDodawanie nowej podkolekcji.
  3. Utwórz nową podkolekcję o nazwie queries.
  4. Utwórz nowy dokument i ustaw pole query na tekst, który występuje w jednym z Twoich dokumentów. Najlepiej sprawdza się w przypadku zapytań semantycznych, np. „Jak mapować dokumenty Firestore za pomocą Swift” (pod warunkiem, że co najmniej jedna z dodanych notatek zawiera tekst dotyczący tego tematu).Dodawanie pola zapytania
  5. W sekcji stanu może pojawić się błądWystąpił błąd
  6. Wynika to z braku indeksu. Aby skonfigurować brakujący indeks, otwórz konsolę Google Cloud dla swojego projektu, klikając ten link, a następnie wybierając projekt z listy.Wybieranie właściwego projektu
  7. W eksploratorze logów Cloud powinien pojawić się komunikat o błędzie „FAILED_PRECONDITION: Missing vector index configuration”. Utwórz wymagany indeks za pomocą tego polecenia gcloud: ..."Komunikat o błędzie w eksploratorze logów
  8. Komunikat o błędzie zawiera też polecenie gcloud, które musisz uruchomić, aby skonfigurować brakujący indeks.
  9. Uruchom to polecenie w wierszu poleceń. Jeśli na komputerze nie masz zainstalowanego interfejsu wiersza poleceń gcloud, postępuj zgodnie z instrukcjami, aby go zainstalować.
    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
    
    Tworzenie indeksu zajmuje kilka minut. Postęp możesz sprawdzić na karcie Indeksy w sekcji Firestore w konsoli Firebase.Stan nowego indeksu
  10. Po skonfigurowaniu indeksu możesz utworzyć nowy dokument zapytania.
  11. W polu wyników powinna pojawić się lista pasujących identyfikatorów dokumentówWynik zapytania semantycznego
  12. Skopiuj jeden z tych identyfikatorów i wróć do kolekcji notes.
  13. Użyj skrótu ⌘+F, aby wyszukać skopiowany identyfikator dokumentu – ten dokument najlepiej pasuje do Twojego zapytania.Znajdowanie identyfikatora dokumentu na liście dokumentów

7. Wdrażanie wyszukiwania semantycznego

Nadszedł czas, aby połączyć aplikację mobilną z rozszerzeniem Vector Search with Firestore i wdrożyć funkcję wyszukiwania semantycznego, która umożliwi użytkownikom wyszukiwanie notatek za pomocą zapytań w języku naturalnym.

Połącz funkcję wywoływaną, aby wykonywać zapytania.

Rozszerzenie Vector Search z Firestore zawiera funkcję w Cloud Functions, którą możesz wywołać z aplikacji mobilnej, aby wysłać zapytanie do indeksu utworzonego wcześniej w tym samouczku. W tym kroku nawiążesz połączenie między aplikacją mobilną a tą funkcją wywoływaną. Pakiet SDK Firebase w Swift zawiera interfejsy API, które umożliwiają bezproblemowe wywoływanie funkcji zdalnych.

  1. Wróć do Xcode i upewnij się, że pracujesz nad projektem sklonowanym w poprzednim kroku tego laboratorium.
  2. Otwórz plik NotesRepository.swift.
  3. Znajdź wiersz zawierający private lazy var vectorSearchQueryCallable: Callable = functions.httpsCallable("")

Aby wywołać funkcję wywoływalną w Cloud Functions, musisz podać nazwę funkcji, którą chcesz wywołać.

  1. Otwórz konsolę Firebase dla swojego projektu i w sekcji Kompilacja kliknij Funkcje.
  2. Pojawi się lista funkcji zainstalowanych przez rozszerzenie.
  3. Wyszukaj zmienną o nazwie ext-firestore-vector-search-queryCallable i skopiuj jej nazwę.
  4. Wklej nazwę do kodu. Powinien on teraz brzmieć
    private lazy var vectorSearchQueryCallable: Callable<String, String> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
    

Wywoływanie funkcji zapytania

  1. Znajdź metodę performQuery
  2. Wywołaj funkcję wywoływalną, wywołując
    let result = try await vectorSearchQueryCallable(searchTerm)
    

Ponieważ jest to wywołanie zdalne, może się nie powieść.

  1. Dodaj podstawową obsługę błędów, aby je przechwytywać i rejestrować w konsoli Xcode.
    private func performQuery(searchTerm: String) async -> [String] {
      do {
        let result = try await vectorSearchQueryCallable(searchTerm)
        return [result]
      }
      catch {
        print(error.localizedDescription)
        return []
      }
    }
    

Łączenie interfejsu

Aby umożliwić użytkownikom wyszukiwanie notatek, zaimplementujesz pasek wyszukiwania na ekranie listy notatek. Gdy użytkownik wpisze wyszukiwane hasło, musisz wywołać metodę performQuery zaimplementowaną w poprzednim kroku. Dzięki modyfikatorom widoku searchabletask udostępnianym przez SwiftUI wymaga to tylko kilku linii kodu.

  1. Najpierw otwórz NotesListScreen.swift
  2. Aby dodać pole wyszukiwania do widoku listy, dodaj modyfikator widoku .searchable(text: $searchTerm, prompt: "Search") tuż nad wierszem .navigationTitle("Notes").
  3. Następnie wywołaj funkcję wyszukiwania, dodając tuż pod nią ten kod:
.task(id: searchTerm, debounce: .milliseconds(800)) {
  await notesRepository.semanticSearch(searchTerm: searchTerm)
}

Ten fragment kodu wywołuje metodę semanticSearch asynchronicznie. Ustawiając limit czasu na 800 milisekund, instruujesz modyfikator zadania, aby odfiltrowywał dane wejściowe użytkownika przez 0,8 sekundy. Oznacza to, że funkcja semanticSearch zostanie wywołana dopiero wtedy, gdy użytkownik przestanie pisać na dłużej niż 0,8 sekundy.

Kod powinien teraz wyglądać tak:

...
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")
...

Uruchamianie aplikacji

  1. Naciśnij ⌘ + R (lub kliknij przycisk Uruchom), aby uruchomić aplikację w symulatorze iOS.
  2. Powinny być widoczne te same notatki, które zostały dodane w aplikacji we wcześniejszej części tego laboratorium, a także notatki dodane w konsoli Firebase.
  3. U góry listy Notatki powinno być widoczne pole wyszukiwania.
  4. Wpisz termin, który występuje w jednym z dodanych dokumentów. Ponownie, najlepiej sprawdza się to w przypadku zapytań semantycznych, np. „Jak mogę wywoływać asynchroniczne interfejsy API Firebase z poziomu Swift” (pod warunkiem, że co najmniej jedna z dodanych notatek zawiera tekst na ten temat).
  5. Prawdopodobnie oczekujesz, że zobaczysz wynik wyszukiwania, ale zamiast tego widok listy jest pusty, a konsola Xcode wyświetla komunikat o błędzie: „The function was called with an invalid argument” (Funkcja została wywołana z nieprawidłowym argumentem).

Aplikacja Notatki z pustą listą wyników

Oznacza to, że dane zostały przesłane w nieprawidłowym formacie.

Analizowanie komunikatu o błędzie

  1. Aby dowiedzieć się, co jest nie tak, otwórz konsolę Firebase.
  2. Otwórz sekcję Funkcje.
  3. Znajdź funkcję ext-firestore-vector-search-queryCallable i otwórz menu dodatkowe, klikając 3 pionowe kropki.
  4. Kliknij Wyświetl logi, aby otworzyć eksplorator logów.
  5. Powinien pojawić się błąd.
Unhandled error ZodError: [
  {
    "code": "invalid_type",
    "expected": "object",
    "received": "string",
    "path": [],
    "message": "Expected object, received string"
  }
]

Oznacza to, że dane zostały przesłane w nieprawidłowym formacie.

Używaj prawidłowych typów danych

Aby dowiedzieć się, w jakim formacie rozszerzenie oczekuje parametrów, zapoznaj się z jego dokumentacją.

  1. Otwórz sekcję Rozszerzenia w konsoli Firebase.
  2. Kliknij Zarządzaj –>Zarządzanie rozszerzeniem Wyszukiwanie wektorowe w Firestore
  3. W sekcji Jak działa to rozszerzenie znajdziesz specyfikację parametrów wejściowych i wyjściowych.Dokumentacja parametru wejściowego i wartości wyniku
  4. Wróć do Xcode i otwórz NotesRepository.swift.
  5. Dodaj na początku pliku ten kod:
    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 jest zgodny ze strukturą parametru wejściowego, którego oczekuje rozszerzenie, zgodnie z dokumentacją rozszerzenia. Zawiera też zagnieżdżony atrybut prefilter, który będzie Ci później potrzebny.QueryResponse pasuje do struktury odpowiedzi rozszerzenia.
  6. Znajdź specyfikację funkcji wywoływanej i zaktualizuj typy danych wejściowych i wyjściowych.
    private lazy var vectorSearchQueryCallable: Callable<QueryRequest, QueryResponse> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
    
  7. Zaktualizuj wywołanie funkcji wywoływanej w 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 []
      }
    }
    

Ponowne uruchomienie aplikacji

  1. Ponowne uruchomienie aplikacji
  2. Wpisz wyszukiwane hasło zawierające słowa z jednej z Twoich notatek.
  3. Powinna być teraz widoczna przefiltrowana lista notatek.

Zrzut ekranu aplikacji z oczekiwanym wynikiem

Wstępne filtrowanie danych użytkowników

Zanim zaczniesz tańczyć z radości, musisz wiedzieć, że obecna wersja aplikacji ma problem: zestaw wyników zawiera dane wszystkich użytkowników.

Możesz to sprawdzić, uruchamiając aplikację w innym symulatorze i dodając więcej dokumentów. Nowe dokumenty będą widoczne tylko w tym symulatorze. Jeśli ponownie uruchomisz aplikację w innym symulatorze, zobaczysz tylko dokumenty utworzone za pierwszym razem.

Jeśli przeprowadzisz wyszukiwanie, zauważysz, że wywołanie vectorSearchQueryCallable zwraca identyfikatory dokumentów, które mogą należeć do innego użytkownika. Aby temu zapobiec, musimy użyć wstępnego filtra.

W pliku performQuery zaktualizuj kod w ten sposób:

  let prefilters: [QueryFilter] = if let uid = user?.uid {
    [QueryFilter(field: "userId", operator: "==", value: uid)]
  }
  else {
    []
  }

  let queryRequest = QueryRequest(query: searchTerm,
                                  limit: 2,
                                  prefilters: prefilters)

Spowoduje to wstępne filtrowanie danych na podstawie identyfikatora zalogowanego użytkownika. Wymaga to aktualizacji indeksu Firestore.

Aby zdefiniować nowy indeks Firestore, który zawiera zarówno pole userId, jak i wektorowe osadzanie w polu embedding, uruchom to polecenie w wierszu poleceń.

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

Gdy indeks zostanie utworzony, uruchom ponownie aplikację, aby sprawdzić, czy działa zgodnie z oczekiwaniami.

Wstępnie odfiltrowany zestaw wyników

8. Gratulacje

Gratulujemy ukończenia tego ćwiczenia!

Z tego modułu dowiedzieliśmy się, jak:

  • skonfigurować bazę danych Cloud Firestore z włączonym wyszukiwaniem semantycznym;
  • Utwórz prostą aplikację SwiftUI, aby wchodzić w interakcje z bazą danych.
  • Zaimplementuj pasek wyszukiwania za pomocą modyfikatora widoku searchable i modyfikatora task w SwiftUI.
  • Wywołaj funkcję Cloud Function, aby przeprowadzić wyszukiwanie semantyczne w bazie danych za pomocą interfejsu Callable pakietu SDK Firestore.

Dzięki wiedzy zdobytej w tym laboratorium możesz teraz tworzyć zaawansowane aplikacje, które wykorzystują możliwości wyszukiwania semantycznego w Cloud Firestore, aby zapewnić użytkownikom bardziej intuicyjne i wydajne wyszukiwanie.

Więcej informacji o nowym polu wektorowym Firestore i obliczaniu wektorów dystrybucyjnych znajdziesz w dokumentacji.