Un système de réponse de question de domaine fermé de bout en bout. Construit au-dessus de la bibliothèque de transformateurs Huggingface.
⛔ [Non maintenu] Ce référentiel n'est plus maintenu, mais est maintenu à des fins éducatives. Si vous voulez une alternative entretenue à CDQA, consultez: https://github.com/deepset-ai/haystack
Si vous souhaitez comprendre le fonctionnement du système et sa mise en œuvre, nous avons écrit un article sur Medium avec une explication de haut niveau.
Nous avons également fait une présentation lors du petit-déjeuner NLP # 9 organisé par Feedly. Vous pouvez le vérifier ici.
pip install cdqagit clone https://github.com/cdqa-suite/cdQA.git
cd cdQA
pip install -e .Des expériences ont été réalisées avec:
t2.medium Deep Learning Ami (Ubuntu) Version 22.0p3.2xlarge Deep Learning Ami (Ubuntu) version 22.0 + un seul Tesla V100 16 Go. Pour utiliser cdQA , vous devez créer un Pandas DataFrame avec les colonnes suivantes:
| titre | paragraphes |
|---|---|
| Le titre de l'article | [Paragraphe 1 de l'article, ..., paragraphe n de l'article] |
L'objectif des convertisseurs cdqa est de faciliter la création de ce DataFrame à partir de votre base de données RAW Documents. Par exemple, le pdf_converter peut créer un cdqa DataFrame à partir d'un répertoire contenant des fichiers .pdf :
from cdqa . utils . converters import pdf_converter
df = pdf_converter ( directory_path = 'path_to_pdf_folder' )Vous devrez installer Java OpenJDK pour utiliser ce convertisseur. Nous avons actuellement des convertisseurs pour:
Nous prévoyons d'améliorer et d'ajouter plus de convertisseurs à l'avenir. Restez à l'écoute!
Vous pouvez télécharger les modèles et les données manuellement à partir des versions GitHub ou utiliser nos fonctions de téléchargement:
from cdqa . utils . download import download_squad , download_model , download_bnpp_data
directory = 'path-to-directory'
# Downloading data
download_squad ( dir = directory )
download_bnpp_data ( dir = directory )
# Downloading pre-trained BERT fine-tuned on SQuAD 1.1
download_model ( 'bert-squad_1.1' , dir = directory )
# Downloading pre-trained DistilBERT fine-tuned on SQuAD 1.1
download_model ( 'distilbert-squad_1.1' , dir = directory )Ajustez le pipeline sur votre corpus à l'aide du lecteur pré-formé:
import pandas as pd
from ast import literal_eval
from cdqa . pipeline import QAPipeline
df = pd . read_csv ( 'your-custom-corpus-here.csv' , converters = { 'paragraphs' : literal_eval })
cdqa_pipeline = QAPipeline ( reader = 'bert_qa.joblib' ) # use 'distilbert_qa.joblib' for DistilBERT instead of BERT
cdqa_pipeline . fit_retriever ( df = df )Si vous souhaitez affiner le lecteur sur votre ensemble de données annoté de type Squad Custom:
cdqa_pipeline = QAPipeline ( reader = 'bert_qa.joblib' ) # use 'distilbert_qa.joblib' for DistilBERT instead of BERT
cdqa_pipeline . fit_reader ( 'path-to-custom-squad-like-dataset.json' )Enregistrez le modèle du lecteur après le réglage fin:
cdqa_pipeline . dump_reader ( 'path-to-save-bert-reader.joblib' )Pour obtenir la meilleure prédiction donnée une requête d'entrée:
cdqa_pipeline . predict ( query = 'your question' )Pour obtenir les n meilleures prédictions:
cdqa_pipeline . predict ( query = 'your question' , n_predictions = N )Il est également possible de modifier le poids du score Retriever par rapport au score du lecteur dans le calcul du score de classement final (la valeur par défaut est de 0,35, ce qui est le meilleur poids de l'ensemble de développement de Squad 1,1-Open)
cdqa_pipeline . predict ( query = 'your question' , retriever_score_weight = 0.35 )Afin d'évaluer les modèles de votre ensemble de données personnalisés, vous devrez l'annoter. Le processus d'annotation peut être effectué en 3 étapes:
Convertissez vos données Pandas en un fichier JSON au format d'escouade:
from cdqa . utils . converters import df2squad
json_data = df2squad ( df = df , squad_version = 'v1.1' , output_dir = '.' , filename = 'dataset-name' )Utilisez un annotateur pour ajouter des paires de questions-réponses de vérité au sol:
Veuillez vous référer à notre cdQA-annotator , un annotateur en ligne pour des questions de questions à domaine fermé répondant aux ensembles de données au format d'escouade.
Évaluer l'objet du pipeline:
from cdqa . utils . evaluation import evaluate_pipeline
evaluate_pipeline ( cdqa_pipeline , 'path-to-annotated-dataset.json' )Évaluer le lecteur:
from cdqa . utils . evaluation import evaluate_reader
evaluate_reader ( cdqa_pipeline , 'path-to-annotated-dataset.json' )Nous avons préparé quelques exemples de cahiers dans le répertoire des exemples.
Vous pouvez également jouer directement avec ces exemples de ordinateur portable à l'aide de Binder ou Google Colaboratory:
| Carnet de notes | Matériel | Plate-forme |
|---|---|---|
| [1] Premières étapes avec CDQA | CPU ou GPU | |
| [2] en utilisant le convertisseur PDF | CPU ou GPU | |
| [3] Formation du lecteur à Squad | GPU |
Binder et Google Colaboratory fournissent des environnements temporaires et peuvent être lents à démarrer, mais nous les recommandons si vous souhaitez commencer avec cdQA facilement.
Vous pouvez déployer une API cdQA REST en exécutant:
export dataset_path=path-to-dataset.csv
export reader_path=path-to-reader-model
FLASK_APP=api.py flask run -h 0.0.0.0Vous pouvez désormais faire des demandes pour tester votre API (ici en utilisant httpie):
http localhost:5000/api query== ' your question here ' Si vous souhaitez desservir une interface utilisateur au-dessus de votre système cdQA , suivez les instructions de CDQA-UI, une interface Web développée pour cdQA .
Lisez nos directives contributives.
| Taper | Titre | Auteur | Année |
|---|---|---|---|
| ? Vidéo | Stanford CS224N: NLP avec Deep Learning Lecture 10 - Question Répondre | Christopher Manning | 2019 |
| ? Papier | Lire Wikipedia pour répondre aux questions du domaine ouvert | Danqi Chen, Adam Fisch, Jason Weston, Antoine Bordes | 2017 |
| ? Papier | Compréhension de la lecture neurale et au-delà | Danqi Chen | 2018 |
| ? Papier | Bert: pré-formation des transformateurs bidirectionnels profonds pour la compréhension du langage | Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova | 2018 |
| ? Papier | Représentations de mots contextuels: une introduction contextuelle | Noah A. Smith | 2019 |
| ? Papier | Question du domaine ouvert de bout en bout Répondre avec Bertserini | Wei Yang, Yuqing Xie, Aileen Lin, Xingyu Li, Luchen Tan, Kun Xiong, Ming Li, Jimmy Lin | 2019 |
| ? Papier | Augmentation des données pour le réglage fin de Bert dans la question de la question du domaine ouvert | Wei Yang, Yuqing Xie, Luchen Tan, Kun Xiong, Ming Li, Jimmy Lin | 2019 |
| ? Papier | Passage à nouveau avec Bert | Rodrigo Nogueira, Kyunghyun Cho | 2019 |
| ? Papier | MRQA: lecture de la machine pour répondre aux questions | Jonathan Berant, Percy Liang, Luke Zettlemoyer | 2019 |
| ? Papier | Question non supervisée Réponse par traduction Cloze | Patrick Lewis, Ludovic Denoyer, Sebastian Riedel | 2019 |
| Cadre | Scikit-Learn: Apprentissage automatique à Python | Pedregosa et al. | 2011 |
| Cadre | Pytorch | Adam Paszke, Sam Gross, Soumith Chintala, Gregory Chanan | 2016 |
| Cadre | Transformers: Traitement du langage naturel de pointe pour TensorFlow 2.0 et Pytorch. | Visage étreint | 2018 |
Apache-2.0