SentRev ( SEN TENCE tr ansformers ev Aluator) est un package Python qui vise à exécuter des tests d'évaluation simples pour vous aider à choisir le meilleur modèle d'intégration pour la récupération de génération augmentée (RAG) avec vos documents PDF.
SentRev travaille avec:
SentenceTransformer dans le package Python sentence_transformers Vous pouvez installer le package à l'aide pip ( plus facile mais pas de personnalisation ):
python3 -m pip install sentrevOu vous pouvez le construire à partir du code source ( plus difficile mais personnalisable ):
# clone the repo
git clone https://github.com/AstraBert/SenTrEv.git
# access the repo
cd SenTrEv
# build the package
python3 -m build
# install the package locally with editability settings
python3 -m pip install -e .SentRev applique un flux de travail d'évaluation très simple:
Voir la figure ci-dessous pour une visualisation du flux de travail
Les mesures utilisées pour évaluer les performances étaient:
Taux de réussite : défini comme l'opération de récupération du nombre dans lequel le contexte correct a été récupéré en haut de tous les contextes récupérés, sur les opérations totales de récupération:
Classement réciproque moyen (MRR) : MRR définit la hauteur dans le classement que le contexte correct est placé parmi les résultats récupérés. MRR @ 10 a été utilisé, ce qui signifie que pour chaque opération de récupération, 10 éléments ont été retournés et qu'une évaluation a été effectuée pour le classement du contexte correct, qui a ensuite été normalisé entre 0 et 1 (déjà mis en œuvre dans SentRev). Un MRR de 1 signifie que le contexte correct a été classé en premier, tandis qu'un MRR de 0 signifie qu'il n'a pas été récupéré. MRR est calculé avec l'équation générale suivante:
Lorsque le contexte correct n'est pas récupéré, le MRR est automatiquement réglé sur 0. MRR est calculé pour chaque opération de récupération, alors l'écart moyen et standard sont calculés et signalés.
Performance temporelle : Pour chaque opération de récupération, les performances temporelles en secondes sont calculées: l'écart moyen et type est ensuite signalé.
Émissions de carbone : les émissions de carbone sont calculées dans GCO2EQ (grammes d'équivalent de CO2) à travers le codecarbon de la bibliothèque Python et ont été évalués pour la région autrichienne. Ils sont signalés pour la charge de calcul globale de toutes les opérations de récupération.
Vous pouvez facilement exécuter Qdrant localement avec Docker:
docker pull qdrant/qdrant:latest
docker run -p 6333:6333 -p 6334:6334 qdrant/qdrant:latest Maintenant, votre base de données vectorielle écoute http://localhost:6333
Disons que nous avons trois PDF ( ~/pdfs/instructions.pdf , ~/pdfs/history.pdf , ~/pdfs/info.pdf ) et nous voulons tester la récupération avec trois encodeurs différents sentence-transformers/all-MiniLM-L6-v2 , sentence-transformers/sentence-t5-base , sentence-transformers/all-mpnet-base-v2 .
Nous pouvons le faire avec ce code très simple:
from sentrev . evaluator import evaluate_rag
from sentence_transformers import SentenceTransformer
from qdrant_client import QdrantClient
# load all the embedding moedels
encoder1 = SentenceTransformer ( 'sentence-transformers/all-MiniLM-L6-v2' )
encoder2 = SentenceTransformer ( 'sentence-transformers/sentence-t5-base' )
encoder3 = SentenceTransformer ( 'sentence-transformers/all-mpnet-base-v1' )
# create a list of the embedders and a dictionary that map each one with its name for the stats report which will be output by SenTrEv
encoders = [ encoder1 , encoder2 , encoder3 ]
encoder_to_names = { encoder1 : 'all-MiniLM-L6-v2' , encoder2 : 'sentence-t5-base' , encoder3 : 'all-mpnet-base-v1' }
# set up a Qdrant client
client = QdrantClient ( "http://localhost:6333" )
# create a list of your PDF paths
pdfs = [ '~/pdfs/instructions.pdf' , '~/pdfs/history.pdf' , '~/pdfs/info.pdf' ]
# Choose a path for the CSV where the evaluation stats will be saved
csv_path = '~/eval/stats.csv'
# evaluate retrieval
evaluate_rag ( pdfs = pdfs , encoders = encoders , encoder_to_name = encoder_to_names , client = client , csv_path = csv_path , distance = 'euclid' , chunking_size = 400 , mrr = 10 , carbon_tracking = "USA" , plot = True ) Vous pouvez jouer avec le groupe de votre PDF en définissant l'argument chunking_size ou avec le pourcentage de texte utilisé pour tester la récupération en définissant text_percentage ou avec la métrique de distance utilisée pour la récupération en définissant l'argument distance ou avec les paramètres mrr en réglant le nombre d'éléments récupérés (dans ce cas 10); Vous pouvez également passer plot=True si vous voulez des parcelles pour l'évaluation: les tracés seront enregistrés dans le même dossier du fichier CSV; Si vous souhaitez activer le suivi des émissions de carbone, vous pouvez utiliser l'option carbon_tracking suivie du code ISO à trois lettres de l'état dans lequel vous vous trouvez.
Vous pouvez également exploiter les solutions de base de données QDRANT On-Cloud (plus à ce sujet ici). Vous avez juste besoin de votre URL de cluster QDRANT et de la touche API pour y accéder:
from qdrant_client import QdrantClient
client = QdrantClient ( url = "YOUR-QDRANT-URL" , api_key = "YOUR-API-KEY" )Il s'agit du seul changement que vous devez apporter au code fourni dans l'exemple précédent.
Vous pouvez également utiliser SentRev pour chanter, vectériser et télécharger vos PDF dans une base de données QDRANT.
from sentrev . evaluator import upload_pdfs
encoder = SentenceTransformer ( 'sentence-transformers/all-MiniLM-L6-v2' )
pdfs = [ '~/pdfs/instructions.pdf' , '~/pdfs/history.pdf' , '~/pdfs/info.pdf' ]
client = QdrantClient ( "http://localhost:6333" )
upload_pdfs ( pdfs = pdfs , encoder = encoder , client = client ) Quant auparavant, vous pouvez également jouer avec l'argument chunking_size (par défaut est 1000) et avec l'argument distance (par défaut est cosinus).
Vous pouvez également rechercher des collections déjà existantes dans une base de données QDrants avec SentRev:
from sentrev . utils import NeuralSearcher
encoder = SentenceTransformer ( 'sentence-transformers/all-MiniLM-L6-v2' )
collection_name = 'customer_help'
client = QdrantClient ( "http://localhost:6333" )
searcher = NeuralSearcher ( client = client , model = encoder , collection_name = collection_name )
res = searcher . search ( "Is it possible to pay online with my credit card?" , limit = 5 )Les résultats seront retournés en tant que liste de charges utiles (les métadonnées que vous avez téléchargées sur la collection QDRANT ainsi que les points vectoriels).
Si vous avez utilisé la fonction SentRev upload_pdfs , vous devriez pouvoir accéder aux résultats de cette manière:
text = res [ 0 ][ "text" ]
source = res [ 0 ][ "source" ]
page = res [ 0 ][ "page" ]Vous pouvez vous référer au cas de test rapporté ici
Trouvez une référence pour toutes les fonctions et classes ici
Les contributions sont toujours les bienvenues!
Trouver des directives de contribution sur contribution.md
Ce projet est open-source et est fourni en vertu d'une licence du MIT.
Si vous avez utilisé SenTrEv pour évaluer vos modèles de récupération, envisagez de le citer:
Bertelli, AC (2024). Évaluation de la performance de trois phrases Transformers Text incorporers - Une étude de cas pour SentRev (V0.1.0). Zenodo. https://doi.org/10.5281/zenodo.14503887
Si vous l'avez trouvé utile, envisagez de le financer.