import os import shutil import subprocess import sys from langchain_community.document_loaders import UnstructuredMarkdownLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_huggingface import HuggingFaceEmbeddings from langchain_community.vectorstores import Chroma # ================= KONFIGURACJA ================= # Podaj tu nazwę swojego pliku EPUB (musi być w tym samym folderze) EPUB_FILE = "build123d-readthedocs-io-en-latest.epub" # Nazwa pliku tymczasowego (skrypt sam go stworzy) MD_FILE = "converted_docs.md" # Folder bazy danych DB_DIR = "/home/pali112/db_build123d" # ================================================ def convert_epub_to_md(): """Konwertuje EPUB do MD używając systemowego Pandoc.""" print(f"🔄 Rozpoczynam konwersję: {EPUB_FILE} -> {MD_FILE}") if not os.path.exists(EPUB_FILE): print(f"❌ BŁĄD: Nie znaleziono pliku {EPUB_FILE}!") sys.exit(1) # Sprawdzenie czy pandoc jest zainstalowany if shutil.which("pandoc") is None: print("❌ BŁĄD: Nie znaleziono 'pandoc'. Zainstaluj go: sudo apt install pandoc") sys.exit(1) try: # Wywołanie komendy systemowej cmd = ["pandoc", EPUB_FILE, "-t", "markdown", "-o", MD_FILE] subprocess.run(cmd, check=True) print("✅ Konwersja zakończona sukcesem.") except subprocess.CalledProcessError as e: print(f"❌ Błąd podczas konwersji pandoc: {e}") sys.exit(1) def rebuild_database(): # 1. Konwersja (Automatyczna) convert_epub_to_md() # 2. Czyszczenie starej bazy if os.path.exists(DB_DIR): print(f"🗑️ Usuwam starą bazę: {DB_DIR}") shutil.rmtree(DB_DIR) # 3. Ładowanie przekonwertowanego pliku print(f"📖 Wczytuję treść z: {MD_FILE}...") loader = UnstructuredMarkdownLoader(MD_FILE) data = loader.load() # Statystyka surowego tekstu raw_text_len = len(data[0].page_content) print(f" Wczytano {raw_text_len} znaków tekstu.") if raw_text_len < 1000: print("⚠️ UWAGA: Bardzo mało tekstu! Konwersja mogła się nie udać.") # 4. Dzielenie na kawałki (Chunking) print("✂️ Dzielę tekst na fragmenty...") text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, chunk_overlap=200, separators=["\n## ", "\n### ", "\n", " ", ""] ) all_splits = text_splitter.split_documents(data) count = len(all_splits) print(f" Stworzono {count} chunków.") # 5. Tworzenie bazy wektorowej print("🧠 Generowanie embedingów i zapisywanie do ChromaDB...") embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2") vectorstore = Chroma.from_documents( documents=all_splits, embedding=embeddings, persist_directory=DB_DIR ) final_count = vectorstore._collection.count() print("-" * 40) print(f"✅ SUKCES! Baza gotowa w {DB_DIR}") print(f"📊 Liczba wektorów w bazie: {final_count}") print("-" * 40) # Opcjonalnie: Usuń plik tymczasowy md, żeby nie śmiecić # os.remove(MD_FILE) if __name__ == "__main__": rebuild_database()