Spaces:
Runtime error
Runtime error
| import os | |
| from pathlib import Path | |
| from langchain_community.document_loaders import TextLoader | |
| from langchain_text_splitters import MarkdownHeaderTextSplitter, RecursiveCharacterTextSplitter | |
| from langchain_chroma import Chroma | |
| from langchain_huggingface import HuggingFaceEmbeddings | |
| from dotenv import load_dotenv | |
| load_dotenv(override=True) | |
| # ----------------------------- | |
| # CONFIG | |
| # ----------------------------- | |
| DB_NAME = str(Path(__file__).parent / "vector_db") | |
| FILE_PATH = str( "about-us.md") | |
| # ----------------------------- | |
| # EMBEDDINGS | |
| # ----------------------------- | |
| embeddings = HuggingFaceEmbeddings( | |
| model_name="sentence-transformers/all-MiniLM-L6-v2" | |
| ) | |
| # ----------------------------- | |
| # LOAD & CHUNK DOCUMENT | |
| # ----------------------------- | |
| def fetch_and_chunk_document(): | |
| loader = TextLoader(FILE_PATH, encoding="utf-8") | |
| raw_document = loader.load()[0] | |
| headers_to_split_on = [ | |
| ("#", "Section"), | |
| ("##", "Header2"), | |
| ("###", "Header3"), | |
| ] | |
| markdown_splitter = MarkdownHeaderTextSplitter( | |
| headers_to_split_on=headers_to_split_on, | |
| strip_headers=False | |
| ) | |
| md_chunks = markdown_splitter.split_text(raw_document.page_content) | |
| # Safety net: only splits chunks that are too large | |
| text_splitter = RecursiveCharacterTextSplitter( | |
| chunk_size=500, | |
| chunk_overlap=50 | |
| ) | |
| chunks = text_splitter.split_documents(md_chunks) | |
| for chunk in chunks: | |
| chunk.metadata["doc_type"] = "about-us" | |
| return chunks | |
| # ----------------------------- | |
| # CREATE VECTOR STORE | |
| # ----------------------------- | |
| def create_embeddings(chunks): | |
| # reset DB if exists | |
| if os.path.exists(DB_NAME): | |
| Chroma( | |
| persist_directory=DB_NAME, | |
| embedding_function=embeddings | |
| ).delete_collection() | |
| vectorstore = Chroma.from_documents( | |
| documents=chunks, | |
| embedding=embeddings, | |
| persist_directory=DB_NAME | |
| ) | |
| # debug info | |
| collection = vectorstore._collection | |
| count = collection.count() | |
| sample_embedding = collection.get(limit=1, include=["embeddings"])["embeddings"][0] | |
| dimensions = len(sample_embedding) | |
| print(f"There are {count:,} vectors with {dimensions:,} dimensions in the vector store") | |
| return vectorstore | |
| # ----------------------------- | |
| # MAIN | |
| # ----------------------------- | |
| if __name__ == "__main__": | |
| # Ensure folder structure exists for safety | |
| if not os.path.exists(FILE_PATH): | |
| raise FileNotFoundError(f"Could not find your markdown file at: {FILE_PATH}") | |
| chunks = fetch_and_chunk_document() | |
| create_embeddings(chunks) | |
| print("Ingestion complete ๐") |