Remarque en haut: le projet n'est pas entretenu.
Les modèles de dialogue basés sur le transformateur fonctionnent mieux et nous vous recommandons de les utiliser au lieu de CAKECHAT basé sur RNN. Voir, par exemple https://github.com/microsoft/dialogpt
CAKECHAT est un backend pour les chatbots capable d'exprimer des émotions via des conversations.

Cakechat est construit sur Keras et Tensorflow.
Le code est flexible et permet de conditionner les réponses du modèle par une variable catégorique arbitraire. Par exemple, vous pouvez former votre propre modèle de conversation neuronal basé sur la personne [1] ou créer une machine de chat émotionnelle [2] .

Modèle:
Mot d'intégration de la couche:
Décodage
Métrique:
Au cas où vous connaissez Docker, le moyen le plus simple d'exécuter un modèle CAKECHAT pré-formé en tant que serveur. Vous devrez peut-être exécuter les commandes suivantes avec sudo .
Version CPU:
docker pull lukalabs/cakechat:latest &&
docker run --name cakechat-server -p 127.0.0.1:8080:8080 -it lukalabs/cakechat:latest bash -c "python bin/cakechat_server.py"
Version GPU:
docker pull lukalabs/cakechat-gpu:latest &&
nvidia-docker run --name cakechat-gpu-server -p 127.0.0.1:8080:8080 -it lukalabs/cakechat-gpu:latest bash -c "CUDA_VISIBLE_DEVICES=0 python bin/cakechat_server.py"
C'est ça! Testez maintenant votre serveur CAKECHAT en exécutant la commande suivante sur votre machine hôte:
python tools/test_api.py -f localhost -p 8080 -c "hi!" -c "hi, how are you?" -c "good!" -e "joy"
Le dict de réponse peut ressembler à ceci:
{'response': "I'm fine!"}
Docker est le moyen le plus simple de configurer l'environnement et d'installer toutes les dépendances pour la formation et les tests.
Remarque: Nous recommandons fortement d'utiliser un environnement compatible GPU pour la formation du modèle CAKECHAT. L'inférence peut être effectuée à la fois sur les GPU et les CPU.
Installer docker.
Tirez une image Docker uniquement du processeur de DockerHub:
docker pull lukalabs/cakechat:latest
docker run --name <YOUR_CONTAINER_NAME> -it lukalabs/cakechat:latest
Installez Nvidia-Docker pour le support GPU.
Tirez l'image Docker compatible GPU de DockerHub:
docker pull lukalabs/cakechat-gpu:latest
nvidia-docker run --name <YOUR_CONTAINER_NAME> -it cakechat-gpu:latest
C'est ça! Vous pouvez maintenant former votre modèle et discuter avec. Voir la section correspondante ci-dessous pour d'autres instructions.
Si vous ne souhaitez pas traiter avec Docker, vous pouvez installer toutes les exigences manuellement:
pip install -r requirements.txt -r requirements-local.txt
NB:
Nous vous recommandons d'installer les exigences dans un VirtualEnv pour éviter de jouer avec vos packages système.
Vous pouvez télécharger nos poids de modèle pré-formés en exécutant python tools/fetch.py .
Les paramètres du modèle pré-formé sont les suivants:
Le modèle a été formé sur un corpus Twitter prétraité avec environ 50 millions de dialogues (11 Go de données texte). Pour nettoyer le corpus, nous avons retiré
Nous avons utilisé notre classificateur d'émotions pour étiqueter chaque énoncé avec l'une des 5 émotions suivantes: "neutral", "joy", "anger", "sadness", "fear" et utilisé ces étiquettes pendant l'entraînement. Pour marquer votre propre corpus avec des émotions, vous pouvez utiliser, par exemple, Deepmoji Tool.
Malheureusement, en raison de la politique de confidentialité de Twitter, nous ne sommes pas autorisés à fournir notre ensemble de données. Vous pouvez former un modèle de boîte de dialogue sur n'importe quel ensemble de données de conversation de texte à votre disposition, un excellent aperçu des ensembles de données conversationnels existants peut être trouvé ici: https://breakend.github.io/dialogdatasets/
Les données de formation doivent être un fichier TXT, où chaque ligne est un objet JSON valide, représentant une liste d'énoncés de dialogue. Reportez-vous à notre ensemble de données de train factice pour voir la structure de fichiers nécessaire. Remplacez ce corpus factice par vos données avant la formation.
Il y a deux options:
La première approche est moins restrictive: vous pouvez utiliser toutes les données de formation que vous souhaitez et définir les paramètres de configuration du modèle. Cependant, vous devez savoir que vous aurez besoin de suffisamment de données de train (~ 50 Mo au moins), un ou plusieurs GPU et suffisamment de patience (jours) pour obtenir les réponses du bon modèle.
La deuxième approche est limitée par le choix des paramètres de configuration du modèle pré-formé - voir cakechat/config.py pour la liste complète. Si les paramètres par défaut conviennent à votre tâche, le réglage fin devrait être une bonne option.
Récupérez le modèle pré-formé d'Amazon S3 en exécutant python tools/fetch.py .
Mettez votre corpus de texte de formation sur data/corpora_processed/train_processed_dialogs.txt . Assurez-vous que votre ensemble de données est suffisamment grand, sinon votre modèle risque de sur-ajuster les données et que les résultats seront médiocres.
Exécutez python tools/train.py .
results/nn_models , le chemin complet est déduit de l'ensemble des paramètres de configuration.-i , par exemple, python tools/train.py -i results/nn_models/my_saved_weights/model.current .CUDA_VISIBLE_DEVICES=<GPU_ID> Variable d'environnement (avec <gpu_id> comme dans la sortie de la commande nvidia-SMI ) si vous souhaitez utiliser GPU. Par exemple, CUDA_VISIBLE_DEVICES=0 python tools/train.py exécutera le processus de train sur le 0-GPU.-s pour former le modèle sur un sous-ensemble des n échantillons de première n échantillons de formation pour accélérer le prétraitement pour le débogage. Par exemple, exécutez python tools/train.py -s 1000 pour s'entraîner sur les 1000 premiers échantillons. Les poids du modèle qualifié sont enregistrés sur results/nn_models/ .
Mettez votre corpus de texte de formation sur data/corpora_processed/train_processed_dialogs.txt .
Configurez les paramètres de formation dans cakechat/config.py . Voir la description des paramètres de configuration pour plus de détails.
Envisagez d'exécuter PYTHONHASHSEED=42 python tools/prepare_index_files.py pour créer les fichiers d'index avec des jetons et des conditions du corpus de formation. Assurez-vous de définir la variable d'environnement PYTHONHASHSEED , sinon vous pouvez obtenir différents fichiers d'index pour différents lancements du script. AVERTISSEMENT: Ce script écrase les fichiers d'index de jetons d'origine data/tokens_index/t_idx_processed_dialogs.json et data/conditions_index/c_idx_processed_dialogs.json . Vous ne devez exécuter ce script que au cas où votre corpus serait suffisamment grand pour contenir tous les mots que vous souhaitez que votre modèle comprenne. Sinon, considérez le réglage fin du modèle pré-formé comme décrit ci-dessus. Si vous avez gâché les fichiers d'index et que vous souhaitez obtenir les versions par défaut, supprimez vos copies et exécutez python tools/fetch.py à nouveau.
Pensez à exécuter python tools/train_w2v.py pour construire une intégration W2V dans le corpus d'entraînement. AVERTISSEMENT: Ce script écrase les poids W2V originaux qui sont stockés dans data/w2v_models . Vous ne devez exécuter ce script que au cas où votre corpus serait suffisamment grand pour contenir tous les mots que vous souhaitez que votre modèle comprenne. Sinon, considérez le réglage fin du modèle pré-formé comme décrit ci-dessus. Si vous avez gâché avec les fichiers W2V et que vous souhaitez obtenir la version par défaut, supprimez votre copie de fichier et exécutez python tools/fetch.py à nouveau.
Exécutez python tools/train.py .
CUDA_VISIBLE_DEVICES=<GPU_ID> Variable d'environnement (avec <gpu_id> comme dans la sortie de la commande nvidia-SMI ) si vous souhaitez utiliser GPU. Par exemple, CUDA_VISIBLE_DEVICES=0 python tools/train.py exécutera le processus de train sur le 0-GPU.-s pour former le modèle sur un sous-ensemble des n échantillons de première n échantillons de formation pour accélérer le prétraitement pour le débogage. Par exemple, exécutez python tools/train.py -s 1000 pour s'entraîner sur les 1000 premiers échantillons. Vous pouvez également définir IS_DEV=1 pour activer le "mode de développement". Il utilise un nombre réduit de paramètres du modèle (diminution des dimensions de la couche cachée, des tailles d'entrée et de sortie des séquences de jetons, etc.) et effectue une journalisation verbale. Reportez-vous aux lignes inférieures de cakechat/config.py pour la liste complète des paramètres de développement.
Les poids du modèle qualifié sont enregistrés sur results/nn_models/ .
Le conteneur Docker compatible GPU prend en charge le train distribué sur plusieurs GPU à l'aide de Horovod.
Par exemple, exécutez python tools/distributed_train.py -g 0 1 pour commencer la formation sur 0 et 1 GPU.
Pendant la formation, les ensembles de données suivants sont utilisés pour les validations Calcul des métriques:
data/corpora_processed/val_processed_dialogs.txt (exemple factice, remplacez par vos données) - pour l'ensemble de données sensible au contextedata/quality/context_free_validation_set.txt - pour l'ensemble de données de validation sans contextedata/quality/context_free_questions.txt - est utilisé pour générer des réponses pour l'exploitation forestière et le calcul de la métrique distinctedata/quality/context_free_test_set.txt - est utilisé pour calculer les métriques du modèle formé, par exemple, le classement des mesures Les métriques sont stockées sur cakechat/results/tensorboard et peuvent être visualisées à l'aide de Tensorboard. Si vous exécutez un conteneur Docker à partir de l'image Docker CPU ou GPU fournie, le serveur Tensorboard doit démarrer automatiquement et servir sur http://localhost:6006 . Ouvrez ce lien dans votre navigateur pour voir les graphiques d'entraînement.
Si vous avez installé les exigences manuellement, démarrez d'abord le serveur Tensorboard en exécutant la commande suivante à partir de votre répertoire racine CakEchat:
mkdir -p results/tensorboard && tensorboard --logdir=results/tensorboard 2>results/tensorboard/err.log &
Après cela, passez à http://localhost:6006 .
Vous pouvez exécuter les outils suivants pour évaluer votre modèle formé sur les données de test (exemple factice, remplacer par vos données):
tools/quality/ranking_quality.py - Calcul des métriques de classement d'un modèle de boîte de dialoguetools/quality/prediction_distinctness.py - calcule une métrique distincte d'un modèle de dialoguetools/quality/condition_quality.py - Calcule les mesures sur différents sous-ensembles de données en fonction de la valeur de conditiontools/generate_predictions.py - évalue le modèle. Génère des prédictions d'un modèle de dialogue sur l'ensemble des contextes de dialogue donnés, puis calcule les métriques. Notez que vous devriez avoir un modèle inverse dans le répertoire data/nn_models si vous souhaitez utiliser les modes de prédiction "* -reanking"tools/generate_predictions_for_condition.py - génère des prédictions pour une valeur de condition donnée Exécutez un serveur qui traite les requêtes HTTP avec des messages d'entrée donnés et renvoie les messages de réponse du modèle:
python bin/cakechat_server.py
Spécifiez CUDA_VISIBLE_DEVICES=<GPU_ID> Variable d'environnement pour exécuter le serveur sur un certain GPU.
N'oubliez pas d'exécuter python tools/fetch.py avant de démarrer le serveur si vous souhaitez utiliser notre modèle pré-formé.
Pour vous assurer que tout fonctionne bien, testez le modèle dans la conversation suivante
- Salut, Eddie, quoi de neuf?
- Pas grand-chose, et toi?
- Très bien, merci. Allez-vous au cinéma demain?
En exécutant la commande:
python tools/test_api.py -f 127.0.0.1 -p 8080
-c "Hi, Eddie, what's up?"
-c "Not much, what about you?"
-c "Fine, thanks. Are you going to the movies tomorrow?"
Vous devriez obtenir une réponse significative, par exemple:
{'response': "Of course!"}
Les paramètres JSON sont:
| Paramètre | Taper | Description |
|---|---|---|
| contexte | liste des chaînes | Liste des messages précédents de l'histoire du dialogue (max. 3 est utilisé) |
| émotion | String, une de l'énumération | L'un des {«neutres», «colère», «joie», «peur», «tristesse»}. Une émotion pour conditionner la réponse. Param facultatif, s'il n'est pas spécifié, «neutre» est utilisé |
POST /cakechat_api/v1/actions/get_response
data: {
'context': ['Hello', 'Hi!', 'How are you?'],
'emotion': 'joy'
}
200 OK
{
'response': 'I'm fine!'
}
Nous vous recommandons d'utiliser Gunicorn pour servir l'API de votre modèle à l'échelle de production.
Installer Gunicorn: pip install gunicorn
Exécutez un serveur qui traite les quais http avec des messages d'entrée et renvoie les messages de réponse du modèle:
cd bin && gunicorn cakechat_server:app -w 1 -b 127.0.0.1:8080 --timeout 2000
Vous pouvez exécuter votre modèle CAKECHAT en tant que bot télégramme:
python tools/telegram_bot.py --token <YOUR_BOT_TOKEN> et discutez avec Télégramme. cakechat/dialog_model/ - Contient un graphique de calcul, une procédure de formation et d'autres utilitaires de modèlecakechat/dialog_model/inference/ - Algorithmes pour la génération de réponsecakechat/dialog_model/quality/ - Code pour le calcul et la journalisation des métriquescakechat/utils/ - Utilitaires pour le traitement de texte, formation W2V, etc.cakechat/api/ - Fonctions pour exécuter le serveur HTTP: configuration de l'API, gestion des erreurstools/ - Scripts pour la formation, les tests et l'évaluation de votre modèlebin/cakechat_server.py - exécute un serveur http qui renvoie les messages de réponse du modèle donné des contextes de dialogue et une émotion. Voir la section Exécuter pour plus de détails.tools/train.py - forme le modèle sur vos données. Vous pouvez utiliser l'option --reverse pour former un modèle inverse utilisé dans les algorithmes de génération de réponse "* -reanking" pour des prédictions plus précises.tools/prepare_index_files.py - prépare l'index pour les jetons et conditions les plus couramment utilisés. Utilisez ce script avant d'entraîner le modèle à partir de zéro sur vos propres données.tools/quality/ranking_quality.py - Calcul des métriques de classement d'un modèle de boîte de dialogue.tools/quality/prediction_distinctness.py - calcule une métrique distincte d'un modèle de boîte de dialogue.tools/quality/condition_quality.py - Calcule des mesures sur différents sous-ensembles de données en fonction de la valeur de condition.tools/generate_predictions.py - évalue le modèle. Génère des prédictions d'un modèle de dialogue sur l'ensemble des contextes de dialogue donnés, puis calcule les métriques. Notez que vous devez avoir un modèle inverse dans le répertoire results/nn_models si vous souhaitez utiliser les modes de prédiction "* -reranking".tools/generate_predictions_for_condition.py - génère des prédictions pour une valeur de condition donnée.tools/test_api.py - Exemple de code pour envoyer des demandes à un serveur HTTP en cours.tools/fetch.py - télécharge le modèle pré-formé et index des fichiers qui lui sont associés.tools/telegram_bot.py - Exécute le bot Telegram sur le modèle formé. Tous les paramètres de configuration pour l'architecture réseau, la formation, la prévision et les étapes de journalisation sont définis dans cakechat/config.py . Certains paramètres d'inférence utilisés dans un serveur HTTP sont définis dans cakechat/api/config.py .
Architecture et taille du réseau
HIDDEN_LAYER_DIMENSION est le paramètre principal qui définit le nombre d'unités cachées dans les couches récurrentes.WORD_EMBEDDING_DIMENSION et CONDITION_EMBEDDING_DIMENSION Définissez le nombre d'unités cachées dans lesquelles chaque jeton / condition est mappé.tokens_index .Algorithme de décodage:
PREDICTION_MODE_FOR_TESTS définit comment les réponses du modèle sont générées. Les options sont les suivantes:DEFAULT_TEMPERATURE .SAMPLES_NUM_FOR_RERANKING et MMI_REVERSE_MODEL_SCORE_WEIGHT . Notez qu'il existe d'autres paramètres qui affectent le processus de génération de réponse. Voir REPETITION_PENALIZE_COEFFICIENT , NON_PENALIZABLE_TOKENS , MAX_PREDICTIONS_LENGTH .
En fournissant des étiquettes de condition supplémentaires dans les entrées de jeu de données, vous pouvez créer les modèles suivants:
Pour utiliser ces conditions supplémentaires, veuillez vous référer à la section formation du modèle. Définissez simplement le champ "Condition" dans l'ensemble de formation sur l'un des éléments suivants: ID Persona , émotion ou étiquette de sujet , mettez à jour les fichiers d'index et démarrez la formation.
Cakechat est développé et entretenu par l'équipe Replika:
Nicolas Ivanov, Michael Khalman, Nikita Smetanin, Artem Rodichev et Denis Fedorenko.
Demo par Oleg Akbarov, Alexander Kuznetsov et Vladimir Chernosvitov.
Tous les problèmes et les demandes de fonctionnalités peuvent être suivis ici - les problèmes de GitHub.
© 2019 Luka, Inc. Licencié sous la licence Apache, version 2.0. Voir le fichier de licence pour plus de détails.