2024. 12. 31. 16:04ㆍProject Log/학부 졸업프로젝트
방학에도 학기 중과 같이 교수님과 매주 월요일마다 줌으로 팀 프로젝트 면담을 진행한다. 시간을 내어 프로젝트 진행 상황에 대한 피드백을 주시고 괜찮은 기술이나 서비스도 추천해 주셔서 항상 감사한 마음이다.
피드백 내용 정리
음성 대화 기능 개발과 모듈에 대해 다양한 피드백을 주셨다.
- 음성 대화를 누가 시작할 것인가? 소프트웨어가 목소리를 인식해서 먼저 시작할 것인지, 사람이 버튼을 눌러서 시작할 것인지 생각해 보라고 하셨다. 목소리를 인식하는 경우 주인의 목소리를 인식하는 방법을 사용하거나, 특정 시작 단어를 사용할 수 있다.
- 대화 흐름을 어떻게 제어할 것인가? Amazon Lex에 다이얼로그 설계 기능이 있다. Lex와 ChatGPT를 연결하여, 이전 대화 맥락을 저장하고 대화에서 발생하는 다양한 상황들에 대비할 수 있다.
- 사전에 GPT에게 어떤 데이터를 제공할 것인가? 한 달 치 Fitbit 밴드 정보를 준다거나, 식사 정보나 기분 상태 정보를 주는 등 어떤 정보를 제공하면 의미가 있을지 생각해 봐야 한다.
- 모듈의 명확한 기능과 형태가 확립되었는가? 음성을 통한 정보 수집 모듈, 조언 및 개입 모듈을 따로 함수화해서 만들고 네트워크 모듈을 따로 조립해서 쓰는 형식이다.
이제 피드백을 바탕으로 필요한 지식을 조사하고 각 모듈에 대해 명확한 선택을 하려고 한다.
ASR 기술
음성인식(Automatic Speech Recognition, ASR) 기술은 사용자의 음성 명령을 컴퓨터가 이해할 수 있는 언어로 자동 변환하는 기술이다. 삼성의 빅스비, 애플의 시리 등 요즘에는 스마트폰에 ASR 기술이 탑재되어 있다.
Flutter ASR을 검색하면 alan_voice 4.9.0 패키지가 나온다. Automatic Speech Recognition (ASR), Natural Language Understanding (NLU) and Speech Synthesis 기술을 활용한 음성 비서 플러그인이라고 한다.
GPT 모델 사용과 대화 설계를 직접 구현할 예정이라, 음성 비서 플러그인을 통으로 사용할 수는 없다.
그래서 두 번째로 찾아본 것이 Word awake engine인 porcupine이다. 음성 AI를 활용하여 항상 듣고 있는 음성지원 애플리케이션을 구축할 수 있다고 한다. 이미 porcupine과 바인딩할 수 있는 플러터 패키지도 있다.
Github: https://github.com/Picovoice/porcupine
porcupine_flutter 3.0.4: https://pub.dev/packages/porcupine_flutter
Dart API docs: https://pub.dev/documentation/porcupine/latest/
Amazon Lex 다이얼로그 설계
아마존 렉스에 관심이 생긴 것은 어제 교수님이 보여주신 렉스 다이얼로그 설계 예시 때문이다. GPT에 대화 내용을 순차적으로 추가만 하는 것이 아니라 정교한 대화 설계가 가능하다면 훨씬 좋을 것이라고 생각했다. 그래서 GPT와 Rex를 어떻게 연결해서 사용할 수 있을지 찾아야 한다.
먼저 AWS Lex와 ChatGPT 모델을 연동하여 챗봇 모델을 구축한 프로젝트 사례를 찾았다. Lex는 사용자 의도를 기반으로 동작을 제공하고, 사용자 의도를 알 수 없는 경우 ChatGPT 모델을 활용하는 방식을 사용하였다. Lambda로 ChatGPT API를 활용하는 코드도 참고하면 좋을 것 같다.
Github: https://github.com/kyopark2014/interactive-chat-using-Lex-and-ChatGPT
단계1: 사용자는 CloudFront의 도메인으로 Chatbot 웹페이지를 접속을 시도하여, S3에 저장된 HTML, CSS, Javascript를 로드합니다.
단계2: 웹페이지에서 채팅 메시지를 입력합니다. 이때 "/chat"리소스에 POST Method으로 JSON 포맷으로 된 text 메시지를 RESTful 형태로 요청하게 됩니다.
단계3: CloudFront는 API Gateway로 요청을 전송합니다.
단계4: API Gateway는 /chat 리소스에 연결되어 있는 Lambda 함수를 호출합니다.
단계5: Lambda 함수는 Lex V2 API를 이용하여 채팅 메시지를 Lex에 전달합니다.
단계6: Lex는 미리 정의한 의도(intent)가 있는 경우에 해당하는 동작을 수행합니다. 의도를 인식할 수 없는 메시지라면, ChatGPT로 문의하는 요청을 보냅니다.
단계7: ChatGPT에서 답변을 하면, 응답이 이전 단계의 역순으로 전달되어서 사용자에게 전달됩니다.
출처: kyopark2014/interactive-chat-using-Lex-and-ChatGPT 깃허브
AWS 공식 포스팅에 있는 Lex를 활용한 콜센터 그림이다. Lex는 Lambda를 통해 다양한 데이터베이스나 소프트웨어와도 상호작용 하도록 설계할 수 있는 것 같다.
GPT에게 사전 제공할 정보
맨 처음에 러프하게 생각했던 방식은 아래와 같았다. Fitbit 데이터와 만성 질환 정보들을 chatCompletion.create 메서드 내부 파라미터인 messages에, 사전에 append를 해야겠다 정도로 생각하고 있었다.
실제로 API를 통해 받아올 수 있는 데이터 컬럼도 검토할 필요가 있고, 제공할 데이터의 수집 기간도 설정이 필요하다. 명확하게 GPT 모델에게 사전 제공할 user context를 정리해 보려고 한다.
- 노인 기본 정보 (from 회원가입 정보)- 나이, 성별
- 만성질환 정보 (from 국민건강보험공단 API )
국민건강보험공단 API: https://splendid-tuberose-a37.notion.site/7-11c71d4d1c62816582dbe8426a529f69- 가장 최근에 받은 건강검진 내역- 계측검사: 비만 (신장, 체중, 허리둘레, 체질량지수), 시각이상(시력 좌/우), 청각이상(청각 좌/우), 고혈압(혈압 최고/최저), 고혈압(혈압 최고/최저)
- 요검사: 신장질환(요단백)
- 혈액검사: 빈혈(혈색소), 당뇨병(공복혈당), 이상지질혈증(총콜레스테롤, HDL콜레스테롤, 중성지방, LDL콜레스테롤), 만성신장질환(혈청크레아티닌, 신사체구체여과율), 간장질환(AST, ALT, 감마지티피)
- 영상검사: 폐결핵 흉부질환
- 골다공증
- 웨어러블 기기 측정 데이터 (from Fitbit API)
Fitbit API: https://dev.fitbit.com/build/reference/web-api/- 특정 날짜 범위에서의 수면 로그 (챗봇과의 대화 날짜 기준으로 5일 전부터 현재까지의 수면 로그)
* Sleep 카테고리
GET /1.2/user/[user-id]/sleep/date/[startDate]/[endDate].json
- 특정 수면 레벨 (deep / light / rem / wake)에 사용자가 있었던 시간 (초 단위)
- 수면 효율 점수 (efficiency) - 활동량 시계열 데이터 (챗봇과의 대화 당일 활동량 1d)
* Activity Time Series 카테고리
GET /1/user/[user-id]/activities/[resource-path]/date/[date]/[period].json
- 칼로리, 이동 거리, 걸음 수 resource option (calories / distance / steps)
- 시계열 데이터 기간 period option (1d, 7d, 30d, 1w, 1m, 3m, 6m, 1y) - 심박수 데이터 (챗봇과의 대화 날짜 기준으로 5일 전부터 현재까지의 안정 시 심박수 로그)
* Heart Rate Time Series 카테고리
GET /1/user/[user-id]/activities/heart/date/[start-date]/[end-date].json
- 안정시 심박수 (restingHeartRate)
- 특정 날짜 범위에서의 수면 로그 (챗봇과의 대화 날짜 기준으로 5일 전부터 현재까지의 수면 로그)
음성 대화 기능 모듈 설계
음성 대화 기능 구현을 위한 모듈을 설계했다. Lex에 대해서 오늘 처음 알아보았기 때문에, 직접 서비스 / 패키지 / API 를 사용해 보면서 모듈 설계도 수정해야 한다.