Machine learning/Chatbot
[위로봇 프로젝트]. 오복이 육아일기 3일차 - 데이터 추가하기
2022.12.06 - [Chatbot] - [위로봇 프로젝트]. 오복이 육아일기 2일차 - 설계 [위로봇 프로젝트]. 오복이 육아일기 2일차 - 설계 2022.12.06 - [Chatbot] - [위로봇 프로젝트]. 오복이 육아일기 1일차 - 소개 위로봇 오복이의 프로세스는 아주 간단하게 설계되어있습니다. 웹 서버는 Python 언어를 기반으로한 FastAPI를 사용했습니다. acdongpgm.tistory.com 챗봇 사용 데이터 1. 송영숙 님의 챗봇 데이터 https://github.com/songys/Chatbot_data 2. AI-HUB 웰니스 상담 데이터 https://aihub.or.kr/opendata/keti-data/recognition-laguage/KETI-02-006 3. AI..
[위로봇 프로젝트]. 오복이 육아일기 2일차 - 설계
2022.12.06 - [Chatbot] - [위로봇 프로젝트]. 오복이 육아일기 1일차 - 소개 위로봇 오복이의 프로세스는 아주 간단하게 설계되어있습니다. 웹 서버는 Python 언어를 기반으로한 FastAPI를 사용했습니다. 웹 서버와 같은 인스턴스 안에는 엘라스틱서치 검색엔진이 있습니다. 데이터 흐름 시나리오 1. 카카오톡 채널 유저 채팅 카카오톡 채널에 접속한 유저가 채팅을 전송하면 채팅 데이터는 직접 구축한 GCP 서버로 요청을 보냅니다. 2. FastAPI Web Server 웹 서버인 fastapi는 요청을 받아 질문의 텍스트만 파씽하고 질문을 엘라스틱서치 쿼리로 전송합니다. 3. ElasticSearch 검색엔진인 엘라스틱서치는 질문의 텍스트와 가장 비슷한 질문을 검색하고 그 질문에 대한 ..
[위로봇 프로젝트]. 오복이 육아일기 1일차 - 소개
안녕하세요 오늘부터 토이 프로젝트로 카카오톡 채널을 이용한 챗봇을 만들어보기로 했습니다. http://pf.kakao.com/_BNZRb 사실 이미 만들었지만 중간메모를 안 하고 개발하니 정리가 안 되는 부분이 있어서 처음부터 하나하나 기록하면서 다시 개발해보고자 합니다. 카카오톡 오픈빌더를 연동하여 챗봇을 만들고자 하는 분들께 참고가 되면 좋겠습니다. 1. 캐릭터 소개 이름 : 오복이 직업 : 심리상담사 종류? : 물범 "위로봇 오복이"는 인공지능 비서가 아닙니다. 오복이는 내가 한 질문에 대해 위로로 답변해주는 감성 대화 챗봇입니다. 오복이는 정해진 시나리오로 답변하지 않습니다.(직접구현한 API를 통해 답변합니다.) 오복이는 검색시스템을 통해 질문과 가장 유사한 질문을 찾아 그의 해당하는 답변을 해..
[chatbot]. 핑퐁 빌더 API 연동하기
핑퐁API는 스케터랩에서 서비스하고있는 일상대화 챗봇이고 한달에 300건 까지의 호출은 무료로 사용할 수 있다. 그래서 핑퐁 API를 파이썬에 연결하여 테스트해보고자 한다. 카카오톡이나 페이스북에 바로 붙여서 사용할 수도 있다. 회원 가입을 하고 봇을 생성하면 API를 사용할 수 있다. request URL 과 Authorization 인증키가 주어진다. import requests PINGPONG_API_KEY = {발급받은 API_KEY} PINGPONG_URL = {발급받은 URL} def ping_pong_reply(question): url = PINGPONG_URL + "10" #여기 숫자 10은 세션 id (유저구별시 사용) data = {"request": {"query": f"{quest..
[챗봇] faiss로 빠르게 유사도 검색하기(Similarity Search)
Faiss 는 Facebook AI 에서 개발한 유사도 검색 모델이다. 밀집 벡터의 효율적인 유사성 검색 및 클러스터링을 위한 라이브러리입니다. Faiss 는 numpy 나 torch 에서 제공해주는 cosine_similarity 보다 훨씬 빠릅니다. 빠른 이유는 벡터들 간의 연관성까지 포함하여 임베딩 정보를 가지고 있기 때문입니다. 즉, 벡터 길이(n)가 고정되어 있을 경우에는 빠른속도를 기대할 수 있지만 매번 다른 벡터들일 경우엔 매번 벡터간 연관성 계산 + 유사도 계산이 필요하기 때문에 기존 numpy 함수를 사용하는 것이 더 빠릅니다. 즉 faiss 는 길이(n)를 제한하는 대신 미리 벡터끼리의 정보를 계산해두고 그것을 이용하여 빠르게 검색합니다. ( 틀리면 마구마구 지적 부탁드립니다. ) 실습..
[챗봇]. 편집거리 알고리즘을 통한 오타 확인
사람들이 채팅에서 사용하는 채팅체(구어체) 데이터들은 오타 혹은 줄임말등을 많이 사용하게 된다. 그러나 한글의 위대함 때문인지 오탈자를 사용하더라도 문맥에는 크게 지장가지 않는다. 그래서 친분이 있는 경우라면 더욱더 채팅할때 오타를 신경쓰지 않게된다.(나도 마찬가지) 기본적인 띄어쓰기 오류 , 애교가 섞인 말투(의도적) , 신조어 , 줄임말 등등,,, 하지만 인공지능 챗봇을 학습시킬때는 오타가 많을 경우 학습하기 어려운 측면이 있다. 물론 요즘 서브워드 기반인 워드피스 토크나이저를 사용하면 오타를 어느정도 보완하는 측면이 있지만. 오타를 정규화 해주는 게 좋은 성능을 야기할 수 있다. 이번 포스팅에서는 구어체 말뭉치를 가지고 자주 사용되는 오타를 확인해보고자한다. 말뭉치 데이터 AI-hub SNS 데이터..
[챗봇]. BERT 임베딩 벡터를(Embedding Vectors) RDBMS의 저장해야하는 이유
챗봇을 개발하다 보면 정확도보다 속도가 더 중요하다는 생각을 하게 된다. 인공지능과 채팅을 하는데 허무맹랑한 소리를 하는 건 어느 정도 유저가 인용해 줄 수 있지만 인공지능이 답장을 느리게 하는 것은 사실상 하는 이유가 없기 때문이다. 검색 기반 챗봇 - 우리 서비스는 생성모델이 아닌 검색모델을 사용하여 챗봇을 개발하였음 위에서 말했듯이 챗봇은 정확도 보다 속도를 우선시하게 되는 데 그래서 우리는(Bi-Encoder) 방식을 채택하여 빠른 속도를 우선시했다. *Bi-Encoder : 임베딩 값을 미리 구해놓기 때문에 속도가 빠른 장점이 있지만 미리 구한 임베딩 값을 저장할 공간이 필요함. Bi-Encoder로 구현했지만 서버에서 실행을 했더니 임베딩 값(numpy)이 많은 메모리를 점유하고 있었다. (메..
[챗봇]. 대화 텍스트 길이(length)에 대한 패널티(penalty)를 주는 방법
Retrival 기반의 챗봇을 개발하다 보면 정확도(질문의 유사도)를 가지고 유사도가 가장 비슷한 질문을 찾아서 해당하는 답변을 리턴해주는 방식을 많이 사용하곤 한다. (유사도를 구하는 방법은 매우 다양함) 하지만 유사도가 높다고 해서 "좋은 답변"일까? 챗봇의 성능이 아무리 좋다고 하더라도 단답이나 장문의 답을 한다면 좋은 챗봇이 아니라고 생각한다. 챗봇이 아니라 일상 대화에서도 단답형 : Q : 너 밥 먹었어? A : 응.... , 네.... , 예~.... 장답형 : Q : 너 밥 먹었어? A : 밥을 먹었는데 밥은 현미밥이었고 반찬은 내가 좋아하는 ~~ 그런데 밥 먹다가 전화가 와서 전화를 받다가 다시 밥을 먹고~~ 주절주절 이렇게 얘기를 하면 대화가 단절되거나 어떻게 답해야 할지 모를 것이다. ..
[챗봇] 아주 간단한 검색기반 챗봇 만들기(feat.pororo)
전에 공부했던 시퀀스 투 시퀀스(seq2seq)로 구현했던 챗봇은 디코더를 통해 단어를 찾아 이어 붙이는 모델이었다. 하지만 문맥이 매끄럽지 않은 부분이 있었고 아웃풋의 시퀀스 수를 결정하는 것이 부자연스러웠다. 토큰이 나와야 하는 조건이 정확하지 않아 보였고 문제가 생각보다 쉽지 않아 보였음. 그래서 이번엔 간단하게 검색 기반 모델을 사용해보고자 한다. 데이터 셋은 전에 사용했던 일상생활(직장, 연애 , 등등 )에서 사용되는 간단한 질문과 답변으로 구성되어있는 데이터를 사용. 진짜 봇처럼 느껴지는 단호박 답변들이 11823건이 있다 ㅋㅋㅋ.. 내 계획은 이렇다. 1. 일단 질문(Q)들을 전부 임베딩 시킨다. 2. 임베딩 값을 미리 저장한다. 3. 새로 입력한 텍스트를 임베딩 시켜서 가장 비슷한 질문을 ..