Coder Social home page Coder Social logo

boostcampaitech5 / level3_nlp_finalproject-nlp-12 Goto Github PK

View Code? Open in Web Editor NEW
13.0 0.0 6.0 25.54 MB

'내마리'는 나의 이야기에 귀를 기울임으로써 나에게 공감하고, 이야기의 맥락을 파악하고, 더 깊은 내용을 질문해주는 챗봇입니다.

Home Page: http://mymary.o-r.kr:30007

Python 79.71% Shell 1.03% HTML 2.62% CSS 4.15% JavaScript 12.49%
chatbot chit-chat chitchat empathetic-dialogues korean-nlp nlp

level3_nlp_finalproject-nlp-12's Introduction

내마리(MyMary): 내 마음을 들여다 보는 챗봇

챗봇과의 대화를 통해 ‘나’에 대해 더 잘 알아갈 수 있는 챗봇, 내마리(MyMary) 서비스입니다. 내마리(MyMary)

  • 사용자의 채팅 속에서 맥락을 파악하고 사용자에게 따뜻한 공감을 제공하며
  • 질문 또는 생각 정리의 형식으로 사용자의 채팅에 대한 답변을 마무리함으로써
  • 사용자가 공감을 기반으로 챗봇과 상호작용할 수 있게 되어, 궁극적으로 사용자 자신과 상호작용 하는 (= 내 마음을 들여다보는) 경험을 제공합니다.

[마리와 대화하기]

1. 프로젝트 데모 Project Demo

demo

2. 팀 & 역할 Team & Roles

공통 문지혜 박경택 박지은 송인서 윤지환
smoked_salmon
GitHub Badge GitHub Badge GitHub Badge GitHub Badge GitHub Badge
데이터 생성
데이터 검수
모델 별 실험
평가 지표 리서치
평가 전략 설계
프롬프트 엔지니어링
LangChain 연동
발표
개발환경 구성
베이스라인 작성
데이터 EDA
발표
FE/BE 구현
DB 연결
LangChain 연동
PM
베이스라인 작성
데이터 취합
데이터 전처리
LangChain 연동

3. 실행 방법 How-to-Run

Dependency Management

poetry shell

Finetuning

finetuning 디렉토리에서

python train.py

Merge QLoRA layer into LLM backbone

finetuning 디렉토리에서

python merge_lora.py

Inference

finetuning 디렉토리에서

python inference.py

Server

Backend

server/backend 디렉토리에서

python app.py

Frontend

server/frontend 디렉토리에서

npm install

and

npm start

4. 프로젝트 아키텍처 Project Architecture

project_architecture

5. 데이터 Data

data_types

  • HuggingFace 데이터셋 리포지토리
  • 공감형 대화 공개 데이터셋은 single-turn 데이터 8,194개와 multi-turn 데이터 18,668개로 구성됩니다.
  • 사용자의 채팅에 대한 응답인 챗봇의 채팅은 '공감형 반응 - 질문' 형태를 띱니다.
  • Finetuning 시 모델의 입력은 프롬프트 템플릿으로 감싸주었으며, 데이터 생성 및 파인튜닝, 추론 등에서 사용한 프롬프트 템플릿은 data/prompt/ 디렉토리를 참고해주세요.

6. 모델 Model

Backbone

KULLM-Polyglot-Ko-12.8B

kullm

Polyglot-Ko-12.8B 모델을 backbone으로 하여 15만 2천여 건의 싱글-턴 대화로 finetuning한 모델입니다.

QLoRA layer

qlora

LoRA 기법에 4-bit quantization, double quantization, paged optimizer 등의 방법을 사용하여 VRAM 32GB single GPU에서 full finetuning이 가능하게 했습니다.

7. 평가 Evaluation

평가를 위해 비교한 모델은 한국어 LLM 3가지(모델 파라미터수 7B, ~13B)와 현재 서비스 중인 GPT-3.5 모델(모델 파라미터 수 175B)입니다.

G-Eval

G-eval 논문을 참고하여 6가지 항목을 선정하고, 추가적으로 (1) 공감 능력, (2) 대화 유도 항목을 추가하여 평가하였습니다. g-eval

Human Evaluation

평가 항목은 크게 (1) 기초 능력, (2) 공감, (3) 맥락 유지, (4) 질문 항목으로 나뉩니다. 각각의 항목은 다시 두세 항목으로 세분류하여 평가를 진행하였습니다. human_eval

8. 서빙 Serving

서빙 파트의 자세한 내용은 server/ 디렉토리의 README를 참고해주세요.

9. 공개 링크 Public Links

Presentation

10. 참고문헌 Reference

level3_nlp_finalproject-nlp-12's People

Contributors

afterthougt avatar fortunetiger avatar iamzieun avatar jihye-moon avatar ohilikeit avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

level3_nlp_finalproject-nlp-12's Issues

[EXP] generation config 설정 조절을 통한 inference 품질 끌어올리기

Background

  • 열심히 학습시킨 모델을 파이프라인에 넣고 inference를 할 때 generation config를 조절할 수 있다.
  • 만약 잘 만들어놓고 설정을 이상하게 주면 모델의 능력이 충분한데도 이상한 결과를 내뱉을 수 있다.

To Do

  • Huggingface의 GenerationConfig 정리
  • 각 인자별 실험 진행(바꿀 때마다 최소 5번의 inference를 통해 일반화 성능 파악)

[FEAT] FE detail 설정

Background

  • React를 이용하여 Front-end의 세부 디자인을구현한다!

To Do

  • 챗봇의 답변을 불러올 때, 도로록 하고 나오게 하는 애니메이션 구현
  • 접속 시 애니메이션
  • 폰트, 배경 색 등 정하기 & 적용하기

[FEAT] 싱글 턴, 멀티 턴 대화에 따른 prompter 구현

Background

  • 기존 싱글 턴과는 달리 멀티 턴 대화가 데이터에 추가되었음
  • 따라서 langchain이 이전맥락을 가져와서 프롬프트에 추가하는 형식과 유사한 방식으로 학습시킬 필요가 있음

To Do

  • 멀티 턴 대화의 경우 다르게 template 적용하는 코드 구현
  • 싱글 턴, 멀티 턴에 따라 다르게 들어가는지 확인하고 학습 후 대화해보며 결과물 확인

[EXP] 모델생성 방법(pipeline vs model.generate)에 따른 차이 비교

Background

  • pipeline 함수를 사용하는 방식과 model.generate() 함수를 바로 사용하는 것 사이에 답변 퀄리티 차이가 있다.
  • pipeline의 경우 소스코드에서 내부적으로 generate함수를 쓰는 것은 동일하지만 이상하게 퀄리티가 더 떨어진다.

To Do

  • pipeline 소스코드 분석 후 이유 찾기
  • 현재 langchain 활용시 pipeline 방법으로 해야하는데 답변 퀄리티를 올리는 방안 연구

[FEAT] evaluation metrics 추가

Background

  • 모델 학습 시 evaluation metric이 필요함
  • llm fine-tuning시 활용가능한 evaluation metric을 조사하고, 그것을 코드에 추가해 보자.

To Do

  • evaluation metric 조사
  • compute_metrics.py 생성
  • train.py에 compute_metrics.py 연결 및 compute_metrics 인자 추가
  • 학습이 제대로 이루어지는지 확인

See Also

[FEAT] streaming mode 구현

Background

  • 텍스트 생성 방법엔 실시간으로 생성되는게 보여지는 streaming mode과 다 생성하고 한 번에 보여주는 batch mode가 있다.
  • 만족스러운 사용자 경험을 위해선 streaming mode 가 필요하다.

To Do

  • reference 조사 (노션 참고)
  • inference 부분에 streaming 기능 추가
  • FastAPI 벡엔드 파트와 협력하여 연결

[BUILD] Environment

Background

  • 원활한 실험 진행을 위한 환경 설정의 필요성

To Do

  • poetry 활용한 환경 설정
  • merge_lora.py와 inference.py 설정 관리

[FEAT] Custom VectorStoreRetrieverMemory 구현

Background

  • LangChain 라이브러리의 VectorStoreRetrieverMemory 클래스가 ai_prefix, human_prefix를 구분해주는 기능이 없는 데 따른 해당 기능 구현의 필요성

To Do

  • 벡터 저장/검색 메모리 커스텀 클래스 구현

See Also

[FEAT] 모델 파트와 웹 파트 통합

Background

  • 구현된 LLM 파이프라인과 웹 구현 부분 통합의 필요성

To Do

  • LangChain의 InMemoryDocstore() 부분과 DB 연동
  • 파이프라인 리팩토링 후 웹 백엔드에서 필요한 함수 분배

See Also

[FEAT] model 최종평가

Background

  • 실제 서비스화 된다면 대부분이 멀티턴 대화가 될 것임
  • 따라서 길어진 대화에 대해 최종적으로 평가하는 지표를 정해야함
  • 싱글 턴 평가멀티 턴 평가가 둘 다 이루어져야 함
  • 모든 평가는 문서화해서 저장

To Do

Metrics Research

  • Human Evaluation : 우리 데이터의 정의를 참고하여 기준을 세우고 대화 결과를 직접 평가
  • Dialogue Evaluation Metric : KULLM 레포에서 사용한 방법과 유사하게 우리 기준에 부합한 프롬프트를 만들고 GPT4에게 평가. KULLM에선 250여 개 데이터를 평가에 사용했으니 우리도 비슷한 수준이거나 100여개 정도로 낮춰서 사용함을 고려

Preparation

  • G-EVAl Prompt 정하기
  • test dataset 정하기
  • evaluation 전략 설정

Evaluation code implementation

  • test 파이프라인 구축
  • 다른 한국어 LLM들 evaluation
  • 우리 모델들 evaluation

[FEAT] 싱글 턴, 멀티 턴 대화 프롬프트 템플릿

Background

  • 싱글 턴 대화(유저-챗봇 한번씩)은 어느 정도 학습이 되어 잘 생성되는 상태
  • 하지만 langchain을 이용한 이전대화를 프롬프트로 삽입 시 엉뚱한 답을 내뱉음
  • 학습할 때 보지 못한 형태의 input이 들어오면 벌어지는 일이라 판단함
  • 이전 대화의 맥락을 함께 학습시키는 멀티 턴 대화 데이터를 모델에 함께 학습시킨다

To Do

  • 멀티 턴 대화 데이터셋 생성을 위한 프롬프트 작성 및 데이터 생성
  • 싱글 턴, 멀티 턴 대화 프롬프트 템플릿 작성
  • prompter.py 에 싱글턴, 멀티턴에 따라 적절하게 매핑해주는 함수 추가

[FEAT] Llama-2 모델로 변경

Background

  • Meta에서 발표한 Llama-2 모델로 backbone 변경

To Do

  • 바뀐 모델 전용 프롬프트 템플릿 작성
  • Llama-2 기반 모델 재 학습
  • 마리에 적용 후 inference 확인

[EXP] Vector store-backed memory

Background

  • 이전 대화기록을 db에 저장한 후 현재의 대화와 유사한 대화를 Retrieval해 와서 프롬프트로 반영
  • 단순히 직전 대화를 프롬프트에 넣는 형태보다 좋을 것으로 판단됨
  • 이 실험은 멀티 턴 대화 데이터셋을 반영한 학습 결과 이전 대화맥락을 주는 형태의 대화가 잘 이어짐을 확인한 이후 진행

To Do

  • 이곳의 document를 참고하여 jupyter notebook으로 확인
  • 유용성이 입증될 경우 FastAPI와 연동하여 챗봇 demo 버전 구현

See Also

[FEAT] 생성된 텍스트 post-processing

Background

  • 챗봇 생성결과는 랜덤이고 항상 좋은 것은 아님.
  • 따라서 매뉴얼하게 필터링해서 적절하지 않은 표현을 제거해주어야 함.

To Do

  • Langchain pipeline 내부에 post-processing이 가능한 메서드 확인
  • 생성된 텍스트를 db로 보내기 전 필터링하는 코드 구현

[FEAT] EleutherAI/polyglot-ko-12.8b finetuning

Background

  • kullm도 결국은 polyglot-ko를 finetuning한 모델로, 만약 우리 task에 맞는 데이터로 polyglot-ko를 충분히 finetuning할 수 있다면 kullm을 사용하지 않아도 된다.

To Do

  • polyglot-ko에 맞게 baseline 수정
  • 적절한 템플릿 및 하이퍼파라미터 실험

[DOCS] 코드 정리

Background

  • main 브랜치에 합치기 전 코드 정리

To Do

  • docstring, type hint 정리
  • 코드 기능 별 주석 추가
  • README.md 작성
  • assets 폴더 추가
    • timeline, tech stack, architecture 이미지 첨부
    • wrap-up report 첨부
    • 발표 장표 첨부

[FEAT] OpenAI API를 활용한 데이터 증강 기능 구현

Background

  • 파인튜닝에서 사용할 대규모 학습 데이터의 생성을 위한 OpenAI API를 사용 자동화 생성 코드의 필요성

To Do

  • OpenAI API 키를 보관할 .env 파일 추가
  • 위 파일을 불러와 input_template.txt의 템플릿 요구 조건에 맞는 데이터를 생성한 뒤 결과물을 csv 형태 등으로 정형화하여 저장하는 기능을 하는 코드 구현

[FEAT] 싱글-턴, 멀티-턴 대화 생성을 위한 프롬프트

Background

  • 싱글-턴, 멀티-턴 대화를 각각 OpenAI API를 사용하여 생성할 필요성 대두
  • 1만 단위 이상의 멀티-턴 대화를 생성할 경우 GPT-4 API 사용 요금이 1000달러 단위 이상으로 예상됨에 따라 비용 절감을 위한 고민

To Do

  • GPT-3.5-turbo 모델을 사용한 데이터 생성 프롬프트 작성 및 공유, 실험 등

See Also

[BUILD] baseline code of finetuning llm

Background

  • llm finetuning을 위한 baseline code의 필요성

To Do

  • finetuning 작동 확인
  • train 관련 hyperparameter 및 각종 configuration -> yaml 파일과 pydantic BaseModel class 활용하여 정리
  • WandB 연결
  • Huggingface Datasets repo 생성 및 연결
  • 모듈화

[FEAT] langchain retrieval의 input, output key 변경가능해짐에 따른 prompter.py와 템플릿 수정

Background

  • langchain vector retrieval 시 input, output key를 (input, response)로 반 강제로 사용중이였음
  • 백본으로 KULLM 모델을 사용하려면 (### 명령어, ### 응답)을 사용할 필요가 있어서 polyglpot-ko로 백본 변경
  • 하지만 (### 명령어, ### 응답)를 활용할 방법을 찾아서 다시 복구

To Do

  • prompter.py 수정
  • 알맞은 템플릿인 multi.json 수정
  • 학습 후 inference 확인 용 notebook 업로드

See Also

[BUILD] modeling, FE/BE 환경 통합

Background

  • modeling 시 사용하는 poetry 환경과 FE/BE에서 사용하는 poetry 환경 통합 필요

To Do

  • 각 환경에서 사용하는 라이브러리 파악
  • 통합된 Poetry 환경 설정 및 관련 파일 commit

See Also

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.