Files
task-6a1864f78a94f887e50d46da/vectorstore.py
T
2026-06-02 07:47:23 +00:00

77 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Vector store utilities for the RAG agent.
Provides functions to create a ChromaDB vector store backed by Ollama embeddings
and to load documents from a directory into the store.
"""
from pathlib import Path
from typing import List
from langchain_ollama import OllamaEmbeddings
from langchain_chroma import Chroma
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.docstore.document import Document
# ---------------------------------------------------------------------------
# Configuration constants
# ---------------------------------------------------------------------------
DEFAULT_EMBEDDING_MODEL = "nomic-embed-text"
DEFAULT_PERSIST_DIR = "./chroma_db"
# ---------------------------------------------------------------------------
# Public API
# ---------------------------------------------------------------------------
def create_vectorstore(persist_directory: str = DEFAULT_PERSIST_DIR) -> Chroma:
"""Create (or load) a Chroma vector store.
Parameters
----------
persist_directory: str
Directory where the Chroma database will be persisted.
Returns
-------
Chroma
An instance of the Chroma vector store.
"""
embeddings = OllamaEmbeddings(model=DEFAULT_EMBEDDING_MODEL)
return Chroma(persist_directory=persist_directory, embedding_function=embeddings)
def load_documents(directory: str, vectorstore: Chroma, chunk_size: int = 1000, chunk_overlap: int = 200) -> None:
"""Load all .txt and .md files from *directory*, chunk them and add to *vectorstore*.
The function is idempotent if the same files are loaded again, duplicates will
not be created because Chroma will deduplicate based on the content hash.
Parameters
----------
directory: str
Path to the folder containing the documents.
vectorstore: Chroma
The vector store to populate.
chunk_size: int, optional
Maximum number of characters per chunk.
chunk_overlap: int, optional
Number of characters to overlap between consecutive chunks.
"""
splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
docs: List[Document] = []
for file_path in Path(directory).glob("**/*"):
if file_path.suffix.lower() not in {".txt", ".md"}:
continue
text = file_path.read_text(encoding="utf-8")
docs.extend(splitter.split_text(text))
# Convert list of strings to list of Documents
documents = [Document(page_content=chunk) for chunk in docs]
if documents:
vectorstore.add_documents(documents)
vectorstore.persist()
# ---------------------------------------------------------------------------
# End of module
# ---------------------------------------------------------------------------