From 668dd31d323ca2d7ba2dc7b8891a7339070b7219 Mon Sep 17 00:00:00 2001 From: "alyona.kavyerina" Date: Fri, 5 Jan 2024 14:46:57 +0000 Subject: [PATCH] =?UTF-8?q?Create=20Blog=20=E2=80=9Cneural-search-tutorial?= =?UTF-8?q?=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/blog/neural-search-tutorial.md | 258 ++++++++++++++++++ .../from_cms/1_f4gzrt6rkyqg8xvjr4bdtq-1-.webp | Bin 0 -> 8308 bytes .../from_cms/1_lotmmhjfexth1ucmtuhl7a.webp | Bin 0 -> 1132 bytes .../from_cms/1_vghoj7gujfjazpdmm9ebxa.webp | Bin 0 -> 25448 bytes .../from_cms/1_yoyuyv4zrz09skc8r6_lta.webp | Bin 0 -> 14098 bytes 5 files changed, 258 insertions(+) create mode 100644 qdrant-landing/content/blog/neural-search-tutorial.md create mode 100644 qdrant-landing/static/blog/from_cms/1_f4gzrt6rkyqg8xvjr4bdtq-1-.webp create mode 100644 qdrant-landing/static/blog/from_cms/1_lotmmhjfexth1ucmtuhl7a.webp create mode 100644 qdrant-landing/static/blog/from_cms/1_vghoj7gujfjazpdmm9ebxa.webp create mode 100644 qdrant-landing/static/blog/from_cms/1_yoyuyv4zrz09skc8r6_lta.webp diff --git a/qdrant-landing/content/blog/neural-search-tutorial.md b/qdrant-landing/content/blog/neural-search-tutorial.md new file mode 100644 index 000000000..d65385285 --- /dev/null +++ b/qdrant-landing/content/blog/neural-search-tutorial.md @@ -0,0 +1,258 @@ +--- +draft: true +title: Neural Search Tutorial +slug: neural-search-tutorial +short_description: Neural Search Tutorial +description: Step-by-step guide on how to build a neural search service. +preview_image: /blog/from_cms/1_vghoj7gujfjazpdmm9ebxa.webp +date: 2024-01-05T14:09:57.544Z +author: Andrey Vasnetsov +featured: false +tags: [] +--- + + +Step-by-step guide on how to build a neural search service. + + + +![](/blog/from_cms/1_yoyuyv4zrz09skc8r6_lta.webp "How to build a neural search service with BERT + Qdrant + FastAPI") + +Information retrieval technology is one of the main technologies that enabled the modern Internet to exist. These days, search technology is the heart of a variety of applications. From web-pages search to product recommendations. For many years, this technology didn’t get much change until neural networks came into play. + +In this tutorial we are going to find answers to these questions: + +* What is the difference between regular and neural search? +* What neural networks could be used for search? +* In what tasks is neural network search useful? +* How to build and deploy own neural search service step-by-step? + +**What is neural search?** + +A regular full-text search, such as Google’s, consists of searching for keywords inside a document. For this reason, the algorithm can not take into account the real meaning of the query and documents. Many documents that might be of interest to the user are not found because they use different wording. + +Neural search tries to solve exactly this problem — it attempts to enable searches not by keywords but by meaning. To achieve this, the search works in 2 steps. In the first step, a specially trained neural network encoder converts the query and the searched objects into a vector representation called *embeddings*. The encoder must be trained so that similar objects, such as texts with the same meaning or alike pictures get a close vector representation. + +![](/blog/from_cms/1_vghoj7gujfjazpdmm9ebxa.webp "Neural encoder places cats closer together") + +Having this vector representation, it is easy to understand what the second step should be. To find documents similar to the query you now just need to find the nearest vectors. The most convenient way to determine the distance between two vectors is to calculate the cosine distance. The usual Euclidean distance can also be used, but it is not so efficient due to the [curse of dimensionality](https://en.wikipedia.org/wiki/Curse_of_dimensionality). + +**Which model could be used?** + +It is ideal to use a model specially trained to determine the closeness of meanings. For example, models trained on Semantic Textual Similarity (STS) datasets. Current state-of-the-art models could be found on this [leaderboard](https://paperswithcode.com/sota/semantic-textual-similarity-on-sts-benchmark?p=roberta-a-robustly-optimized-bert-pretraining). + +However, not only specially trained models can be used. If the model is trained on a large enough dataset, its internal features can work as embeddings too. So, for instance, you can take any pre-trained on ImageNet model and cut off the last layer from it. In the penultimate layer of the neural network, as a rule, the highest-level features are formed, which, however, do not correspond to specific classes. The output of this layer can be used as an embedding. + +**What tasks is neural search good for?** + +Neural search has the greatest advantage in areas where the query cannot be formulated precisely. Querying a table in a SQL database is not the best place for neural search. + +On the contrary, if the query itself is fuzzy, or it cannot be formulated as a set of conditions — neural search can help you. If the search query is a picture, sound file or long text, neural network search is almost the only option. + +If you want to build a recommendation system, the neural approach can also be useful. The user’s actions can be encoded in vector space in the same way as a picture or text. And having those vectors, it is possible to find semantically similar users and determine the next probable user actions. + +**Let’s build our own** + +With all that said, let’s make our neural network search. As an example, I decided to make a search for startups by their description. In this demo, we will see the cases when text search works better and the cases when neural network search works better. + +I will use data from [startups-list.com](https://www.startups-list.com/). Each record contains the name, a paragraph describing the company, the location and a picture. Raw parsed data can be found at [this link](https://storage.googleapis.com/generall-shared-data/startups_demo.json). + +**Prepare data for neural search** + +To be able to search for our descriptions in vector space, we must get vectors first. We need to encode the descriptions into a vector representation. As the descriptions are textual data, we can use a pre-trained language model. As mentioned above, for the task of text search there is a whole set of pre-trained models specifically tuned for semantic similarity. + +One of the easiest libraries to work with pre-trained language models, in my opinion, is the [sentence-transformers](https://github.com/UKPLab/sentence-transformers) by UKPLab. It provides a way to conveniently download and use many pre-trained models, mostly based on transformer architecture. Transformers is not the only architecture suitable for neural search, but for our task, it is quite enough. + +We will use a model called **`distilbert-base-nli-stsb-mean-tokens**\`. DistilBERT means that the size of this model has been reduced by a special technique compared to the original BERT. This is important for the speed of our service and its demand for resources. The word \`stsb` in the name means that the model was trained for the Semantic Textual Similarity task. + +The complete code for data preparation with detailed comments can be found and run in [Colab Notebook](https://colab.research.google.com/drive/1kPktoudAP8Tu8n8l-iVMOQhVmHkWV_L9?usp=sharing). + +![](/blog/from_cms/1_lotmmhjfexth1ucmtuhl7a.webp "What tasks is neural search good for? Neural search has the greatest advantage in areas where the query cannot be formulated precisely. Querying a table in a SQL database is not the best place for neural search. On the contrary, if the query itself is fuzzy, or it cannot be formulated as a set of conditions — neural search can help you. If the search query is a picture, sound file or long text, neural network search is almost the only option. If you want to build a recommendation system, the neural approach can also be useful. The user’s actions can be encoded in vector space in the same way as a picture or text. And having those vectors, it is possible to find semantically similar users and determine the next probable user actions. Let’s build our own With all that said, let’s make our neural network search. As an example, I decided to make a search for startups by their description. In this demo, we will see the cases when text search works better and the cases when neural network search works better. I will use data from startups-list.com. Each record contains the name, a paragraph describing the company, the location and a picture. Raw parsed data can be found at this link. Prepare data for neural search To be able to search for our descriptions in vector space, we must get vectors first. We need to encode the descriptions into a vector representation. As the descriptions are textual data, we can use a pre-trained language model. As mentioned above, for the task of text search there is a whole set of pre-trained models specifically tuned for semantic similarity. One of the easiest libraries to work with pre-trained language models, in my opinion, is the sentence-transformers by UKPLab. It provides a way to conveniently download and use many pre-trained models, mostly based on transformer architecture. Transformers is not the only architecture suitable for neural search, but for our task, it is quite enough. We will use a model called `distilbert-base-nli-stsb-mean-tokens`. DistilBERT means that the size of this model has been reduced by a special technique compared to the original BERT. This is important for the speed of our service and its demand for resources. The word `stsb` in the name means that the model was trained for the Semantic Textual Similarity task. The complete code for data preparation with detailed comments can be found and run in Colab Notebook.") + +**Vector search engine** + +Now as we have a vector representation for all our records, we need to store them somewhere. In addition to storing, we may also need to add or delete a vector, save additional information with the vector. And most importantly, we need a way to search for the nearest vectors. + +The vector search engine can take care of all these tasks. It provides a convenient API for searching and managing vectors. + +In our tutorial we will use [Qdrant](https://qdrant.tech/) vector search engine. It not only supports all necessary operations with vectors but also allows to store additional payload along with vectors and use it to perform filtering of the search result. Qdrant has a client for python and also defines the API schema if you need to use it from other languages. + +The easiest way to use Qdrant is to run a pre-built image. So make sure you have Docker installed on your system. + +To start Qdrant, use the instructions on its [homepage](https://github.com/qdrant/qdrant). + +Download image from [DockerHub](https://hub.docker.com/r/generall/qdrant): + +`docker pull qdrant/qdrant` + +And run the service inside the docker: + +`docker run -p 6333:6333 \`\ +`-v $(pwd)/qdrant_storage:/qdrant/storage \`\ +`qdrant/qdrant` + +You should see output like this + +```abuild +`...`\ +`[...] Starting 12 workers`\ +`[...] Starting "actix-web-service-0.0.0.0:6333" service on 0.0.0.0:6333` +``` + +This means that the service is successfully launched and listening port 6333. To make sure you can test  in your browser and get qdrant version info. + +All uploaded to Qdrant data is saved into the `*./qdrant_storage*` directory and will be persisted even if you recreate the container. + +**Upload data to Qdrant** + +Now once we have the vectors prepared and the search engine running, we can start uploading the data. To interact with Qdrant from python, I recommend using an out-of-the-box client library. + +To install it, use the following command + +`pip install qdrant-client` + +At this point, we should have startup records in file `*startups.json*\`, encoded vectors in file `*startup_vectors.npy*`, and running Qdrant on a local machine. Let’s write a script to upload all startup data and vectors into the search engine. + +First, let’s create a client object for Qdrant. + +```abuild +# Import client library +from qdrant_client import QdrantClient +from qdrant_client import models +qdrant_client = QdrantClient(host=’localhost’, port=6333) +``` + +Qdrant allows you to combine vectors of the same purpose into collections. Many independent vector collections can exist on one service at the same time. + +Let’s create a new collection for our startup vectors. + +```abuild +`qdrant_client.recreate_collection(`\ +`collection_name='startups',`\ +`vectors_config=models.VectorParams(size=768, distance="Cosine")`\ +`)` +``` + +The `*recreate_collection*` function first tries to remove an existing collection with the same name. This is useful if you are experimenting and running the script several times. + +The `*vector_size*\` parameter is very important. It tells the service the size of the vectors in that collection. All vectors in a collection must have the same size, otherwise, it is impossible to calculate the distance between them. `*768*` is the output dimensionality of the encoder we are using. + +The `*distance*` parameter allows specifying the function used to measure the distance between two points. + +The Qdrant client library defines a special function that allows you to load datasets into the service. However, since there may be too much data to fit a single computer memory, the function takes an iterator over the data as input. + +Let’s create an iterator over the startup data and vectors. + +``` +import numpy as np +import json + +fd = open('./startups.json') + +# payload is now an iterator over startup data +payload = map(json.loads, fd) + +# Here we load all vectors into memory, numpy array works as iterable for itself. +# Other option would be to use Mmap, if we don't want to load all data into RAM +vectors = np.load('./startup_vectors.npy') + +# And the final step - data uploading +qdrant_client.upload_collection( + collection_name='startups', + vectors=vectors, + payload=payload, + ids=None, # Vector ids will be assigned automatically + batch_size=256 # How many vectors will be uploaded in a single request? +``` + +Now we have vectors, uploaded to the vector search engine. On the next step we will learn how to actually search for closest vectors. + +The full code for this step could be found [here](https://github.com/qdrant/qdrant_demo/blob/master/qdrant_demo/init_vector_search_index.py). + +**Make a search API** + +Now that all the preparations are complete, let’s start building a neural search class. + +First, install all the requirements: + +`pip install sentence-transformers numpy` + +In order to process incoming requests neural search will need 2 things. A model to convert the query into a vector and Qdrant client, to perform a search queries. + +``` +# File: neural_searcher.py + +from qdrant_client import QdrantClient +from sentence_transformers import SentenceTransformer + + +class NeuralSearcher: + + def __init__(self, collection_name): + self.collection_name = collection_name + # Initialize encoder model + self.model = SentenceTransformer('distilbert-base-nli-stsb-mean-tokens', device='cpu') + # initialize Qdrant client + self.qdrant_client = QdrantClient(host='localhost', port=6333) + + # The search function looks as simple as possible: + + def search(self, text: str): + # Convert text query into vector + vector = self.model.encode(text).tolist() + + # Use `vector` for search for closest vectors in the collection + search_result = self.qdrant_client.search( + collection_name=self.collection_name, + query_vector=vector, + query_filter=None, # We don't want any filters for now + top=5 # 5 the most closest results is enough + ) + + # `search_result` contains found vector ids with similarity scores along with the stored payload + # In this function we are interested in payload only + payloads = [hit.payload for hit in search_result] + return payloads +``` + +With Qdrant it is also feasible to add some conditions to the search. For example, if we wanted to search for startups in a certain city, the search query could look like this: + +We now have a class for making neural search queries. Let’s wrap it up into a service. + +**Deploy as a service** + +To build the service we will use the FastAPI framework. It is super easy to use and requires minimal code writing. + +To install it, use the command + +`pip install fastapi uvicorn` + +Our service will have only one API endpoint and will look like this: + +Now, if you run the service with + +`python service.py` + +[ttp://localhost:8000/docs](http://localhost:8000/docs) , you should be able to see a debug interface for your service. + +![](/blog/from_cms/1_f4gzrt6rkyqg8xvjr4bdtq-1-.webp "FastAPI Swagger interface") + + + +Feel free to play around with it, make queries and check out the results. + +This concludes the tutorial. + +**Online Demo** + +The described code is the core of this [online demo](https://demo.qdrant.tech/). + +You can try it to get an intuition for cases when the neural search is useful. The demo contains a switch that selects between neural and full-text searches. You can turn neural search on and off to compare the result with regular full-text search. Try to use startup description to find similar ones. + +**Conclusion** + +In this tutorial, I have tried to give minimal information about neural search, but enough to start using it. Many potential applications are not mentioned here, this is a space to go further into the subject. + +Subscribe to my [telegram channel](https://t.me/neural_network_engineering), where I talk about neural networks engineering, publish other examples of neural networks and neural search applications. + +Subscribe to the [Qdrant user’s group](https://discord.gg/tdtYvXjC4h) if you want to be updated on latest Qdrant news and features. \ No newline at end of file diff --git a/qdrant-landing/static/blog/from_cms/1_f4gzrt6rkyqg8xvjr4bdtq-1-.webp b/qdrant-landing/static/blog/from_cms/1_f4gzrt6rkyqg8xvjr4bdtq-1-.webp new file mode 100644 index 0000000000000000000000000000000000000000..8ce06017e99d8750c1eec88877a72cd926f7deda GIT binary patch literal 8308 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%0Amvmzg@Jv9uQQ(KT9I(s#&pC%jK#a~c6* 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 S7C=la1?pjjvPFPw5C8yO7vO6E literal 0 HcmV?d00001 diff --git a/qdrant-landing/static/blog/from_cms/1_vghoj7gujfjazpdmm9ebxa.webp b/qdrant-landing/static/blog/from_cms/1_vghoj7gujfjazpdmm9ebxa.webp new file mode 100644 index 0000000000000000000000000000000000000000..50bf669d7d7153927978b616185bb995be41a509 GIT binary patch literal 25448 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