/NELLM-NEgotiation-Learned-Large-Language-Model

level3_nlp_finalproject-nlp-03 created by GitHub Classroom

Primary LanguageJupyter Notebook

image

๐Ÿฏ๐Ÿฏ:NELLM(๋‚ผ๋ฆ„): NEgotiation Large Language Model

Static Badge Static Badge Static Badge

NELLM(๋‚ผ๋ฆ„)์€ ์ค‘๊ณ ๊ฑฐ๋ž˜์—์„œ ํŒ๋งค์ž ๋Œ€์‹  ๊ฐ€๊ฒฉ์„ ํ˜‘์ƒ์— 1๋Œ€ n์œผ๋กœ ๋Œ€์‘ํ•˜๋Š” ์ฑ—๋ด‡ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค.

Demo & Example

image

  • ๋ฐฐํฌ ๊ธฐ๊ฐ„ : 23.07.19 21:00 ~ 23.08.18 16:00
  • ๋ฐฐํฌ ํ˜•ํƒœ : ๋งŽ์€ user๋“ค์ด ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ธฐ ์œ„ํ•ด NELLM๊ณผ ๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒŒ์ž„ ํ˜•ํƒœ๋กœ ๋ฐฐํฌํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด์šฉ ๋ฐฉ๋ฒ• : ํšŒ์› ๋“ฑ๋กํ›„ ํŒ๋งค ๋ชฉ๋ก์—์„œ ์›ํ•˜๋Š” ์ƒํ’ˆ ํŽ˜์ด์ง€์— ์ž…์žฅํ•˜์—ฌ NELLM๊ณผ ๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŒฑMembers

๊น€๋ฏผํ˜ ๊น€์˜์ง„ ๊น€์„ฑ์šฐ ์˜ค์›ํƒ ์ •์„ธ์—ฐ
Data Model Model Service Service
- Data ์ˆ˜์ง‘ ยท ๋ฒˆ์—ญ
- ChatGPT API ํ™œ์šฉ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
- ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ ยท EDA
- QLoRA ยท Vicuna ํ•™์Šต ๊ตฌํ˜„
- ๋ชจ๋ธ ์ถœ๋ ฅ ์กฐ์ ˆ Advisor ์ œ์ž‘
- ๋ฐ์ดํ„ฐ ๊ฒ€์ˆ˜
- LoRA fine-tuning
- ๋ฐ์ดํ„ฐ ๊ฒ€์ˆ˜
- Web API, Model API ์„œ๋น™ ๋ฐ ๊ด€๋ฆฌ
- ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ, ๋กœ๊ทธ ๋ถ„์„
- ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ์ž๋™ํ™”
- ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ฐ ํ•™์Šต ๋ฐ์ดํ„ฐ ์ œ์ž‘

Model

๐Ÿค—NELLM(๋‚ผ๋ฆ„)์€ KULLM(๊ตฌ๋ฆ„)์„ ๋ฐ”ํƒ•์œผ๋กœ QLoRA fine-tuning๋œ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.

Key Features

fp16์—์„œ int8๋กœ quantizingํ•œ ํ›„ LoRA(Low Rank Adaptation)์„ ์ ์šฉํ•˜์—ฌ ๊ฐ€์šฉํ•œ ์ž์› (NVIDIA V100 VRAM 32GB) ๋‚ด์—์„œ ํ•™์Šต์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์˜€๋‹ค.

๊ฐ€๊ฒฉ์„ regex๋กœ ์ถ”์ ํ•˜๋ฉฐ rule์„ ๊ธฐ๋ฐ˜ ์œผ๋กœ NELLM์˜ ๋ฐœํ™”๋ฅผ ์ผ์ •๋ถ€๋ถ„ ๊ฐ•์ œํ•˜์—ฌ controlํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • e2e_dataset.py : ํŒ๋งค์ž์˜ ๋ฐœํ™”๋งŒ ํ•™์Šตํ•˜๋„๋ก ๋ฐ์ดํ„ฐ์…‹์„ ๊ตฌ์ถ•ํ•˜์—ฌ ๋ชจ๋ธ์ด ๊ตฌ๋งค์ž์˜ ๋ฐœํ™”๊นŒ์ง€ ํ˜ผ๋™ํ•˜์—ฌ ํ•จ๊ป˜ ์ƒ์„ฑํ•˜๋Š” ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.

Dataset

๐Ÿค—NELLM ๋ฐ์ดํ„ฐ์…‹ v1: ChatGPT๋กœ ์ž์ฒด ์ƒ์„ฑํ•œ ๋ฐ์ดํ„ฐ์…‹
๐Ÿค—NELLM ๋ฐ์ดํ„ฐ์…‹ v2: v1 + ์ œ๋ชฉ, ์ƒํ’ˆ ์„ค๋ช…, ๊ฐ€๊ฒฉ ํฌ๋กค๋ง ํ›„ ์ฑ„ํŒ…๋งŒ ChatGPT๋กœ ์ƒ์„ฑํ•œ ๋ฐ์ดํ„ฐ์…‹
๐Ÿค—NELLM ๋ฐ์ดํ„ฐ์…‹ v3: v2์— ์œ ์ € ๋กœ๊ทธ์—์„œ ํŠน์ด ์ผ€์ด์Šค(์˜ˆ: ๋ฌด๋ฃŒ ๋‚˜๋ˆ” ํ•ด์ฃผ์„ธ์š”.)์— ๋Œ€์‘ํ•˜๋Š” ๋ฐœํ™”๊ฐ€ ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ์…‹
๐Ÿค—์œ ์ € ๋ฐ์ดํ„ฐ์…‹: ์•ฑ ๋ฐฐํฌ ํ›„ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์–ป์–ด ์ •์ œํ•œ ๋ฐ์ดํ„ฐ์…‹

Data Schema

{
    "title":"{์ œ๋ชฉ}",               // str
    "description":"{์ƒํ’ˆ ์ •๋ณด}",    // str
    "price": "์ƒํ’ˆ ๊ฐ€๊ฒฉ",           // int
    "result":"ACCEPT ๋˜๋Š” DENY",    // str
    "events":[
        {"role":"๊ตฌ๋งค์ž","message":"์•ˆ๋…•ํ•˜์„ธ์š”! ๋ฌผ๊ฑด ํŒ”๋ ธ๋‚˜์š”?"},
        {"role":"ํŒ๋งค์ž", "message":"์•„์ง ์•ˆํŒ”๋ ธ์Šต๋‹ˆ๋‹ค~"},
        //...
        {"role":"๊ตฌ๋งค์ž","message":"##<{์ตœ์ข… ์ œ์•ˆ ๊ฐ€๊ฒฉ}>##"},
        {"role":"ํŒ๋งค์ž", "message":"##<{์ˆ˜๋ฝ/๊ฑฐ์ ˆ}>##"},
    ],
}

์ •์˜๋œ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜๋ˆ„์–ด์ง„๋‹ค. events์˜ ๊ธธ์ด๊ฐ€ ๋ฐ์ดํ„ฐ๋งˆ๋‹ค ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— json-like data๋กœ ์ •์˜ํ•˜์˜€๋‹ค.

  • title: str
    • ์ค‘๊ณ ๊ฑฐ๋ž˜ ํŒ๋งค๊ธ€ ์ œ๋ชฉ
  • description: str
    • ์ค‘๊ณ ๊ฑฐ๋ž˜ ํŒ๋งค๊ธ€ ๋‚ด์šฉ
  • price: int
    • ํŒ๋งค์ž๊ฐ€ ์˜ฌ๋ฆฐ ๊ฐ€๊ฒฉ
  • result: str
    • ๊ฑฐ๋ž˜๊ฐ€ ์„ฑ์‚ฌ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์˜๋ฏธํ•œ๋‹ค. "##<์ˆ˜๋ฝ>##" ๋˜๋Š” "##<๊ฑฐ์ ˆ>##"์ด๋‹ค.
  • events: List[Dict]
    • role๊ณผ message๋ฅผ key ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๋Š” dictionary๋“ค์„ ์›์†Œ๋กœ ๊ฐ€์ง€๊ณ , ๋Œ€ํ™” ํ„ด์˜ ๊ธธ์ด๋Š” ๋ฐ์ดํ„ฐ๋งˆ๋‹ค ๋‹ค๋ฅด๋‹ค.

Synthetic Data Generation

ChatGPT

๊ธฐ์กด ์˜์–ด ๋ฐ์ดํ„ฐ์…‹์ธ CraigslistBargain๋ฅผ ๋ฒˆ์—ญํ•˜์—ฌ ์‚ฌ์šฉํ–ˆ์œผ๋‚˜, ๋‹จ์ˆœํ•œ ๋Œ€ํ™”ํŒจํ„ด, ๋ฒˆ์—ญ์ฒด, ๋ฌธํ™” ์ฐจ์ด์— ๋”ฐ๋ฅธ ๋ถ€์ ์ ˆํ•œ ๋‚ด์šฉ ๋“ฑ์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ณ ์ž ChatGPT API๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ–ˆ๋‹ค.

  1. ๊ตญ๋‚ด ์ค‘๊ณ ๊ฑฐ๋ž˜ ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด ๋ฐ˜์˜ (ex. ๋„ค๊ณ , ์ฟจ๊ฑฐ๋ž˜ ๋“ฑ)
  2. ๋Œ€ํ™” ํŒจํ„ด ๋‹ค์–‘ํ™”
    • ๊ตฌ๋งค์ž์˜ ํŽ˜๋ฅด์†Œ๋‚˜ ๋ถ€์—ฌ
    • ๊ทธ์— ๋”ฐ๋ฅธ ํŒ๋งค์ž์˜ ๋ฐ˜์‘
    • ๊ฐ€๊ฒฉ ์ œ์•ˆ์˜ ๊ทผ๊ฑฐ๋กœ ์ƒํ’ˆ ์„ค๋ช… ํ™œ์šฉ
  3. ๊ฑฐ๋ž˜๊ฐ€ ์„ฑ์‚ฌ(ACCEPT)๋˜๊ธฐ๋งŒ ํ•˜๋Š” ๋ฐ์ดํ„ฐ ํŽธ์ค‘์„ ๋ง‰๊ธฐ ์œ„ํ•ด 30% ํ™•๋ฅ ๋กœ ๊ฑฐ์ ˆ(DENY)ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก prompt ๊ตฌ์„ฑ

Web

HTML5 FastAPI SQLite MongoDB Docker Google Cloud ์„œ๋น„์Šค ๊ตฌ์กฐ๋„

  • Frontend : HTML5
  • Backend : FastAPI
  • App server : GCP (Google Cloud Platform)
  • Model Server : Upstage์—์„œ ์ œ๊ณต๋ฐ›์€ V100 ์„œ๋ฒ„
  • DB : ์ฑ„ํŒ… ๋ฐ์ดํ„ฐ๋Š” App Server์˜ SQLite(Relational DB)์— ์ €์žฅ๋˜๋ฉฐ, 24์‹œ๊ฐ„๋งˆ๋‹ค ํ•œ ๋ฒˆ์”ฉ json ํ˜•ํƒœ์˜ data๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด MongoDB๋กœ ์˜ฎ๊ฒจ์ง„๋‹ค.

Environment

  • Ubuntu 18.04.6 LTS
  • NVIDIA Volta V100 VRAM 32GB
  • Python>=3.9
  • Poetry & Pyenv ๊ฐ€์ƒํ™˜๊ฒฝ ์„ค์ •
    poetry๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ ํ›„, ์„ค์น˜๋˜์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด ์„ค์น˜ํ•œ๋‹ค.
    curl -sSL https://install.python-poetry.org | python3 -
    ์ด repo๋ฅผ clone ํ•œ๋‹ค.
    git clone https://github.com/boostcampaitech5/level3_nlp_finalproject-nlp-03
    cd level3_nlp_finalproject-nlp-03
    poetry install
  • Web server ํ™˜๊ฒฝ ์„ค์ •

How to run

Model train & evaluation

1. LoRA fine-tuning

> python chat_bot/scripts/train.py --help

usage: train.py [-h] [--train-dataset-names TRAIN_DATASET_NAMES [TRAIN_DATASET_NAMES ...]] [--model-name-or-checkpoint MODEL_NAME_OR_CHECKPOINT] [--dataset-type DATASET_TYPE] [--conv-template CONV_TEMPLATE] [--max-length MAX_LENGTH] [--epoch EPOCH]
                        [--max-steps MAX_STEPS] [--batch-size BATCH_SIZE] [--grad-accum GRAD_ACCUM] [--lr LR] [--output-dir OUTPUT_DIR] [--run-name RUN_NAME] [--peft-type PEFT_TYPE] [--lora-r LORA_R] [--lora-alpha LORA_ALPHA] [--lora-dropout LORA_DROPOUT]
                        [--n_virtual_token N_VIRTUAL_TOKEN]

optional arguments:
  -h, --help            show this help message and exit
  --train-dataset-names TRAIN_DATASET_NAMES [TRAIN_DATASET_NAMES ...]
                        list of dataset names. use as --train-dataset-names ds1 ds2
  --model-name-or-checkpoint MODEL_NAME_OR_CHECKPOINT
  --dataset-type DATASET_TYPE
  --conv-template CONV_TEMPLATE
  --max-length MAX_LENGTH
  --epoch EPOCH
  --max-steps MAX_STEPS
  --batch-size BATCH_SIZE
  --grad-accum GRAD_ACCUM
  --lr LR
  --output-dir OUTPUT_DIR
  --run-name RUN_NAME
  --peft-type PEFT_TYPE
  --lora-r LORA_R
  --lora-alpha LORA_ALPHA
  --lora-dropout LORA_DROPOUT
  --n_virtual_token N_VIRTUAL_TOKEN
  • ์‹คํ–‰ ์˜ˆ์‹œ
python chat_bot/scripts/train.py \
    --train-dataset-names ggul-tiger/{dataset_name_1} ggul-tiger/{dataset_name_2}

2. evaluation

> python chat_bot/scripts/eval.py --help

usage: eval.py [-h] --data-path DATA_PATH --model_checkpoint_path MODEL_CHECKPOINT_PATH [--conv-template-name CONV_TEMPLATE_NAME] [--num-rollouts NUM_ROLLOUTS]

optional arguments:
  -h, --help            show this help message and exit
  --data-path DATA_PATH
  --model_checkpoint_path MODEL_CHECKPOINT_PATH
  --conv-template-name CONV_TEMPLATE_NAME
  --num-rollouts NUM_ROLLOUTS
  • ์‹คํ–‰ ์˜ˆ์‹œ
python chat_bot/scripts/eval.py \
    --data-path ./data/sample_data.json \
    --model_checkpoint_path ggul-tiger/{model_name}

Web server

1. WebAPI: NELLM์˜ ํ”„๋ก ํŠธ & ๋ฐฑ์—”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” API

cd app
uvicorn main:app --port 80

2. ModelAPI: ๊ตฌ๋งค์ž์˜ ์ฑ„ํŒ…์„ ์ž…๋ ฅ ๋ฐ›์•„ ์ ์ ˆํ•œ ๋Œ€๋‹ต์„ ์ถœ๋ ฅํ•˜๋Š” API

cd modelapi
uvicorn main:app --port 30007       

References

  • Verma, Siddharth, et al. โ€œCHAI: A CHatbot AI for Task-Oriented Dialogue with Offline Reinforcement Learning.โ€ Proceedings of the 2022 Conference of the North American Chapter of the Association for Computational Linguistics (NAACL), 2022.
  • Lab, NLP &. AI, and Human-Inspired AI research. KULLM: Korea University Large Language Model Project. GitHub, 2023, https://github.com/nlpai-lab/kullm.
  • He, He, et al. โ€œDecoupling Strategy and Generation in Negotiation Dialogues.โ€ CoRR, vol. abs/1808.09637, 2018, http://arxiv.org/abs/1808.09637.
  • Ko, Hyunwoong, et al. A Technical Report for Polyglot-Ko: Open-Source Large-Scale Korean Language Models. 2023.
  • Dettmers, Tim, et al. "Qlora: Efficient finetuning of quantized llms." arXiv preprint arXiv:2305.14314 (2023).
  • @misc{zheng2023judging, title={Judging LLM-as-a-judge with MT-Bench and Chatbot Arena}, author={Lianmin Zheng and Wei-Lin Chiang and Ying Sheng and Siyuan Zhuang and Zhanghao Wu and Yonghao Zhuang and Zi Lin and Zhuohan Li and Dacheng Li and Eric. P Xing and Hao Zhang and Joseph E. Gonzalez and Ion Stoica}, year={2023}, eprint={2306.05685}, archivePrefix={arXiv}, primaryClass={cs.CL} }