Integracja wyszukiwarki tekstu

Wyszukiwanie tekstu umożliwia wyszukiwanie w korpusie tekstu podobnego semantycznie. Działa on w ten sposób, że osadza zapytanie w wektorze o wysokiej liczbie wymiarów, który reprezentuje znaczenie semantyczne zapytania. Następnie przeprowadza wyszukiwanie podobieństw w predefiniowanym indeksie niestandardowym za pomocą ScaNN (Scalable Nearest Neighbors).

W przeciwieństwie do klasyfikacji tekstu (np. klasyfikator języka naturalnego Bert) zwiększenie liczby rozpoznawanych elementów nie wymaga ponownego trenowania całego modelu. Nowe elementy można dodawać, po prostu ponownie tworząc indeks. Umożliwia to też pracę z większymi korpusami (ponad 100 tys. elementów).

Użyj interfejsu Task Library TextSearcher API, aby wdrożyć własny moduł wyszukiwania tekstu w aplikacjach mobilnych.

Kluczowe funkcje interfejsu TextSearcher API

  • Przyjmuje jako dane wejściowe pojedynczy ciąg znaków, wyodrębnia wektory dystrybucyjne i przeprowadza w indeksie wyszukiwanie najbliższych sąsiadów.

  • Przetwarzanie tekstu wejściowego, w tym tokenizacja Wordpiece lub Sentencepiece w grafie lub poza nim.

Wymagania wstępne

Zanim zaczniesz korzystać z interfejsu TextSearcher API, musisz utworzyć indeks na podstawie niestandardowego korpusu tekstu, w którym chcesz wyszukiwać informacje. Możesz to zrobić, korzystając z interfejsu Model Maker Searcher API. Wystarczy, że wykonasz czynności opisane w samouczku i dostosujesz je do swoich potrzeb.

W tym celu potrzebujesz:

  • model osadzania tekstu TFLite, np. Universal Sentence Encoder. Na przykład:
    • ponownie wytrenowany w tym Colab, który jest zoptymalizowany pod kątem wnioskowania na urządzeniu. Wyszukiwanie ciągu tekstowego na Pixelu 6 zajmuje tylko 6 ms.
    • skwantyzowany, który jest mniejszy od powyższego, ale generowanie każdego osadzenia zajmuje 38 ms.
  • korpusu tekstowego.

Po tym kroku powinieneś mieć samodzielny model wyszukiwarki TFLite (np. mobilenet_v3_searcher.tflite), który jest oryginalnym modelem osadzania tekstu z indeksem dołączonym do metadanych modelu TFLite.

Uruchamianie wnioskowania w Javie

Krok 1. Zaimportuj zależność Gradle i inne ustawienia

Skopiuj plik modelu wyszukiwarki .tflite do katalogu zasobów modułu Android, w którym będzie uruchamiany model. Określ, że plik nie powinien być skompresowany, i dodaj bibliotekę TensorFlow Lite do pliku build.gradle modułu:

android {
    // Other settings

    // Specify tflite index file should not be compressed for the app apk
    aaptOptions {
        noCompress "tflite"
    }

}

dependencies {
    // Other dependencies

    // Import the Task Vision Library dependency
    implementation 'org.tensorflow:tensorflow-lite-task-vision:0.4.4'
    // Import the GPU delegate plugin Library for GPU inference
    implementation 'org.tensorflow:tensorflow-lite-gpu-delegate-plugin:0.4.4'
}

Krok 2. Korzystanie z modelu

// Initialization
TextSearcherOptions options =
    TextSearcherOptions.builder()
        .setBaseOptions(BaseOptions.builder().useGpu().build())
        .setSearcherOptions(
            SearcherOptions.builder().setL2Normalize(true).build())
        .build();
TextSearcher textSearcher =
    textSearcher.createFromFileAndOptions(context, modelFile, options);

// Run inference
List<NearestNeighbor> results = textSearcher.search(text);

Więcej opcji konfigurowania TextSearcher znajdziesz w kodzie źródłowym i dokumentacji Javadoc.

Uruchamianie wnioskowania w C++

// Initialization
TextSearcherOptions options;
options.mutable_base_options()->mutable_model_file()->set_file_name(model_path);
options.mutable_embedding_options()->set_l2_normalize(true);
std::unique_ptr<TextSearcher> text_searcher = TextSearcher::CreateFromOptions(options).value();

// Run inference with your input, `input_text`.
const SearchResult result = text_searcher->Search(input_text).value();

Więcej opcji konfigurowania TextSearcher znajdziesz w kodzie źródłowym.

Uruchamianie wnioskowania w Pythonie

Krok 1. Zainstaluj pakiet TensorFlow Lite Support Pypi.

Pakiet TensorFlow Lite Support Pypi możesz zainstalować za pomocą tego polecenia:

pip install tflite-support

Krok 2. Korzystanie z modelu

from tflite_support.task import text

# Initialization
text_searcher = text.TextSearcher.create_from_file(model_path)

# Run inference
result = text_searcher.search(text)

Więcej opcji konfigurowania TextSearcher znajdziesz w kodzie źródłowym.

Przykładowe wyniki

Results:
 Rank#0:
  metadata: The sun was shining on that day.
  distance: 0.04618
 Rank#1:
  metadata: It was a sunny day.
  distance: 0.10856
 Rank#2:
  metadata: The weather was excellent.
  distance: 0.15223
 Rank#3:
  metadata: The cat is chasing after the mouse.
  distance: 0.34271
 Rank#4:
  metadata: He was very happy with his newly bought car.
  distance: 0.37703

Wypróbuj proste narzędzie demonstracyjne CLI do TextSearcher z własnym modelem i danymi testowymi.