맨 위에 참고 : 프로젝트가 인정되지 않았습니다.
변압기 기반 대화 모델이 더 잘 작동하며 RNN 기반 CakeChat 대신 사용하는 것이 좋습니다. 예를 들어 https://github.com/microsoft/dialogpt를 참조하십시오
CakeChat은 대화를 통해 감정을 표현할 수있는 챗봇의 백엔드입니다.

CakeChat은 Keras와 Tensorflow를 기반으로합니다.
코드는 유연하며 임의의 범주 형 변수로 모델의 응답을 조절할 수 있습니다. 예를 들어, 자신의 페르소나 기반 신경 대화 모델 [1] 을 훈련 시키거나 감정적 인 채팅 기계를 만들 수 있습니다 [2] .

모델:
단어 임베딩 레이어 :
디코딩
메트릭 :
Docker에 익숙한 경우 여기에서 예비 훈련 된 CakeChat 모델을 서버로 실행하는 가장 쉬운 방법이 있습니다. sudo 와 함께 다음 명령을 실행해야 할 수도 있습니다.
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"
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"
그게 다야! 이제 호스트 컴퓨터에서 다음 명령을 실행하여 CakeChat 서버를 테스트하십시오.
python tools/test_api.py -f localhost -p 8080 -c "hi!" -c "hi, how are you?" -c "good!" -e "joy"
응답 dict는 다음과 같습니다.
{'response': "I'm fine!"}
Docker는 환경을 설정하고 교육 및 테스트를위한 모든 종속성을 설치하는 가장 쉬운 방법입니다.
참고 : CakeChat 모델을 훈련시키기 위해 GPU 지원 환경을 사용하는 것이 좋습니다. GPU 및 CPU에서 추론이 이루어질 수 있습니다.
Docker를 설치하십시오.
DockerHub에서 CPU 전용 Docker 이미지를 가져옵니다.
docker pull lukalabs/cakechat:latest
docker run --name <YOUR_CONTAINER_NAME> -it lukalabs/cakechat:latest
GPU 지원을 위해 NVIDIA DOCKER를 설치하십시오.
DockerHub에서 GPU 지원 Docker Image를 당기십시오.
docker pull lukalabs/cakechat-gpu:latest
nvidia-docker run --name <YOUR_CONTAINER_NAME> -it cakechat-gpu:latest
그게 다야! 이제 모델을 훈련시키고 채팅 할 수 있습니다. 추가 지침은 아래의 해당 섹션을 참조하십시오.
Docker를 처리하지 않으려면 모든 요구 사항을 수동으로 설치할 수 있습니다.
pip install -r requirements.txt -r requirements-local.txt
NB :
시스템 패키지로 혼란을 방지하기 위해 VirtualEnV 내부에 요구 사항을 설치하는 것이 좋습니다.
python tools/fetch.py 실행하여 미리 훈련 된 모델 가중치를 다운로드 할 수 있습니다.
미리 훈련 된 모델의 매개 변수는 다음과 같습니다.
이 모델은 ~ 5 천만 개의 대화 상자 (11GB의 텍스트 데이터)를 가진 전처리 트위터 코퍼스에서 교육을 받았습니다. 코퍼스를 정리하기 위해 우리는 제거했습니다
우리는 감정 분류기를 사용하여 각 발언을 다음과 같은 5 가지 감정 중 하나 인 "neutral", "joy", "anger", "sadness", "fear" 으로 표시하고 훈련 중에이 레이블을 사용했습니다. 자신의 코퍼스를 감정으로 표시하려면 DeepMoji 도구와 같이 사용할 수 있습니다.
불행히도 트위터의 개인 정보 보호 정책으로 인해 데이터 세트를 제공 할 수 없습니다. 사용 가능한 모든 텍스트 대화 데이터 세트에서 대화 모델을 훈련시킬 수 있습니다. 기존 대화 데이터 세트에 대한 훌륭한 개요는 여기에서 찾을 수 있습니다 : https://breakend.github.io/dialogdatasets/
교육 데이터는 TXT 파일이어야하며 각 줄은 유효한 JSON 객체이며 대화 상자 발화 목록을 나타냅니다. 필요한 파일 구조를 보려면 더미 트레인 데이터 세트를 참조하십시오. 훈련 전에이 더미 코퍼스를 데이터로 교체하십시오.
두 가지 옵션이 있습니다.
첫 번째 방법은 덜 제한적입니다. 원하는 교육 데이터를 사용하고 모델의 구성 매개 변수를 설정할 수 있습니다. 그러나 좋은 모델의 응답을 얻기 위해 충분한 열차 데이터 (적어도 ~ 50MB 이상), 하나 이상의 GPU 및 충분한 인내 (일)가 필요하다는 것을 알고 있어야합니다.
두 번째 방법은 미리 훈련 된 모델의 구성 매개 변수 선택에 의해 제한됩니다. 전체 목록은 cakechat/config.py 참조하십시오. 기본 매개 변수가 작업에 적합한 경우 미세 조정이 좋은 옵션이어야합니다.
python tools/fetch.py 실행하여 Amazon S3의 미리 훈련 된 모델을 가져 오십시오.
교육 텍스트 코퍼스를 data/corpora_processed/train_processed_dialogs.txt 에 넣으십시오. 데이터 세트가 충분히 커지는 지 확인하십시오. 그렇지 않으면 모델 위험이 데이터에 과적 해지고 결과가 좋지 않을 것입니다.
python tools/train.py 실행하십시오.
results/nn_models 에서 미리 훈련 된 모델 가중치를 찾을 수 있으며, 전체 경로는 구성 매개 변수 세트에서 추론됩니다.-i 인수를 통해 파일의 경로를 지정할 수 있습니다 (예 : python tools/train.py -i results/nn_models/my_saved_weights/model.current .CUDA_VISIBLE_DEVICES=<GPU_ID> 환경 변수 (<gpu_id>와 함께)를 설정하는 것을 잊지 마십시오. 예를 들어 CUDA_VISIBLE_DEVICES=0 python tools/train.py 0- 번째 GPU에서 열차 프로세스를 실행합니다.-s 사용하여 훈련 데이터의 첫 번째 N 샘플의 하위 집합에서 모델을 훈련시켜 디버깅을위한 전처리 속도를 높이십시오. 예를 들어, python tools/train.py -s 1000 실행하여 처음 1000 개의 샘플을 훈련시킵니다. 훈련 된 모델의 무게는 results/nn_models/ 에 저장됩니다.
교육 텍스트 코퍼스를 data/corpora_processed/train_processed_dialogs.txt 에 넣으십시오.
cakechat/config.py 에서 교육 매개 변수를 설정하십시오. 자세한 내용은 구성 설정 설명을 참조하십시오.
PYTHONHASHSEED=42 python tools/prepare_index_files.py 실행하여 훈련 코퍼스의 토큰 및 조건으로 인덱스 파일을 작성하십시오. PYTHONHASHSEED 환경 변수를 설정하십시오. 그렇지 않으면 스크립트의 다른 시작에 대해 다른 색인 파일을 얻을 수 있습니다. 경고 : 이 스크립트는 원래 토큰 인덱스 파일 data/tokens_index/t_idx_processed_dialogs.json 및 data/conditions_index/c_idx_processed_dialogs.json 덮어 씁니다. 코퍼스가 모델을 이해하려는 모든 단어를 포함 할 수있을만큼 큰 경우에만이 스크립트를 실행해야합니다. 그렇지 않으면, 위에서 설명한대로 미리 훈련 된 모델을 미세 조정하는 것을 고려하십시오. 인덱스 파일을 엉망으로 만들고 기본 버전을 얻으려면 사본을 삭제하고 python tools/fetch.py Anew를 실행하십시오.
훈련 코퍼스에서 W2V 임베딩을 구축하려면 python tools/train_w2v.py 실행하는 것을 고려하십시오. 경고 : 이 스크립트는 data/w2v_models 에 저장된 원래 W2V 가중치를 덮어 씁니다. 코퍼스가 모델을 이해하려는 모든 단어를 포함 할 수있을만큼 큰 경우에만이 스크립트를 실행해야합니다. 그렇지 않으면, 위에서 설명한대로 미리 훈련 된 모델을 미세 조정하는 것을 고려하십시오. W2V 파일을 엉망으로 만들고 기본 버전을 얻으려면 파일 사본을 삭제하고 python tools/fetch.py Anew를 실행하십시오.
python tools/train.py 실행하십시오.
CUDA_VISIBLE_DEVICES=<GPU_ID> 환경 변수 (<gpu_id>와 함께)를 설정하는 것을 잊지 마십시오. 예를 들어 CUDA_VISIBLE_DEVICES=0 python tools/train.py 0th GPU에서 열차 프로세스를 실행합니다.-s 사용하여 훈련 데이터의 첫 번째 N 샘플의 하위 집합에서 모델을 훈련시켜 디버깅을위한 전처리 속도를 높이십시오. 예를 들어, python tools/train.py -s 1000 실행하여 처음 1000 개의 샘플을 훈련시킵니다. "개발 모드"를 활성화하려면 IS_DEV=1 설정할 수도 있습니다. 감소 된 모델 매개 변수 (감소 된 숨겨진 레이어 치수, 입력 및 출력 크기의 토큰 시퀀스 등)를 사용하고 장점 로깅을 수행합니다. Dev Params의 전체 목록은 cakechat/config.py 의 결론을 참조하십시오.
훈련 된 모델의 무게는 results/nn_models/ 에 저장됩니다.
GPU 지원 Docker 컨테이너는 Horovod를 사용하여 여러 GPU의 분산 열차를 지원합니다.
예를 들어, python tools/distributed_train.py -g 0 1 실행하여 0 및 1 gpus에 대한 교육을 시작하십시오.
교육 중에 다음 데이터 세트는 검증 메트릭 계산에 사용됩니다.
data/corpora_processed/val_processed_dialogs.txt (더미 예, 데이터로 바꾸기)-컨텍스트 감각 데이터 세트의 경우data/quality/context_free_validation_set.txt 컨텍스트 프리 유효성 검사 데이터 세트data/quality/context_free_questions.txt 고유 한 메트릭을 로깅 및 계산하는 데 응답을 생성하는 데 사용됩니다.data/quality/context_free_test_set.txt - 훈련 된 모델의 메트릭을 계산하는 데 사용됩니다. 메트릭은 cakechat/results/tensorboard 에 저장되며 Tensorboard를 사용하여 시각화 할 수 있습니다. 제공된 CPU 또는 GPU 지원 Docker Image에서 Docker 컨테이너를 실행하면 Tensorboard Server가 자동으로 시작하여 http://localhost:6006 에서 서비스해야합니다. 브라우저 에서이 링크를 열어 교육 그래프를보십시오.
요구 사항을 수동으로 설치 한 경우 CakeChat 루트 디렉토리에서 다음 명령을 실행하여 먼저 Tensorboard Server를 시작하십시오.
mkdir -p results/tensorboard && tensorboard --logdir=results/tensorboard 2>results/tensorboard/err.log &
그 후 http://localhost:6006 으로 진행하십시오.
테스트 데이터에서 숙련 된 모델을 평가하기 위해 다음 도구를 실행할 수 있습니다 (더미 예제, 데이터로 교체) :
tools/quality/ranking_quality.py - 대화 상자 모델의 순위 지표를 계산합니다tools/quality/prediction_distinctness.py 대화 모델의 고유 한 메트릭을 계산합니다tools/quality/condition_quality.py - 조건 값에 따라 데이터의 다른 서브 세트에 대한 메트릭을 계산합니다.tools/generate_predictions.py - 모델을 평가합니다. 주어진 대화 상자 컨텍스트 세트에서 대화 모델의 예측을 생성 한 다음 메트릭을 계산합니다. "*-RERANKING"예측 모드를 사용하려면 data/nn_models 디렉토리에 리버스 모델이 있어야합니다.tools/generate_predictions_for_condition.py - 주어진 조건 값에 대한 예측을 생성합니다 주어진 입력 메시지로 HTTP- 요청을 처리하는 서버를 실행하고 모델에서 응답 메시지를 반환합니다.
python bin/cakechat_server.py
CUDA_VISIBLE_DEVICES=<GPU_ID> 환경 변수를 지정하여 특정 GPU에서 서버를 실행하십시오.
미리 훈련 된 모델을 사용하려면 서버를 시작하기 전에 python tools/fetch.py 실행하는 것을 잊지 마십시오.
모든 것이 잘 작동하는지 확인하려면 다음 대화에서 모델을 테스트하십시오.
- 안녕하세요, 에디, 무슨 일이야?
-별로, 당신은 어떻습니까?
- 좋아, 감사합니다. 내일 영화에 갈 건가요?
명령을 실행하여 :
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?"
예를 들어 의미있는 답변을 얻어야합니다.
{'response': "Of course!"}
JSON 매개 변수는 다음과 같습니다.
| 매개 변수 | 유형 | 설명 |
|---|---|---|
| 문맥 | 문자열 목록 | 대화 기록의 이전 메시지 목록 (Max. 3이 사용됨) |
| 감정 | 끈, 열거 중 하나입니다 | { 'Neutral', 'Anger', 'Joy', 'Fear', 'Sadness'} 중 하나. 반응을 조절하는 감정. 지정되지 않은 경우 '중립'이 사용됩니다 |
POST /cakechat_api/v1/actions/get_response
data: {
'context': ['Hello', 'Hi!', 'How are you?'],
'emotion': 'joy'
}
200 OK
{
'response': 'I'm fine!'
}
생산 규모로 모델의 API를 제공하기 위해 Gunicorn을 사용하는 것이 좋습니다.
Gunicorn 설치 : pip install gunicorn
입력 메시지로 http-queries를 처리하는 서버를 실행하고 모델의 응답 메시지를 반환합니다.
cd bin && gunicorn cakechat_server:app -w 1 -b 127.0.0.1:8080 --timeout 2000
CakeChat 모델을 Telegram Bot으로 실행할 수 있습니다.
python tools/telegram_bot.py --token <YOUR_BOT_TOKEN> 실행하고 Telegram에서 채팅하십시오. cakechat/dialog_model/ - 계산 그래프, 교육 절차 및 기타 모델 유틸리티가 포함되어 있습니다.cakechat/dialog_model/inference/ - 응답 생성을위한 알고리즘cakechat/dialog_model/quality/ - 메트릭 계산 및 로깅을위한 코드cakechat/utils/ - 텍스트 처리, W2V 교육 등의 유틸리티.cakechat/api/ - HTTP 서버를 실행하는 기능 : API 구성, 오류 처리tools/ - 모델 교육, 테스트 및 평가를위한 스크립트bin/cakechat_server.py 대화 상자 컨텍스트와 감정이 주어진 모델의 응답 메시지를 반환하는 http-server를 실행합니다. 자세한 내용은 실행 섹션을 참조하십시오.tools/train.py - 데이터에서 모델을 훈련시킵니다. 보다 정확한 예측을 위해 "*-reranking"응답 생성 알고리즘에 사용되는 --reverse 모델을 훈련시킬 수 있습니다.tools/prepare_index_files.py - 가장 일반적으로 사용되는 토큰 및 조건에 대한 Index를 준비합니다. 자체 데이터에서 모델을 처음부터 교육하기 전에이 스크립트를 사용하십시오.tools/quality/ranking_quality.py - 대화 상자 모델의 순위 지표를 계산합니다.tools/quality/prediction_distinctness.py 대화 모델의 고유 한 메트릭을 계산합니다.tools/quality/condition_quality.py - 조건 값에 따라 데이터의 다른 서브 세트에 대한 메트릭을 계산합니다.tools/generate_predictions.py - 모델을 평가합니다. 주어진 대화 상자 컨텍스트 세트에서 대화 모델의 예측을 생성 한 다음 메트릭을 계산합니다. "*-reranking"예측 모드를 사용하려면 results/nn_models 디렉토리에 리버스 모델이 있어야합니다.tools/generate_predictions_for_condition.py - 주어진 조건 값에 대한 예측을 생성합니다.tools/test_api.py 실행중인 HTTP-Server에 요청을 보내는 코드 예제.tools/fetch.py 이와 관련된 미리 훈련 된 모델 및 인덱스 파일을 다운로드합니다.tools/telegram_bot.py - 훈련 된 모델 위에서 Telegram Bot을 실행합니다. 네트워크 아키텍처, 교육, 예측 및 로깅 단계에 대한 모든 구성 매개 변수는 cakechat/config.py 에 정의되어 있습니다. HTTP-Server에 사용되는 일부 추론 매개 변수는 cakechat/api/config.py 에 정의됩니다.
네트워크 아키텍처 및 크기
HIDDEN_LAYER_DIMENSION 재발 층의 숨겨진 단위의 수를 정의하는 주요 매개 변수입니다.WORD_EMBEDDING_DIMENSION and CONDITION_EMBEDDING_DIMENSION 각 토큰/조건이 매핑되는 숨겨진 장치의 수를 정의합니다.tokens_index 디렉토리의 사전의 토큰 수로 정의됩니다.디코딩 알고리즘 :
PREDICTION_MODE_FOR_TESTS 모델의 응답이 어떻게 생성되는지 정의합니다. 옵션은 다음과 같습니다.DEFAULT_TEMPERATURE 매개 변수를 조정하여 온도 값을 제어 할 수 있습니다.SAMPLES_NUM_FOR_RERANKING [4] MMI_REVERSE_MODEL_SCORE_WEIGHT 을 선택 하여이 모드를 조정할 수 있습니다. 응답 생성 프로세스에 영향을 미치는 다른 매개 변수가 있습니다. REPETITION_PENALIZE_COEFFICIENT , NON_PENALIZABLE_TOKENS , MAX_PREDICTIONS_LENGTH 참조하십시오.
데이터 세트 항목 내에 추가 조건 라벨을 제공하면 다음 모델을 구축 할 수 있습니다.
이러한 추가 조건을 사용하려면 모델 교육 섹션을 참조하십시오. 교육에서 설정에서 "조건"필드를 다음 중 하나로 설정하십시오. 페르소나 ID , 감정 또는 주제 레이블, 인덱스 파일을 업데이트하고 교육을 시작하십시오.
Cakechat은 Replika 팀에 의해 개발되고 유지됩니다.
Nicolas Ivanov, Michael Khalman, Nikita Smetanin, Artem Rodichev 및 Denis Fedorenko.
Oleg Akbarov, Alexander Kuznetsov 및 Vladimir Chernosvitov의 데모.
모든 문제와 기능 요청은 여기에서 추적 할 수 있습니다 - GitHub 문제.
© 2019 Luka, Inc. Apache 라이센스, 버전 2.0에 따라 라이센스가 부여되었습니다. 자세한 내용은 라이센스 파일을 참조하십시오.