Skip to content

adds support for int8 and uint8 dtypes in vectorizers #279

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Feb 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 8 additions & 39 deletions docs/user_guide/04_vectorizers.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -223,12 +223,12 @@
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# You can also create many embeddings at once\n",
"embeddings = hf.embed_many(sentences, as_buffer=True, dtype=\"float32\")\n"
"embeddings = hf.embed_many(sentences, as_buffer=True)\n"
]
},
{
Expand Down Expand Up @@ -660,13 +660,13 @@
"metadata": {},
"source": [
"## Selecting your float data type\n",
"When embedding text as byte arrays RedisVL supports 4 different floating point data types, `float16`, `float32`, `float64` and `bfloat16`.\n",
"When embedding text as byte arrays RedisVL supports 4 different floating point data types, `float16`, `float32`, `float64` and `bfloat16`, and 2 integer types, `int8` and `uint8`.\n",
"Your dtype set for your vectorizer must match what is defined in your search index. If one is not explicitly set the default is `float32`."
]
},
{
"cell_type": "code",
"execution_count": 19,
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
Expand All @@ -675,8 +675,9 @@
"# subsequent calls to embed('', as_buffer=True) and embed_many('', as_buffer=True) will now encode as float16\n",
"float16_bytes = vectorizer.embed('test sentence', as_buffer=True)\n",
"\n",
"# you can override this setting on each individual method call\n",
"float64_bytes = vectorizer.embed('test sentence', as_buffer=True, dtype=\"float64\")\n",
"# to generate embeddings with different dtype instantiate a new vectorizer\n",
"vectorizer_64 = HFTextVectorizer(dtype='float64')\n",
"float64_bytes = vectorizer_64.embed('test sentence', as_buffer=True)\n",
"\n",
"float16_bytes != float64_bytes"
]
Expand All @@ -690,38 +691,6 @@
"# cleanup\n",
"index.delete()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"dist = max(i for i in range(10))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dist"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
Expand All @@ -746,4 +715,4 @@
},
"nbformat": 4,
"nbformat_minor": 2
}
}
2 changes: 1 addition & 1 deletion redisvl/redis/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ def array_to_buffer(array: List[float], dtype: str) -> bytes:
raise ValueError(
f"Invalid data type: {dtype}. Supported types are: {[t.lower() for t in VectorDataType]}"
)
return np.array(array).astype(dtype.lower()).tobytes()
return np.array(array, dtype=dtype.lower()).tobytes()


def buffer_to_array(buffer: bytes, dtype: str) -> List[Any]:
Expand Down
2 changes: 2 additions & 0 deletions redisvl/schema/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ class VectorDataType(str, Enum):
FLOAT16 = "FLOAT16"
FLOAT32 = "FLOAT32"
FLOAT64 = "FLOAT64"
INT8 = "INT8"
UINT8 = "UINT8"


class VectorIndexAlgorithm(str, Enum):
Expand Down
5 changes: 5 additions & 0 deletions redisvl/utils/vectorize/text/azureopenai.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from tenacity import retry, stop_after_attempt, wait_random_exponential
from tenacity.retry import retry_if_not_exception_type

from redisvl.utils.utils import deprecated_argument
from redisvl.utils.vectorize.base import BaseVectorizer

# ignore that openai isn't imported
Expand Down Expand Up @@ -167,6 +168,7 @@ def _set_model_dims(self, model) -> int:
stop=stop_after_attempt(6),
retry=retry_if_not_exception_type(TypeError),
)
@deprecated_argument("dtype")
def embed_many(
self,
texts: List[str],
Expand Down Expand Up @@ -213,6 +215,7 @@ def embed_many(
stop=stop_after_attempt(6),
retry=retry_if_not_exception_type(TypeError),
)
@deprecated_argument("dtype")
def embed(
self,
text: str,
Expand Down Expand Up @@ -251,6 +254,7 @@ def embed(
stop=stop_after_attempt(6),
retry=retry_if_not_exception_type(TypeError),
)
@deprecated_argument("dtype")
async def aembed_many(
self,
texts: List[str],
Expand Down Expand Up @@ -299,6 +303,7 @@ async def aembed_many(
stop=stop_after_attempt(6),
retry=retry_if_not_exception_type(TypeError),
)
@deprecated_argument("dtype")
async def aembed(
self,
text: str,
Expand Down
3 changes: 3 additions & 0 deletions redisvl/utils/vectorize/text/bedrock.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from tenacity import retry, stop_after_attempt, wait_random_exponential
from tenacity.retry import retry_if_not_exception_type

from redisvl.utils.utils import deprecated_argument
from redisvl.utils.vectorize.base import BaseVectorizer


Expand Down Expand Up @@ -118,6 +119,7 @@ def _set_model_dims(self, model: str) -> int:
stop=stop_after_attempt(6),
retry=retry_if_not_exception_type(TypeError),
)
@deprecated_argument("dtype")
def embed(
self,
text: str,
Expand Down Expand Up @@ -158,6 +160,7 @@ def embed(
stop=stop_after_attempt(6),
retry=retry_if_not_exception_type(TypeError),
)
@deprecated_argument("dtype")
def embed_many(
self,
texts: List[str],
Expand Down
3 changes: 3 additions & 0 deletions redisvl/utils/vectorize/text/cohere.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from tenacity import retry, stop_after_attempt, wait_random_exponential
from tenacity.retry import retry_if_not_exception_type

from redisvl.utils.utils import deprecated_argument
from redisvl.utils.vectorize.base import BaseVectorizer

# ignore that cohere isn't imported
Expand Down Expand Up @@ -111,6 +112,7 @@ def _set_model_dims(self, model) -> int:
raise ValueError(f"Error setting embedding model dimensions: {str(e)}")
return len(embedding)

@deprecated_argument("dtype")
def embed(
self,
text: str,
Expand Down Expand Up @@ -177,6 +179,7 @@ def embed(
stop=stop_after_attempt(6),
retry=retry_if_not_exception_type(TypeError),
)
@deprecated_argument("dtype")
def embed_many(
self,
texts: List[str],
Expand Down
5 changes: 5 additions & 0 deletions redisvl/utils/vectorize/text/custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from pydantic.v1 import PrivateAttr

from redisvl.utils.utils import deprecated_argument
from redisvl.utils.vectorize.base import BaseVectorizer


Expand Down Expand Up @@ -155,6 +156,7 @@ def _validate_sync_callables(self) -> int:

return dims

@deprecated_argument("dtype")
def embed(
self,
text: str,
Expand Down Expand Up @@ -191,6 +193,7 @@ def embed(

return self._process_embedding(result, as_buffer, dtype)

@deprecated_argument("dtype")
def embed_many(
self,
texts: List[str],
Expand Down Expand Up @@ -239,6 +242,7 @@ def embed_many(
return embeddings

@validate_async
@deprecated_argument("dtype")
async def aembed(
self,
text: str,
Expand Down Expand Up @@ -280,6 +284,7 @@ async def aembed(
return self._process_embedding(result, as_buffer, dtype)

@validate_async
@deprecated_argument("dtype")
async def aembed_many(
self,
texts: List[str],
Expand Down
3 changes: 3 additions & 0 deletions redisvl/utils/vectorize/text/huggingface.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from pydantic.v1 import PrivateAttr

from redisvl.utils.utils import deprecated_argument
from redisvl.utils.vectorize.base import BaseVectorizer


Expand Down Expand Up @@ -79,6 +80,7 @@ def _set_model_dims(self):
raise ValueError(f"Error setting embedding model dimensions: {str(e)}")
return len(embedding)

@deprecated_argument("dtype")
def embed(
self,
text: str,
Expand Down Expand Up @@ -112,6 +114,7 @@ def embed(
embedding = self._client.encode([text], **kwargs)[0]
return self._process_embedding(embedding.tolist(), as_buffer, dtype)

@deprecated_argument("dtype")
def embed_many(
self,
texts: List[str],
Expand Down
5 changes: 5 additions & 0 deletions redisvl/utils/vectorize/text/mistral.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from tenacity import retry, stop_after_attempt, wait_random_exponential
from tenacity.retry import retry_if_not_exception_type

from redisvl.utils.utils import deprecated_argument
from redisvl.utils.vectorize.base import BaseVectorizer

# ignore that mistralai isn't imported
Expand Down Expand Up @@ -116,6 +117,7 @@ def _set_model_dims(self, model) -> int:
stop=stop_after_attempt(6),
retry=retry_if_not_exception_type(TypeError),
)
@deprecated_argument("dtype")
def embed_many(
self,
texts: List[str],
Expand Down Expand Up @@ -162,6 +164,7 @@ def embed_many(
stop=stop_after_attempt(6),
retry=retry_if_not_exception_type(TypeError),
)
@deprecated_argument("dtype")
def embed(
self,
text: str,
Expand Down Expand Up @@ -200,6 +203,7 @@ def embed(
stop=stop_after_attempt(6),
retry=retry_if_not_exception_type(TypeError),
)
@deprecated_argument("dtype")
async def aembed_many(
self,
texts: List[str],
Expand Down Expand Up @@ -248,6 +252,7 @@ async def aembed_many(
stop=stop_after_attempt(6),
retry=retry_if_not_exception_type(TypeError),
)
@deprecated_argument("dtype")
async def aembed(
self,
text: str,
Expand Down
5 changes: 5 additions & 0 deletions redisvl/utils/vectorize/text/openai.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from tenacity import retry, stop_after_attempt, wait_random_exponential
from tenacity.retry import retry_if_not_exception_type

from redisvl.utils.utils import deprecated_argument
from redisvl.utils.vectorize.base import BaseVectorizer

# ignore that openai isn't imported
Expand Down Expand Up @@ -121,6 +122,7 @@ def _set_model_dims(self, model) -> int:
stop=stop_after_attempt(6),
retry=retry_if_not_exception_type(TypeError),
)
@deprecated_argument("dtype")
def embed_many(
self,
texts: List[str],
Expand Down Expand Up @@ -167,6 +169,7 @@ def embed_many(
stop=stop_after_attempt(6),
retry=retry_if_not_exception_type(TypeError),
)
@deprecated_argument("dtype")
def embed(
self,
text: str,
Expand Down Expand Up @@ -205,6 +208,7 @@ def embed(
stop=stop_after_attempt(6),
retry=retry_if_not_exception_type(TypeError),
)
@deprecated_argument("dtype")
async def aembed_many(
self,
texts: List[str],
Expand Down Expand Up @@ -253,6 +257,7 @@ async def aembed_many(
stop=stop_after_attempt(6),
retry=retry_if_not_exception_type(TypeError),
)
@deprecated_argument("dtype")
async def aembed(
self,
text: str,
Expand Down
3 changes: 3 additions & 0 deletions redisvl/utils/vectorize/text/vertexai.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from tenacity import retry, stop_after_attempt, wait_random_exponential
from tenacity.retry import retry_if_not_exception_type

from redisvl.utils.utils import deprecated_argument
from redisvl.utils.vectorize.base import BaseVectorizer


Expand Down Expand Up @@ -128,6 +129,7 @@ def _set_model_dims(self) -> int:
stop=stop_after_attempt(6),
retry=retry_if_not_exception_type(TypeError),
)
@deprecated_argument("dtype")
def embed_many(
self,
texts: List[str],
Expand Down Expand Up @@ -173,6 +175,7 @@ def embed_many(
stop=stop_after_attempt(6),
retry=retry_if_not_exception_type(TypeError),
)
@deprecated_argument("dtype")
def embed(
self,
text: str,
Expand Down
Loading