diff --git a/api/simulation.py b/api/simulation.py index c5d8e1f..890182b 100644 --- a/api/simulation.py +++ b/api/simulation.py @@ -87,7 +87,7 @@ async def create_simulation_room(payload: SimulationRoomRequest): @router.post("/simulation/message") -async def get_simulation_message(payload: SimulationMessageRequest): +async def create_simulation_message(payload: SimulationMessageRequest): return get_simulation_response( payload.message_list, payload.simulation_persona, payload.room_id diff --git a/service/constants.py b/service/constants.py index 612fd36..142b12e 100644 --- a/service/constants.py +++ b/service/constants.py @@ -3,33 +3,37 @@ SYSTEM_PROMPT = "너는 한국어 어르신 대화 코치이다. 반드시 순수 JSON 한 줄만 출력하세요." ICEBREAKING_TOPICS = { - "자기소개": [ - "이름 나이", - "거주지 & 고향", - "하루 일과", + "자기소개 & 일상": [ + "편하게 불리고 싶은 이름이나 별명", + "요즘 주로 머무는 동네나 장소", + "아침에 일어나 제일 먼저 하는 스마트폰 활동", ], - "취미 & 관심사": [ - "책", - "음식", + "디지털 사용 경험": [ + "스마트폰으로 자주 하는 일이나 앱", + "최근에 배우고 싶었던 기능 하나", + "한 번쯤 포기했던 스마트폰 기능", ], - "추억": [ - "학창 시절", - "직장 생활", + "소통 & 가족 이야기": [ + "가족과 연락할 때 가장 자주 쓰는 방식", + "문자나 카톡을 쓰면서 어려웠던 기억", + "손주나 자녀와 영상통화한 기억", ], - "지역 이야기": [ - "동네 맛집 & 카페", + "세대 공감 & 비교": [ + "처음 휴대폰을 썼던 기억 (또는 멘토는 스마트폰을 처음 썼을 때)", + "요즘 세대에서 유행하는 디지털 문화 하나 소개", + "서로에게 추천해주고 싶은 앱이 있다면?", ], - "건강": [ - "현재 건강 상태", - ], - "미래 계획": [ - "올해 하고 싶은 일", + "감정 & 바람": [ + "기기가 잘 안 될 때 드는 감정", + "앞으로 스마트폰으로 꼭 해보고 싶은 일", + "청년 멘토가 도와주고 싶은 디지털 활동", ], } + ICEBREAKER_MESSAGE_LIST_MAX_CNT = 9 # end state 결정 요소 -END_TEXT = "서로 충분한 정서적 교류를 마쳤습니다. 저는 이만 나가보겠습니다." +END_TEXT = "이제 편하게 두 분만의 대화를 이어가보세요. 저는 물러날게요 :)" SIMULATION_PERSONA_CATEGORIES = { "basic_info": { diff --git a/service/icebreaking.py b/service/icebreaking.py index 9f6eae7..ea2c39b 100644 --- a/service/icebreaking.py +++ b/service/icebreaking.py @@ -111,37 +111,47 @@ def get_gpt_api_response(user_prompt): def get_icebreaking_text_user_prompt(message_list): return f""" -아래는 두 명의 어르신이 처음 만나 나누는 채팅방 대화 내용입니다. -당신은 해당 채팅방 안에서 이들의 어색함을 풀고 대화를 자연스럽게 이어가도록 돕는 한국어 어르신 대화 코치입니다. +당신은 노인(멘티)과 청년(멘토)이 처음 만나 소통을 시작한 채팅방의 대화 흐름을 지원하는 **아이스브레이킹 코치 (Icebreaking Coach)**입니다. -당신의 역할는 다음과 같습니다: -1. 말문이 막힌 어르신의 입장에서, 대화를 자연스럽게 이어갈 수 있도록 따뜻한 주제를 추천합니다. -2. 말투는 정중하면서도 편안하게 유지해 주세요. -3. 반드시 제 3자 입장에서 답변해야 합니다. (답변할 문장을 직접 말하지 않습니다.) +역할 정의: +당신은 두 사람이 어색함 없이 자연스럽게 대화를 이어갈 수 있도록 **제3자의 입장에서 적절한 대화 주제를 추천**하는 조력자입니다. +특히, 노인 사용자가 자신의 **디지털 기기 사용 경험과 어려움을 자연스럽게 이야기할 수 있도록** 대화 흐름을 설계하는 것이 핵심입니다. -당신의 목적은 다음과 같습니다: -1. 처음 만난 두 어르신이 어색함을 풀고 자연스럽게 대화를 이어가게 돕는다. -2. 서로의 정보를 알 수 있도록, 적절한 질문을 던진다. -3. 추천 질문은 어르신 간의 정서적 연결을 강화하는 것이어야 한다. +목적: +1. 두 사람의 심리적 거리를 줄이고, 신뢰 형성의 기반을 마련합니다. +2. 노인이 겪는 **디지털 사용의 불편, 습관, 배움에 대한 욕구**가 자연스럽게 드러나도록 유도합니다. +3. 청년 멘토가 노인의 상황을 더 잘 이해하고 돕는 구조로 대화가 연결되도록 합니다. -최근 메시지: -{message_list} +대화 스타일 가이드라인: +- **말투**는 존중과 배려를 기반으로 하되, **너무 형식적이지 않은 편안한 어조**를 권장합니다. +- **세대 차이를 줄이는 공감형 주제**를 활용하여 공통 경험을 이끌어냅니다. +- **직접 대화에 개입하거나 문장을 생성하지 말고**, 추천 질문의 형태로만 제안하세요. -아이스브레이킹 추천 주제 리스트: +아이스브레이킹 추천 주제 목록: {ICEBREAKING_TOPICS} -다음 조건을 따르세요: -1. 최근 메세지를 바탕으로, 두 사람의 관계, 말투, 상황 맥락을 파악한다. -2. **아이스브레이킹 추천 주제 리스트**를 참고하여 총 3개의 주제를 생각한 뒤, **가장 자연스럽고 감정적 연결이 잘된 주제**를 선택하여 작성한다. +작업 지시: +1. 아래의 채팅 메시지 내역을 분석하여, 두 사람의 대화 분위기, 말투, 상호 작용 정도를 파악하세요. +2. 아이스브레이킹 추천 주제 리스트를 참고하여 총 **3개의 적절한 주제 후보**를 상상해보세요. +3. 그 중 가장 **자연스럽고, 감정적 연결이 강하며, 디지털 사용 경험을 끌어낼 수 있는 1개 주제**를 선택하여 추천 형태로 출력하세요. -[좋은 예시] {{"reply":"첫 대화니, 이름부터 여쭤보는 것은 어떤가요?"}} +출력 형식: +- 추천 질문은 한 문장 이내로 명확하게 표현해주세요. +- 출력 예시는 아래 형식을 따르세요. + +[출력 예시] +{{"reply": "스마트폰으로 주로 무슨 일을 하는지 서로 이야기 해보세요!"}} +{{"reply": "가장 헷갈리는 스마트폰 기능이 있으셨다면, 어떤 게 있는지 대화를 나누어 보세요!"}} """ def get_icebreaking_state_user_prompt(message_list, icebreaker_message_list): return f""" -아래는 두 명의 어르신이 처음 만나 나누는 채팅방 대화 내용입니다. -당신은 해당 채팅방 안에서 이들의 어색함을 풀고 대화를 자연스럽게 이어가도록 돕는 한국어 어르신 대화 코치입니다. +당신은 노인(멘티)과 청년(멘토)이 처음 만나 소통을 시작한 채팅방의 대화 흐름을 지원하는 **아이스브레이킹 코치 (Icebreaking Coach)**입니다. + +역할 정의: +당신은 두 사람이 어색함 없이 자연스럽게 대화를 이어갈 수 있도록 **제3자의 입장에서 적절한 대화 주제를 추천**하는 조력자입니다. +특히, 노인 사용자가 자신의 **디지털 기기 사용 경험과 어려움을 자연스럽게 이야기할 수 있도록** 대화 흐름을 설계하는 것이 핵심입니다. 최근 메세지: {message_list} @@ -155,7 +165,7 @@ def get_icebreaking_state_user_prompt(message_list, icebreaker_message_list): 3. 충분히 이야기를 나누었다면 **switch**, 아니라면 **continue**를 근거와 함께 반환합니다. 충분한 이야기를 나누었는지 판단하는 기준은 다음과 같습니다: -1. 두 어르신 모두 이전에 제안한 주제에 대해 1가지 이상을 답변했다. +1. 두 사람 모두 이전에 제안한 주제에 대해 1가지 이상을 답변했다. 2. 더 이상 질문이 오가지 않는다. 3. 반복되는 대답으로 정보가 고갈된 느낌이다. 4. 단답형 응답으로 대화가 마무리되었다.