[AI]1단계_모델_API_설계 - 100-hours-a-week/12-marong-Wiki GitHub Wiki
1. API 엔드포인트 목록 작성
method | 경로 | 설명 |
---|---|---|
POST | /recommend/place | 유저의 MBTI 기반 장소 추천 |
GET(예정) | /recommend/history | 사용자 장소 추천 히스토리 조회 |
2. API 입/출력 형식 명세서 작성
Request
POST /recommend/place
{
"id": "user123",
"eiScore": 50,
"snScore": 50,
"tfScore": 50,
"jpScore": 50,
"hobbies": ["게임", "운동"],
"likedFoods": ["치킨"],
"dislikedFoods": ["오이"]
}
필드명 | 타입 | 필수여부 | 설명 |
---|---|---|---|
id | string | 필수 | 사용자 고유 ID |
eiScore | int | 필수 | E/I MBTI 점수 (0~100, 5단위) |
snScore | int | 필수 | S/N MBTI 점수 (0~100, 5단위) |
tfScore | int | 필수 | T/F MBTI 점수 (0~100, 5단위) |
jpScore | int | 필수 | J/P MBTI 점수 (0~100, 5단위) |
hobbies | array[string] | 선택 | 사용자 취미 |
likedFoods | array[string] | 선택 | 사용자가 선호하는 음식 |
dislikedFoods | array[string] | 선택 | 사용자가 선호하지 않는 음식 |
Response
200
{
"id": "user123",
"eiScore": 50,
"snScore": 50,
"tfScore": 50,
"jpScore": 50,
"hobbies": ["게임", "운동"],
"likedFoods": ["치킨"],
"dislikedFoods": ["오이"]
}
400
{
"message" : "invalid_request",
"data" : null
}
500
{
"message" : "internal_server_error",
"data" : null
}
3. 서비스 전체 구조 내 역할·연동 관계 설명 작성
- FastAPI 서버 (/recommend/place)
- LLM (snunlp/KR-SBERT-V40K-klueNLI-augSTS) 기반 리뷰 벡터 임베딩
- MBTI 벡터와 식당의 평균 분위기 벡터 간 평균 유사도 계산
- 해당 식당 별점, 거리, 유사도 정규화 및 가중치 적용하여 최종 점수 환산
- 최종 점수의 내림차순으로 정렬 후 상위 10위까지 사용자에게 출력
- 상기 Flow를 '식당', '카페' Query 순서대로 반복
- 추천된 식당, 카페에 대해 최종 응답 반환 (상호명, 주소, 별점, 사용자 위치 기준 식당 및 카페까지 직선 거리)
4. API 호출 예시 및 예시 응답 정리
test를 위해 전부 MBTI 4가지 전부 50으로 설정 후 진행
{
"id": "user123",
"eiScore": 50,
"snScore": 50,
"tfScore": 50,
"jpScore": 50,
"hobbies": ["게임", "운동"],
"likedFoods": ["치킨"],
"dislikedFoods": ["오이"]
}
면식당 분당서현점 등 사용자 추천 점수 기준 상위 5위 식당 추천
실제결과