Files
vibe-bot/vibe_bot/db/vectors.py
T
2026-08-19 13:16:43 -04:00

43 lines
1.3 KiB
Python

"""float32 embedding (de)serialization and cosine similarity."""
from __future__ import annotations
import logging
import numpy as np
logger = logging.getLogger(__name__)
def vector_to_bytes(vector: list[float]) -> bytes:
"""Convert a vector to bytes for SQLite storage."""
logger.debug("Converting vector (length: %d) to bytes", len(vector))
result = np.array(vector, dtype=np.float32).tobytes()
logger.debug("Vector converted to %d bytes", len(result))
return result
def bytes_to_vector(blob: bytes) -> np.ndarray:
"""Convert bytes back to a vector."""
logger.debug("Converting %d bytes back to vector", len(blob))
result = np.frombuffer(blob, dtype=np.float32)
logger.debug("Vector reconstructed with %d dimensions", len(result))
return result
def cosine_similarity(vec1: np.ndarray, vec2: np.ndarray) -> float:
"""Calculate cosine similarity between two vectors."""
vec1 = vec1.flatten()
vec2 = vec2.flatten()
logger.debug(
"Calculating cosine similarity between vectors of dimension %d",
len(vec1),
)
norm1 = np.linalg.norm(vec1)
norm2 = np.linalg.norm(vec2)
if norm1 == 0 or norm2 == 0:
return 0.0
result = float(np.dot(vec1, vec2) / (norm1 * norm2))
logger.debug("Similarity calculated: %.4f", result)
return result