FinRAG / scripts /build_bm25.py
Harshavard21's picture
Initial commit
454f118
Raw History Blame Contribute Delete
1.68 kB
"""
scripts/build_bm25.py
======================
Standalone script to verify Qdrant is healthy and build the BM25 index.
Run this after ingestion is complete.
"""
import sys, os
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from config.settings import settings
from src.utils.logger import logger
from src.vectorstore.qdrant_store import QdrantStore
from src.vectorstore.bm25_index import BM25Index
# --- Step 1: Verify Qdrant ---
print("Checking Qdrant collection...")
qdrant = QdrantStore()
info = qdrant.get_collection_info()
print(f"Qdrant status : {info['status']}")
print(f"Vectors stored : {info.get('vectors_count', info.get('points_count', '?'))}")
# --- Step 2: Scroll all index chunks from Qdrant to build BM25 ---
print("\nScrolling all index chunks from Qdrant for BM25 build...")
from qdrant_client.models import Filter, FieldCondition, MatchAny
# We need Chunk-like objects. Let's just rebuild from the JSON cache.
from src.ingestion.pipeline import IngestionPipeline
from src.chunking.hierarchical_chunker import HierarchicalChunker
pipeline = IngestionPipeline()
documents = pipeline.run_all(force_reprocess=False) # loads from cache instantly
chunker = HierarchicalChunker()
chunked_docs = chunker.chunk_documents(documents)
all_index_chunks = []
for cdoc in chunked_docs:
all_index_chunks.extend(cdoc.all_index_chunks)
print(f"Index chunks for BM25: {len(all_index_chunks)}")
# --- Step 3: Build BM25 ---
print("\nBuilding BM25 sparse index...")
bm25 = BM25Index()
bm25.build(all_index_chunks)
print(f"\nBM25 index built over {len(all_index_chunks)} chunks")
print("\nAll done! Run: streamlit run app/main.py")