피드백 모델은 사용자가 작성한 독후감을 AI가 자동으로 피드백 해주기 위한 모델입니다.
전체적인 로직은 다음과 같습니다.
사용자가 작성한 독후감을 문장 단위로 나눈 후 KOBERT 모델로 임베딩을 진행합니다. 그 다음, 학습 시킨 GRU 모델에 임베딩된 벡터를 입력으로 넣으면 11가지 항목 점수를 반환합니다. 이렇게 도출된 점수들을 피드백 챗봇에 다시 입력으로 넣으면 이에 따른 피드백 텍스트가 나오게 반환됩니다.
문장을 나누는 처음에는 단순히 ' . '을 기준으로 나누었습니다. 하지만 이렇게 문장을 나누게 되면, 의미상 알맞지 않은 곳에서 문장이 나뉘는 문제가 발생했습니다. 아무래도 독후감을 피드백 하기 위해선 정확하게 문장이 나뉘여야 임베딩도 정확하게 되기 때문에 이런 문제는 용납될 수 없었습니다. 그래서 KSS라는 패턴 기반 문장 분리기를 이용했습니다. . , ! , ? 뿐만 아니라 의미까지 고려해서 문장을 나눠주고 속도도 빠르기 때문에 정확하게 문장을 나눌 수 있었습니다.
KoBERT finetunning 그리고 GRU 셀 학습에 사용한 데이터 셋은 AI HUB에서 제공하고 있는 에세이 글 평가 데이터셋입니다. 한국어로 된 에세이글을 점수로 평가한 데이터셋을 찾기가 어려워서 이 데이터셋을 찾는데까지 많은 시간이 걸렸습니다.
간단하게 이 데이터셋에 대해 소개하면 다음과 같습니다.
다양한 학년군의 에세이 및 에세이 평가 점수로 구성된 데이터
• 에세이는 전문가의 자문을 통해 구성된 50가지 주제로 구성되어 있음
• 에세이에 대한 평가는 3인의 전문가 평가를 통해 이뤄졌으며, 최대 11가지 평가항목으로 이뤄진 루브릭을 통해 데이터의 신뢰성을 높임
한국어 특성으로 에세이 글에 대한 토큰화 작업이 필요했고 한국어 성능 한계를 극복하기 위해 토큰화 기법 및 말뭉치 데이터를 변경하여 학습한 KoBERT모델을 베이스로 선정하였습니다. 선정한 KoBERT 모델이 에세이의 특성을 반영할 수 있도록 Finetuning기법을 사용하였습니다. 그리고 점수를 예측하기 위해 GRU cell 기반 모델을 구성하였습니다. Kappa Score 71점 달성.
피드백 챗봇은 메뉴형 챗봇으로 만들었습니다. 점수는 0~100점 사이로 도출되고 이를 0,1,2,3 그룹으로 나누었습니다.
(0~25, 26~50, 51~ 75, 76~100)
이에 따라 피드백을 맵핑하여 피드백 텍스트를 반환하였습니다.
self.feedback_list = {
0: {3: '맞춤법을 지켜서 글을 참 잘 작성했어요. ', 2: '맞춤법을 잘 지켰지만 틀린 부분을 확인하고 더 정확하게 작성할 수 있도록 노력해보세요. ',
1: '글에 문법적 오류가 조금 많아요. 엉박사님의 맞춤법 교정을 참고해 보세요. ',
0: '글에 문법적 오류가 많아요. 엉박사님의 맞춤법 교정을 참고하여 문법에 따라 글을 다시 한번 작성해 보세요. '},
1: {3: '어휘력이 정말 뛰어나요! ', 2: '어휘력이 좋아요! ', 1: '단어를 조금 더 다양하게 사용하는 연습을 해 보세요. ',
0: '단어를 다양하게 사용해 보고, 상황에 맞는 단어를 써서 글을 다시 작성해 보세요. '},
2: {3: '', 2: '', 1: '', 0: ''},
3: {3: '글을 짜임새 있게 잘 작성했어요! ', 2: '글을 짜임새 있게 작성했어요. ', 1: '작성한 글을 다시 읽어보고 어색한 부분이 없는지 확인해 보세요. ',
0: '글의 짜임새가 부족한 것 같아요. 작성한 글을 다시 한번 읽어 보고 어색한 부분을 찾아보세요. '},
4: {3: '형식에 따라 글을 잘 작성했어요! ', 2: '형식에 따라 글을 잘 작성했어요! ', 1: '형식에 따라 글을 재구성해보세요. ',
0: '글을 작성하기 전 어떤 형식으로 작성할지 생각하고 글을 작성하는 연습을 해보세요. '},
5: {3: '글의 흐름이 매우 자연스럽네요! ', 2: '글의 흐름이 자연스러워요! ', 1: '글의 연결이 부자연스러워요. 글의 연결이 어색한 부분을 찾아보세요. ',
0: '글의 연결이 부자연스러워요. 글의 연결이 어색한 부분을 찾아보세요. '},
6: {3: '적절한 분량의 글을 잘 작성했어요! ', 2: '적절한 분량의 글을 잘 작성했어요! ', 1: '글을 조금 더 많이 작성하는 연습을 해 보세요. ', 0: '챕터별 활동을 참고해서 글을 더 많이 적는 연습을 해 보세요. '},
7: {3: '주제가 명료하고 글 전체가 하나의 주제를 잘 뒷받침 하고 있어요. ', 2: '주제에 맞게 글을 잘 작성했어요. ',
1: '글을 쓸 때 주제를 먼저 정하고, 주제를 생각하면서 글을 쓰는 연습을 해 보세요. ',
0: '챕터별 활동을 보면서 하나의 주제를 정하고 그 주제에 맞게 글을 적는 연습을 해 보세요. '},
8: {3: '글을 구체적이고 상세하게 잘 작성 했어요. ', 2: '글을 구체적이고 상세하게 작성 했어요. ', 1: '챕터별 활동을 참고해서 글을 구체적으로 적어보는 연습을 해 보세요. ',
0: '챕터별 활동을 참고해서 글을 구체적으로 적어보는 연습을 해 보세요. '},
9: {3: '', 2: '', 1: '', 0: ''},
10: {3: '글을 창의적이고 논리적으로 잘 작성했어요. 새로운 발상이나 관점 전환을 시도했으며 내용이 매우 적절해요. ',
2: '글을 창의적으로 잘 작성했지만, 논리적으로 약간 부족한 부분이 있어요. ',
1: '논리적으로 글을 쓰는 연습이 필요해 보여요. 새로운 발상이나 관점 전환을 시도했지만, 글과 알맞지 않은 것 같아요. ',
0: '창의적이고 짜임새 있게 글을 쓰는 연습이 필요해 보여요. '},
}