Hinweis oben: Das Projekt ist nicht gehört.
Transformator-basierte Dialogmodelle funktionieren besser und wir empfehlen, sie anstelle von RNN-basierten Cakechat zu verwenden. Siehe zum Beispiel https://github.com/microsoft/dialogpt
Cakechat ist ein Backend für Chatbots, die Emotionen über Gespräche ausdrücken können.

Cakechat basiert auf Keras und Tensorflow.
Der Code ist flexibel und ermöglicht es, die Antworten des Modells durch eine willkürliche kategoriale Variable zuzustimmen. Sie können beispielsweise Ihr eigenes personenbasiertes neuronales Konversationsmodell [1] trainieren oder eine emotionale Chat-Maschine [2] erstellen.

Modell:
Worteinbettungsschicht:
Dekodierung
Metriken:
Falls Sie mit Docker vertraut sind, ist dies der einfachste Weg, um ein vorgebildetes Cakechat-Modell als Server auszuführen. Möglicherweise müssen Sie die folgenden Befehle mit sudo ausführen.
CPU -Version:
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"
GPU -Version:
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"
Das war's! Testen Sie nun Ihren Cakechat -Server, indem Sie den folgenden Befehl auf Ihrem Host -Computer ausführen:
python tools/test_api.py -f localhost -p 8080 -c "hi!" -c "hi, how are you?" -c "good!" -e "joy"
Das Antwortdikt kann so aussehen:
{'response': "I'm fine!"}
Docker ist der einfachste Weg, um die Umgebung einzurichten und alle Abhängigkeiten für Schulungen und Tests zu installieren.
Hinweis: Wir empfehlen dringend, die GPU-fähige Umgebung zum Schulungs-Cakechat-Modell zu verwenden. Inferenz kann sowohl bei GPUs als auch bei CPUs erfolgen.
Docker installieren.
Ziehen Sie nur ein CPU-Bild von DockerHub an: Docker-Bild:
docker pull lukalabs/cakechat:latest
docker run --name <YOUR_CONTAINER_NAME> -it lukalabs/cakechat:latest
Installieren Sie Nvidia-Docker für die GPU-Unterstützung.
Ziehen Sie das GPU-fähige Docker-Bild von DockerHub an:
docker pull lukalabs/cakechat-gpu:latest
nvidia-docker run --name <YOUR_CONTAINER_NAME> -it cakechat-gpu:latest
Das war's! Jetzt können Sie Ihr Modell trainieren und mit ihm chatten. Weitere Anweisungen finden Sie im entsprechenden Abschnitt unten.
Wenn Sie sich nicht mit Docker befassen möchten, können Sie alle Anforderungen manuell installieren:
pip install -r requirements.txt -r requirements-local.txt
NB:
Wir empfehlen, die Anforderungen in einem VirtualenV zu installieren, um das Durcheinander mit Ihren Systempaketen zu verhindern.
Sie können unsere vorgebildeten Modellgewichte herunterladen, indem Sie python tools/fetch.py ausführen.
Die Parameter des vorgebreiteten Modells sind Folgendes:
Das Modell wurde auf einem vorverarbeiteten Twitter -Korpus mit ~ 50 Millionen Dialogen (11 GB Textdaten) trainiert. Um den Korpus aufzuräumen, entfernten wir uns
Wir haben unseren Emotions -Klassifizierer verwendet, um jede Äußerung mit einem der folgenden 5 Emotionen zu kennzeichnen: "neutral", "joy", "anger", "sadness", "fear" und diese Labels während des Trainings verwendet. Um Ihr eigenes Korpus mit Emotionen zu markieren, können Sie beispielsweise das Deepmoji-Tool verwenden.
Leider dürfen wir aufgrund der Datenschutzrichtlinie von Twitter unseren Datensatz nicht bereitstellen. Sie können ein Dialogmodell in jedem Text -Konversationsdatensatz trainieren, der Ihnen zur Verfügung steht. Eine großartige Übersicht über vorhandene Konversationsdatensätze finden Sie hier: https://breakend.github.io/dialogdatasets/
Die Trainingsdaten sollten eine TXT -Datei sein, wobei jede Zeile ein gültiges JSON -Objekt ist, das eine Liste der Dialog -Äußerungen darstellt. In unserem Dummy -Zug -Datensatz finden Sie die erforderliche Dateistruktur. Ersetzen Sie diesen Dummy -Korpus vor dem Training durch Ihre Daten.
Es gibt zwei Optionen:
Der erste Ansatz ist weniger restriktiv: Sie können alle gewünschten Trainingsdaten verwenden und alle Konfigurationsparameter des Modells festlegen. Sie sollten sich jedoch bewusst sein, dass Sie genügend Zugdaten (zumindest ~ 50 MB), einen oder mehrere GPUs und genügend Geduld (Tage) benötigen, um die Antworten des guten Modells zu erhalten.
Der zweite Ansatz ist durch die Auswahl der Konfigurationsparameter des vorgeborenen Modells begrenzt-siehe cakechat/config.py für die vollständige Liste. Wenn die Standardparameter für Ihre Aufgabe geeignet sind, sollte die Feinabstimmung eine gute Option sein.
Finden Sie das vorgebildete Modell von Amazon S3, indem Sie python tools/fetch.py ausführen.
Setzen Sie Ihr Trainingstextkorpus in data/corpora_processed/train_processed_dialogs.txt . Stellen Sie sicher, dass Ihr Datensatz groß genug ist, andernfalls besteht Ihr Modell, die Daten zu überwinden, und die Ergebnisse sind schlecht.
python tools/train.py ausführen.
results/nn_models , der vollständige Pfad wird aus dem Satz von Konfigurationsparamenten abgeleitet.python tools/train.py -i results/nn_models/my_saved_weights/model.current , können Sie den Pfad zur Datei über -i -Argument angeben.CUDA_VISIBLE_DEVICES=<GPU_ID> Umgebungsvariable (mit <gpu_id> wie in der Ausgabe des Befehls nvidia-smi ) festzulegen, wenn Sie GPU verwenden möchten. Zum Beispiel wird CUDA_VISIBLE_DEVICES=0 python tools/train.py den Zugprozess auf der 0-ten GPU durchführen.-s , um das Modell auf einer Teilmenge der ersten N -Stichproben Ihrer Trainingsdaten zu trainieren, um die Vorverarbeitung zum Debuggen zu beschleunigen. Führen Sie beispielsweise python tools/train.py -s 1000 durch, um auf den ersten 1000 Proben zu trainieren. Gewichte des trainierten Modells werden auf results/nn_models/ gespeichert.
Setzen Sie Ihr Trainingstextkorpus in data/corpora_processed/train_processed_dialogs.txt .
Richten Sie Trainingsparameter in cakechat/config.py ein. Weitere Informationen finden Sie unter Beschreibung der Konfigurationseinstellungen.
Erwägen Sie PYTHONHASHSEED=42 python tools/prepare_index_files.py auszuführen, um die Indexdateien mit Token und Bedingungen aus dem Trainingskorpus zu erstellen. Stellen Sie sicher, dass Sie die Variable PYTHONHASHSEED -Umgebungsvariable festlegen. Andernfalls können Sie verschiedene Indexdateien für verschiedene Starts des Skripts erhalten. WARNUNG: Dieses Skript überschreibt die ursprünglichen Token -Indexdateien data/tokens_index/t_idx_processed_dialogs.json und data/conditions_index/c_idx_processed_dialogs.json . Sie sollten dieses Skript nur ausführen, falls Ihr Korpus groß genug ist, um alle Wörter zu enthalten, die Ihr Modell verstehen soll. Andernfalls in Betracht ziehen, wie oben beschrieben das vorgebreitete Modell vorhanden ist. Wenn Sie mit Indexdateien durcheinander gebracht wurden und die Standardversionen abrufen möchten, löschen Sie Ihre Kopien und führen Sie python tools/fetch.py neu aus.
Erwägen Sie, python tools/train_w2v.py auszuführen, um W2V -Einbettung aus dem Trainingskorpus zu erstellen. Warnung: Dieses Skript überschreibt die ursprünglichen W2V -Gewichte, die in data/w2v_models gespeichert sind. Sie sollten dieses Skript nur ausführen, falls Ihr Korpus groß genug ist, um alle Wörter zu enthalten, die Ihr Modell verstehen soll. Andernfalls in Betracht ziehen, wie oben beschrieben das vorgebreitete Modell vorhanden ist. Wenn Sie sich mit W2V -Dateien durcheinander gebracht haben und die Standardversion abrufen möchten, löschen Sie Ihre Dateikopie und führen Sie python tools/fetch.py neu aus.
python tools/train.py ausführen.
CUDA_VISIBLE_DEVICES=<GPU_ID> Umgebungsvariable (mit <gpu_id> wie in der Ausgabe des Befehls nvidia-smi ) festzulegen, wenn Sie GPU verwenden möchten. Zum Beispiel CUDA_VISIBLE_DEVICES=0 python tools/train.py wird den Zugprozess auf der 0-ten GPU durchführen.-s , um das Modell auf einer Teilmenge der ersten N -Stichproben Ihrer Trainingsdaten zu trainieren, um die Vorverarbeitung zum Debuggen zu beschleunigen. Führen Sie beispielsweise python tools/train.py -s 1000 durch, um auf den ersten 1000 Proben zu trainieren. Sie können auch IS_DEV=1 festlegen, um den "Entwicklungsmodus" zu aktivieren. Es verwendet eine reduzierte Anzahl von Modellparametern (verringerte Abmessungen der versteckten Schicht, Eingangs- und Ausgangsgrößen von Token -Sequenzen usw.) und führt eine ausführliche Protokollierung durch. Die vollständige Liste der Entwicklerparameter finden Sie in den unteren Räumen von cakechat/config.py .
Gewichte des trainierten Modells werden auf results/nn_models/ gespeichert.
Der GPU-fähige Docker-Container unterstützt den verteilten Zug auf mehreren GPUs mit Horovod.
Führen Sie beispielsweise python tools/distributed_train.py -g 0 1 aus, um das Training unter 0 und 1 GPUs zu starten.
Während des Trainings werden die folgenden Datensätze für die Berechnung der Metriken von Validierungen verwendet:
data/corpora_processed/val_processed_dialogs.txt (Dummy-Beispiel, Ersetzen Sie durch Ihre Daten)-für den kontextsensitiven Datensatzdata/quality/context_free_validation_set.txt -Für den kontextfreien Validierungsdatensatzdata/quality/context_free_questions.txt -wird zum Generieren von Antworten zur Protokollierung und Berechnung verschiedener Methoden verwendetdata/quality/context_free_test_set.txt - wird für die Computermetriken des trainierten Modells, z. B. Ranking -Metriken, verwendet Die Metriken werden auf cakechat/results/tensorboard gespeichert und können mithilfe von Tensorboard sichtbar gemacht werden. Wenn Sie einen Docker-Container aus dem bereitgestellten CPU- oder GPU-fähigen Docker-Bild ausführen, sollte Tensorboard Server automatisch starten und auf http://localhost:6006 dienen. Öffnen Sie diesen Link in Ihrem Browser, um die Trainingsdiagramme anzuzeigen.
Wenn Sie die Anforderungen manuell installiert haben, starten Sie den Tensorboard -Server zunächst, indem Sie den folgenden Befehl aus Ihrem Cakechat -Root -Verzeichnis ausführen:
mkdir -p results/tensorboard && tensorboard --logdir=results/tensorboard 2>results/tensorboard/err.log &
Danach fahren Sie mit http://localhost:6006 fort.
Sie können die folgenden Tools ausführen, um Ihr geschultes Modell für Testdaten zu bewerten (Beispiel für Dummy -Beispiel, durch Ihre Daten ersetzen):
tools/quality/ranking_quality.py - Berechnet Ranking -Metriken eines Dialogmodellstools/quality/prediction_distinctness.py -Berechnet die unterschiedliche Methoden eines Dialogmodellstools/quality/condition_quality.py - berechnet Metriken auf verschiedenen Datenuntergruppen gemäß dem Zustandswerttools/generate_predictions.py - Bewertet das Modell. Erzeugt Vorhersagen eines Dialogmodells auf dem Satz gegebener Dialogkontexte und berechnet dann Metriken. Beachten Sie, dass Sie im Verzeichnis data/nn_models über ein umgekehrtes Modell verfügen sollten, wenn Sie "*-Reranking" -Predict-Modi verwenden möchtentools/generate_predictions_for_condition.py - generiert Vorhersagen für einen bestimmten Zustandswert Führen Sie einen Server aus, der HTTP-Requests mit bestimmten Eingangsnachrichten verarbeitet und Antwortmeldungen aus dem Modell zurückgibt:
python bin/cakechat_server.py
Geben Sie CUDA_VISIBLE_DEVICES=<GPU_ID> Umgebungsvariable an, um den Server auf einer bestimmten GPU auszuführen.
Vergessen Sie nicht, python tools/fetch.py auszuführen, bevor Sie den Server starten, wenn Sie unser vorgebildetes Modell verwenden möchten.
Testen Sie das Modell in der folgenden Konversation, um sicherzustellen, dass alles gut funktioniert
- Hallo, Eddie, was ist los?
- Nicht viel, was ist mit dir?
- Gut, danke. Gehst du morgen ins Kino?
Durch Ausführen des Befehls:
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?"
Sie sollten eine sinnvolle Antwort erhalten, zum Beispiel:
{'response': "Of course!"}
JSON -Parameter sind:
| Parameter | Typ | Beschreibung |
|---|---|---|
| Kontext | Liste der Saiten | Liste früherer Nachrichten aus dem Dialoghistorie (max. 3 wird verwendet) |
| Emotion | String, einer von Enum | Eine von {'neutral', 'Wut', 'Freude', 'Angst', 'Traurigkeit'}. Eine Emotion, um die Reaktion aufzubauen. Optionaler Param, falls nicht angegeben, wird "neutral" verwendet |
POST /cakechat_api/v1/actions/get_response
data: {
'context': ['Hello', 'Hi!', 'How are you?'],
'emotion': 'joy'
}
200 OK
{
'response': 'I'm fine!'
}
Wir empfehlen, Gunicorn für die Serviertage der API Ihres Modells im Produktionsmaßstab zu verwenden.
Installieren Sie Gunicorn: pip install gunicorn
Führen Sie einen Server aus, der HTTP-Querien mit Eingabemeldungen verarbeitet und die Antwortmeldungen des Modells zurückgibt:
cd bin && gunicorn cakechat_server:app -w 1 -b 127.0.0.1:8080 --timeout 2000
Sie können Ihr Cakechat -Modell als Telegrammbot ausführen:
python tools/telegram_bot.py --token <YOUR_BOT_TOKEN> aus und chatten Sie mit dem Telegramm. cakechat/dialog_model/ - enthält Rechengrafik, Schulungsverfahren und andere Modelldienstprogrammecakechat/dialog_model/inference/ - Algorithmen zur Reaktionserzeugungcakechat/dialog_model/quality/ - Code für Metrikenberechnung und Protokollierungcakechat/utils/ - Dienstprogramme für die Textverarbeitung, W2V -Schulung usw.cakechat/api/ - Funktionen zum Ausführen von HTTP -Server: API -Konfiguration, Fehlerbehandlungtools/ - Skripte zum Training, Testen und Bewertung Ihres Modellsbin/cakechat_server.py -führt einen HTTP-Server aus, der Antwortmeldungen des mit dem Modells angegebenen Dialogkontexte und einer Emotion zurückgibt. Weitere Informationen finden Sie unter Abschnitt Ausführen.tools/train.py - trainiert das Modell auf Ihren Daten. Sie können die Option --reverse Option verwenden, um ein umgekehrtes Modell zu trainieren, das in "*-Reranking" -Anantwortalgorithmen verwendet wird, um genauere Vorhersagen zu erhalten.tools/prepare_index_files.py - Bereiten Sie den Index für die am häufigsten verwendeten Token und Bedingungen vor. Verwenden Sie dieses Skript, bevor Sie das Modell auf Ihren eigenen Daten von Grund auf neu trainieren.tools/quality/ranking_quality.py - Berechnet Ranking -Metriken eines Dialogmodells.tools/quality/prediction_distinctness.py -Berechnet unterschiedliche Methoden eines Dialogmodells.tools/quality/condition_quality.py - berechnet Metriken auf verschiedenen Datenuntergruppen gemäß dem Zustandswert.tools/generate_predictions.py - Bewertet das Modell. Erzeugt Vorhersagen eines Dialogmodells auf dem Satz gegebener Dialogkontexte und berechnet dann Metriken. Beachten Sie, dass Sie im Verzeichnis der results/nn_models ein umgekehrtes Modell haben sollten, wenn Sie "*-Reranking" -Predict-Modi verwenden möchten.tools/generate_predictions_for_condition.py - generiert Vorhersagen für einen bestimmten Zustandswert.tools/test_api.py -Beispielcode zum Senden von Anforderungen an einen laufenden HTTP-Server.tools/fetch.py -Laden Sie das damit verbundene vorgebildete Modell- und Indexdateien herunter.tools/telegram_bot.py - Läuft Telegrammbot auf dem trainierten Modell. Alle Konfigurationsparameter für die Netzwerkarchitektur-, Schulungs-, Vorhersage- und Protokollierungsschritte sind in cakechat/config.py definiert. Einige in einem HTTP-Server verwendete Inferenzparameter sind in cakechat/api/config.py definiert.
Netzwerkarchitektur und Größe
HIDDEN_LAYER_DIMENSION ist der Hauptparameter, der die Anzahl der verborgenen Einheiten in wiederkehrenden Schichten definiert.WORD_EMBEDDING_DIMENSION und CONDITION_EMBEDDING_DIMENSION definieren Sie die Anzahl der versteckten Einheiten, in die jede Token/Bedingung abgebildet ist.tokens_index definiert.Decodierungsalgorithmus:
PREDICTION_MODE_FOR_TESTS definiert, wie die Antworten des Modells generiert werden. Die Optionen sind die folgenden:DEFAULT_TEMPERATURE abstellen.SAMPLES_NUM_FOR_RERANKING und MMI_REVERSE_MODEL_SCORE_WEIGHT auswählen. Beachten Sie, dass es andere Parameter gibt, die den Prozess der Antwortgenerierung beeinflussen. Siehe REPETITION_PENALIZE_COEFFICIENT , NON_PENALIZABLE_TOKENS , MAX_PREDICTIONS_LENGTH .
Durch die Bereitstellung zusätzlicher Zustandsbezeichnungen in Datensatzeinträgen können Sie die folgenden Modelle erstellen:
Um diese zusätzlichen Bedingungen zu nutzen, finden Sie in der Abschnitt -Schulung das Modell. Legen Sie einfach das Feld "Bedingung" in dem Training ein der folgenden fest: Persona -ID , Emotion oder Themenetikett , aktualisieren Sie die Indexdateien und starten Sie das Training.
Cakechat wird vom Replika -Team entwickelt und gepflegt:
Nicolas Ivanov, Michael Khalman, Nikita Smetanin, Artem Rodichev und Denis Fedorenko.
Demo von Oleg Akbarov, Alexander Kuznetsov und Vladimir Chernosvitov.
Alle Probleme und Feature -Anfragen können hier nachverfolgt werden - GitHub -Probleme.
© 2019 Luka, Inc. Lizenziert unter der Apache -Lizenz, Version 2.0. Weitere Informationen finden Sie unter Lizenzdatei.