Esta es una bifurcación para el modelo Instructor porque el repositorio original ya no se mantiene actualizado. También hice algunas mejoras en su código fuente:
sentence-transformers
anterior a 2.2.2.Este repositorio contiene el código y los modelos previamente entrenados para nuestro artículo Un incrustador, cualquier tarea: incrustaciones de texto optimizadas con instrucciones. Consulte nuestra página del proyecto para obtener una descripción general rápida del proyecto.
Presentamos Instructor ??, un modelo de incrustación de texto ajustado a instrucciones que puede generar incrustaciones de texto adaptadas a cualquier tarea (p. ej., clasificación, recuperación, agrupación, evaluación de texto, etc.) y dominios (p. ej., ciencia, finanzas, etc.) simplemente proporcionando las instrucciones de la tarea, sin ningún ajuste . ¿Instructor? ¡Logra sota en 70 tareas de integración diversas!
************************** Actualizaciones ********************** *******
encode
Es muy fácil utilizar INSTRUCTOR para cualquier inserción de texto. Puedes probarlo fácilmente en el cuaderno Colab. En su máquina local, le recomendamos crear primero un entorno virtual:
conda env create -n instructor python=3.7
git clone https://github.com/HKUNLP/instructor-embedding
pip install -r requirements.txt
Eso creará el entorno instructor
que utilizamos. Para utilizar la herramienta de incrustación, primero instale el paquete InstructorEmbedding
desde PyPI
pip install InstructorEmbedding
o instalarlo directamente desde nuestro código
pip install -e .
Activa el entorno ejecutando
conda activate instructor
Primero descargue un modelo previamente entrenado (consulte la lista de modelos para obtener una lista completa de los modelos disponibles)
from InstructorEmbedding import INSTRUCTOR
model = INSTRUCTOR ( 'hkunlp/instructor-large' )
Luego proporcione la oración y la instrucción personalizada al modelo.
# prepare texts with instructions
text_instruction_pairs = [
{ "instruction" : "Represent the Science title:" , "text" : "3D ActionSLAM: wearable person tracking in multi-floor environments" },
{ "instruction" : "Represent the Medicine sentence for retrieving a duplicate sentence:" , "text" : "Recent studies have suggested that statins, an established drug group in the prevention of cardiovascular mortality, could delay or prevent breast cancer recurrence but the effect on disease-specific mortality remains unclear." }
]
# postprocess
texts_with_instructions = []
for pair in text_instruction_pairs :
texts_with_instructions . append ([ pair [ "instruction" ], pair [ "text" ]])
# calculate embeddings
customized_embeddings = model . encode ( texts_with_instructions )
Y eso es todo ya. Ahora tenemos una lista de numerosas matrices con las incrustaciones.
for pair , embedding in zip ( text_instruction_pairs , customized_embeddings ):
print ( "Instruction: " , pair [ "instruction" ])
print ( "text: " , pair [ "text" ])
print ( "Embedding: " , embedding )
print ( "" )
encode
Los usuarios del modelo necesitan utilizar sólo la función encode
:
model . encode ( sentences ,
batch_size : int = 32 ,
show_progress_bar : bool = None ,
output_value : str = 'sentence_embedding' ,
convert_to_numpy : bool = True ,
convert_to_tensor : bool = False ,
device : str = None ,
normalize_embeddings : bool = False )
sentences
: Las oraciones que se van a incrustar. Debe tener el formato de [["instruction prompt 0", "text to be embedded 0], ["instruction prompt 1", "text to be embedded 1], ...]
.batch_size
(predeterminado: 32): el tamaño del lote utilizado para el cálculo. Determina el número de frases procesadas juntas en cada lote.show_progress_bar
(predeterminado: Ninguno): si se establece en True
, muestra una barra de progreso mientras codifica oraciones, lo que proporciona una indicación visual del progreso de la codificación.output_value
(predeterminado: 'sentence_embedding'): especifica el tipo de salida deseado. El valor predeterminado 'sentence_embedding' devuelve incrustaciones de oraciones. Establecerlo en 'token_embeddings' devuelve incrustaciones de tokens de palabras. Establecerlo en Ninguno devuelve todos los valores de salida.convert_to_numpy
(predeterminado: True
): si se establece en True
, la salida es una lista de numerosos vectores. Si se establece en False
, el resultado es una lista de tensores de PyTorch.convert_to_tensor
(predeterminado: False
): si se establece en True
, la función devuelve un tensor apilado como salida única. Este parámetro anula cualquier configuración especificada por convert_to_numpy
.device
(predeterminado: Ninguno): especifica el dispositivo torch.device que se utilizará para el cálculo. Si no se especifica, la función utiliza el dispositivo predeterminado.normalize_embeddings
(predeterminado: False
): si se establece en True
, los vectores devueltos tendrán una longitud de 1, lo que indica que están normalizados. En este caso, la búsqueda por similitud utilizaría el producto escalar más rápido ( util.dot_score
), en lugar de la similitud coseno. Lanzamos una serie de puntos de control de INSTRUCTORES con diferentes tamaños. Puede cargar fácilmente estos modelos con el paquete InstructorEmbedding
.
Modelo | Promedio Puntaje |
---|---|
hkunlp/base-instructor | 55,9 |
hkunlp/instructor-grande | 58,4 |
hkunlp/instructor-xl | 58,8 |
A continuación proporcionamos algunos casos de uso específicos. Para obtener más ejemplos y aplicaciones, consulte nuestro artículo.
Si desea calcular incrustaciones personalizadas para oraciones específicas, puede seguir la plantilla unificada para escribir instrucciones:
Representa el domain
text_type
para task_objective
:
domain
es opcional y especifica el dominio del texto, por ejemplo, ciencia, finanzas, medicina, etc.text_type
es obligatorio y especifica la unidad de codificación, por ejemplo, oración, documento, párrafo, etc.task_objective
es opcional y especifica el objetivo de incrustar, por ejemplo, recuperar un documento, clasificar la oración, etc.Puede utilizar INSTRUCTOR para calcular similitudes entre dos grupos de oraciones, con incrustaciones personalizadas .
from sklearn . metrics . pairwise import cosine_similarity
sentences_a = [[ 'Represent the Science sentence: ' , 'Parton energy loss in QCD matter' ],
[ 'Represent the Financial statement: ' , 'The Federal Reserve on Wednesday raised its benchmark interest rate.' ]]
sentences_b = [[ 'Represent the Science sentence: ' , 'The Chiral Phase Transition in Dissipative Dynamics' ],
[ 'Represent the Financial statement: ' , 'The funds rose less than 0.5 per cent on Friday' ]]
embeddings_a = model . encode ( sentences_a )
embeddings_b = model . encode ( sentences_b )
similarities = cosine_similarity ( embeddings_a , embeddings_b )
import numpy as np
from sklearn . metrics . pairwise import cosine_similarity
query = [[ 'Represent the Wikipedia question for retrieving supporting documents: ' , 'where is the food stored in a yam plant' ]]
corpus = [[ 'Represent the Wikipedia document for retrieval: ' , 'Capitalism has been dominant in the Western world since the end of feudalism, but most feel[who?] that the term "mixed economies" more precisely describes most contemporary economies, due to their containing both private-owned and state-owned enterprises. In capitalism, prices determine the demand-supply scale. For example, higher demand for certain goods and services lead to higher prices and lower demand for certain goods lead to lower prices.' ],
[ 'Represent the Wikipedia document for retrieval: ' , "The disparate impact theory is especially controversial under the Fair Housing Act because the Act regulates many activities relating to housing, insurance, and mortgage loans—and some scholars have argued that the theory's use under the Fair Housing Act, combined with extensions of the Community Reinvestment Act, contributed to rise of sub-prime lending and the crash of the U.S. housing market and ensuing global economic recession" ],
[ 'Represent the Wikipedia document for retrieval: ' , 'Disparate impact in United States labor law refers to practices in employment, housing, and other areas that adversely affect one group of people of a protected characteristic more than another, even though rules applied by employers or landlords are formally neutral. Although the protected classes vary by statute, most federal civil rights laws protect based on race, color, religion, national origin, and sex as protected traits, and some laws include disability status and other traits as well.' ]]
query_embeddings = model . encode ( query )
corpus_embeddings = model . encode ( corpus )
similarities = cosine_similarity ( query_embeddings , corpus_embeddings )
retrieved_doc_id = np . argmax ( similarities )
print ( retrieved_doc_id )
import sklearn . cluster
sentences = [[ 'Represent the Medicine sentence for clustering: ' , 'Dynamical Scalar Degree of Freedom in Horava-Lifshitz Gravity' ],
[ 'Represent the Medicine sentence for clustering: ' , 'Comparison of Atmospheric Neutrino Flux Calculations at Low Energies' ],
[ 'Represent the Medicine sentence for clustering: ' , 'Fermion Bags in the Massive Gross-Neveu Model' ],
[ 'Represent the Medicine sentence for clustering: ' , "QCD corrections to Associated t-tbar-H production at the Tevatron" ],
[ 'Represent the Medicine sentence for clustering: ' , 'A New Analysis of the R Measurements: Resonance Parameters of the Higher, Vector States of Charmonium' ]]
embeddings = model . encode ( sentences )
clustering_model = sklearn . cluster . MiniBatchKMeans ( n_clusters = 2 )
clustering_model . fit ( embeddings )
cluster_assignment = clustering_model . labels_
print ( cluster_assignment )
Construimos datos de incrustación multitarea con instrucciones (MEDI), que consta de una colección de 330 conjuntos de datos de Super-NI (Super-NaturalInstructions), datos de entrenamiento de incrustación de transformadores de oraciones, KILT y MedMCQA, que abarcan una amplia gama de dominios y tareas. Construimos pares positivos y negativos si no se proporcionan y los almacenamos en un formato unificado:
[
{'query': ['Represent the Wikipedia question for retrieving relevant documents;', 'big little lies season 2 how many episodes'], 'pos': ['Represent the Wikipedia document for retrieval;', 'Big Little Lies (TV series) series garnered several accolades. It received 16 Emmy Award nominations and won eight, including Outstanding Limited Series and acting awards for Kidman, Skarsgård, and Dern. The trio also won Golden Globe Awards in addition to a Golden Globe Award for Best Miniseries or Television Film win for the series. Kidman and Skarsgård also received Screen Actors Guild Awards for their performances. Despite originally being billed as a miniseries, HBO renewed the series for a second season. Production on the second season began in March 2018 and is set to premiere in 2019. All seven episodes are being written by Kelley'], 'neg': ['Represent the Wikipedia document for retrieval;', 'Little People, Big World final minutes of the season two-A finale, "Farm Overload". A crowd had gathered around Jacob, who was lying on the ground near the trebuchet. The first two episodes of season two-B focus on the accident, and how the local media reacted to it. The first season of "Little People, Big World" generated solid ratings for TLC (especially in the important 18–49 demographic), leading to the show's renewal for a second season. Critical reviews of the series have been generally positive, citing the show's positive portrayal of little people. Conversely, other reviews have claimed that the show has a voyeuristic bend'], 'task_id': 1}
{'query': ['Represent the Wikipedia question for retrieving relevant documents;', 'who sang waiting for a girl like you'], 'pos': ['Represent the Wikipedia document for retrieval;', 'Waiting for a Girl Like You Waiting for a Girl Like You "Waiting for a Girl Like You" is a 1981 power ballad by the British-American rock band Foreigner. The distinctive synthesizer theme was performed by the then-little-known Thomas Dolby, and this song also marked a major departure from their earlier singles because their previous singles were mid to upper tempo rock songs while this song was a softer love song with the energy of a power ballad. It was the second single released from the album "4" (1981) and was co-written by Lou Gramm and Mick Jones. It has become one of the band's most'], 'neg': ['Represent the Wikipedia document for retrieval;', 'Waiting for a Girl Like You held off the number 1 spot by Olivia Newton-John's single "Physical" for nine consecutive weeks, and then by Hall & Oates' "I Can't Go for That (No Can Do)" for a tenth week on January 30, 1982. Because of its chart longevity, it ended up being the number 19 song on the Top 100 singles of 1982. The song was the band's biggest hit until "I Want to Know What Love Is" hit number 1 in 1985. The song lists at number 100 on ""Billboard"'s Greatest Songs of All Time". Waiting for a Girl Like You "Waiting for a Girl'], 'task_id': 1}
...
{'query': ['Represent the Wikipedia sentence for retrieving relevant documents;', 'i LOVE sweet martini drinks!'], 'pos': ['Represent the Wikipedia document for retrieval;', "Appletini AppletininAn Apple martini (Appletini for short) is a cocktail containing vodka and one or more of apple juice, apple cider, apple liqueur, or apple brandy.nThis drink, originally called an Adam's Apple Martini because the bartender who created it was named Adam, was created in 1996 at Lola's West Hollywood restaurant.nThe drink, Adam's Apple was advertised by Smirnoff in the July 1972 issue of Playboy Magazine to the inside front cover. The recipe called for an ounce or so of Smirnoff"], 'neg': ['Represent the Wikipedia document for retrieval;', "Aromatised wine similar beverages described in this legislation are 'aromatised wine-based drinks' (non-fortified) and 'aromatised wine-product cocktail' (blended, lower alcohol drink under 7% ABV).nVarieties of aromatised wine.nVarieties of aromatised wine Vermouth.nVermouth is the most widely used aromatised wine due to its use in cocktails and famous commercial brands such as Martini and Cinzano which are commonplace around the world. Vermouth can be sweet or dry and red, white, pink or orange. It is traditionally"], 'task_id': 300}
]
Cada instancia consta de una consulta, un par positivo, un par negativo y la identificación de la tarea, que se utiliza para garantizar que los datos del mismo lote de entrenamiento provengan de la misma tarea. Los datos de MEDI están disponibles para su descarga en este enlace.
Proporcionamos el script de ejemplo para la formación del INSTRUCTOR. Es posible que primero deba descargar los datos MEDI, descomprimir la carpeta y colocar medi-data.json
en --cache_dir
.
python train . py - - model_name_or_path sentence - transformers / gtr - t5 - large - - output_dir { output_directory } - - cache_dir { cache_directory } - - max_source_length 512 - - num_train_epochs 10 - - save_steps 500 - - cl_temperature 0.1 - - warmup_ratio 0.1 - - learning_rate 2e-5 - - overwrite_output_dir
A continuación explicamos los argumentos:
--model_name_or_path
: puntos de control previamente entrenados para empezar. Admitimos tanto la identificación del modelo (p. ej., sentence-transformers/gtr-t5-large
, sentence-transformers/sentence-t5-large
) como la ruta del punto de control (p. ej., punto de control guardado por el entrenador de transformadores).--cl_temperature
: Temperatura para pérdida de contraste--cache_dir
: el directorio para almacenar en caché los modelos y datos descargados. Los datos MEDI descargados ( medi-data.json
) deben colocarse en el directorio --cache_dir
.--output_dir
: el directorio para almacenar los modelos entrenados (puntos de control) para su evaluación. Todos los demás argumentos son argumentos de entrenamiento Huggingface's transformers
, como --overwrite_output_dir
, --num_train_epochs
, --learning_rate
. Para más detalles, consulte Transformadores Huggingface.
Evaluamos a INSTRUCTOR masivamente en 70 tareas diversas, que abarcan una amplia gama de tareas y dominios. Específicamente, basamos nuestra evaluación en tres puntos de referencia: MTEB, Billboard y Prompt Retrieval. A continuación explicamos los detalles sobre la ejecución de scripts de evaluación.
Para evaluar el rendimiento del modelo en el conjunto de datos de referencia MTEB, primero instale la biblioteca MTEB
cd evaluation / MTEB
pip install - e .
Luego ejecute el siguiente comando:
python examples / evaluate_model . py - - model_name hkunlp / instructor - large - - output_dir outputs - - task_name ArguAna - - result_file results
Puede evaluar los puntos de control de su modelo entrenado especificando --model_name
y ejecutar todos los conjuntos de datos MTEB cambiando --task_name
. Consulte nuestro documento o punto de referencia MTEB para conocer las métricas de evaluación de todas las tareas.
Para evaluar el rendimiento del modelo en Billboard, ejecute el siguiente comando:
cd evaluation / text_evaluation
python main . py - - model_name hkunlp / instructor - large - - task mscoco - - add_prompt
Puede evaluar los puntos de control de su modelo entrenado especificando --model_name
y ejecutar todos los conjuntos de datos de Billboard cambiando --task
. En los tres conjuntos de datos de Billboard, informamos la correlación de Pearson.
Para evaluar el rendimiento del modelo en la recuperación rápida, ejecute el siguiente comando:
cd evaluation / prompt_retrieval
python main . py - - embedding_model hkunlp / instructor - large - - task rte - - model_cache_dir { cache_dir } - - output_dir { output_dir } - - add_prompt
Puede evaluar los puntos de control de su modelo entrenado especificando --model_name
y ejecutar conjuntos de datos de recuperación rápida cambiando --task
. Para tener una métrica coherente, convertimos todas las tareas en Recuperación rápida en un formato de "texto a texto" e informamos la puntuación de Rouge-L.
Para cuantificar el modelo instructor embedding , ejecute el siguiente código:
# imports
import torch
from InstructorEmbedding import INSTRUCTOR
# load the model
model = INSTRUCTOR ( 'hkunlp/instructor-large' , device = 'cpu' ) # you can use GPU
# quantize the model
qmodel = torch . quantization . quantize_dynamic (
model , { torch . nn . Linear }, dtype = torch . qint8 )
# Inference
sentence = "3D ActionSLAM: wearable person tracking in multi-floor environments"
instruction = "Represent the Science title:"
embeddings = qmodel . encode ([[ instruction , sentence ]])
# you can also normalize the embeddings: normalize_embeddings=True
print ( f"Quantized Embeddings: n { embeddings } " )
Reduce el tamaño del modelo 10 veces y el tiempo de inferencia será menor que el del modelo normal :)
Si tiene alguna pregunta relacionada con el código o el documento, no dude en enviar un correo electrónico a Hongjin ( [email protected]
) y Weijia ( [email protected]
). Intente especificar el problema con detalles para que podamos ayudarle mejor y más rápido.
Si encuentra útil nuestro trabajo, cítenos:
@inproceedings { INSTRUCTOR ,
title = { One Embedder, Any Task: Instruction-Finetuned Text Embeddings } ,
author = { Su, Hongjin and Shi, Weijia and Kasai, Jungo and Wang, Yizhong and Hu, Yushi and Ostendorf, Mari and Yih, Wen-tau and Smith, Noah A. and Zettlemoyer, Luke and Yu, Tao } ,
url = { https://arxiv.org/abs/2212.09741 } ,
year = { 2022 } ,
}
¡Agradecemos los esfuerzos de la comunidad por extender INSTRUCTOR!
InstructorTextEmbedder
e InstructorDocumentEmbedder
.