From f996092b44e005b9f250c5fd9bf5073a7550da43 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=A0=D0=BE=D0=BC?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Mon, 1 Jun 2026 17:40:52 +0000 Subject: [PATCH] Add vectorstore.py --- vectorstore.py | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 vectorstore.py diff --git a/vectorstore.py b/vectorstore.py new file mode 100644 index 0000000..74308ad --- /dev/null +++ b/vectorstore.py @@ -0,0 +1,56 @@ +""" +Vector store utilities for ChromaDB with Ollama embeddings. +""" + +import os +from pathlib import Path + +from langchain_chroma import Chroma +from langchain_ollama import OllamaEmbeddings +from langchain_text_splitters import RecursiveCharacterTextSplitter +from langchain.docstore.document import Document + +def create_vectorstore(persist_directory: str = "./chroma_db") -> Chroma: + """Create or load a Chroma vector store. + + Parameters + ---------- + persist_directory: str + Directory where the Chroma database is persisted. + + Returns + ------- + Chroma + A Chroma vector store instance. + """ + embeddings = OllamaEmbeddings(model="nomic-embed-text") + return Chroma(persist_directory=persist_directory, embedding_function=embeddings) + +def load_documents(directory: str, vectorstore: Chroma) -> None: + """Load text and markdown files from *directory*, chunk them, and add to *vectorstore*. + + Parameters + ---------- + directory: str + Path to the folder containing .txt and .md files. + vectorstore: Chroma + The Chroma vector store to which documents will be added. + """ + docs = [] + for file_path in Path(directory).rglob("*.*"): + if file_path.suffix.lower() in ".txt .md".split(): + try: + text = file_path.read_text(encoding="utf-8") + except Exception as e: + print(f"Failed to read {file_path}: {e}") + continue + docs.append(Document(page_content=text, metadata={"source": str(file_path)})) + + if not docs: + print("No documents found to load.") + return + + splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200) + chunks = splitter.split_documents(docs) + vectorstore.add_documents(chunks) + print(f"Loaded {len(chunks)} chunks into the vector store.") \ No newline at end of file