본문 바로가기
Hobby

챗봇 메신져 제작기 24.07.15

by 왕고미 2024. 7. 16.

 

금년도 토이프로젝트로 제작했던 챗봇이 어느정도 제작 완료된 것 같습니다!

 

일전에 올리기는 헀지만 제작한 챗봇의 개요는 아래와 같습니다!

 

이전에 이직은 준비해볼까 하던 중, 포트폴리오 자료 및 경력, 이력 및 

예상 질문과 답변을 준비하던 중...

' 아 귀찮다 ! 내 경력을 누가 대답해줬으면 좋겠다 ! '라는 생각이 들어 만들었습니다.

 

대략적인 특이사항은 밑에....

 

1. PHP 라라벨에 제트스트림을 통해 로그인관련 모듈을 제공받고

livewire를 통해 UI 컴포넌트를 서버사이드로 렌더링하도록 했습니다.

 

2. 내부의 자연어처리모델은 Bert모델을 사용했습니다.

이를 위해서 python + Flask서버를 Gunicorn을 통해 열어둡니다. Model로드할 때 서버 메모리가 바로 바사삭 되긴 합니다만 Model이 로드되고 나면 그럭저럭 대답하는 속도를 보여줍니다...

GPU가 없는 싸구려 서버를 돌리는 저로서는 고작 요정도 서버 스펙에 Gunicorn하나 phpFpm하나도 벅차더라구요...

 

3. 젠킨스는 executor를 1개로 줄였는데도 불구하고 service를 꺼놓지 않으면 메모리가 30%나 날아가기에 빌드 후 jenkins를 꺼두도록 설정했습니다...

 

4. 대략적인 챗봇의 사용순서는 다음과 같습니다.

-> 챗봇 생성

 

-> 챗봇이 응답할 질문과 응답 등록

 

-> 질의응답이 준비되면 데이터셋 추출(csv)

 

-> csv를 데이터셋으로 질문(key)에 대한 답(value)를 Embeding 후 Vector화 (이 부분을 학습이라 칭함)

 

-> 학습된 결과를 토대로 Bertmodel을 통해 질문에 대한 자연어처리를 통해 질문(key)과의 유사도 비교

 

-> 가장 유사하거나 유사도(similarity)가 비슷한 질문을 찾고 해당 Key에 맞는 Value를 찾아 리턴

 

-> 사용자에게 답변

 

※ 만약 유사도(similarity)가 너무 낮거나 아예 찾을 수 없는 질문을 물어볼 경우 '미답변'으로 분류하여 따로 DB에 저장하고 이전에 등록한 비슷한 질의응답 항목을 연결하거나 아예 새로운 질의응답을 작성한 후 다시 학습시켜 다음에는 대답할 수 있도록 한다.

 

 

이렇게 제작을 하다보니, 핵심 기능들이 제작은 되었는데 제가 웹디자이너가 아니다보니,

 

사소한 색 맞춤, 레이아웃 디자인, 애니메이팅 등에서 시간을 훨씬 많이 뺏긴 거 같아요.

 

로그인 후 메인페이지

 

챗봇 관리페이지

 

채팅 기록 확인
미답변 대화 확인 및 답변완성 페이지

 

 

 

 

저에게는 올해 하는 토이프로젝트 중 가장 재미있는 프로젝트네요!

 

지금은 어느 정도 완성되었다고 판단한 후

틈이 나는 시간을 들여 이것 저것 수정하고 있는 중입니다.

그런데 사용 방법을 알고 있는 개발 당사자가 QA를 하자니 미처 발견하지 못하는 오류나 개선사항 등,

실제 사용자가 불편해 하거나 개선되었으면 하는 부분에 대한 체크를 하기 쉽지 않은 것 같습니다.

 

이제 사용자만 구해서 테스트 해보고 싶은데.....

사실 이거 테스트 해 줄 사람들을 구하기도 쉽지 않네요...

 

상용서비스도 아니고 회사일도 아니다 보니 

자본의 힘 없이 사용되는 서비스처럼 만들어야 하는게 참....


사용해본 후 피드백을 도와주실 수 있는 분이 계실까요?

 

1) 챗봇 제작가능한 페이지

https://simchat.aimor.site/

 

[simChat - 간단히 만드는 챗봇]

안녕하세요! simChat입니다! simChat은 아주 간단한 과정으로 여러분만의 챗봇을 만들고, 질문과 답변을 등록하여 여러분의 챗봇에 방문하는 사람들에게 준비된 상담을 진행할 수 있어요!

simchat.aimor.site

 

2) 해당 사이트에서 제작한 자기소개용 챗봇 예시

https://simchat.aimor.site/msg?c_key=a8228927-9bbb-448f-886b-9ed41997b192

 

[ 호잇호이★ ]

 

simchat.aimor.site

 

** 대답하지 못하는 답변이 많을 수 있습니다.

프라이빗한 챗봇은 한정된 Document내에서 학습을 한 후 답변을 해야 하기 때문에 의도된 바입니다.

답변되지 못한 질문은 로그인 후 미답변 목록에서 답변을 등록한 후 학습하게 됩니다.

이 때 Db에 등록된 질문과 응답을 일정패턴의 Document로 Export한 후 ChromaDB를 통해 Vector화 되고,

이 후 Bert모델에서 유사도를 측정하여 VectorDB에 저장된 답변 중 유사도 높은 키값의 답변을 찾아냅니다.

 

** 자연어 처리 모델은 Bert모델의 한국어 변주 모델 중 하나인 KoSroBerta를 사용했습니다.

자연어 문맥처리는 그럭저럭이나, 유사도 측정에 있어서 영문만큼 확실하지 못합니다. 대답이 LLAMA, GEMMA, GPT 만큼 양질이엇으면 좋겠다 하는 생각은 있지만, 돈이 많이 없어서 .....

 

** 자연어처리 모델의 탑재는 별도로 python Flask를 통해 제작된 API 요청 중계서버내에 있습니다. localhost 에서의 요청외에는 모조리 거부되도록 되어 있습니다.