From c09909773ea8ec37cfbe7013e212027aaec54833 Mon Sep 17 00:00:00 2001 From: Nirant Date: Mon, 1 Apr 2024 20:48:26 +0530 Subject: [PATCH] Add Execution Counts (#177) * Update notebooks * Update FastEmbed usage across docs * Refactor code for better readability and maintainability * Clean outputs * Change dataset * Add numbers inline in output * Remove inline outputs since I used :memory: * Fix syntax error in Hindi_Tamil_RAG_with_Navarasa7B.ipynb --- .../examples/FastEmbed_vs_HF_Comparison.ipynb | 122 +- .../Hindi_Tamil_RAG_with_Navarasa7B.ipynb | 37 +- docs/examples/Hybrid_Search.ipynb | 100 +- docs/examples/SPLADE_with_FastEmbed.ipynb | 81 +- .../Binary_Quantization_with_Qdrant.ipynb | 1266 +---------------- docs/qdrant/Retrieval_with_FastEmbed.ipynb | 14 +- 6 files changed, 254 insertions(+), 1366 deletions(-) diff --git a/docs/examples/FastEmbed_vs_HF_Comparison.ipynb b/docs/examples/FastEmbed_vs_HF_Comparison.ipynb index 153ec1ba..9d043d60 100644 --- a/docs/examples/FastEmbed_vs_HF_Comparison.ipynb +++ b/docs/examples/FastEmbed_vs_HF_Comparison.ipynb @@ -15,7 +15,55 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: matplotlib in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (3.8.3)\n", + "Requirement already satisfied: transformers in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (4.39.2)\n", + "Requirement already satisfied: torch in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (2.2.0)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from matplotlib) (1.2.0)\n", + "Requirement already satisfied: cycler>=0.10 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from matplotlib) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from matplotlib) (4.50.0)\n", + "Requirement already satisfied: kiwisolver>=1.3.1 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from matplotlib) (1.4.5)\n", + "Requirement already satisfied: numpy<2,>=1.21 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from matplotlib) (1.26.4)\n", + "Requirement already satisfied: packaging>=20.0 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from matplotlib) (24.0)\n", + "Requirement already satisfied: pillow>=8 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from matplotlib) (10.2.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from matplotlib) (3.1.2)\n", + "Requirement already satisfied: python-dateutil>=2.7 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from matplotlib) (2.9.0.post0)\n", + "Requirement already satisfied: filelock in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from transformers) (3.13.1)\n", + "Requirement already satisfied: huggingface-hub<1.0,>=0.19.3 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from transformers) (0.20.3)\n", + "Requirement already satisfied: pyyaml>=5.1 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from transformers) (6.0.1)\n", + "Requirement already satisfied: regex!=2019.12.17 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from transformers) (2023.12.25)\n", + "Requirement already satisfied: requests in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from transformers) (2.31.0)\n", + "Requirement already satisfied: tokenizers<0.19,>=0.14 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from transformers) (0.15.2)\n", + "Requirement already satisfied: safetensors>=0.4.1 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from transformers) (0.4.2)\n", + "Requirement already satisfied: tqdm>=4.27 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from transformers) (4.66.2)\n", + "Requirement already satisfied: typing-extensions>=4.8.0 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from torch) (4.10.0)\n", + "Requirement already satisfied: sympy in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from torch) (1.12)\n", + "Requirement already satisfied: networkx in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from torch) (3.2.1)\n", + "Requirement already satisfied: jinja2 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from torch) (3.1.3)\n", + "Requirement already satisfied: fsspec in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from torch) (2024.2.0)\n", + "Requirement already satisfied: six>=1.5 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from jinja2->torch) (2.1.5)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from requests->transformers) (3.3.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from requests->transformers) (3.6)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from requests->transformers) (2.2.1)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from requests->transformers) (2024.2.2)\n", + "Requirement already satisfied: mpmath>=0.19 in /opt/homebrew/Caskroom/miniconda/base/envs/fst/lib/python3.10/site-packages (from sympy->torch) (1.3.0)\n" + ] + } + ], + "source": [ + "!pip install matplotlib transformers torch" + ] + }, + { + "cell_type": "code", + "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:38:48.671752Z", @@ -45,7 +93,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:43:34.512097Z", @@ -55,9 +103,11 @@ "outputs": [ { "data": { - "text/plain": "12" + "text/plain": [ + "12" + ] }, - "execution_count": 55, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -91,7 +141,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:43:35.417504Z", @@ -101,9 +151,11 @@ "outputs": [ { "data": { - "text/plain": "torch.Size([12, 384])" + "text/plain": [ + "torch.Size([12, 384])" + ] }, - "execution_count": 56, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -119,7 +171,9 @@ " self.tokenizer = AutoTokenizer.from_pretrained(model_id)\n", "\n", " def embed(self, texts: List[str]):\n", - " encoded_input = self.tokenizer(texts, max_length=512, padding=True, truncation=True, return_tensors=\"pt\")\n", + " encoded_input = self.tokenizer(\n", + " texts, max_length=512, padding=True, truncation=True, return_tensors=\"pt\"\n", + " )\n", " model_output = self.model(**encoded_input)\n", " sentence_embeddings = model_output[0][:, 0]\n", " sentence_embeddings = F.normalize(sentence_embeddings)\n", @@ -142,14 +196,26 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:43:35.486719Z", "start_time": "2024-03-30T00:43:35.416166Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", + "To disable this warning, you can either:\n", + "\t- Avoid using `tokenizers` before the fork if possible\n", + "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n", + "100%|██████████| 77.7M/77.7M [00:15<00:00, 4.99MiB/s]\n" + ] + } + ], "source": [ "embedding_model = TextEmbedding(model_name=model_id)" ] @@ -167,7 +233,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:43:35.693539Z", @@ -179,8 +245,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "Huggingface Transformers (Average, Max, Min): (0.053893327713012695, 0.055748701095581055, 0.052037954330444336)\n", - "FastEmbed (Average, Max, Min): (0.04135441780090332, 0.04371190071105957, 0.03899693489074707)\n" + "Huggingface Transformers (Average, Max, Min): (0.07326400279998779, 0.08054399490356445, 0.06598401069641113)\n", + "FastEmbed (Average, Max, Min): (0.09258604049682617, 0.13388705253601074, 0.0512850284576416)\n" ] } ], @@ -188,7 +254,9 @@ "import types\n", "\n", "\n", - "def calculate_time_stats(embed_func: Callable, documents: list, k: int) -> Tuple[float, float, float]:\n", + "def calculate_time_stats(\n", + " embed_func: Callable, documents: list, k: int\n", + ") -> Tuple[float, float, float]:\n", " times = []\n", " for _ in range(k):\n", " # Timing the embed_func call\n", @@ -222,7 +290,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:43:35.746781Z", @@ -232,8 +300,10 @@ "outputs": [ { "data": { - "image/png": "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hITg66+/lvp4eHhg+/btGDNmDObOnQtXV1f89NNPCAwMlPq8++67SE5OxsSJE5GQkIDatWsjMjJSY3I4ERER/Tfp1X2a/s14nyYielO8TxPRq/E+TURERET/AgxNRERERDIwNBERERHJwNBEREREJANDExEREZEMDE1EREREMjA0EREREcnA0EREREQkA0MTERERkQwMTUREREQyMDQRERERycDQRERERCQDQxMRERGRDAxNRERERDIwNBERERHJwNBEREREJANDExEREZEMDE1EREREMjA0EREREcnA0EREREQkA0MTERERkQwMTUREREQyMDQRERERycDQRERERCQDQxMRERGRDAxNRERERDIwNBERERHJwNBEREREJANDExEREZEMDE1EREREMhiVdgFEf0dWdi6W/L4XMRfv4NzlO0jPyMb0if3Qs2Njjb4qlQorNxzFqo1HcSs+CeamxvCuUh5fjukOn6quan3v3EvGzMXbcfT0VWRm56Kcoy06tK2D8cM6qfVbseYQfl13BHfvP0YZW0t09K+Ljz7sAAtzU7V+cXeTMXXBFhw9fRV5efmoUa0Cxn7QAU3qV33tPr774VycjL5R5DIjQwPcOD73tWMQEZHuMDTRv1JKWibm/RSJ8s5l4F2lPE5EXS+27/hvVmJz5Bl0b98QIT1bIDsnD5eu3sXj1Ey1fpeu3UPvD+fB2cEGg/q2QRkbSzxITMWDxFS1fhHzN2PJb3vRvk1thL3bCjduJ2DFmkO4dushfps/XOr3IDEV3QfOgoGBAh+81xbm5qZYu/UE+o9YgJULRqBR3cqv3MfwsED07tJErS37aS4+/341mjeuJvdQERGRjjA00b+SY1klTu2YAseySpy/HI/OodOL7LdtTzTWbz+FxVMHIah1rWLHU6lUGDvpV3i6O+HPhSNgZmZSZL+kR+n4edV+dA9ugFlf9ZfaPSo6YNKMddh75AL8m/sCABat2IOMJ9nY9edn8HRzAgD06doEbXt+i2/mbMC2Xz9+5T42b6QZjDbuPA0A6BrY4JXrEhGR7nFOE/0rmZoYw7Gs8rX9fvrjAGpVd0NQ61pQqVTIfppbZL/DJ2Nx9eZDjBoUBDMzEzzNyUNBgUqjX/SF28gvUKFTQD219sLHW3dHS22nY26iuperFJgAwNzMBP4tauBi7F3cjk+Sta8v2rzrDCzM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OqXWtm/fPrRu3RoNGzbEd999p/PiiIiIiPSF7ND0ySefYNu2bdLj27dvo1OnTjAxMYGfnx8iIiL4hb1ERET01pJ9ee7MmTP4+OOPpccrV65E1apVsWvXLgBAzZo1MX/+fIwePVrnRRIRERGVNtlnmh49egRXV1fp8YEDB9CpUyfpcatWrRAXF6fT4oiIiIj0hezQZGdnh4cPHwJ4foPLM2fOoHHjxtLyvLw86ct7iYiIiN42skNTq1at8M033+Du3buYM2cOVCoVWrVqJS2/fPky3N3dS6BEIiIiotIne07TlClT0K5dO7i5ucHQ0BDz5s2DpaWltPy3335DmzZtSqRIIiIiotImOzS5u7vjypUruHTpEhwcHODi4qK2/KuvvlKb80RERET0NtHq5pZGRkaoVatWkcuKayciIiJ6G2j9hb1ERERE/0UMTUREREQyMDQRERERyaBVaMrPz8fXX3+Ne/fulVQ9RERERHpJq9BkZGSE6dOnIz8/v6TqISIiItJLWl+ea9OmDQ4dOlQStRARERHpLa1uOQAAwcHB+PTTT3HhwgXUq1dP7QaXANC5c2edFUdERESkL7QOTcOGDQMAzJo1S2OZQqFAQUHBm1dFREREpGe0Dk0qlaok6iAiIiLSa290y4GcnBxd1UFERESk17QOTQUFBfjmm29Qvnx5WFlZ4datWwCAL7/8Ej///LPOCyQiIiLSB1qHpilTpmD58uWYNm0aTExMpPYaNWrgp59+0mlxRERERPpC69D066+/YunSpejXrx8MDQ2l9lq1aiE2NlanxRERERHpC61D0/3791G5cmWNdpVKhWfPnumkKCIiIiJ9o3Vo8vHxwZEjRzTa161bhzp16uikKCIiIiJ9o/UtByZOnIiQkBDcv38fKpUKGzZswNWrV/Hrr79i27ZtJVEjERERUanT+kxTly5dsHXrVuzduxeWlpaYOHEirly5gq1bt6Jdu3YlUSMRERFRqdP6TBMANG/eHHv27NF1LURERER662+FJgA4c+YMrly5AuD5PKd69erprCgiIiIifaN1aLp37x769OmDo0ePwtbWFgCQlpaGJk2a4M8//4Srq6uuayQiIiIqdVrPaRo0aBCePXuGK1euICUlBSkpKbhy5QpUKhUGDRpUEjUSERERlTqtzzQdOnQIx44dg5eXl9Tm5eWF+fPno3nz5jot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Y4Pdu3dj+PDhqFevHsqWLYuJEyeq3cupSZMmWLVqFb744gt89tlnqFKlCjZt2oQaNWpotT9ERET09pJ9n6bu3bsDADZv3oygoCC1+TwFBQU4f/48vLy8EBkZWTKV6jnep4mo9PA+TUT/DaV9nybZZ5psbGwAPD/TZG1trTbp28TEBI0bN8bgwYP/ZslERERE+k12aFq2bBkAwN3dHePHj4eFhUWJFUVERESkb7SeCN6/f3/cv39fo/369euIi4vTRU1EREREekfr0BQaGopjx45ptJ88eRKhoaG6qImIiIhI72gdms6ePYumTZtqtDdu3Fi6dQARERHR20br0KRQKPDkyRON9vT09CK/yJeIiIjobaB1aGrRogUiIiLUAlJBQQEiIiLQrFkznRZHREREpC+0vrnl1KlT0aJFC3h5eaF58+YAgCNHjiAjIwP79+/XeYFERERE+kDrM00+Pj44f/48evXqhaSkJDx58gT9+/dHbGws76BNREREby2tzzQBgIuLC7777jtd10JERESkt/5WaAKA7OxsxMfHIy8vT629Zs2ab1wUERERkb7ROjQlJycjLCwMO3fuLHI5P0FHREREbyOt5zSNHj0aaWlpOHnyJMzNzREZGYkVK1agSpUq2LJlS0nUSERERFTqtD7TtH//fmzevBn169eHgYEB3Nzc0K5dOyiVSkRERKBDhw4lUScRERFRqdL6TFNWVhYcHR0BAGXKlEFycjIAwNfXF9HR0bqtjoiIiEhPaB2avLy8cPXqVQBArVq1sGTJEty/fx+LFy9GuXLldF4gERERkT7Q+vLcqFGj8PDhQwDApEmTEBQUhJUrV8LExATLly/XdX1EREREekHr0PTee+9J/65Xrx7u3LmD2NhYVKxYEWXLltVpcURERET6QqvLc8+ePYOnpyeuXLkitVlYWKBu3boMTERERPRW0yo0GRsbIycnp6RqISIiItJbWk8EHz58OKZOnYr8/PySqIeIiIhIL2k9p+n06dPYt28fdu/eDV9fX1haWqot37Bhg86KIyIiItIXWocmW1tb9OjRoyRqISIiItJbWoemZcuWlUQdRERERHpN6zlNRERERP9FWp9pAoB169ZhzZo1iI+PR15entoyfpUKERERvY20PtM0b948hIWFwcnJCWfPnkXDhg1hb2+PW7duITg4uCRqJCIiIip1WoemhQsXYunSpZg/fz5MTEzw8ccfY8+ePRg5ciTS09NLokYiIiKiUqd1aIqPj0eTJk0AAObm5njy5AkA4P3338cff/yh2+qIiIiI9ITWocnZ2RkpKSkAgIoVK+LEiRMAgNu3b0MIodvqiIiIiPSE1qGpTZs22LJlCwAgLCwMY8aMQbt27fDuu++iW7duOi+QiIiISB9o/em5pUuXQqVSAXj+lSr29vY4duwYOnfujA8++EDnBRIRERHpA61Dk4GBAQwM/v8EVe/evdG7d2+dFkVERESkb/7WfZrS0tJw6tQpJCUlSWedCvXv318nhRERERHpE61D09atW9GvXz9kZmZCqVRCoVBIyxQKBUMTERERvZW0ngj+0UcfYcCAAcjMzERaWhpSU1Oln8JP1RERERG9bbQOTffv38fIkSNhYWFREvUQERER6SWtQ1NgYCDOnDlTErUQERER6S1Zc5oK78sEAB06dMD48eNx+fJl+Pr6wtjYWK1v586ddVshERERkR6QFZq6du2q0fb1119rtCkUChQUFLxxUURERET6RlZoevm2AkRERET/NVrPaSIiIiL6L5Idmvbv3w8fHx9kZGRoLEtPT0f16tVx+PBhnRZHREREpC9kh6Y5c+Zg8ODBUCqVGstsbGzwwQcfYPbs2TotjoiIiEhfyA5N586dQ1BQULHLAwICEBUVpZOiiIiIiPSN7NCUmJiocXuBFxkZGSE5OVknRRERERHpG9mhqXz58rh48WKxy8+fP49y5crppCgiIiIifSM7NLVv3x5ffvklcnJyNJY9ffoUkyZNQseOHXVaHBEREZG+kHWfJgD44osvsGHDBlStWhXh4eHw8vICAMTGxmLBggUoKCjA559/XmKFEhEREZUm2aHJyckJx44dw9ChQzFhwgQIIQA8vwt4YGAgFixYACcnpxIrlIiIiKg0yQ5NAODm5oYdO3YgNTUVN27cgBACVapUQZkyZUqqPiIiIiK9oFVoKlSmTBk0aNBA17UQERER6S1+jQoRERGRDAxNRERERDIwNBERERHJwNBEREREJANDExEREZEMDE1EREREMjA0EREREcnA0EREREQkA0MTERERkQwMTUREREQyMDQRERERycDQRERERCQDQxMRERGRDAxNRERERDIwNBERERHJwNBEREREJANDExEREZEMDE1EREREMuh1aJo8eTIU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", - "text/plain": "
" + "image/png": "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i4kTJyI+Ph6VKlXCrFmz0KFDB9nHos4ti6+DUw4QFY9TDhDR61Ln77fWzNP0rmNoIio9DE1E9Lre23maiIiIiEoLQxMRERGRDAxNRERERDIwNBERERHJwNBEREREJANDExEREZEMDE1EREREMjA0EREREcnA0EREREQkA0MTERERkQwMTUREREQyMDQRERERycDQRERERCQDQxMRERGRDAxNRERERDIwNBERERHJwNBEREREJANDExEREZEMDE1EREREMjA0EREREcnA0EREREQkA0MTERERkQwMTUREREQyMDQRERERycDQRERERCQDQxMRERGRDAxNRERERDIwNBERERHJwNBEREREJANDExEREZEMDE1EREREMjA0EREREcnA0EREREQkA0MTERERkQwMTUREREQyMDQRERERycDQRERERCQDQxMRERGRDAxNRERERDIwNBERERHJwNBEREREJIN+aRdAREQk19mLtzB76VacOHsDQgjU9nHHl8O7oGplZ6nP7XuP0LTrlGK3EdjFF9993RsAcPrCTazfdgQxx6/gzv1kWCvMUKuaGz7/rCMquNqrrHv1RgK+mb8Bx09fg4GBPlo1roqJo7rB1tripXXHxF5BryGLil3+xWcdETLA/xVHT6WNoYmIiN4J5y7dxgeDF8DJ3gojB7ZDQYHAb+v2I/DThdi08gt4uDoAAGytzTF/ah+V9ffGXMCmiONo2sBLagv/dReOn76OgNa1UKWiEx48SseqtfvQsc9MbPzlc3h6OEl97yemoOenC2FhboyxQzshMzMby1dH49LVe/hn5RcwNCj+T2pFN4cia9rw71HsP3IJTRtWeZOnht4ShiYiInonzF22FcZGBtjw8+ewtjIDAHRrXw8tP/gWs3/YgvCZAwEApiZG6Na+nsr667YehoWZMVo3rSa1DezdEgu/7asUeDq2qQ3/3mFYuioSC77pK7UvWbkTmU+zseXXsSjnaAMAqFHVFR+HLMG6rUfQu1vjYmu3s7UssqaFP22Hu4sdani7qvlsUGngmCYiInonHDt1HU3qeUqBCQDsyyjQoFZFRB84jyeZ2cWum/QwDTGxV+DfsgaMjQyk9jrVK6icIXIvb4/KFcrianyiUnvE7tNo3aSaFJgAoEn9KqhQ3h7bdp1Q+3hOnY9H/O0H6NKurtrrUulgaCIiondCTk4e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b1+sXLkS48aNw5MnTzB48GCkpqaiSZMmiIiIkAITAKxevRohISFo3bo1dHV10aNHDyxa9L9vklYoFNi5cyeGDRuGOnXqoEyZMggNDVWay6lRo0b4448/MHHiRHz11VeoVKkSNm3aJDswERER0fuvVM80vU94pomo9PBMExG9LnX+fvPuOSIiIiIZtHYgOBHRf811t46lXQKRVqsQv7VU988zTUREREQyMDQRERERycDQRERERCQDQxMRERGRDAxNRERERDIwNBERERHJwNBEREREJANDExEREZEMDE1EREREMjA0EREREcnA0EREREQkA0MTERERkQwMTUREREQyMDQRERERycDQRERERCQDQxMRERGRDPpyOo0ZM0b2BufNm/faxRARERFpK1mh6eTJk0qPT5w4gby8PHh6egIALl++DD09PdSpU0fzFRIRERFpAVmhaffu3dK/582bBwsLC6xatQrW1tYAgJSUFPTv3x9NmzYtmSqJiIiISpnaY5rmzp2LsLAwKTABgLW1NaZNm4a5c+dqtDgiIiIibaF2aEpPT8eDBw9U2h88eIDHjx9rpCgiIiIibaN2aOrWrRv69++PDRs24M6dO7hz5w7Wr1+P4OBgdO/evSRqJCIiIip1ssY0PS88PBxffPEFevfujdzc3Gcb0ddHcHAwZs+erfECiYiIiLSB2qHJ1NQUP/zwA2bPno1r164BADw8PGBmZqbx4oiIiIi0hdqhqZCZmRmqV6+uyVqIiIiItJbaoenJkyf47rvvEBUVhaSkJBQUFCgtv379usaKIyIiItIWaoemgQMHYu/evfjkk09QtmxZ6OjolERdRERERFpF7dC0fft2bNu2DY0bNy6JeoiIiIi0ktpTDlhbW8PGxqYkaiEiIiLSWmqHpm+//RahoaHIzMwsiXqIiIiItJLal+fmzp2La9euwcHBAW5ubjAwMFBafuLECY0VR0RERKQt1A5NXbt2LYEyiIiIiLSb2qFp8uTJJVEHERERkVZ77cktY2NjcfHiRQBA1apVUatWLY0VRURERKRt1A5NSUlJCAwMxJ49e2BlZQUASE1NRcuWLfHXX3/Bzs5O0zUSERERlTq1754bPnw4Hj9+jPPnzyM5ORnJyck4d+4c0tPTMWLEiJKokYiIiKjUqX2mKSIiArt27YKXl5fU5u3tjSVLlqBt27YaLY6I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j5eIiIi01zs1T5M24zxNRKWH8zQR/TdwniYiIiKidwBDExEREZEMDE1EREREMjA0EREREcnA0EREREQkA0MTERERkQwMTUREREQyMDQRERERycDQRERERCQDQxMRERGRDAxNRERERDIwNBERERHJwNBEREREJANDExEREZEMDE1EREREMjA0EREREcnA0EREREQkA0MTERERkQwMTUREREQyMDQRERERycDQRERERCQDQxMRERGRDAxNRERERDIwNBERERHJwNBEREREJANDExEREZEMDE1EREREMjA0EREREcnA0EREREQkA0MTERERkQwMTUREREQyMDQRERERycDQRERERCQDQxMRERGRDAxNRERERDIwNBERERHJwNBEREREJANDExEREZEMDE1EREREMjA0EREREcnA0EREREQkA0MTERERkQwMTUREREQyMDQRERERycDQRERERCQDQxMRERGRDAxNL1iyZAnc3NxgbGyMBg0a4OjRo6VdEhEREWkBhqbn/P333xgzZgwmT56MEydOoEaNGvD390dSUlJpl0ZERESljKHpOfPmzcOgQYPQv39/eHt7Izw8HKampvjll19KuzQiIiIqZfqlXYC2yMnJQWxsLCZMmCC16erqws/PDzExMSr9s7OzkZ2dLT1OS0sDAKSnp5dIfQX5OSWyXaL3QUm97962xwW5pV0CkVYrifd64TaFEK/sy9D0/x4+fIj8/Hw4ODgotTs4OODSpUsq/cPCwjB16lSVdhcXlxKrkYiKplAsL+0SiOhtUChKbNOPHz+G4hXbZ2h6TRMmTMCYMWOkxwUFBUhOToatrS10dHRKsTIqaenp6XBxccHt27dhaWlZ2uUQUQng+/y/QwiBx48fw8nJ6ZV9GZr+X5kyZaCnp4fExESl9sTERDg6Oqr0NzIygpGRkVKblZVVSZZIWsbS0pIfpkTvOb7P/xtedYapEAeC/z9DQ0PUqVMHUVFRUltBQQGioqLg6+tbipURERGRNuCZpueMGTMGffv2Rd26dVG/fn0sWLAAT548Qf/+/Uu7NCIiIiplDE3P+eijj/DgwQOEhoYiISEBNWvWREREhMrgcPpvMzIywuTJk1UuzxLR+4PvcyqKjpBzjx0RERHRfxzHNBERERHJwNBEREREJANDExEREZEMDE1EREREMjA00X9SixYtMGrUKI1v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", + "text/plain": [ + "
" + ] }, "metadata": {}, "output_type": "display_data" @@ -287,7 +357,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 10, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:43:25.537072Z", @@ -295,11 +365,21 @@ } }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/b4/grpbcmrd36gc7q5_11whbn540000gn/T/ipykernel_42284/1958479940.py:8: UserWarning: Creating a tensor from a list of numpy.ndarrays is extremely slow. Please consider converting the list to a single numpy.ndarray with numpy.array() before converting to a tensor. (Triggered internally at /Users/runner/work/pytorch/pytorch/pytorch/torch/csrc/utils/tensor_new.cpp:278.)\n", + " calculate_cosine_similarity(hf.embed(documents), Tensor(list(embedding_model.embed(documents))))\n" + ] + }, { "data": { - "text/plain": "0.9999997019767761" + "text/plain": [ + "0.9999997019767761" + ] }, - "execution_count": 49, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -339,7 +419,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.17" + "version": "3.10.13" }, "orig_nbformat": 4 }, diff --git a/docs/examples/Hindi_Tamil_RAG_with_Navarasa7B.ipynb b/docs/examples/Hindi_Tamil_RAG_with_Navarasa7B.ipynb index 0b839727..e18dbc15 100644 --- a/docs/examples/Hindi_Tamil_RAG_with_Navarasa7B.ipynb +++ b/docs/examples/Hindi_Tamil_RAG_with_Navarasa7B.ipynb @@ -22,28 +22,39 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": { "id": "rOTVBRFAj2U-" }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", + "To disable this warning, you can either:\n", + "\t- Avoid using `tokenizers` before the fork if possible\n", + "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n" + ] + } + ], "source": [ "!pip install -U fastembed datasets qdrant-client peft transformers accelerate bitsandbytes -qq" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 21, "metadata": { + "ExecuteTime": { + "end_time": "2024-03-30T00:45:24.814968Z", + "start_time": "2024-03-30T00:45:24.811138Z" + }, "colab": { "base_uri": "https://localhost:8080/" }, "id": "aAfdPG15j2U_", - "outputId": "c457a5dd-bccb-4b56-8c7f-878dfc94884d", - "ExecuteTime": { - "end_time": "2024-03-30T00:45:24.814968Z", - "start_time": "2024-03-30T00:45:24.811138Z" - } + "outputId": "c457a5dd-bccb-4b56-8c7f-878dfc94884d" }, "outputs": [], "source": [ @@ -61,11 +72,11 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ - "hf_token = \"\" # Get your token from https://huggingface.co/settings/token, needed for Gemma weights" + "hf_token = # Get your token from https://huggingface.co/settings/token, needed for Gemma weights" ] }, { @@ -88,7 +99,7 @@ "outputs": [], "source": [ "embedding_model = \"sentence-transformers/paraphrase-multilingual-mpnet-base-v2\"\n", - "model_id = \"Telugu-LLM-Labs/Indic-gemma-7b-finetuned-sft-Navarasa\"" + "model_id = \"Telugu-LLM-Labs/Indic-gemma-2b-finetuned-sft-Navarasa\"" ] }, { @@ -451,9 +462,9 @@ "provenance": [] }, "kernelspec": { - "name": "python3", + "display_name": "Python 3 (ipykernel)", "language": "python", - "display_name": "Python 3 (ipykernel)" + "name": "python3" }, "language_info": { "codemirror_mode": { diff --git a/docs/examples/Hybrid_Search.ipynb b/docs/examples/Hybrid_Search.ipynb index 14a9a832..9ed03cc7 100644 --- a/docs/examples/Hybrid_Search.ipynb +++ b/docs/examples/Hybrid_Search.ipynb @@ -31,7 +31,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -40,7 +40,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:46:59.293555Z", @@ -76,7 +76,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -85,7 +85,7 @@ "'0.2.5'" ] }, - "execution_count": 2, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -96,7 +96,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:47:06.815264Z", @@ -113,7 +113,7 @@ "})" ] }, - "execution_count": 3, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -135,7 +135,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:47:06.831216Z", @@ -321,7 +321,7 @@ "5 Panasonic FV-08VRE2 Ventilation Fan with Reces... " ] }, - "execution_count": 4, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -335,7 +335,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:47:06.842492Z", @@ -358,7 +358,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:47:06.843214Z", @@ -372,7 +372,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:47:06.843675Z", @@ -386,7 +386,7 @@ "176" ] }, - "execution_count": 7, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -404,7 +404,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:47:08.983795Z", @@ -415,7 +415,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "350b127222dc4ea1bb13183b0b424868", + "model_id": "930a97b272324022a4ce1a2ff7637c53", "version_major": 2, "version_minor": 0 }, @@ -429,7 +429,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "a2a543cab92a42fb801b9842ad69b0c7", + "model_id": "74778cee8094426da10c2e2bb780daa0", "version_major": 2, "version_minor": 0 }, @@ -451,7 +451,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:47:09.018037Z", @@ -479,7 +479,7 @@ " 13850, 16602, 23924]))]" ] }, - "execution_count": 9, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -515,7 +515,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:47:12.171596Z", @@ -538,7 +538,7 @@ " 'sources': {'hf': 'Qdrant/SPLADE_PP_en_v1'}}]" ] }, - "execution_count": 10, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -549,7 +549,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -645,7 +645,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:48:11.018700Z", @@ -663,7 +663,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:48:12.418869Z", @@ -677,7 +677,7 @@ "(1024,)" ] }, - "execution_count": 13, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -688,7 +688,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:48:13.789029Z", @@ -702,15 +702,15 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 6min 15s, sys: 44.3 s, total: 6min 59s\n", - "Wall time: 3min 6s\n" + "CPU times: user 5min 57s, sys: 22 s, total: 6min 19s\n", + "Wall time: 1min 37s\n" ] } ], @@ -732,7 +732,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -752,7 +752,7 @@ "Name: sparse_embedding, Length: 176, dtype: object" ] }, - "execution_count": 16, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -763,15 +763,15 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 15min 46s, sys: 4.48 s, total: 15min 50s\n", - "Wall time: 2min 46s\n" + "CPU times: user 15min 51s, sys: 31.7 s, total: 16min 23s\n", + "Wall time: 3min\n" ] } ], @@ -789,7 +789,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:48:19.041998Z", @@ -814,7 +814,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:48:23.670884Z", @@ -828,7 +828,7 @@ "True" ] }, - "execution_count": 19, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -855,7 +855,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:48:26.252861Z", @@ -889,7 +889,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -898,7 +898,7 @@ "UpdateResult(operation_id=0, status=)" ] }, - "execution_count": 21, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -916,7 +916,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:48:48.298878Z", @@ -978,7 +978,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:48:53.075137Z", @@ -996,7 +996,7 @@ " ('E', 0.01775980832584606)]" ] }, - "execution_count": 23, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -1056,7 +1056,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -1069,7 +1069,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -1078,7 +1078,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -1097,7 +1097,7 @@ " (4, 0.01564927857935627)]" ] }, - "execution_count": 26, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -1108,7 +1108,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -1127,7 +1127,7 @@ " Record(id=4, payload={'text': 'Panasonic FV-08VRE2 Ventilation Fan with Recessed LED (Renewed)\\nPanasonic FV-08VRE2 Ventilation Fan with Recessed LED (Renewed)\\nPanasonic\\nWhite\\nNone\\nThe design solution for Fan/light combinations\\nEnergy Star rated architectural grade recessed Fan/LED light\\nQuiet, energy efficient and powerful 80 CFM ventilation hidden above the Ceiling\\nLED lamp is dimmable\\nBeautiful Lighting with 6-1/2”aperture and advanced luminaire design\\nThe design solution for Fan/light combinations\\nEnergy Star rated architectural grade recessed Fan/LED light\\nQuiet, energy efficient and powerful 80 CFM ventilation hidden above the Ceiling\\nLED lamp is dimmable\\nBeautiful Lighting with 6-1/2”aperture and advanced luminaire design', 'product_id': 'B07QJ7WYFQ'}, vector=None, shard_key=None)]" ] }, - "execution_count": 27, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -1149,7 +1149,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 29, "metadata": {}, "outputs": [ { @@ -1187,7 +1187,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -1196,7 +1196,7 @@ "11" ] }, - "execution_count": 29, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } diff --git a/docs/examples/SPLADE_with_FastEmbed.ipynb b/docs/examples/SPLADE_with_FastEmbed.ipynb index 53aad164..457b4056 100644 --- a/docs/examples/SPLADE_with_FastEmbed.ipynb +++ b/docs/examples/SPLADE_with_FastEmbed.ipynb @@ -47,23 +47,14 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:49:20.516644Z", "start_time": "2024-03-30T00:49:20.188543Z" } }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/joein/work/qdrant/fastembed/venv/lib/python3.11/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n" - ] - } - ], + "outputs": [], "source": [ "from fastembed import SparseTextEmbedding, SparseEmbedding\n", "from typing import List" @@ -78,7 +69,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:49:22.366294Z", @@ -88,9 +79,20 @@ "outputs": [ { "data": { - "text/plain": "[{'model': 'prithvida/Splade_PP_en_v1',\n 'vocab_size': 30522,\n 'description': 'Misspelled version of the model. Retained for backward compatibility. Independent Implementation of SPLADE++ Model for English',\n 'size_in_GB': 0.532,\n 'sources': {'hf': 'Qdrant/SPLADE_PP_en_v1'}},\n {'model': 'prithivida/Splade_PP_en_v1',\n 'vocab_size': 30522,\n 'description': 'Independent Implementation of SPLADE++ Model for English',\n 'size_in_GB': 0.532,\n 'sources': {'hf': 'Qdrant/SPLADE_PP_en_v1'}}]" + "text/plain": [ + "[{'model': 'prithvida/Splade_PP_en_v1',\n", + " 'vocab_size': 30522,\n", + " 'description': 'Misspelled version of the model. Retained for backward compatibility. Independent Implementation of SPLADE++ Model for English',\n", + " 'size_in_GB': 0.532,\n", + " 'sources': {'hf': 'Qdrant/SPLADE_PP_en_v1'}},\n", + " {'model': 'prithivida/Splade_PP_en_v1',\n", + " 'vocab_size': 30522,\n", + " 'description': 'Independent Implementation of SPLADE++ Model for English',\n", + " 'size_in_GB': 0.532,\n", + " 'sources': {'hf': 'Qdrant/SPLADE_PP_en_v1'}}]" + ] }, - "execution_count": 2, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -101,7 +103,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2024-03-30T00:49:27.193530Z", @@ -110,11 +112,18 @@ }, "outputs": [ { - "name": "stderr", - "output_type": "stream", - "text": [ - "Fetching 9 files: 100%|██████████| 9/9 [00:00<00:00, 63019.59it/s]\n" - ] + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2aa47b26ab01475e8d3577433037f685", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Fetching 9 files: 0%| | 0/9 [00:00,\n", - " 'optimizer_status': ,\n", - " 'vectors_count': 100000,\n", - " 'indexed_vectors_count': 0,\n", - " 'points_count': 100000,\n", - " 'segments_count': 5,\n", - " 'config': {'params': {'vectors': {'size': 1536,\n", - " 'distance': ,\n", - " 'hnsw_config': None,\n", - " 'quantization_config': None,\n", - " 'on_disk': True},\n", - " 'shard_number': 1,\n", - " 'replication_factor': 1,\n", - " 'write_consistency_factor': 1,\n", - " 'on_disk_payload': True},\n", - " 'hnsw_config': {'m': 16,\n", - " 'ef_construct': 100,\n", - " 'full_scan_threshold': 10000,\n", - " 'max_indexing_threads': 0,\n", - " 'on_disk': False,\n", - " 'payload_m': None},\n", - " 'optimizer_config': {'deleted_threshold': 0.2,\n", - " 'vacuum_min_vector_number': 1000,\n", - " 'default_segment_number': 5,\n", - " 'max_segment_size': None,\n", - " 'memmap_threshold': None,\n", - " 'indexing_threshold': 20000,\n", - " 'flush_interval_sec': 5,\n", - " 'max_optimization_threads': 1},\n", - " 'wal_config': {'wal_capacity_mb': 32, 'wal_segments_ahead': 0},\n", - " 'quantization_config': {'binary': {'always_ram': True}}},\n", - " 'payload_schema': {}}" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "collection_info = client.get_collection(collection_name=f\"{collection_name}\")\n", "collection_info.dict()" @@ -256,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -272,7 +166,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -288,652 +182,9 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
limitoversamplingrescorecorrecttotal queriestime
011.0False754234.632868
111.0True8840.298480
211.5False7540.225124
311.5True8340.268409
412.0False9040.227887
512.0True9040.368640
613.0False7840.202784
713.0True9240.427767
815.0False7240.196870
915.0True9640.556918
1031.0False8940.284389
1131.0True9240.469356
1231.5False9240.239615
1331.5True9740.538105
1432.0False9140.231395
1532.0True9340.676558
1633.0False9640.229494
1733.0True9540.894687
1835.0False9240.228185
1935.0True9741.418588
2051.0False9340.251973
2151.0True9540.702272
2251.5False8840.247825
2351.5True9740.832820
2452.0False9540.247442
2552.0True9640.934421
2653.0False9240.234346
2753.0True9741.309440
2855.0False8940.234266
2955.0True9742.010821
30101.0False9640.326593
31101.0True9641.025037
32101.5False8940.304709
33101.5True9641.299685
34102.0False9340.308194
35102.0True9841.680287
36103.0False9440.316083
37103.0True9442.348110
38105.0False9740.334111
39105.0True9643.689124
40201.0False9540.470449
41201.0True9841.808852
42201.5False9340.435893
43201.5True9442.496987
44202.0False9640.473800
45202.0True9543.306971
46203.0False9740.473543
47203.0True10044.618521
48205.0False9640.459217
49205.0True9747.186773
50501.0False9540.891328
51501.0True9544.245011
52501.5False9640.702362
53501.5True9845.981293
54502.0False9640.779303
55502.0True9447.743587
56503.0False9440.816802
57503.0True97410.909127
58505.0False9640.842580
59505.0True99417.818811
\n", - "
" - ], - "text/plain": [ - " limit oversampling rescore correct total queries time\n", - "0 1 1.0 False 75 4 234.632868\n", - "1 1 1.0 True 88 4 0.298480\n", - "2 1 1.5 False 75 4 0.225124\n", - "3 1 1.5 True 83 4 0.268409\n", - "4 1 2.0 False 90 4 0.227887\n", - "5 1 2.0 True 90 4 0.368640\n", - "6 1 3.0 False 78 4 0.202784\n", - "7 1 3.0 True 92 4 0.427767\n", - "8 1 5.0 False 72 4 0.196870\n", - "9 1 5.0 True 96 4 0.556918\n", - "10 3 1.0 False 89 4 0.284389\n", - "11 3 1.0 True 92 4 0.469356\n", - "12 3 1.5 False 92 4 0.239615\n", - "13 3 1.5 True 97 4 0.538105\n", - "14 3 2.0 False 91 4 0.231395\n", - "15 3 2.0 True 93 4 0.676558\n", - "16 3 3.0 False 96 4 0.229494\n", - "17 3 3.0 True 95 4 0.894687\n", - "18 3 5.0 False 92 4 0.228185\n", - "19 3 5.0 True 97 4 1.418588\n", - "20 5 1.0 False 93 4 0.251973\n", - "21 5 1.0 True 95 4 0.702272\n", - "22 5 1.5 False 88 4 0.247825\n", - "23 5 1.5 True 97 4 0.832820\n", - "24 5 2.0 False 95 4 0.247442\n", - "25 5 2.0 True 96 4 0.934421\n", - "26 5 3.0 False 92 4 0.234346\n", - "27 5 3.0 True 97 4 1.309440\n", - "28 5 5.0 False 89 4 0.234266\n", - "29 5 5.0 True 97 4 2.010821\n", - "30 10 1.0 False 96 4 0.326593\n", - "31 10 1.0 True 96 4 1.025037\n", - "32 10 1.5 False 89 4 0.304709\n", - "33 10 1.5 True 96 4 1.299685\n", - "34 10 2.0 False 93 4 0.308194\n", - "35 10 2.0 True 98 4 1.680287\n", - "36 10 3.0 False 94 4 0.316083\n", - "37 10 3.0 True 94 4 2.348110\n", - "38 10 5.0 False 97 4 0.334111\n", - "39 10 5.0 True 96 4 3.689124\n", - "40 20 1.0 False 95 4 0.470449\n", - "41 20 1.0 True 98 4 1.808852\n", - "42 20 1.5 False 93 4 0.435893\n", - "43 20 1.5 True 94 4 2.496987\n", - "44 20 2.0 False 96 4 0.473800\n", - "45 20 2.0 True 95 4 3.306971\n", - "46 20 3.0 False 97 4 0.473543\n", - "47 20 3.0 True 100 4 4.618521\n", - "48 20 5.0 False 96 4 0.459217\n", - "49 20 5.0 True 97 4 7.186773\n", - "50 50 1.0 False 95 4 0.891328\n", - "51 50 1.0 True 95 4 4.245011\n", - "52 50 1.5 False 96 4 0.702362\n", - "53 50 1.5 True 98 4 5.981293\n", - "54 50 2.0 False 96 4 0.779303\n", - "55 50 2.0 True 94 4 7.743587\n", - "56 50 3.0 False 94 4 0.816802\n", - "57 50 3.0 True 97 4 10.909127\n", - "58 50 5.0 False 96 4 0.842580\n", - "59 50 5.0 True 99 4 17.818811" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "import time\n", "\n", @@ -973,7 +224,9 @@ " for rescore in rescore_grid:\n", " # print(f\"limit={limit}, oversampling={oversampling}, rescore={rescore}\")\n", " start = time.time()\n", - " correct_results = count_correct(query_dataset, limit=limit, oversampling=oversampling, rescore=rescore)\n", + " correct_results = count_correct(\n", + " query_dataset, limit=limit, oversampling=oversampling, rescore=rescore\n", + " )\n", " end = time.time()\n", " results.append(\n", " {\n", @@ -992,484 +245,15 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
candidatesrescoretime
01.0False234.632868
11.0True0.298480
21.5False0.225124
31.5True0.268409
42.0False0.227887
52.0True0.368640
63.0False0.202784
73.0True0.427767
85.0False0.196870
95.0True0.556918
103.0False0.284389
113.0True0.469356
124.5False0.239615
134.5True0.538105
146.0False0.231395
156.0True0.676558
169.0False0.229494
179.0True0.894687
1815.0False0.228185
1915.0True1.418588
205.0False0.251973
215.0True0.702272
227.5False0.247825
237.5True0.832820
2410.0False0.247442
2510.0True0.934421
2615.0False0.234346
2715.0True1.309440
2825.0False0.234266
2925.0True2.010821
3010.0False0.326593
3110.0True1.025037
3215.0False0.304709
3315.0True1.299685
3420.0False0.308194
3520.0True1.680287
3630.0False0.316083
3730.0True2.348110
3850.0False0.334111
3950.0True3.689124
4020.0False0.470449
4120.0True1.808852
4230.0False0.435893
4330.0True2.496987
4440.0False0.473800
4540.0True3.306971
4660.0False0.473543
4760.0True4.618521
48100.0False0.459217
49100.0True7.186773
5050.0False0.891328
5150.0True4.245011
5275.0False0.702362
5375.0True5.981293
54100.0False0.779303
55100.0True7.743587
56150.0False0.816802
57150.0True10.909127
58250.0False0.842580
59250.0True17.818811
\n", - "
" - ], - "text/plain": [ - " candidates rescore time\n", - "0 1.0 False 234.632868\n", - "1 1.0 True 0.298480\n", - "2 1.5 False 0.225124\n", - "3 1.5 True 0.268409\n", - "4 2.0 False 0.227887\n", - "5 2.0 True 0.368640\n", - "6 3.0 False 0.202784\n", - "7 3.0 True 0.427767\n", - "8 5.0 False 0.196870\n", - "9 5.0 True 0.556918\n", - "10 3.0 False 0.284389\n", - "11 3.0 True 0.469356\n", - "12 4.5 False 0.239615\n", - "13 4.5 True 0.538105\n", - "14 6.0 False 0.231395\n", - "15 6.0 True 0.676558\n", - "16 9.0 False 0.229494\n", - "17 9.0 True 0.894687\n", - "18 15.0 False 0.228185\n", - "19 15.0 True 1.418588\n", - "20 5.0 False 0.251973\n", - "21 5.0 True 0.702272\n", - "22 7.5 False 0.247825\n", - "23 7.5 True 0.832820\n", - "24 10.0 False 0.247442\n", - "25 10.0 True 0.934421\n", - "26 15.0 False 0.234346\n", - "27 15.0 True 1.309440\n", - "28 25.0 False 0.234266\n", - "29 25.0 True 2.010821\n", - "30 10.0 False 0.326593\n", - "31 10.0 True 1.025037\n", - "32 15.0 False 0.304709\n", - "33 15.0 True 1.299685\n", - "34 20.0 False 0.308194\n", - "35 20.0 True 1.680287\n", - "36 30.0 False 0.316083\n", - "37 30.0 True 2.348110\n", - "38 50.0 False 0.334111\n", - "39 50.0 True 3.689124\n", - "40 20.0 False 0.470449\n", - "41 20.0 True 1.808852\n", - "42 30.0 False 0.435893\n", - "43 30.0 True 2.496987\n", - "44 40.0 False 0.473800\n", - "45 40.0 True 3.306971\n", - "46 60.0 False 0.473543\n", - "47 60.0 True 4.618521\n", - "48 100.0 False 0.459217\n", - "49 100.0 True 7.186773\n", - "50 50.0 False 0.891328\n", - "51 50.0 True 4.245011\n", - "52 75.0 False 0.702362\n", - "53 75.0 True 5.981293\n", - "54 100.0 False 0.779303\n", - "55 100.0 True 7.743587\n", - "56 150.0 False 0.816802\n", - "57 150.0 True 10.909127\n", - "58 250.0 False 0.842580\n", - "59 250.0 True 17.818811" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df = results_df.copy()\n", "df[\"candidates\"] = df[\"oversampling\"] * df[\"limit\"]\n", "df[[\"candidates\", \"rescore\", \"time\"]]\n", "# df.to_csv(\"candidates-rescore-time.csv\", index=False)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# client.delete_collection(collection_name=f\"{collection_name}\")" - ] } ], "metadata": { @@ -1488,7 +272,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.17" + "version": "3.10.13" } }, "nbformat": 4, diff --git a/docs/qdrant/Retrieval_with_FastEmbed.ipynb b/docs/qdrant/Retrieval_with_FastEmbed.ipynb index 863cae04..3a48743d 100644 --- a/docs/qdrant/Retrieval_with_FastEmbed.ipynb +++ b/docs/qdrant/Retrieval_with_FastEmbed.ipynb @@ -39,15 +39,7 @@ "cell_type": "code", "execution_count": 2, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001B[32m2024-02-07 22:20:57.013\u001B[0m | \u001B[33m\u001B[1mWARNING \u001B[0m | \u001B[36mfastembed.embedding\u001B[0m:\u001B[36m\u001B[0m:\u001B[36m7\u001B[0m - \u001B[33m\u001B[1mDefaultEmbedding, FlagEmbedding, JinaEmbedding are deprecated. Use TextEmbedding instead.\u001B[0m\n" - ] - } - ], + "outputs": [], "source": [ "from typing import List\n", "import numpy as np\n", @@ -140,7 +132,7 @@ { "data": { "text/plain": [ - "(array([-0.04393955, 0.04452892, -0.00760788, -0.03399807, 0.01951348],\n", + "(array([-0.06002192, 0.04322132, -0.00545516, -0.04419701, -0.00542277],\n", " dtype=float32),\n", " array([-0.06002192, 0.04322132, -0.00545516, -0.04419701, -0.00542277],\n", " dtype=float32))" @@ -183,7 +175,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.5" + "version": "3.10.13" }, "orig_nbformat": 4 },