Skip to content

bcaitech1/p3-dst-chatting-day

Repository files navigation

Chatting-Day's Dialogue State Tracking (DST)

프로젝트 기간 : 2021.04.26 ~ 2021.05.20

프로젝트 주제 : Deep Knowledge Tracing

[목차]



[Dialogue State Tracking 소개]

  • 대화 상태 추적(Dialogue State Tracking) 은 목적 지향형 대화(Task-Oriented Dialogue)의 중요한 하위 테스크 중 하나입니다.
  • 유저와의 대화에서 미리 시나리오에 의해 정의된 정보인 Slot과 매 턴마다 그에 속할 수 있는 Value의 집합인, 대화 상태 (Dialogue State)를 매 턴마다 추론하는 테스크입니다.
  • 시스템은 유저의 목적(Goal)을 파악해야만 하고, 보통 이 Goal은 (Slot, Value) 페어의 집합으로 표현될 수 있습니다.
  • 예를들어, 숙소를 예약하는 시나리오의 경우 "숙소의 종류", "숙소의 가격대"가 Slot의 타입이 될 수 있고, 이에 속할 수 있는 Value로 각각 ("호텔", "모텔", "에어비앤비", ...), ("저렴", "적당", "비싼", ...) 등을 가질 수 있습니다.


[Installation]

Dependencies

  • torch==1.7.0+cu101
  • transformers==3.5.1
  • wandb
  • pytorch-transformers==1.0.0
  • wget==3.2
  • pytorch-pretrained-bert
pip install -r requirements.txt


[Usage]

모델을 사용하기 위해서는 run.sh 를 실행시킵니다.

$ p3-dst-chatting-day/run.sh

총 4가지의 모델을 선택할 수 있습니다.

  • SomDST
  • ChanDST
  • TransformerDST
  • TRADE_TAPT


[File Structure]

Baseline (TRADE)

  • TRADE는 Open-vocab based DST model로서, Ontology를 기반에서 벗어난 모델입니다.
  • 기존의 GloVe, Char Embedding 대신 monologg/koelectra-base-v3-discriminatortoken_embeddings을 pretrained Subword Embedding으로 사용합니다.
  • 메모리를 아끼기 위해 Token Embedding (768) => Hidden Dimension (400)으로의 Projection layer가 들어 있습니다.
  • 빠른 학습을 위해 Parallel Decoding이 구현되어 있습니다.

p3-dst-chatting-day/Baseline/
│
├── train.py
├── preprocessor.py
├── model.py
├── inference.py
├── evaluation.py
└── data_utils.py


CHAN-DST

  • CHAN-DST Open-vocab based DST model로서, SOTA (2020, MULTIWOZ 2.1) 모델입니다.
  • WOS (Wizard Of Seoul) dataset에 적합한 코드로 수정해서 사용했습니다.

p3-dst-chatting-day/ChanDST/
│
├── main_chan.py - for train
├── preprocessor.py
├── model_chan.py
├── inference.py
├── evaluation.py
└── data_utils.py


SOM-DST

  • SOM-DST는 Open-vocab based DST model 기반의 모델로서, TRADE의 느린 학습/추론 시간을 개선한 모델입니다.
  • WOS (Wizard Of Seoul) dataset에 적합한 코드로 수정해서 사용했습니다.
  • Encoder로는 dsksd/bert-ko-small-minimal을 사용했습니다.

p3-dst-chatting-day/SomDST/
│
├── assets/ - config files & vocab
│   ├── bert_config_base_uncased.json
│   ├── bert_config_large_uncased.json
│   └── vocab.txt
├── utils/ - util files
│   ├── __init__.py
│   ├── ckpt_utils.py - for saving model
│   ├── data_utils.py - for controlling data
│   ├── fix_label.py
│   └── mapping.pair - convert general word
├── LICENSE
├── NOTICE
├── README.md
├── create_data.py
├── evaluation.py
├── inference.py
├── model.py
└── train.py


Transformer-DST

  • Transformer-DST는 Open-vocab based DST model 기반의 모델로서, Slot Generator 부분을 Transformer Decoder로 대체해 사용합니다.
  • WOS (Wizard Of Seoul) dataset에 적합한 코드로 수정해서 사용했습니다.
  • EncoderDecoderdsksd/bert-ko-small-minimal을 사용했습니다.

p3-dst-chatting-day/TransformerDST/
│
├── utils/ - util files
│   ├── bert_config_multilingual_uncased.json
│   ├── bert_config_base_uncased.json
│   ├── bert_ko_small_minimal.json
│   ├── ckpt_utils.py - for saving model
│   ├── data_utils.py - for controlling data
│   └── eval_utils.py
├── TransformerDSTevaluation.py
├── TransformerDSTinference.py
├── TransformerDSTmodel.py
├── TransformerDSTtrain.py
└── modeling_bert.py - custom bert


TAPT (Task-adaptive Pretraining)

  • TAPT는 학습할 데이터에 대해 모델을 pretraining (또는 multi 학습) 하는 방법입니다.
  • WOS (Wizard Of Seoul) dataset로 DST task를 수행하면서 초반에 (또는 동시에) MLM task를 수행합니다.
  • TAPT는 TRADE 모델과 SUMBT 모델에 적용했습니다.

p3-dst-chatting-day/
│
├── SUMBT_TAPT/
│   ├── sumbt_tapt.py
│   └── data_utils.py
├── TRADE_TAPT/
│   ├── data_utils.py
│   ├── eval_utils.py
│   ├── evaluation.py
│   ├── inference.py
│   ├── model.py
│   ├── preprocessor.py
└── └── train.py


Serving

  • Serving은 AI 모델을 실제 서비스에서 사용할 수 있게 Server에 올리는 작업입니다.
  • Serving은 Pytorch에서 제공하는 torchserve를 사용했습니다.
  • Django Chat App 서버와 연결(REST API)해 챗봇과 유사하게 작동합니다.

p3-dst-chatting-day/
│
├── Serving/ - License from Pytorch
│   ├── ...
│   ├── dst_trade/
│   │   ├── DST_custom_handler.py - 모델이 동작하는 방식을 명시
│   │   ├── README.md
│   │   ├── config.properties - serving management config
│   │   ├── data_utils.py
│   │   ├── exp_config.json
│   │   ├── model.py
│   │   ├── preprocessor.py
│   │   ├── requirements.txt - 아카이브 제작  dependencies 사용 가능
│   │   ├── slot_meta.json
│   │   └── test.json - model serving  test해볼  있는 json 파일
│   └── ...
├── django_server/
│   ├── chat/
│   │   ├── migrations/ - migration 관리 폴더
│   │   │   ├── ...
│   │   ├── templates/chat/ - Html  frontend 부분
│   │   │   ├── ...
│   │   ├── __init__.py
│   │   ├── admin.py
│   │   ├── apps.py
│   │   ├── consumers.py - 사용자들 간의 message 처리
│   │   ├── models.py
│   │   ├── routing.py - routing pattern
│   │   ├── tests.py
│   │   ├── urls.py
│   │   └── views.py - view templates
│   ├── project_dst/
│   │   └── ...
└── └── manage.py - django의 manage 파일


[Input JSON File]

Input으로 들어가는 JSON File은 WOS (Wizard Of Seoul)의 양식을 따릅니다.

  • dialogue_idx : 대화 고유의 index를 나타냅니다.
  • domain : 대화 전체 turn에서 나오는 domain들입니다.
  • dialgoue
    • role : user 또는 system으로 구성됩니다.
    • text : user 또는 system의 발화입니다.
    • state : 추적해야할 domain-slot-value을 의미합니다.
[
	{
    "dialogue_idx": "snowy-hat-1111:관광_식당_11",
    "domains": [
      "관광",
      "식당"
    ],
    "dialogue": [
      {
        "role": "user",
        "text": "서울 중앙에 있는 박물관을 찾아주세요",
        "state": [
          "관광-종류-박물관",
          "관광-지역-서울 중앙"
        ]
      },
      {
        "role": "sys",
        "text": "안녕하세요. 문화역서울 284은 어떠신가요? 평점도 4점으로 방문객들에게 좋은 평가를 받고 있습니다."
      },
      {
        "role": "user",
        "text": "좋네요 거기 평점은 말해주셨구 전화번호가 어떻게되나요?",
        "state": [
          "관광-종류-박물관",
          "관광-지역-서울 중앙",
          "관광-이름-문화역서울 284"
        ]
      },
      {
        "role": "sys",
        "text": "전화번호는 983880764입니다. 더 필요하신 게 있으실까요?"
      },
      {
        "role": "user",
        "text": "네 관광지와 같은 지역의 한식당을 가고싶은데요 야외석이 있어야되요",
        "state": [
          "관광-종류-박물관",
          "관광-지역-서울 중앙",
          "관광-이름-문화역서울 284",
          "식당-지역-서울 중앙",
          "식당-종류-한식당",
          "식당-야외석 유무-yes"
        ]
      },
      {
        "role": "sys",
        "text": "생각하고 계신 가격대가 있으신가요?"
      },
      {
        "role": "user",
        "text": "음.. 저렴한 가격대에 있나요?",
        "state": [
          "관광-종류-박물관",
          "관광-지역-서울 중앙",
          "관광-이름-문화역서울 284",
          "식당-가격대-저렴",
          "식당-지역-서울 중앙",
          "식당-종류-한식당",
          "식당-야외석 유무-yes"
        ]
      },
      {
        "role": "sys",
        "text": "죄송하지만 저렴한 가격대에는 없으시네요."
      },

			..생략
      
      {
        "role": "sys",
        "text": "감사합니다. 즐거운 여행되세요."
      }
    ]
  },
   
  ..생략

]


[Contributors]



[Collaborative Tool]

Chatting Day 피어들의 Ground Rule, 실험노트, 피어세션 등 한달 간의 행보를 확인하시려면 다음 링크를 클릭하세요.



[Reference]

Papers

Dataset

  • WOS (Wizard Of Seoul)