You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
montpelliermaalsi2024/hello_world_rag
gwen 1094f91871 hello world rag 1 year ago
..
hello-world.txt hello world rag 1 year ago
rag.py hello world rag 1 year ago
readme.md hello world rag 1 year ago
requirements.txt hello world rag 1 year ago

readme.md

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 :

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é.

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).

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.

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.

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.

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 :

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.