citationEdge / memory /vector_memory.py
omkarkudalkar222's picture
Fresh deployment without history
0e38162
Raw
History Blame Contribute Delete
1.95 kB
"""
Vector Memory: in-memory store for embedding-based similarity search.
Used for short-term retrieval within a single job run.
"""
from typing import Any, Dict, List, Optional
from memory.base_memory import BaseMemory
from services.vector_store_service import VectorStoreService
from utils.logger import get_logger
logger = get_logger("vector_memory")
class VectorMemory(BaseMemory):
"""In-process vector store backed by sentence-transformers."""
def __init__(self, embedder: VectorStoreService):
self.embedder = embedder
self._store: Dict[str, Dict] = {} # key -> {value, embedding, metadata}
async def store(self, key: str, value: Any, metadata: Optional[Dict] = None) -> None:
text = str(value)
embedding = self.embedder.embed(text)
self._store[key] = {
"value": value,
"text": text,
"embedding": embedding,
"metadata": metadata or {},
}
async def retrieve(self, key: str) -> Optional[Any]:
entry = self._store.get(key)
return entry["value"] if entry else None
async def search(self, query: str, k: int = 5) -> List[Dict[str, Any]]:
if not self._store:
return []
q_vec = self.embedder.embed(query)
scored = []
for key, entry in self._store.items():
sim = self.embedder.cosine_similarity(q_vec, entry["embedding"])
scored.append({"key": key, "value": entry["value"], "score": sim})
scored.sort(key=lambda x: x["score"], reverse=True)
return scored[:k]
async def delete(self, key: str) -> None:
self._store.pop(key, None)
async def clear(self, scope: Optional[str] = None) -> None:
if scope:
keys = [k for k, v in self._store.items() if v["metadata"].get("job_id") == scope]
for k in keys:
del self._store[k]
else:
self._store.clear()