| from datasets import load_dataset |
| from langchain.text_splitter import RecursiveCharacterTextSplitter |
| from transformers import pipeline |
| import torch |
| from sentence_transformers import SentenceTransformer |
| import numpy as np |
| from tqdm import tqdm |
| import faiss |
|
|
| model_id = "meta-llama/Meta-Llama-3-8B-Instruct" |
|
|
| |
| ds = load_dataset("artemss/hotwash-rag") |
|
|
|
|
| |
| texts = ds["train"]["text"] |
| print(f"{len(texts)} documents chargés.") |
|
|
|
|
| |
| splitter = RecursiveCharacterTextSplitter( |
| chunk_size=1000, |
| chunk_overlap=100, |
| separators=["\n\n", "\n", ".", " "] |
| ) |
|
|
| |
| docs = [] |
| for t in texts: |
| chunks = splitter.split_text(t) |
| docs.extend(chunks) |
|
|
| print(f"{len(docs)} chunks générés.") |
|
|
|
|
| |
| model_name = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2" |
| embedder = SentenceTransformer(model_name) |
|
|
| |
| |
| |
| |
|
|
| |
| embeddings = embedder.encode(chunks, show_progress_bar=True, convert_to_numpy=True) |
|
|
| print(f"{len(embeddings)} embeddings créés. Taille de vecteur : {embeddings.shape[1]}") |
|
|
| |
| dim = embeddings.shape[1] |
|
|
| |
| index = faiss.IndexFlatL2(dim) |
| index.add(np.array(embeddings)) |
|
|
| print(f"✅ Index FAISS créé avec {index.ntotal} vecteurs.") |
|
|
| def retrieve_similar_chunks(query: str, embedder, index, chunks, top_k: int = 5): |
| """ |
| Recherche les chunks les plus pertinents pour une requête donnée. |
| |
| Args: |
| query (str): La requête utilisateur (question, mot-clé, etc.) |
| embedder: Le modèle SentenceTransformer utilisé pour les embeddings |
| index: L’index FAISS contenant les vecteurs des chunks |
| chunks (list): La liste des textes (chunks) |
| top_k (int): Le nombre de résultats à renvoyer |
| |
| Returns: |
| list[dict]: Une liste de résultats sous forme : |
| [{'chunk': texte, 'score': distance}, ...] |
| """ |
| |
| query_vec = embedder.encode([query]) |
| |
| |
| distances, indices = index.search(query_vec, k=top_k) |
| |
| |
| results = [] |
| for dist, idx in zip(distances[0], indices[0]): |
| results.append({ |
| "chunk": chunks[idx], |
| "score": float(dist) |
| }) |
| |
| return results |
|
|
|
|
| |
| query = "résumé sur la cybersécurité des systèmes industriels" |
| results = retrieve_similar_chunks(query, embedder, index, docs, top_k=3) |
|
|
| print("\n🔎 Résultats les plus pertinents :\n") |
| for r in results: |
| print(f"Score: {r['score']:.4f}\nTexte: {r['chunk'][:300]}...\n") |
|
|
|
|
|
|
|
|
|
|
|
|