Add vector_store.py
This commit is contained in:
@@ -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)
|
||||||
Reference in New Issue
Block a user