From b8a178f82175f2260df8914711d21ceccfeac700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=B8=D1=80=D0=B8=D0=BB=D0=BB=20=D0=9A=D1=83=D1=82?= =?UTF-8?q?=D0=BB=D0=B0=D1=85=D0=BC=D0=B5=D1=82=D0=BE=D0=B2?= Date: Thu, 28 May 2026 09:15:03 +0000 Subject: [PATCH] Add vector_store.py --- vector_store.py | 65 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 vector_store.py diff --git a/vector_store.py b/vector_store.py new file mode 100644 index 0000000..d5e6872 --- /dev/null +++ b/vector_store.py @@ -0,0 +1,65 @@ +""" +Vector store implementation using ChromaDB. + +Provides functions to add documents and perform semantic search. +""" + +import os +from typing import List, Dict +from langchain_ollama import OllamaEmbeddings +from chromadb import Client +from chromadb.config import Settings + +# Initialize embeddings model (Ollama) +embeddings = OllamaEmbeddings(model="nomic-embed-text") + +# ChromaDB client – in‑memory by default, persistent folder "chromadb" +CHROMA_DIR = os.path.join(os.getcwd(), "chromadb") +client = Client(Settings(chroma_db_impl="duckdb+parquet", persist_directory=CHROMA_DIR)) +collection_name = "rag_collection" + +# Ensure collection exists +if collection_name not in client.list_collections(): + client.create_collection(name=collection_name) +col = client.get_or_create_collection(name=collection_name) + +class VectorStore: + def __init__(self, collection): + self.collection = collection + + def add_document(self, doc_id: str, text: str, metadata: Dict | None = None) -> None: + """Add a single document to the collection. + + Parameters + ---------- + doc_id: str + Unique identifier for the document. + text: str + Raw text content. + metadata: dict, optional + Additional key/value pairs stored with the vector. + """ + vec = embeddings.embed_query(text) + self.collection.add(ids=[doc_id], documents=[text], metadatas=[metadata or {}]) + + def search(self, query: str, k: int = 5) -> List[Dict]: + """Semantic search over the collection. + + Returns a list of dicts with keys: id, document, score, metadata. + """ + results = self.collection.query( + query_texts=[query], n_results=k, include=['documents', 'distances', 'metadatas'] + ) + hits = [] + for i in range(len(results["ids"][0])): + hit = { + "id": results["ids"][0][i], + "document": results["documents"][0][i], + "score": 1 - results["distances"][0][i], # distance to similarity + "metadata": results["metadatas"][0][i], + } + hits.append(hit) + return hits + +# Singleton instance for easy import +vector_store = VectorStore(col)