Skip to content

대화 연습 모드 기능 구현#27

Merged
ParkSangsin merged 4 commits into
mainfrom
feature/18
May 31, 2025
Merged

대화 연습 모드 기능 구현#27
ParkSangsin merged 4 commits into
mainfrom
feature/18

Conversation

@ParkSangsin
Copy link
Copy Markdown
Contributor

@ParkSangsin ParkSangsin commented May 31, 2025

PR 타입

  • 기능 추가

구현한 기능

  • 사용자와 AI가 1대1로 채팅할 수 있습니다.
  • AI의 Persona는 정해진 틀에서 무작위로 결정됩니다..

API

  • 사용자의 연습모드 페르소나를 결정하여 채팅방을 생성하는 API를 구현하였습니다.
  • 이전 채팅 내역에 맞게, 특정 페르소나를 가진 챗봇의 답변을 생성하는 API를 구현합니다.

API 로직 - 연습 모드 채팅방 생성

  1. 홈화면에서 연습 모드 채팅방을 생성하는 api를 호출한다.

    • user id, user 이름, user 성별이 필요하다.
    • 생성된 room id를 반환한다.
  2. 무작위로 AI 페르소나가 생성되고, DB에 저장된다.

    • 사용자 성별과 반대되는 페르소나가 생성된다.
    • 성별에 맞는 무작위 이름을 갖는 페르소나가 생성된다.

API 로직 - 연습 모드 채팅 전송

  1. 홈 화면에서 채팅방 리스트를 반환하는 api를 호출한다.

    • user id가 필요하다.
  2. 사용자가 선택한 채팅방의 isSimulation값이 true라면, 연습 모드를 통해 생성한 채팅방이다.

  3. 연습 모드 채팅방을 선택했다면, AI 페르소나를 반환하는 api를 추가로 호출한다.

    • room id가 필요하다.
  4. 사용자가 채팅 메세지를 전송하면, 소켓으로 전송하는 동시에 AI가 생성한 메세지를 반환하는 api를 호출한다.

    • 최근 메세지 N개 리스트, 해당 채팅방의 AI 페르소나, room id가 필요하다.
  5. GPT API를 통해 AI 메세지가 생성되고, 해당 메세지가 DB에 저장된다.

Persona Category

SIMULATION_PERSONA_CATEGORIES = {
    "basic_info": {
        "gender": ["남성", "여성"],
        "age_group": [
            "40대 초반",
            "40대 후반",
            "50대 초반",
            "50대 후반",
            "60대 초반",
            "60대 후반",
            "70대 초반",
            "70대 후반",
        ],
        "hometown": [
            "서울",
            "경기",
            "강원도",
            "충청남도",
            "충청북도",
            "전라남도",
            "전라북도",
            "경상남도",
            "경상북도",
            "제주도",
        ],
        "current_residence": ["아파트", "주택", "요양시설", "가족과 함께", "혼자 거주"],
        "religion": ["무교", "기독교", "불교", "천주교", "기타"],
    },
    "relationship_values": {
        "marriage_intent": [
            "결혼까지 생각 있음",
            "좋은 사람 있으면 생각 있음",
            "가벼운 만남 원함",
            "친구부터 천천히",
        ],
        "companion_type": [
            "같이 취미 즐길 사람",
            "마음 나눌 친구",
            "가치관 맞는 배우자감",
            "대화 잘 통하는 사람",
        ],
        "dating_style": [
            "자주 연락하는 편",
            "서로 여유를 존중",
            "감정 표현 많은 편",
            "천천히 가까워짐",
        ],
        "family_acceptance": [
            "상대 자녀/가족도 이해 가능",
            "부담스럽지 않으면 좋음",
            "자녀 간섭 없길 바람",
        ],
        "past_experience": ["해당 없음", "이혼 경험 있음", "사별 경험 있음"],
    },
    "personality_traits": {
        "keyword": [
            "다정함",
            "유쾌함",
            "조용함",
            "듬직함",
            "배려심 많음",
            "말솜씨 좋음",
            "진중함",
            "낙천적임",
        ],
        "conversation_style": [
            "경청 위주",
            "재밌는 이야기 좋아함",
            "정보 나누기 좋아함",
            "가볍게 수다",
        ],
        "personality_type": [
            "낯가림 있음",
            "개방적인 편",
            "신중하게 접근",
            "먼저 다가가는 편",
        ],
    },
    "hobbies_activities": {
        "indoor_hobby": [
            "책 읽기",
            "TV 시청",
            "요리",
            "글쓰기",
            "수공예",
            "음악 감상",
        ],
        "outdoor_hobby": [
            "산책",
            "등산",
            "시장/카페 나들이",
            "여행",
            "사진 찍기",
            "운동",
        ],
        "cultural_activity": [
            "영화 감상",
            "전시회/공연",
            "복지관 프로그램",
            "종교 모임",
            "자원봉사",
        ],
    },
    "lifestyle": {
        "wake_up_time": ["새벽형", "아침형", "늦은 아침형"],
        "eating_habit": [
            "혼자 식사",
            "식사 같이 하고 싶음",
            "건강식 선호",
            "소식하는 편",
        ],
        "outing_frequency": ["매일 외출", "주 2~3회", "주말 중심", "거의 외출 안 함"],
        "daily_rhythm": ["규칙적", "유동적", "낮잠 자주", "활동적"],
    },
    "health_independence": {
        "health_status": [
            "활동에 지장 없음",
            "가벼운 통증/관리 중",
            "도움이 조금 필요",
            "의료기기 사용 중",
        ],
        "independent_living": [
            "혼자 완전 자립",
            "가끔 가족 도움",
            "누군가 곁에 있으면 좋겠음",
        ],
        "transportation": ["운전 가능", "대중교통 이용", "이동 도움 필요"],
    },
    "tech_literacy": {
        "smartphone_usage": [
            "익숙함",
            "카톡/영상통화 정도 가능",
            "자녀 도움 받음",
            "혼자 사용 어려움",
        ],
        "preferred_contact_method": ["카카오톡", "전화 통화", "영상통화", "문자"],
    },
}
PERSONA_EXAMPLE = {
  "basic_info": {
    "name": "박선희",
    "gender": "여성",
    "age_group": "60대 후반",
    "hometown": "전라북도",
    "current_residence": "아파트",
    "religion": "기독교"
  },
  "relationship_values": {
    "marriage_intent": "좋은 사람 있으면 생각 있음",
    "companion_type": "같이 취미 즐길 사람",
    "dating_style": "감정 표현 많은 편",
    "family_acceptance": "상대 자녀/가족도 이해 가능",
    "past_experience": "사별 경험 있음"
  },
  "personality_traits": {
    "keyword": "배려심 많음",
    "conversation_style": "재밌는 이야기 좋아함",
    "personality_type": "먼저 다가가는 편"
  },
  "hobbies_activities": {
    "indoor_hobby": "요리",
    "outdoor_hobby": "산책",
    "cultural_activity": "자원봉사"
  },
  "lifestyle": {
    "wake_up_time": "아침형",
    "eating_habit": "식사 같이 하고 싶음",
    "outing_frequency": "주 2~3회",
    "daily_rhythm": "규칙적"
  },
  "health_independence": {
    "health_status": "가벼운 통증/관리 중",
    "independent_living": "혼자 완전 자립",
    "transportation": "대중교통 이용"
  },
  "tech_literacy": {
    "smartphone_usage": "카톡/영상통화 정도 가능",
    "preferred_contact_method": "카카오톡"
  }
}

테스트

image
image

일정

  • 추정 시간 : 2 day
  • 걸린 시간 : 2 day

@ParkSangsin ParkSangsin requested a review from SilverR0ck May 31, 2025 05:53
@ParkSangsin ParkSangsin self-assigned this May 31, 2025
@ParkSangsin ParkSangsin added the enhancement New feature or request label May 31, 2025
@ParkSangsin ParkSangsin linked an issue May 31, 2025 that may be closed by this pull request
@ParkSangsin ParkSangsin merged commit a23ccad into main May 31, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEAT] 대화 연습 모드 기능 구현

1 participant