[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. 서비스 전체 구조 내 역할·연동 관계 설명 작성

  1. FastAPI 서버 (/recommend/place)
  2. LLM (snunlp/KR-SBERT-V40K-klueNLI-augSTS) 기반 리뷰 벡터 임베딩
  3. MBTI 벡터와 식당의 평균 분위기 벡터 간 평균 유사도 계산
  4. 해당 식당 별점, 거리, 유사도 정규화 및 가중치 적용하여 최종 점수 환산
  5. 최종 점수의 내림차순으로 정렬 후 상위 10위까지 사용자에게 출력
  6. 상기 Flow를 '식당', '카페' Query 순서대로 반복
  7. 추천된 식당, 카페에 대해 최종 응답 반환 (상호명, 주소, 별점, 사용자 위치 기준 식당 및 카페까지 직선 거리)

4. API 호출 예시 및 예시 응답 정리

test를 위해 전부 MBTI 4가지 전부 50으로 설정 후 진행

{
  "id": "user123",
    "eiScore": 50,
    "snScore": 50,
    "tfScore": 50,
    "jpScore": 50, 
    "hobbies": ["게임", "운동"],
    "likedFoods": ["치킨"],
    "dislikedFoods": ["오이"]
}

면식당 분당서현점 등 사용자 추천 점수 기준 상위 5위 식당 추천

실제결과