📝 목차
1) 모두의 취향을 고려하고, 2) 각자의 선호도 투표를 반영하여, 3) 같이 먹을 ‘맛집’을 알아서 추천해주는 서비스는 없을까?
'맛 스페이스'에서는 임베딩 벡터 유사도를 기반으로 맛집을 검색합니다.
텍스트로 치지 않아도, 대화만으로 키워드를 감지하여 근처 맛집을 추천해요!
저희 팀원은 1달이라는 짧은 시간 안에 AI 모델을 구축하고 학습시키는 일에 시간을 쏟기 보다는, 새로운 방법으로 내 취향에 맞는 식당을 찾는 방법을 고민했습니다. 이때, Elastic search에서 텍스트를 사전 학습된 모델을 활용하여 Imbedding Vector로 변환하고 Vector Search를 통해 유사한 것을 검색하는 기능이 있다는 것을 알게 되었습니다.
그렇다면, 서울의 맛집들의 리뷰들에서 '취향 키워드'를 자동으로 추출하고 이를 벡터화하여 저장해두었을 때, 입력 텍스트의 임베딩 벡터와 유사한 값(식당)을 찾는다면 어떨까? 라는 생각이 들었습니다. 추천 시스템에서 직관적인 방법이 무조건 더 나은 결과물을 나오게 하는게 아니라는 말을 들었던 기억을 회상하며, 기획을 확정했습니다.
그리고 이런 방법이라면 최대한 좋은 결과물을 끌어내면서 즐겁게 개발할 수 있을 것이란 확신했습니다. 🚀🚀
- 약 7만 개의 서울 시 맛집 데이터와 리뷰 수집 -> 분위기 키워드 추출
- 데이터를 정제한 결과 1만 8천 식당을 대상으로 식당에 해당하는 '키워드'를 벡터화
- 유저의 니즈에 따른 식당 추천
- 분위기와 메뉴를 활용한 식당 데이터 벡터화
- 유클리드 거리 계산을 통해 식당 간의 유사도 측정
- K-NN 알고리즘을 통한 인접한 식당 탐색
- 유저가 말한 문장을
Konlpy로 토큰화 - 수집한 문장으로 벡터 모델 학습
Word2Vec를 활용하여 위 모델을 통해 연관 단어 맵핑
- Mesh방식
WebRTC구현하여 4명 간 화상 통화 Socket.IO를 활용한 실시간 선택 공유
- 문제 : 기존에 존재하는 모델인 FastText를 사용했을 때, 키워드의 연관성이 높지 않고, 그 유사도가 기대하던 수준에 미치지 못함
- 해결 : 식당 리뷰 데이터 수집 후 Word2Vec 를 활용하여 자체 모델 학습으로 연관도 개선
✔️해결1: 각각의 식당벡터의 중간 지점을 유클리드 거리를 통해 구할 수 있었다
✔️해결2: K-최근접 이웃 (K-Nearest Neighbors, KNN) 을 통해 해당하는 중간 지점과 가까운 식당을 찾아 추천할 수 있게 되었다
✔️해결: 일정 시간마다 반응**을 보여주어야 UX에 더 좋은 결과를 얻을 수 있다고 여겨 Frontend에서는 Throttling 방식을 채택하여 버퍼 구현 및 응답 안정화, Backend에서는 Throttler 패키지의 기능을 활용하여 Rate Limiting을 걸어 API 요청 초과 방지
|
마찬옥 (깃허브) - 팀장 - 프론트엔드 - UI / UX 설계 및 구현 - 디자인 및 컨셉 담당 - 미디어 스트리밍 구현(WebRTC) - 실시간 기능 구현 (Socket.io) - 클라이언트 - 서버 API 구현 (Axios) |
|
천지영 (깃허브) - 팀원 - 백엔드 - Python 서버 구축 - 데이터 수집 - 프로그램 메인 로직 구현 |
|
이서연 (깃허브) - 팀원 - 백엔드 - nest js 서버 구축 - Redis 서버 구축 - 데이터 수집 - Python ↔ nest ↔ Front 의 API , Socket의 명세 및 구성 - 배포 |
|
현재훈 (깃허브) - 팀원 - 프론트엔드 - 프론트 fast API 및 socket 관련 명세 및 구성 참여 - 애니메이션 및 effect 담당 (css, tailwind, gsap 등) - git 관련 이슈 해결 및 프론트 git 전략 - 데이터 수집 작업 참여 - 팀 내 이슈 해결에 적극 참여 (언어, 로직 관련) - 제안된 아이디어 구현 (Throttling Buffer) - UX 경험 증감에 기여 |





