项目作者: bcaitech1

项目描述 :
Chatting-Day's Dialogue State Tracking (DST)
高级语言: Python
项目地址: git://github.com/bcaitech1/p3-dst-chatting-day.git
创建时间: 2021-04-22T13:24:56Z
项目社区:https://github.com/bcaitech1/p3-dst-chatting-day

开源协议:

下载


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
  1. pip install -r requirements.txt




[Usage]

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

  1. $ 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이 구현되어 있습니다.

  1. p3-dst-chatting-day/Baseline/
  2. ├── train.py
  3. ├── preprocessor.py
  4. ├── model.py
  5. ├── inference.py
  6. ├── evaluation.py
  7. └── data_utils.py




CHAN-DST

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

  1. p3-dst-chatting-day/ChanDST/
  2. ├── main_chan.py - for train
  3. ├── preprocessor.py
  4. ├── model_chan.py
  5. ├── inference.py
  6. ├── evaluation.py
  7. └── data_utils.py




SOM-DST

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

  1. p3-dst-chatting-day/SomDST/
  2. ├── assets/ - config files & vocab
  3. ├── bert_config_base_uncased.json
  4. ├── bert_config_large_uncased.json
  5. └── vocab.txt
  6. ├── utils/ - util files
  7. ├── __init__.py
  8. ├── ckpt_utils.py - for saving model
  9. ├── data_utils.py - for controlling data
  10. ├── fix_label.py
  11. └── mapping.pair - convert general word
  12. ├── LICENSE
  13. ├── NOTICE
  14. ├── README.md
  15. ├── create_data.py
  16. ├── evaluation.py
  17. ├── inference.py
  18. ├── model.py
  19. └── 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을 사용했습니다.

  1. p3-dst-chatting-day/TransformerDST/
  2. ├── utils/ - util files
  3. ├── bert_config_multilingual_uncased.json
  4. ├── bert_config_base_uncased.json
  5. ├── bert_ko_small_minimal.json
  6. ├── ckpt_utils.py - for saving model
  7. ├── data_utils.py - for controlling data
  8. └── eval_utils.py
  9. ├── TransformerDSTevaluation.py
  10. ├── TransformerDSTinference.py
  11. ├── TransformerDSTmodel.py
  12. ├── TransformerDSTtrain.py
  13. └── modeling_bert.py - custom bert




TAPT (Task-adaptive Pretraining)

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

  1. p3-dst-chatting-day/
  2. ├── SUMBT_TAPT/
  3. ├── sumbt_tapt.py
  4. └── data_utils.py
  5. ├── TRADE_TAPT/
  6. ├── data_utils.py
  7. ├── eval_utils.py
  8. ├── evaluation.py
  9. ├── inference.py
  10. ├── model.py
  11. ├── preprocessor.py
  12. └── └── train.py




Serving

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

  1. p3-dst-chatting-day/
  2. ├── Serving/ - License from Pytorch
  3. ├── ...
  4. ├── dst_trade/
  5. ├── DST_custom_handler.py - 모델이 동작하는 방식을 명시
  6. ├── README.md
  7. ├── config.properties - serving management config
  8. ├── data_utils.py
  9. ├── exp_config.json
  10. ├── model.py
  11. ├── preprocessor.py
  12. ├── requirements.txt - 아카이브 제작 dependencies 사용 가능
  13. ├── slot_meta.json
  14. └── test.json - model serving test해볼 있는 json 파일
  15. └── ...
  16. ├── django_server/
  17. ├── chat/
  18. ├── migrations/ - migration 관리 폴더
  19. ├── ...
  20. ├── templates/chat/ - Html frontend 부분
  21. ├── ...
  22. ├── __init__.py
  23. ├── admin.py
  24. ├── apps.py
  25. ├── consumers.py - 사용자들 간의 message 처리
  26. ├── models.py
  27. ├── routing.py - routing pattern
  28. ├── tests.py
  29. ├── urls.py
  30. └── views.py - view templates
  31. ├── project_dst/
  32. └── ...
  33. └── └── 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을 의미합니다.
  1. [
  2. {
  3. "dialogue_idx": "snowy-hat-1111:관광_식당_11",
  4. "domains": [
  5. "관광",
  6. "식당"
  7. ],
  8. "dialogue": [
  9. {
  10. "role": "user",
  11. "text": "서울 중앙에 있는 박물관을 찾아주세요",
  12. "state": [
  13. "관광-종류-박물관",
  14. "관광-지역-서울 중앙"
  15. ]
  16. },
  17. {
  18. "role": "sys",
  19. "text": "안녕하세요. 문화역서울 284은 어떠신가요? 평점도 4점으로 방문객들에게 좋은 평가를 받고 있습니다."
  20. },
  21. {
  22. "role": "user",
  23. "text": "좋네요 거기 평점은 말해주셨구 전화번호가 어떻게되나요?",
  24. "state": [
  25. "관광-종류-박물관",
  26. "관광-지역-서울 중앙",
  27. "관광-이름-문화역서울 284"
  28. ]
  29. },
  30. {
  31. "role": "sys",
  32. "text": "전화번호는 983880764입니다. 더 필요하신 게 있으실까요?"
  33. },
  34. {
  35. "role": "user",
  36. "text": "네 관광지와 같은 지역의 한식당을 가고싶은데요 야외석이 있어야되요",
  37. "state": [
  38. "관광-종류-박물관",
  39. "관광-지역-서울 중앙",
  40. "관광-이름-문화역서울 284",
  41. "식당-지역-서울 중앙",
  42. "식당-종류-한식당",
  43. "식당-야외석 유무-yes"
  44. ]
  45. },
  46. {
  47. "role": "sys",
  48. "text": "생각하고 계신 가격대가 있으신가요?"
  49. },
  50. {
  51. "role": "user",
  52. "text": "음.. 저렴한 가격대에 있나요?",
  53. "state": [
  54. "관광-종류-박물관",
  55. "관광-지역-서울 중앙",
  56. "관광-이름-문화역서울 284",
  57. "식당-가격대-저렴",
  58. "식당-지역-서울 중앙",
  59. "식당-종류-한식당",
  60. "식당-야외석 유무-yes"
  61. ]
  62. },
  63. {
  64. "role": "sys",
  65. "text": "죄송하지만 저렴한 가격대에는 없으시네요."
  66. },
  67. ..생략
  68. {
  69. "role": "sys",
  70. "text": "감사합니다. 즐거운 여행되세요."
  71. }
  72. ]
  73. },
  74. ..생략
  75. ]




[Contributors]




[Collaborative Tool]

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




[Reference]

Papers

Dataset

  • WOS (Wizard Of Seoul)