chatbot-fr / sauve /step3_llamaindex.py
rkonan's picture
reorganisation
236b637
import os
import pickle
import faiss
import numpy as np
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex
from llama_index.core.node_parser import SentenceSplitter
from llama_index.vector_stores.faiss import FaissVectorStore
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
# Paramètres
DOCS_DIR = "data"
VECTOR_DIR = "vectordb"
INDEX_FILE = os.path.join(VECTOR_DIR, "index.faiss")
CHUNKS_FILE = os.path.join(VECTOR_DIR, "chunks.pkl")
EMBEDDING_MODEL = "sentence-transformers/all-MiniLM-L6-v2"
os.makedirs(VECTOR_DIR, exist_ok=True)
# Étape 1 — Lecture
print("📥 Chargement des documents...")
documents = SimpleDirectoryReader(input_dir=DOCS_DIR).load_data()
# Étape 2 — Chunking avec overlap (512 tokens, 64 d'overlap)
print("✂️ Découpage structuré avec overlap...")
parser = SentenceSplitter(
chunk_size=512,
chunk_overlap=64,
break_on_newlines=True # 👈 Important ici
)
#parser = SentenceSplitter(chunk_size=512, chunk_overlap=64)
nodes = parser.get_nodes_from_documents(documents)
# Étape 3 — Embedding + FAISS
print("🔢 Génération des embeddings et indexation FAISS...")
embed_model = HuggingFaceEmbedding(model_name=EMBEDDING_MODEL)
# Créer un index brut FAISS
#dimension = embed_model.get_query_embedding("test").shape[0]
embedding_dim = np.array(embed_model.get_query_embedding("test")).shape[0]
faiss_index = faiss.IndexFlatL2(embedding_dim)
vector_store = FaissVectorStore(faiss_index=faiss_index)
# Création de l’index LlamaIndex avec FAISS
index = VectorStoreIndex(nodes, embed_model=embed_model, vector_store=vector_store)
# Étape 4 — Sauvegarde
print("💾 Sauvegarde de l’index et des chunks...")
#vector_store.save(INDEX_FILE)
faiss.write_index(faiss_index, INDEX_FILE)
chunks = [node.get_content() for node in nodes]
with open(CHUNKS_FILE, "wb") as f:
pickle.dump(chunks, f)
print(f"✅ {len(chunks)} chunks sauvegardés dans {CHUNKS_FILE}")