Sentrev ( senence tr ansformers Ev Aluator) es un paquete de Python que tiene como objetivo ejecutar pruebas de evaluación simples para ayudarlo a elegir el mejor modelo de incrustación para la generación aumentada de recuperación (RAG) con sus documentos PDF.
Sentrev trabaja con:
SentenceTransformer en el paquete de Python sentence_transformers Puede instalar el paquete usando pip ( más fácil pero sin personalización ):
python3 -m pip install sentrevO puede construirlo a partir del código fuente ( más difícil pero personalizable ):
# 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 aplica un flujo de trabajo de evaluación muy simple:
Vea la figura a continuación para obtener una visualización del flujo de trabajo
Las métricas utilizadas para evaluar el rendimiento fueron:
Tasa de éxito : definida como la operación de recuperación de números en la que se recuperó el contexto correcto en la parte superior entre todos los contextos recuperados, fuera de las operaciones de recuperación total:
Ranking recíproco medio (MRR) : MRR define qué tan alto en la clasificación se coloca el contexto correcto entre los resultados recuperados. Se usó MRR@10, lo que significa que para cada operación de recuperación se devolvió 10 elementos y se realizó una evaluación para la clasificación del contexto correcto, que luego se normalizó entre 0 y 1 (ya implementado en Sentrev). Un MRR de 1 significa que el contexto correcto se clasificó primero, mientras que un MRR de 0 significa que no se recuperó. MRR se calcula con la siguiente ecuación general:
Cuando no se recupera el contexto correcto, MRR se establece automáticamente en 0. MRR se calcula para cada operación de recuperación, entonces la desviación promedio y estándar se calcula y informa.
Rendimiento de tiempo : para cada operación de recuperación se calcula el rendimiento de tiempo en segundos: se informa la desviación promedio y estándar.
Emisiones de carbono : las emisiones de carbono se calculan en GCO2EQ (gramos de CO2 equivalente) a través del codecarbon de la biblioteca de Python y se evaluaron para la región austriaca. Se informan para la carga computacional global de todas las operaciones de recuperación.
Puede ejecutar fácilmente Qdrant localmente con Docker:
docker pull qdrant/qdrant:latest
docker run -p 6333:6333 -p 6334:6334 qdrant/qdrant:latest Ahora su base de datos vectorial está escuchando en http://localhost:6333
Digamos que tenemos tres PDFS ( ~/pdfs/instructions.pdf , ~/pdfs/history.pdf , ~/pdfs/info.pdf ) y queremos probar la recuperación con tres codificadores diferentes sentence-transformers/all-MiniLM-L6-v2 , sentence-transformers/sentence-t5-base , sentence-transformers/all-mpnet-base-v2 .
Podemos hacerlo con este código muy 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 ) Puede jugar con la fragmentación de su PDF estableciendo el argumento chunking_size o con el porcentaje de texto utilizado para probar la recuperación estableciendo text_percentage o con la métrica de distancia utilizada para la recuperación estableciendo el argumento distance o con la configuración mrr ajustando el número de elementos recuperados (en este caso 10); También puede pasar plot=True si desea gráficos para la evaluación: los gráficos se guardarán en la misma carpeta del archivo CSV; Si desea activar el seguimiento de emisiones de carbono, puede usar la opción carbon_tracking seguida del código ISO de tres letras del estado en el que se encuentra.
También puede explotar las soluciones de base de datos de Qdrant en la nube (más al respecto aquí). Solo necesita su URL de clúster Qdrant y la clave API para acceder a ella:
from qdrant_client import QdrantClient
client = QdrantClient ( url = "YOUR-QDRANT-URL" , api_key = "YOUR-API-KEY" )Este es el único cambio que debe hacer al código proporcionado en el ejemplo anterior.
Puede usar SentRev también para fragmentar, vectorizar y cargar sus PDF a una base de datos 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 ) En cuanto a antes, también puede jugar con el argumento chunking_size (el valor predeterminado es 1000) y con el argumento distance (el valor predeterminado es coseno).
También puede buscar colecciones ya existentes en una base de datos Qdrant con 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 )Los resultados se devolverán como una lista de cargas útiles (los metadatos que sube a la colección Qdrant junto con los puntos de vector).
Si usó la función Sentrev upload_pdfs , debería poder acceder a los resultados de esta manera:
text = res [ 0 ][ "text" ]
source = res [ 0 ][ "source" ]
page = res [ 0 ][ "page" ]Puede consultar el caso de prueba informado aquí
Encuentre una referencia para todas las funciones y clases aquí
¡Las contribuciones siempre son bienvenidas!
Encuentre las pautas de contribución en la contribución.md
Este proyecto es de código abierto y se proporciona bajo una licencia MIT.
Si usó SenTrEv para evaluar sus modelos de recuperación, considere citarlo:
Bertelli, AC (2024). Evaluación del desempeño de tres integradores de transformadores de texto Incremistadores: un estudio de caso para Sentrev (V0.1.0). Zenodo. https://doi.org/10.5281/zenodo.14503887
Si lo encontró útil, considere financiarlo.