챗봇 기반 스마트 도서관 통합 서비스 프로젝트(2)

임정민·2023년 4월 19일
0

프로젝트

목록 보기
18/33
post-thumbnail

챗봇 기반의 스마트 도서관 통합 서비스 프로젝트 입니다.

챗봇 기반 스마트 도서관 통합 서비스 프로젝트(1)에 이은 발표 PPT 및 설명입니다.

발표 및 PPT

안녕하십니까.
챗봇 기반 스마트 도서관 통합 서비스라는 주제로 최종 프로젝트를 진행한 당근과채찍팀 발표자 임정민입니다. 반갑습니다. 발표 바로 진행하겠습니다.

발표 목차입니다. 이런 순서대로 진행을 하겠고 중간에 시연 영상도 있습니다.
편하게 보시면 될거같습니다.

팀원 소개 및 역할 분담입니다. 총 5명 저 임정민, 장동근님, 최해정님, 이종은님, 심현우님으로 이루어져 있습니다.

주제는 챗봇 기반의 스마트 도서관 통합 서비스입니다. 먼저 스마트 도서관에 대해 간단히 소개해드리자면

사진에서 보이시는 것과 같이 책 자판기 형태의 도서관입니다.

지하철역, 주민센터와 같이 사람들이 많이 몰리는 공공장소에 배치되어 도서관에 대한 접근성이 떨어지는 이용자이나 바쁜 일상 속에서 도서관을 방문하기 힘든 시민들을 위한 무인 도서 시스템입니다. 대중교통을 이용할 때와 같이 이동하는 중간에 원하는 도서를 빌리고 반납하는 형태로 이용합니다.

하지만 시민들 입장에서 존재자체를 모르거나 이용방법에 대해 잘 몰라서 현재 이용률이 낮은 상황입니다.

또 막상 사용하기위해 이렇게 스마트 도서관을 검색해보면 스마트 도서관별로 이용안내나 자료검색 페이지가 각각 나눠어져있습니다. 그래서 어떤 책이 어디 있는지, 대출이 가능한지 알아보기 위해서는 각 페이지에 들어가서 검색야하는 불편한 구조입니다.

이를 개선하고자 하나의 통합된 스마트 도서관 서비스를 기획했습니다.

또 이 서비스를 챗봇 기반의 서비스로 개발했습니다. 주로 이동 중간에 조그만 화면의 핸드폰으로 도서를 검색하고 동선과 가까운 곳으로 방문하는 이용 패턴을 고려해서 길가면서 카톡하듯이 채팅을 통해 사용자가 원하는 정보를 얻을 수 있게 하였습니다.

결론적으로는 프로젝트의 목표는 이러한 서비스를 통해 스마트 도서관이라는 공공시설물을 활성화하는 데 있습니다.

스마트 도서관 통합 챗봇 책GPT 입니다. 출퇴근길과 같이 이동하는 중간에 도서를 대해 검색하기도 하며 (대여가 가능하면 대출, 대출중이면 반납 알림을 받을 수 있습니다.) 원하는 장르에 대해 추천받고 도서관별 운영시간과 같은 문의 사항에 대한 정보를 있는 서비스를 이용할 있게 했습니다.

처음 서비스에 들어오면 로그인 페이지, 회원가입 페이지,ID/PW 찾기 페이지 (같은 경우에는 email 인증을 통해서 확인이 가능합니다.)를 통해 회원을 인증하고 넘어가면

이러한 채팅창 화면이 나옵니다.이 안에서 사용자의 요청이 이루어지게 됩니다.

채팅화면에서 우측상단에 전체보기 버튼을 통해 도서관별로 어떤책을 보유하고 있는지 목록들을 확인할 수 있습니다. 그 옆에 있는 이용 방법 버튼으로 챗봇 이용 방법이나 스마트 도서관 이용 방법을 확인할 수 있습니다. 그 뒤에

여기서 바로 메세지란에 입력해서 바로 검색을 할 수도 있고 (예시1)

챗봇 인사말 하단에 있는 검색, 추천, 문의 버튼을 눌러서 답변을 (예시2) 얻을 수도 있습니다.

전체 시스템이 작동하는 구조 대해 설명드리자면

(시스템 구조 사진)

이러한 구조로 설계되어있습니다. 사용자가 채팅을 치면 그 발화문 문장을 웹서버 spring이 받아서 str객체에 저장합니다. 저장한 str객체를 의도분류모델, 트랜스포머 모델이 포함된 플라스크 서버로 전달해줍니다. 여기서 아까 말씀드린 챗봇의 기능 '검색,추천,문의' 그리고 예외까지 모델의 예측에 따라 내부 알고리즘이 작동합니다. 여기서 검색이나 추천과 같이 도서에 대한 정보가 필요하면 이때, 데이터베이스에 접근해서 데이터를 불러옵니다. 이렇게 분류된 의도별로 답변에 대한 모든 내용을 하나의 객체에 저장해서 다시 spring서버로 전달해주어 출력하는 방식입니다. 도서 정보들을 출력해준 뒤에 사용자가 찾은 도서에 대해 대출 혹은 반납 알림 버튼을 눌렀을 때도 DB에 접근하게 됩니다. 이 구조는 사용자가 메세지를 입력할 때마다 반복되는 구조입니다.

세부적으로 먼저 데이터베이스에 대해 설명 드리겠습니다.

도서 정보는 광진구와 합정역 인근 스마트도서관 4곳의 도서검색 페이지와 알라딘 스크래핑을 통해 수집하였고, 크롤링-전처리-데이터베이스 적재까지 한번에 수행할 수 있도록 하였습니다.

개발 초기에는 챗봇에서 DB에 직접 접근하여 조회하는 방식으로 설계했는데, 다수 DB에 따로 접근을 해야 한다는 점,DB 접근 권한 및 보안 문제있을 수 있다는점 통합 서비스라는 목적에 맞지 않는다고 판단되어 전체적인 구조를 변경하였습니다.

최종 단계에서 구현한 전체 DB 구조이고 도서관의 개수에 상관없이 통합 서비스 DB에만 접근하게끔 설계를 변경하였고 개별 도서관은 개인정보 등 보안이 필요한 정보를 제외한 소장 도서와 대출 현황 정보만 선택해 View table을 생성해주면 통합DB는 그 테이블을 가져와서 취합해서 사용합니다.

이렇게 뷰 테이블을 사용함으로써 도서관의 중요 데이터에 접근하지 못하게 하고, 복잡한 JOIN문을 간결하게 사용할 수 있게 했습니다. 또한 데이터가 변경되어도 통합DB에서 별도의 작업없이 모델 내부에서 쿼리문이 실행되면 자동으로 업데이트 되어 실시간으로 변경 사항이 적용되어 나타납니다.

최종적으로 구현한 ER 다이어그램입니다. (최종 보여주면서) 통합 서비스에서 제공하는 검색기능과, 대출 기능을 구현하기 위해 구축한 스마트도서관 DB 구조입니다. 실제 스마트 도서관 DB를 제공받고 싶었지만 프로젝트 기간 내에 공공기관과 협업하지는 못해서 직접 설계했습니다.

챗봇과 연결되는 통합 DB의 세부구조입니다. 반납 알림 기능을 위해 데이터를 저장해야할 물리 테이블과, 도서 정보, 대여 현황 조회를 위한 VIEW 테이블입니다. 완성한 데이터베이스는 AWS의 RDS에 올려 DB를 관리하는데에 편리성을 높였습니다.

여기까지가 데이터 구축에 관한 내용이었고 이어서

Flask(데이터 서버)에서 구체적으로 사용자의 어떤 입력을, 어떻게 분류하여 처리하는지에 대해 말씀드리겠습니다.

가장 먼저 발화문이 들어왔을 때 CNN 의도분류 모델이 작동해서 사용자 의도 예측합니다.

(한 템포 쉬고)

데이터는 4개의 클래스,총 600개의 발화문 데이터를 나누어 학습시켰습니다. 데이터 수집 부분은 도서관 챗봇에 대한 데이터를 찾아봤을 때 거의 없다시피 해서 직접 만들었습니다.

또 패딩 길이를 맞춰줄때 문장마다 토크나이징해서 조사나 접미사, 종결어미같은 의도 분류하는데에 큰 의미없는 품사들은 제거하는 과정이 필요한데이때 조사, 접미사에 대해 품사 체계가 세분화 되어있는, 또 이후에 검색 기능때 보여드릴 오탈자에 대한 대응이 가능하기도 해서 형태소 분석기는 komoran으로 선택하게 되었습니다. 토크나이징 했을 때 99퍼센트 정도 포함하는 길이로 설정했습니다.

임베딩에 대한 내용입니다.보통 Word2vec, fasttext 두가지 방식 중에 고민했었는데 fasttext는 subowrd로 OOV에 대처가 가능하긴 하지만 지금 임베딩 시키려는 대상이 우측에 보이시는 의도분류 학습 데이터인데 저희가 직접 만들다보니 대부분 말뭉치에 포함되는 단어들이기도 하고 subword를 포함한 fasttext 는 용량적인 부분이나 속도부분 무거울 수 있어 word2vec 방식으로 진행했습니다.

단어별로 200개 벡터차원, vocab size는 3만개 정도입니다 (되는 파일 전처리해서
Embedding layer에 가중치 부여했습니다.)

데이터 분할 과정입니다.Test size는 0.2로 잡아서 학습때는 제외하고 테스트 때만 사용할 unseen data는 따로 남겨두었고 train / vaildation 9:1비율로 학습시켰습니다.

이렇게 해서 학습한 결과로 학습할 때의 정확도는 98%였고 Unseen data로 Test 했을 때는 83% 정도로 나왔습니다.

이렇게 만들어진 CNN 모델에 이러한 데이터가 들어와서 분류가 되는데
(예를 들어서 “군자역 하루키 작가님 책 검색해봐” 라는 발화문이 들어오면 의도 분류 모델이) 모델의 예측에 따라 검색,추천,문의 그리고 negative, 클래스 예외 클래스로 분류합니다.

검색 기능부터 상세히 말씀드려보자면

이렇게 위치명, 작가명, 도서명 기준으로 검색할 수 있습니다. 위치명으로만 검색하거나 위치명과 작가명으로 검색하거나 모든 경우의 수로 전부 검색이 가능합니다.

이게 검색할 때의 예시들입니다. 검색의 원리는 형태소 분석기가 문장안에서 고유명사들의 n-gram들을 찾는 과정이 있습니다.

예를 들어서 ‘요괴의 아이를 키우고 있습니다 1’ 라는 책이 있으 bigrams, trigrams ,… 5-grams까지 Komoran 형태소 분석기에 고유명사로 태깅해놓아서 발화문 안에서 찾은뒤에 책원본명으로 변환시켜서 DB에서 찾는 방식입니다.

(여기서 도서명은 하나의 어절, unigram까지 입력해놓으면 평상시 사용하는 단어까지 책이름으로 판단할 수가 있어서 도서명은 unigram은 제외했습니다.)


N - gram으로 찾을 떄의 예시로 무라카미 하루키 작가 검색할 때는 하루키, Unigram으로 (새롭게 만나는 한국 신화 책 검색할 떄는 한국신화 bigrams로도 검색이 되고) Tri – gram 도 비슷한 원리입니다. 또 이렇게 공백이 없는 n-gram으로 쳤을 때도 가능합니다. 근데 여기서

스마트 도서관 이용 패턴상 이동하면서 채팅을 칠때 자소가 분리된 오탈자가 발생는 경우가 있습니다. 이를 위해서 토크나이저중에 유일하게 오탈자 분석이 가능한 Komoran을 사용함으로써 이런식으로 김여ㅇ하 작가님 김영하 보정시키기는 방식으로 검색이 가능하게 했습니다. (과ㅇ진으로 보정해서 인식할 수 있게하였습니다.)

검색했을 때 이렇게 도서목록이 카드형식으로 나옵니다. 밑에 화살표 눌러서 돌아가면서 선택할 수 있고 또 소개글 버튼을 통해서 책에 대한 간단한 소개글을 보거나 도서정보 버튼을 눌러서 책이 위치한 도서관도 알 수 있습니다.

검색한 책이 대출이 가능할 때는 대출 신청 버튼 (1)이 나오면서 사용자에게 대출여부 선택권을 주고 (버튼을 누르면 DB에 접근해서 대출가능여부를 업데이트합니다.)

대출이 불가능할 때는 반납 알림 버튼 (2)이 나옵니다. 반납 알림 버튼을 눌렀을 때는 대출기간이 이틀 남았을때 기준으로 이메일로 알림이 가게끔 설정되어있습니다.

(버튼 의도) (제가 처음에 메세지를 바로 입력해도 되고 버튼을 누르고 메세지를 입력해도 된다고 하였는데) 또 버튼을 통해서 더 정확하게 답변을 제공할 수 있는 기능인데 “~검색해줘”와 같은 발화문 형태가

아니라 고유명사만 쳤을 때도 결과가 나오게 했습니다. 이 부분은 타이핑하는 과정을 줄이거나 또 의도 분류가 잘못되었을 떄 부적절한 답변이 나왔을때 버튼으로 의도를 고정해서 더 정확한 답변 얻을 수 있게 했습니다. 여기까지가 검색기능이고


다음은 추천 기능입니다.

추천은 이러한 위치명과 장르가 포함된 문장 2개 이상의 장르가 포함된 문장
그리고 아까 말씀드린 오탈자 이러한 문장 모두 대응이 가능합니다.

추천할때 규칙이 있습니다. 일단 총 3권까지 추천하고 예시문을 기준으로
위치와 장르가 특정되었을 때 가장 먼저 위치에 해당하는지, 추천을 받고 마음에 들면 직접 방문해서 빌리기 때문에 위치가 1순위이고 만약에 위치명을 입력하지 않고 장르 요청했을 때는 통합된 모든 스마트 도서관에서 찾게 됩니다.

그다음 순위가 요청한 장르를 많이 포함하는 순서대로 , ‘한국 역사 소설’ ‘한국 역사’, ‘역사 소설’ 다음 순위는 대여 횟수가 많은, 인기가 많은 순서대로, (대여횟수는 크롤링해서 가져올 수가 없어서 임의의 횟수를 부여해서 우선으로 가져옵니다.) 그리고 마지막으로 대출이 가능한 도서들을 우선으로 하는데 추천을 받는 다는 것이 관심이 있다는 뜻이기 때문에 대출이 가능한 것들을 우선으로 보여주고 있습니다. 예시로

이런식으로 "자양 한강 도서관에 한국 SF 소설 추천해주세요" 라고 요청하면

총 3권 추천해주고 해당하는 장르에 관계된 도서들을 추천해줍니다. 도서정보에 가보면 어디에 위치한지까지 알수 있습니다.

마지막 기능은 문의입니다.

현재 총 6가지 문의에 대해 대응가능합니다.도서관의 자주 묻는 질문들 위주로 구성을 했습니다. 운영시간이나 이용방법 대출 기간이나 분실했을 때 등에 대한 요청에 답변할 수 있습니다.

시스템 구조 상 이때 일단 문의로 분류되었을 때 구체적으로 어떤 종류의 문의인지 파악을 해야하는데

이때 Roberta 계열 sentence_transformer를 통해서 유사도 계산을 통해 가장 비슷한 문장을 찾고 그에 대응되는 답변을 출력하는 방식으로 작동합니다.

예를 들어 운영시간에 대한 문의를 하면 (통합서비스이다 보니 도서관에 따라 이용정책이 조금씩 다를 수 있습니다.) 위치에 대한 특정을 하지 않고 운영 시간에 대해 문의하면 통합된 모든 스마트 도서관에 대해 알려주고 반대로 밑문장 예시같이 이렇게 위치가 특정되면 해당하는 도서관에 대한 정보만 알려주게 해 놓았습니다.

여기까지가 저희가 개발한 챗봇 시스템 이였고 한번 주요 기능들 영상으로 보여드리겠습니다.

(시연 영상)

https://www.youtube.com/watch?v=Q35C48ziSsQ&list=PLml1GH62sPF_YQyHsvy795-JX-T-s817p&ab_channel=%EC%9E%84%EC%A0%95%EB%AF%BC


마지막으로 한계점 및 향후 방향성입니다.첫번쨰로는 현재 검색할 때 n-gram들로 찾는 방식인데 이 경우에는 오타가 포함될 시에는 조금만 틀려도 검색이 불가합니다. 그래서 개체명 인식 모델을 통해 문장안에서 도서명을 추출해서 단어단위의 임베딩을 비교하여 검색하는 기능으로 개선시킬 생각입니다.

두번째로는 이 프로젝트는 실제 공공기관에서 관할하는 스마트 도서관 DB와 연동된다고 가정하고 대출과 반납알림이 가능한 서비스를 만든것인데 저희가 애초에 스마트 도서관 DB접근 권한만 있으면 바로 적용할 수 있게끔 DB 설계를 했기 때문에 차후 시립, 구립도서관과 협업해서 실제 통합 서비스로 구현하는것이 두번째 방향성입니다.

발표는 여기까지이고 궁금하신 사항들 질문해주시면 감사하겠습니다.

profile
https://github.com/min731

0개의 댓글