From 1094f918717b023993d6ae0526e8c0abecbec3f7 Mon Sep 17 00:00:00 2001 From: gwen Date: Mon, 3 Mar 2025 15:32:09 +0100 Subject: [PATCH] hello world rag --- hello_world_rag/hello-world.txt | 11 ++++ hello_world_rag/rag.py | 56 ++++++++++++++++ hello_world_rag/readme.md | 110 +++++++++++++++++++++++++++++++ hello_world_rag/requirements.txt | 2 + 4 files changed, 179 insertions(+) create mode 100644 hello_world_rag/hello-world.txt create mode 100644 hello_world_rag/rag.py create mode 100644 hello_world_rag/readme.md create mode 100644 hello_world_rag/requirements.txt diff --git a/hello_world_rag/hello-world.txt b/hello_world_rag/hello-world.txt new file mode 100644 index 0000000..d1c35dd --- /dev/null +++ b/hello_world_rag/hello-world.txt @@ -0,0 +1,11 @@ +Hello, World! + +Cette phrase est souvent utilisée comme un premier programme dans de nombreux langages de programmation. Elle est simple et permet de vérifier que l'environnement de développement est correctement configuré. + +L'origine de "Hello, World!" remonte aux années 1970. Elle a été popularisée par le livre "The C Programming Language" de Brian Kernighan et Dennis Ritchie. Depuis, elle est devenue une tradition dans l'apprentissage de la programmation. + +Le programme "Hello, World!" est un excellent point de départ pour les débutants. Il permet de comprendre les bases de la syntaxe d'un langage de programmation et de voir comment compiler et exécuter un programme. + +Dans certains langages, comme Python, afficher "Hello, World!" est très simple. Il suffit d'une seule ligne de code : print("Hello, World!"). D'autres langages peuvent nécessiter plus de lignes de code pour accomplir la même tâche. + +Aujourd'hui, "Hello, World!" est plus qu'un simple programme. C'est un symbole de l'apprentissage de la programmation et une porte d'entrée vers le monde du développement logiciel. diff --git a/hello_world_rag/rag.py b/hello_world_rag/rag.py new file mode 100644 index 0000000..4e86fa2 --- /dev/null +++ b/hello_world_rag/rag.py @@ -0,0 +1,56 @@ +import faiss +import numpy as np +from sentence_transformers import SentenceTransformer + +# Étape 1 : Lire le fichier texte +def lire_fichier(fichier): + with open(fichier, 'r', encoding='utf-8') as file: + return file.read() + +# Étape 2 : Découper le texte en chunks +def decouper_texte(texte, taille_chunk=100): + mots = texte.split() + chunks = [' '.join(mots[i:i + taille_chunk]) for i in range(0, len(mots), taille_chunk)] + return chunks + +# Étape 3 : Vectoriser les chunks avec SentenceTransformer +model = SentenceTransformer('paraphrase-MiniLM-L6-v2') + +def vectoriser_chunks(chunks): + vecteurs = model.encode(chunks) + return vecteurs + +# Étape 4 : Stocker les vecteurs dans FAISS +def creer_index_faiss(vecteurs): + dimension = vecteurs.shape[1] + index = faiss.IndexFlatL2(dimension) + index.add(vecteurs) + return index + +# Étape 5 : Interroger la base de données +def interroger_base(question, index, chunks, top_k=1): + question_vector = model.encode([question]) + distances, indices = index.search(question_vector, top_k) + return [chunks[i] for i in indices[0]] + +# Exemple d'utilisation +texte = lire_fichier('hello-world.txt') +chunks = decouper_texte(texte) +vecteurs = vectoriser_chunks(chunks) +index_faiss = creer_index_faiss(vecteurs) + +question = "Quelle est la signification de 'hello world'?" +chunks_similaires = interroger_base(question, index_faiss, chunks) + +print("Chunks les plus similaires question 1 :") +for chunk in chunks_similaires: + print(chunk) + + +question = "Comment afficher 'Hello, World!' en Python ?" +chunks_similaires = interroger_base(question, index_faiss, chunks) + +print("Chunks les plus similaires question 2 :") +for chunk in chunks_similaires: + print(chunk) + diff --git a/hello_world_rag/readme.md b/hello_world_rag/readme.md new file mode 100644 index 0000000..4f9c77b --- /dev/null +++ b/hello_world_rag/readme.md @@ -0,0 +1,110 @@ +# README.md + +## Description + +Ce programme permet de lire un fichier texte, de le découper en morceaux (chunks), de vectoriser ces morceaux à l'aide de SentenceTransformer, de stocker les vecteurs dans une base de données FAISS, et enfin d'interroger cette base de données pour trouver les morceaux les plus similaires à une question donnée. + +## Prérequis + +Avant d'exécuter ce programme, assurez-vous d'avoir installé les bibliothèques suivantes : + +- `faiss` +- `numpy` +- `sentence-transformers` + +Vous pouvez les installer via pip : + +```bash +pip install faiss-cpu numpy sentence-transformers +``` + +## Utilisation + +### Étape 1 : Lire le fichier texte + +La fonction `lire_fichier` lit le contenu d'un fichier texte donné. + +```python +def lire_fichier(fichier): + with open(fichier, 'r', encoding='utf-8') as file: + return file.read() +``` + +### Étape 2 : Découper le texte en chunks + +La fonction `decouper_texte` découpe le texte en morceaux de taille définie (par défaut 100 mots). + +```python +def decouper_texte(texte, taille_chunk=100): + mots = texte.split() + chunks = [' '.join(mots[i:i + taille_chunk]) for i in range(0, len(mots), taille_chunk)] + return chunks +``` + +### Étape 3 : Vectoriser les chunks avec SentenceTransformer + +La fonction `vectoriser_chunks` utilise le modèle `SentenceTransformer` pour vectoriser les morceaux de texte. + +```python +model = SentenceTransformer('paraphrase-MiniLM-L6-v2') + +def vectoriser_chunks(chunks): + vecteurs = model.encode(chunks) + return vecteurs +``` + +### Étape 4 : Stocker les vecteurs dans FAISS + +La fonction `creer_index_faiss` crée un index FAISS et y ajoute les vecteurs. + +```python +def creer_index_faiss(vecteurs): + dimension = vecteurs.shape[1] + index = faiss.IndexFlatL2(dimension) + index.add(vecteurs) + return index +``` + +### Étape 5 : Interroger la base de données + +La fonction `interroger_base` permet de rechercher les morceaux les plus similaires à une question donnée. + +```python +def interroger_base(question, index, chunks, top_k=1): + question_vector = model.encode([question]) + distances, indices = index.search(question_vector, top_k) + return [chunks[i] for i in indices[0]] +``` + +### Exemple d'utilisation + +Voici un exemple d'utilisation du programme : + +```python +texte = lire_fichier('hello-world.txt') +chunks = decouper_texte(texte) +vecteurs = vectoriser_chunks(chunks) +index_faiss = creer_index_faiss(vecteurs) + +question = "Quelle est la signification de 'hello world'?" +chunks_similaires = interroger_base(question, index_faiss, chunks) +print("Chunks les plus similaires à la question 1 :") +for chunk in chunks_similaires: + print(chunk) + +question = "Comment afficher 'Hello, World!' en Python ?" +chunks_similaires = interroger_base(question, index_faiss, chunks) +print("Chunks les plus similaires à la question 2 :") +for chunk in chunks_similaires: + print(chunk) +``` + +## Remarques + +- Assurez-vous que le fichier `hello-world.txt` existe dans le même répertoire que le script. +- Vous pouvez ajuster la taille des chunks en modifiant le paramètre `taille_chunk` dans la fonction `decouper_texte`. +- Le modèle `SentenceTransformer` utilisé est `paraphrase-MiniLM-L6-v2`, mais vous pouvez en utiliser un autre si nécessaire. + +## Licence + +Ce projet est sous licence MIT. Voir le fichier `LICENSE` pour plus de détails. diff --git a/hello_world_rag/requirements.txt b/hello_world_rag/requirements.txt new file mode 100644 index 0000000..687f42c --- /dev/null +++ b/hello_world_rag/requirements.txt @@ -0,0 +1,2 @@ +faiss-cpu +sentence-transformers