Il s'agit d'un fork pour le modèle Instructor car le référentiel d'origine n'est plus conservé. J'ai également apporté quelques améliorations à leur code source :
sentence-transformers
ci-dessus 2.2.2.Ce référentiel contient le code et les modèles pré-entraînés pour notre article One Embedder, Any Task: Instruction-Finetuned Text Embeddings. Veuillez vous référer à notre page de projet pour un aperçu rapide du projet.
Nous introduisons Instructor ??, un modèle d'intégration de texte affiné par les instructions qui peut générer des intégrations de texte adaptées à n'importe quelle tâche (par exemple, classification, récupération, regroupement, évaluation de texte, etc.) et domaines (par exemple, science, finance, etc.) en fournissant simplement les instructions de tâche, sans aucun réglage . Instructeur ? réalise sota sur 70 tâches d'intégration diverses !
************************** Mises à jour ******************** *******
encode
Il est très simple d’utiliser INSTRUCTOR pour toute intégration de texte. Vous pouvez facilement l'essayer dans le bloc-notes Colab. Sur votre machine locale, nous vous recommandons de créer d'abord un environnement virtuel :
conda env create -n instructor python=3.7
git clone https://github.com/HKUNLP/instructor-embedding
pip install -r requirements.txt
Cela créera l’ instructor
d’environnement que nous avons utilisé. Pour utiliser l'outil d'intégration, installez d'abord le package InstructorEmbedding
à partir de PyPI
pip install InstructorEmbedding
ou installez-le directement depuis notre code
pip install -e .
Activez l'environnement en exécutant
conda activate instructor
Téléchargez d'abord un modèle pré-entraîné (voir la liste des modèles pour une liste complète des modèles disponibles)
from InstructorEmbedding import INSTRUCTOR
model = INSTRUCTOR ( 'hkunlp/instructor-large' )
Fournissez ensuite la phrase et les instructions personnalisées au modèle.
# 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 )
Et c'est déjà tout. Nous avons maintenant une liste de tableaux numpy avec les intégrations.
for pair , embedding in zip ( text_instruction_pairs , customized_embeddings ):
print ( "Instruction: " , pair [ "instruction" ])
print ( "text: " , pair [ "text" ])
print ( "Embedding: " , embedding )
print ( "" )
encode
Les utilisateurs du modèle doivent utiliser uniquement la fonction 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
: Les phrases à intégrer. Il doit être au format [["instruction prompt 0", "text to be embedded 0], ["instruction prompt 1", "text to be embedded 1], ...]
.batch_size
(par défaut : 32) : la taille du lot utilisée pour le calcul. Il détermine le nombre de phrases traitées ensemble dans chaque lot.show_progress_bar
(par défaut : Aucun) : s'il est défini sur True
, il affiche une barre de progression lors de l'encodage des phrases, fournissant une indication visuelle de la progression de l'encodage.output_value
(par défaut : 'sentence_embedding') : Spécifie le type de sortie souhaité. La valeur par défaut « sentence_embedding » renvoie les incorporations de phrases. Le définir sur « token_embeddings » renvoie les intégrations de jetons Wordpiece. Le définir sur Aucun renvoie toutes les valeurs de sortie.convert_to_numpy
(par défaut : True
) : si défini sur True
, la sortie est une liste de vecteurs numpy. S'il est défini sur False
, le résultat est une liste de tenseurs PyTorch.convert_to_tensor
(par défaut : False
) : si elle est définie sur True
, la fonction renvoie un tenseur empilé sous forme de sortie unique. Ce paramètre remplace tout paramètre spécifié par convert_to_numpy
.device
(par défaut : Aucun) : Spécifie le torch.device à utiliser pour le calcul. Si non spécifié, la fonction utilise le périphérique par défaut.normalize_embeddings
(par défaut : False
) : s'il est défini sur True
, les vecteurs renvoyés auront une longueur de 1, indiquant qu'ils sont normalisés. Dans ce cas, la recherche de similarité utiliserait le produit scalaire le plus rapide ( util.dot_score
), au lieu de la similarité cosinus. Nous avons publié une série de points de contrôle INSTRUCTOR de différentes tailles. Vous pouvez facilement charger ces modèles avec le package InstructorEmbedding
.
Modèle | Moy. Score |
---|---|
hkunlp/base-instructeur | 55,9 |
hkunlp/instructeur-grand | 58,4 |
hkunlp/instructeur-xl | 58,8 |
Nous proposons ci-dessous quelques cas d’utilisation spécifiques. Pour plus d'exemples et d'applications, reportez-vous à notre article
Si vous souhaitez calculer des intégrations personnalisées pour des phrases spécifiques, vous pouvez suivre le modèle unifié pour rédiger des instructions :
Représentez le domain
text_type
pour task_objective
:
domain
est facultatif et spécifie le domaine du texte, par exemple science, finance, médecine, etc.text_type
est obligatoire et spécifie l'unité de codage, par exemple une phrase, un document, un paragraphe, etc.task_objective
est facultatif et spécifie l'objectif de l'intégration, par exemple récupérer un document, classer la phrase, etc.Vous pouvez utiliser INSTRUCTOR pour calculer les similitudes entre deux groupes de phrases, avec des intégrations personnalisées .
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 )
Nous construisons des données d'intégration multitâches avec instructions (MEDI), constituées d'une collection de 330 ensembles de données de Super-NI (Super-NaturalInstructions), transformateur de phrases intégrant des données de formation, KILT et MedMCQA, couvrant un large éventail de domaines et de tâches. Nous construisons des paires positives et négatives si elles ne sont pas fournies, et les stockons dans un format unifié :
[
{'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}
]
Chaque instance se compose d'une requête, d'une paire positive, d'une paire négative et de l'identifiant de la tâche, qui est utilisé pour garantir que les données du même lot d'entraînement proviennent de la même tâche. Les données MEDI peuvent être téléchargées sur ce lien.
Nous fournissons l’exemple de script pour la formation INSTRUCTEUR. Vous devrez peut-être d'abord télécharger les données MEDI, décompresser le dossier et placer medi-data.json
sous --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
Nous expliquons les arguments ci-dessous :
--model_name_or_path
: points de contrôle pré-entraînés pour commencer. Nous prenons en charge à la fois l'identifiant du modèle (par exemple, sentence-transformers/gtr-t5-large
, sentence-transformers/sentence-t5-large
) ou le chemin du point de contrôle (par exemple, point de contrôle enregistré par l'entraîneur des transformateurs).--cl_temperature
: Température pour la perte de contraste--cache_dir
: Le répertoire dans lequel mettre en cache les modèles et les données téléchargés. Les données MEDI téléchargées ( medi-data.json
) doivent être placées dans le répertoire --cache_dir
.--output_dir
: Le répertoire dans lequel stocker les modèles entraînés (points de contrôle) pour évaluation. Tous les autres arguments sont les arguments de formation Huggingface's transformers
, tels que --overwrite_output_dir
, --num_train_epochs
, --learning_rate
. Pour plus de détails, reportez-vous à Transformateurs Huggingface
Nous évaluons massivement INSTRUCTOR sur 70 tâches diverses, couvrant un large éventail de tâches et de domaines. Plus précisément, nous basons notre évaluation sur trois critères : MTEB, Billboard et Prompt Retrieval. Nous expliquons les détails de l'exécution des scripts d'évaluation dans ce qui suit.
Pour évaluer les performances du modèle sur l'ensemble de données de référence MTEB, installez d'abord la bibliothèque MTEB.
cd evaluation / MTEB
pip install - e .
Exécutez ensuite la commande suivante :
python examples / evaluate_model . py - - model_name hkunlp / instructor - large - - output_dir outputs - - task_name ArguAna - - result_file results
Vous pouvez évaluer les points de contrôle de votre modèle entraîné en spécifiant --model_name
et exécuter tous les ensembles de données MTEB en modifiant --task_name
. Consultez notre document ou notre benchmark MTEB pour connaître les mesures d'évaluation de toutes les tâches.
Pour évaluer les performances du modèle sur Billboard, exécutez la commande suivante :
cd evaluation / text_evaluation
python main . py - - model_name hkunlp / instructor - large - - task mscoco - - add_prompt
Vous pouvez évaluer les points de contrôle de votre modèle entraîné en spécifiant --model_name
et exécuter tous les ensembles de données Billboard en modifiant --task
. Dans les trois ensembles de données de Billboard, nous rapportons la corrélation de Pearson.
Pour évaluer les performances du modèle lors de la récupération d'invite, exécutez la commande suivante :
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
Vous pouvez évaluer les points de contrôle de votre modèle entraîné en spécifiant --model_name
et exécuter des ensembles de données de récupération rapide en modifiant --task
. Afin d'avoir une métrique cohérente, nous convertissons toutes les tâches de Prompt Retrieval dans un format « texte à texte » et rapportons le score Rouge-L.
Pour quantifier le modèle instructor embedding , exécutez le code suivant :
# 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 } " )
Cela réduit la taille du modèle de 10x et le temps d'inférence sera inférieur au modèle normal :)
Si vous avez des questions concernant le code ou le document, n'hésitez pas à envoyer un e-mail à Hongjin ( [email protected]
) et Weijia ( [email protected]
). Veuillez essayer de spécifier le problème avec des détails afin que nous puissions vous aider mieux et plus rapidement.
Si vous trouvez notre travail utile, veuillez nous citer :
@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 } ,
}
Nous remercions les efforts de la communauté pour étendre INSTRUCTOR !
InstructorTextEmbedder
et InstructorDocumentEmbedder
.