From ef81aedc891d5c94c81352da1fe273d269ce5e55 Mon Sep 17 00:00:00 2001 From: Surya Date: Fri, 5 Apr 2024 00:19:00 -0700 Subject: [PATCH] tests run, omnoms --- tests/omnoms/vlite-unit.omom | Bin 0 -> 338589 bytes tests/unit.py | 3 + vlite/main.py | 203 +++++++---------------------------- vlite/model.py | 40 ++----- vlite/omom.py | 149 +++++++++++++++++++++++++ 5 files changed, 200 insertions(+), 195 deletions(-) create mode 100644 tests/omnoms/vlite-unit.omom create mode 100644 vlite/omom.py diff --git a/tests/omnoms/vlite-unit.omom b/tests/omnoms/vlite-unit.omom new file mode 100644 index 0000000000000000000000000000000000000000..e86a98c1bf4fbb045bf0cfa210b4c38b3f763373 GIT binary patch literal 338589 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œ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 V^|tRU%0?gVsB?BkgR|$){|8?~82A7H literal 0 HcmV?d00001 diff --git a/tests/unit.py b/tests/unit.py index 9a28175..d2ac261 100644 --- a/tests/unit.py +++ b/tests/unit.py @@ -105,6 +105,9 @@ def tearDownClass(cls): if os.path.exists('vlite-unit.npz'): print("[+] Removing vlite") os.remove('vlite-unit.npz') + if os.path.exists('vlite-unit.omom'): + print("[+] Removing vlite") + os.remove('vlite-unit.omom') if __name__ == '__main__': unittest.main(verbosity=2) \ No newline at end of file diff --git a/vlite/main.py b/vlite/main.py index ece5788..2a898d3 100644 --- a/vlite/main.py +++ b/vlite/main.py @@ -3,60 +3,35 @@ from .model import EmbeddingModel from .utils import chop_and_chunk import datetime +from .omom import Omom class VLite: - """ - A simple vector database for text embedding and retrieval. - - Attributes: - collection (str): Path to the collection file. - device (str): Device to use for embedding ('cpu' or 'cuda'). - model (EmbeddingModel): The embedding model used for text representation. - - Methods: - add(text, id=None, metadata=None): Adds a text to the collection with optional ID and metadata. - retrieve(text=None, id=None, top_k=5): Retrieves similar texts from the collection. - save(): Saves the collection to a file. - """ def __init__(self, collection=None, device='cpu', model_name='mixedbread-ai/mxbai-embed-large-v1'): if collection is None: current_datetime = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") collection = f"vlite_{current_datetime}" - self.collection = f"{collection}.npz" + self.collection = f"{collection}" self.device = device self.model = EmbeddingModel(model_name) if model_name else EmbeddingModel() + + self.omom = Omom() + self.index = {} try: - with np.load(self.collection, allow_pickle=True) as data: - index_data = data['index'].item() + with self.omom.read(collection) as omom_file: self.index = { chunk_id: { 'text': chunk_data['text'], 'metadata': chunk_data['metadata'], - 'vector': np.array(chunk_data['vector']), # Convert back to numpy array - 'binary_vector': np.array(chunk_data['binary_vector']), # Convert back to numpy array - 'int8_vector': np.array(chunk_data['int8_vector']) # Convert back to numpy array + 'binary_vector': np.array(chunk_data['binary_vector']) } - for chunk_id, chunk_data in index_data.items() + for chunk_id, chunk_data in omom_file.metadata.items() } except FileNotFoundError: print(f"Collection file {self.collection} not found. Initializing empty attributes.") - self.index = {} - - def add(self, data, metadata=None, need_chunks=True, newEmbedding=False, fast=True): - """ - Adds text or a list of texts to the collection with optional ID within metadata. - - Args: - data (str, dict, or list): Text data to be added. Can be a string, a dictionary containing text, id, and/or metadata, or a list of strings or dictionaries. - metadata (dict, optional): Additional metadata to be appended to each text entry. - need_chunks (bool, optional): Whether to split the text into chunks before embedding. Defaults to True. - fast (bool, optional): Whether to use fast mode for chunking. Defaults to True. - - Returns: - list: A list of tuples, each containing the ID of the added text and the updated vectors array. - """ - print("Adding text to the collection...") + + def add(self, data, metadata=None, need_chunks=True, fast=True): + print("Adding text to the collection...", self.collection) data = [data] if not isinstance(data, list) else data results = [] all_chunks = [] @@ -88,48 +63,33 @@ def add(self, data, metadata=None, need_chunks=True, newEmbedding=False, fast=Tr encoded_data = self.model.embed(all_chunks, device=self.device) binary_encoded_data = self.model.quantize(encoded_data, precision="binary") - int8_encoded_data = self.model.quantize(encoded_data, precision="int8") - - for idx, (chunk, vector, binary_vector, int8_vector, metadata, item_id) in enumerate(zip(all_chunks, encoded_data, binary_encoded_data, int8_encoded_data, all_metadata, all_ids)): + + for idx, (chunk, binary_vector, metadata, item_id) in enumerate(zip(all_chunks, binary_encoded_data, all_metadata, all_ids)): chunk_id = f"{item_id}_{idx}" self.index[chunk_id] = { 'text': chunk, 'metadata': metadata, - 'vector': vector, - 'binary_vector': binary_vector.tolist(), - 'int8_vector': int8_vector.tolist() + 'binary_vector': binary_vector.tolist() } if item_id not in [result[0] for result in results]: - results.append((item_id, encoded_data, metadata)) + results.append((item_id, binary_encoded_data, metadata)) self.save() print("Text added successfully.") return results - def retrieve(self, text=None, top_k=5, metadata=None, newEmbedding=False): - """ - Retrieves similar texts from the collection based on text content, ID, or metadata. - - Args: - text (str, optional): Query text for finding similar texts. - top_k (int, optional): Number of top similar texts to retrieve. Defaults to 5. - metadata (dict, optional): Metadata to filter the retrieved texts. - - Returns: - tuple: A tuple containing a list of similar texts, their similarity scores, and metadata (if applicable). - """ + def retrieve(self, text=None, top_k=5, metadata=None): print("Retrieving similar texts...") if text: print(f"Retrieving top {top_k} similar texts for query: {text}") query_chunks = chop_and_chunk(text, fast=True) query_vectors = self.model.embed(query_chunks, device=self.device) query_binary_vectors = self.model.quantize(query_vectors, precision="binary") - query_int8_vectors = self.model.quantize(query_vectors, precision="int8") results = [] - for query_binary_vector, query_int8_vector in zip(query_binary_vectors, query_int8_vectors): - chunk_results = self.rescore(query_binary_vector, query_int8_vector, top_k, metadata) + for query_binary_vector in query_binary_vectors: + chunk_results = self.search(query_binary_vector, top_k, metadata) results.extend(chunk_results) results.sort(key=lambda x: x[1], reverse=True) @@ -138,59 +98,31 @@ def retrieve(self, text=None, top_k=5, metadata=None, newEmbedding=False): print("Retrieval completed.") return [(self.index[idx]['text'], score, self.index[idx]['metadata']) for idx, score in results] - def rescore(self, query_binary_vector, query_int8_vector, top_k, metadata=None): - """ - Performs retrieval using binary search and rescoring using int8 embeddings. - - Args: - query_binary_vector (numpy.ndarray): Binary vector of the query. - query_int8_vector (numpy.ndarray): Int8 vector of the query. - top_k (int): Number of top similar texts to retrieve. - metadata (dict, optional): Metadata to filter the retrieved texts. - - Returns: - list: A list of tuples containing the chunk IDs and their similarity scores. - """ - # Reshape query_binary_vector and query_int8_vector to 1D arrays + def search(self, query_binary_vector, top_k, metadata=None): + # Reshape query_binary_vector to 1D array query_binary_vector = query_binary_vector.reshape(-1) - query_int8_vector = query_int8_vector.reshape(-1) # Perform binary search binary_vectors = np.array([item['binary_vector'] for item in self.index.values()]) binary_similarities = np.einsum('i,ji->j', query_binary_vector, binary_vectors) - top_k_indices = np.argpartition(binary_similarities, -top_k*4)[-top_k*4:] + top_k_indices = np.argpartition(binary_similarities, -top_k)[-top_k:] top_k_ids = [list(self.index.keys())[idx] for idx in top_k_indices] - # Apply metadata filter on the retrieved top_k*4 items + # Apply metadata filter on the retrieved top_k items if metadata: filtered_ids = [] for item_id in top_k_ids: item_metadata = self.index[item_id]['metadata'] if all(item_metadata.get(key) == value for key, value in metadata.items()): filtered_ids.append(item_id) - top_k_ids = filtered_ids[:top_k*4] - - # Perform rescoring using int8 embeddings - int8_vectors = np.array([self.index[idx]['int8_vector'] for idx in top_k_ids]) - int8_similarities = np.einsum('i,ji->j', query_int8_vector, int8_vectors) + top_k_ids = filtered_ids[:top_k] - # Sort the results based on the int8 similarities - sorted_indices = np.argpartition(int8_similarities, -top_k)[-top_k:] - sorted_ids = np.take(top_k_ids, sorted_indices) - sorted_scores = int8_similarities[sorted_indices] + # Get the similarity scores for the top_k items + top_k_scores = binary_similarities[top_k_indices] - return list(zip(sorted_ids, sorted_scores)) + return list(zip(top_k_ids, top_k_scores)) def delete(self, ids): - """ - Deletes items from the collection by their IDs. - - Args: - ids (list or str): A single ID or a list of IDs of the items to delete. - - Returns: - int: The number of items deleted from the collection. - """ if isinstance(ids, str): ids = [ids] @@ -209,18 +141,6 @@ def delete(self, ids): return deleted_count def update(self, id, text=None, metadata=None, vector=None): - """ - Updates an item in the collection by its ID. - - Args: - id (str): The ID of the item to update. - text (str, optional): The updated text content of the item. - metadata (dict, optional): The updated metadata of the item. - vector (numpy.ndarray, optional): The updated embedding vector of the item. - - Returns: - bool: True if the item was successfully updated, False otherwise. - """ if id in self.index: if text is not None: self.index[id]['text'] = text @@ -239,40 +159,18 @@ def update(self, id, text=None, metadata=None, vector=None): return False def get(self, ids=None, where=None): - """ - Retrieves items from the collection based on IDs and/or metadata. - - Args: - ids (list, optional): List of IDs to retrieve. If provided, only items with the specified IDs will be returned. - where (dict, optional): Metadata filter to apply. Items matching the filter will be returned. - - Returns: - list: A list of retrieved items, each item being a tuple of (text, metadata). - """ if ids is not None: - # Convert ids to a set for faster membership testing id_set = set(ids) items = [(self.index[id]['text'], self.index[id]['metadata']) for id in self.index if id in id_set] else: items = [(self.index[id]['text'], self.index[id]['metadata']) for id in self.index] if where is not None: - # Filter items based on metadata items = [item for item in items if all(item[1].get(key) == value for key, value in where.items())] return items - def set(self, id, text=None, metadata=None, vector=None): - """ - Updates the attributes of an item in the collection by ID. - - Args: - id (str): ID of the item to update. - text (str, optional): Updated text content of the item. - metadata (dict, optional): Updated metadata of the item. - vector (numpy.ndarray, optional): Updated embedding vector of the item. - """ print(f"Setting attributes for item with ID: {id}") if id in self.index: if text is not None: @@ -286,48 +184,31 @@ def set(self, id, text=None, metadata=None, vector=None): print(f"Item with ID {id} not found.") def count(self): - """ - Returns the number of items in the collection. - - Returns: - int: The count of items in the collection. - """ return len(self.index) + def save(self): - """ - Saves the current state of the collection to a file. - """ print(f"Saving collection to {self.collection}") - index_data = { - chunk_id: { - 'text': chunk_data['text'], - 'metadata': chunk_data['metadata'], - 'vector': chunk_data['vector'], - 'binary_vector': chunk_data['binary_vector'], - 'int8_vector': chunk_data['int8_vector'] - } - for chunk_id, chunk_data in self.index.items() - } - with open(self.collection, 'wb') as f: - np.savez(f, index=index_data) + with self.omom.create(self.collection) as omom_file: + omom_file.set_header( + embedding_model=self.model.model_metadata['general.name'], + embedding_size=self.model.model_metadata.get('bert.embedding_length', 1024), + embedding_dtype=self.model.embedding_dtype, + context_length=self.model.model_metadata.get('bert.context_length', 512) + ) + for chunk_id, chunk_data in self.index.items(): + omom_file.add_embedding(chunk_data['binary_vector']) + omom_file.add_context(chunk_data['text']) + omom_file.add_metadata(chunk_id, chunk_data['metadata']) print("Collection saved successfully.") - def clear(self): - """ - Clears the entire collection, removing all items and resetting the attributes. - """ print("Clearing the collection...") self.index = {} - self.save() + self.omom.delete(self.collection) print("Collection cleared.") def info(self): - """ - Prints information about the collection, including the number of items, collection file path, - and the embedding model used. - """ print("Collection Information:") print(f" Items: {self.count()}") print(f" Collection file: {self.collection}") @@ -337,10 +218,4 @@ def __repr__(self): return f"VLite(collection={self.collection}, device={self.device}, model={self.model})" def dump(self): - """ - Dumps the collection data to a dictionary for serialization. - - Returns: - dict: A dictionary containing the collection data. - """ return self.index \ No newline at end of file diff --git a/vlite/model.py b/vlite/model.py index 2ab11e1..2de451d 100644 --- a/vlite/model.py +++ b/vlite/model.py @@ -9,38 +9,28 @@ class EmbeddingModel: def __init__(self, model_name='mixedbread-ai/mxbai-embed-large-v1'): hf_path = hf_hub_download(repo_id="mixedbread-ai/mxbai-embed-large-v1", filename="gguf/mxbai-embed-large-v1-f16.gguf") print(f"Downloaded model to {hf_path}") - self.model = llama_cpp.Llama(model_path=hf_path, embedding=True) - self.dimension = 1024 # hardcoded - self.max_seq_length = 512 # hardcoded + self.model_metadata = self.model.metadata + self.embedding_size = self.model_metadata.get("bert.embedding_length", 1024) + self.context_length = self.model_metadata.get("bert.context_length", 512) + self.embedding_dtype = "float32" def embed(self, texts, max_seq_length=512, device="cpu"): if isinstance(texts, str): texts = [texts] embeddings_dict = self.model.create_embedding(texts) return [item["embedding"] for item in embeddings_dict["data"]] - + def token_count(self, texts): - enc = tiktoken.get_encoding("cl100k_base") + enc = tiktoken.get_encoding("cl100k_base") tokens = 0 for text in texts: token_ids = enc.encode(text, disallowed_special=()) tokens += len(token_ids) return tokens - - def quantize(self, embeddings, precision="binary"): - """ - Quantizes the embeddings to the specified precision. - - Args: - embeddings (list or numpy.ndarray): Input embeddings to quantize. - precision (str, optional): Precision to quantize the embeddings. Can be "binary" or "int8". Defaults to "binary". - - Returns: - numpy.ndarray: Quantized embeddings. - """ - embeddings = np.array(embeddings) # Convert embeddings to a numpy array + def quantize(self, embeddings, precision="binary"): + embeddings = np.array(embeddings) if precision == "binary": return np.packbits(embeddings > 0).reshape(embeddings.shape[0], -1) elif precision == "int8": @@ -49,16 +39,4 @@ def quantize(self, embeddings, precision="binary"): raise ValueError(f"Unsupported precision: {precision}") def rescore(self, query_vector, vectors): - """ - Rescores the retrieved vectors using the query vector. - - Args: - query_vector (numpy.ndarray): Query vector for rescoring. - vectors (numpy.ndarray): Retrieved vectors to rescore. - - Returns: - numpy.ndarray: Rescored similarities. - """ - return np.dot(query_vector, vectors.T).flatten() - - \ No newline at end of file + return np.dot(query_vector, vectors.T).flatten() \ No newline at end of file diff --git a/vlite/omom.py b/vlite/omom.py new file mode 100644 index 0000000..1f3dc23 --- /dev/null +++ b/vlite/omom.py @@ -0,0 +1,149 @@ +import os +import struct +import json +from enum import Enum +from typing import List, Dict, Union +import numpy as np + +class OmomSectionType(Enum): + HEADER = 0 + EMBEDDINGS = 1 + CONTEXTS = 2 + METADATA = 3 + +class OmomFile: + MAGIC_NUMBER = b"OMOM" + VERSION = 1 + + def __init__(self, file_path): + self.file_path = file_path + self.header = { + "embedding_model": "default", + "embedding_size": 0, + "embedding_dtype": "float32", + "context_length": 0, + } + self.embeddings = [] + self.contexts = [] + self.metadata = {} + + def set_header(self, embedding_model: str, embedding_size: int, embedding_dtype: str, context_length: int): + self.header["embedding_model"] = embedding_model + self.header["embedding_size"] = embedding_size + self.header["embedding_dtype"] = embedding_dtype + self.header["context_length"] = context_length + + def add_embedding(self, embedding: List[float]): + self.embeddings.append(embedding) + + def add_context(self, context: str): + self.contexts.append(context) + + def add_metadata(self, key: str, value: Union[int, float, str]): + self.metadata[key] = value + + def save(self): + with open(self.file_path, "wb") as file: + file.write(self.MAGIC_NUMBER) + file.write(struct.pack(" OmomFile: + file_path = self.get(user) + return OmomFile(file_path) + + def read(self, user_id: str) -> OmomFile: + file_path = self.get(user_id) + return OmomFile(file_path) + + def delete(self, user_id: str): + file_path = self.get(user_id) + if os.path.exists(file_path): + os.remove(file_path) \ No newline at end of file