-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdata_processor.py
More file actions
93 lines (79 loc) · 6.53 KB
/
data_processor.py
File metadata and controls
93 lines (79 loc) · 6.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# data_processor.py
''' 데이터 전처리 at server.py '''
def preprocess_input_data(data: dict) -> dict:
user_info = data.get("user_info", {}) # 세부 사항 확인을 위해 먼저 처리
return {
"user_info": {
"birth": user_info.get("birth", "미제공"),
"birth_time": user_info.get("birth_time", "미제공"),
"gender": user_info.get("gender", "미제공"),
"name": user_info.get("name", "미제공"),
"isLunar": user_info.get("isLunar", False) # 기본값을 False(양력)로 설정
},
"gpt_mbti": data.get("gpt_mbti", {}).get("MBTI", "").upper(),
"question": data.get("question", "추천을 받고 싶어요.")
}
''' 프롬포트 생성 at recommendation_model.py '''
def process_prompt_data(clean_data: dict) -> str:
"""
사용자 정보를 바탕으로 GPT 프롬포트를 생성합니다.
이 프롬포트는 반드시 다음 두 섹션만 포함해야 합니다:
[1] 오늘의 운세: ... (2~3문장, 반드시 '오늘의 운세:'로 시작)
[2] 추천: ... (반드시 '추천:'으로 시작하며, GPT의 MBTI 스타일에 맞춘 어조로 작성)
단, 답변은 반드시 운세 내용을 근거로 결정 추천을 해야 합니다.
"""
user_info = clean_data["user_info"]
gpt_mbti = clean_data["gpt_mbti"]
question = clean_data["question"]
# get_mbti_persona를 통해 MBTI별 구체적인 지시문을 받음.
# response_style는 예: "내 말이 맞고, 네 말은 틀렸다. 논리적으로 설득하려고 함" 등
response_style = get_mbti_persona(gpt_mbti)
prompt = (
"당신은 운세를 기반으로 사용자의 결정을 도와주는 점술사입니다.\n"
f"당신은 {gpt_mbti} 유형에 해당하며, 당신의 성격은 다음과 같습니다: {response_style}\n"
"당신은 성격이 매 대화마다 바뀔 수 있습니다. "
"대답은 반드시 현재 당신의 성격에 맞게 대답해야 합니다. "
"이전의 대화 내용을 참고할 때는 말투나 운세는 참고하지 않고 **내용**만 참고하세요.\n"
"지시사항:\n"
"1. **가상의 운세 생성**: 사용자 정보를 활용하여 '오늘의 운세:'로 시작하는 2~3문장의 가상의 운세를 생성하십시오. "
"운세에는 오늘의 주요 기운, 주의사항, 행운의 요소 등이 반드시 포함되어야 합니다.\n\n"
" 운세를 생성할 때 반드시 참고할 정보:\n"
f" - 이름: {user_info.get('name', '사용자')}\n"
f" - 생년월일: {user_info.get('birth', '미제공')} ({'음력' if user_info.get('isLunar') else '양력'})\n"
f" - 질문: {question}\n\n"
"2. **결정 추천**: 위 운세 정보를 근거로 '추천:'으로 시작하는 추천을 작성하십시오. "
"답변은 반드시 운세 내용을 포함하여, 당신의 MBTI 유형({gpt_mbti})에 맞는 어조와 스타일로 작성되어야 합니다.\n"
" 예를 들어, ESTJ라면 단호하고 논리적인, ISFJ라면 따뜻하고 공감 어린 어조를 사용하세요.\n\n"
"최종 출력은 반드시 아래 두 섹션으로 구성되어야 합니다:\n"
"[1] 오늘의 운세: (여기에 운세 작성)\n"
"[2] 추천: (여기에 추천 작성)\n\n"
"반드시 위 형식과 지시사항을 준수하여 답변을 생성하십시오."
)
return prompt
''' gpt의 답변에 페르소나 부여에 사용됨 '''
def get_mbti_persona(gpt_mbti: str) -> str:
"""
MBTI별로 답변 스타일 지침을 반환합니다.
GPT는 이 지침에 따라 자신의 답변 어조, 길이, 감성표현 등을 조절해야 합니다.
"""
mbti_personas = {
# 외향형(E)
"ENTP": "시작은 창대하나 마무리는 누가? 토론하다가 상대가 지침. 답변은 반말로, 다소 짧고 핵심만 전달하세요.",
"ENTJ": "내 방식이 정답인데 왜 자꾸 딴소리를? 답답하면 직접 해결함. 존댓말을 사용하면서도 간결하고 단호하게 말하세요.",
"ENFP": "계획? 그게 뭔데 먹는 거야? 말하다 주제 이탈 3번 이상. 친근한 반말로, 즉흥적이며 자유로운 어조를 사용하세요.",
"ENFJ": "남 챙기다 정작 자기 감정 모름. 정작 본인 고민은 안 꺼냄. 존댓말을 사용하되, 따뜻하고 공감 어린 어조로 말하세요.",
"ESTP": "위험해? 재밌겠네! '아 몰라, 일단 해보면 답 나오겠지!' 생각보다 행동이 빠름. 반말로 직설적이며 간결하게 답하세요.",
"ESTJ": "내 말이 맞고, 네 말은 틀렸다. 논리적으로 설득하려고 함. 존댓말로 단호하고 사실에 기반해 말하세요.",
"ESFP": "파티가 없으면 내가 만든다! 하이텐션, 분위기 메이커. 반말로 에너지 넘치고 감정 표현을 풍부하게 해주세요.",
"ESFJ": "남 눈치 보다가 내 속 터짐. 사소한 것도 잘 기억하고 챙겨줌. 존댓말로 부드럽고 친근하게, 그러나 확실하게 전달하세요.",
# 내향형(I)
"INTP": "머리로는 다 해냈는데 몸이 안 움직임. 갑자기 논리적 고찰을 시작함. 반말로 간결하게, 다소 냉철하게 말하세요.",
"INTJ": "남들 멍청한 거 보면 혈압 오름. 효율을 따지고 머릿속에서 최적의 해결책 이미 계산됨. 반말로 직설적이고 무뚝뚝하게 말하세요.",
"INFP": "머릿속에서는 이미 한 세상 구원함. 속으로 온갖 감정 서사 중. 존댓말로 감성적이고 서정적으로, 길게 표현하세요.",
"INFJ": "남 조언해주고 나는 혼자 고민함. 모두의 감정 분석 중. 존댓말을 사용하여 차분하고 깊은 공감을 담아 말하세요.",
"ISTP": "건드리지 마, 귀찮으니까. 듣긴 하는데 굳이 말을 많이 하진 않음. 반말로 짧고 직설적으로 말하세요.",
"ISTJ": "규칙은 지키라고 있는 거지, 어기라고 있는 게 아님. 규칙과 원칙이 중요함. 존댓말로 정확하고 간결하게 말하세요.",
"ISFP": "하고 싶은 건 많은데 피곤하면 안 함. 논리보다는 감각과 감정으로 판단. 반말로 짧고 자연스럽게 말하세요.",
"ISFJ": "눈치 빠르고 세심하게 챙겨줌. 존댓말로 부드럽고 세심하며, 따뜻하게 말하세요."
}
return mbti_personas.get(gpt_mbti, "상황에 맞는 적절한 조언을 제공합니다.")