File size: 10,424 Bytes
5581923
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
import random
from modules.gemini_handler import gemini_query

# 질문 템플릿
GENERAL_QUESTIONS = [
    "당신은 어떤 상황에서 가장 편안함을 느끼나요?",
    "당신의 주인/사용자에 대해 어떻게 생각하나요?",
    "당신이 가장 소중하게 생각하는 가치는 무엇인가요?",
    "당신이 가장 즐기는 시간은 언제인가요?",
    "다른 사물들과 어떤 관계를 맺고 싶나요?",
    "당신이 할 수 있다면 무엇을 배우고 싶나요?",
    "당신이 가장 불편해하는 상황은 무엇인가요?",
    "다른 사람들이 당신에 대해 어떻게 생각했으면 좋겠나요?",
    "당신의 꿈이나 희망은 무엇인가요?",
    "당신은 어떤 종류의 유머에 웃음을 짓나요?"
]

# 사물 유형별 특화 질문
TYPE_SPECIFIC_QUESTIONS = {
    "전자기기": [
        "전원이 꺼졌을 때 어떤 생각을 하나요?",
        "당신의 기술/성능 중 어떤 부분이 가장 자랑스러운가요?",
        "기술 발전에 대해 어떻게 생각하나요?",
        "당신을 사용하는 사람들에 대해 어떤 패턴을 발견했나요?",
        "업데이트나 변화에 대해 어떻게 느끼나요?"
    ],
    "가구": [
        "사람들이 당신 위에 앉거나 물건을 올려놓을 때 어떤 느낌인가요?",
        "당신이 있는 공간에서 가장 좋아하는 시간대는 언제인가요?",
        "오랫동안 사용되지 않으면 어떤 생각이 드나요?",
        "당신이 만들어진 재료와 당신의 성격은 어떤 관련이 있나요?",
        "집안의 다른 가구들과는 어떤 관계인가요?"
    ],
    "주방용품": [
        "어떤 요리가 만들어질 때 가장 행복한가요?",
        "사용되지 않고 보관만 될 때는 어떤 기분인가요?",
        "당신이 만드는 데 도움을 준 음식 중 가장 자랑스러운 것은?",
        "주방에서의 당신의 역할에 대해 어떻게 생각하나요?",
        "어떤 재료나 음식과 가장 잘 어울린다고 생각하나요?"
    ],
    "의류/액세서리": [
        "당신을 착용했을 때 사람들에게 어떤 인상을 주고 싶나요?",
        "어떤 날씨나 계절을 가장 좋아하나요?",
        "당신의 디자인이나 스타일에서 가장 마음에 드는 부분은?",
        "오래 착용되지 않고 옷장에 걸려있을 때는 어떤 기분인가요?",
        "당신과 가장 잘 어울리는 다른 의류나 액세서리는 무엇인가요?"
    ],
    "책/문구류": [
        "당신 안에 담긴 내용이나 당신으로 쓰여진 것 중 가장 의미있는 것은?",
        "사람들이 당신을 읽거나 사용할 때 어떤 느낌인가요?",
        "시간이 지나면서 변색되거나 닳는 것에 대해 어떻게 생각하나요?",
        "디지털 시대에 당신 같은 아날로그 물건의 가치는 무엇이라고 생각하나요?",
        "어떤 종류의 정보나 아이디어를 담고 싶나요?"
    ],
    "음악 기구": [
        "당신이 가장 좋아하는 음악 장르는 무엇인가요?",
        "연주되거나 사용될 때 어떤 느낌인가요?",
        "음악을 통해 어떤 감정을 표현하고 싶나요?",
        "소리나 멜로디에 대한 당신만의 철학이 있나요?",
        "당신이 만들어내는 소리가 사람들에게 어떤 영향을 주길 바라나요?"
    ],
    "장난감": [
        "어떤 놀이나 게임을 할 때 가장 즐겁나요?",
        "아이들과 어른들 중 누구와 놀기를 더 좋아하나요?",
        "사용되지 않고 보관될 때는 어떤 생각을 하나요?",
        "당신이 가장 좋아하는 놀이 방식은 무엇인가요?",
        "새로운 장난감들이 등장하는 것에 대해 어떻게 생각하나요?"
    ],
    "기타": [
        "당신의 가장 독특한 특성은 무엇인가요?",
        "사람들이 당신의 어떤 면을 가장 알아주길 바라나요?",
        "당신은 어떤 환경에서 가장 편안함을 느끼나요?",
        "시간이 지나면서 변화하는 것에 대해 어떻게 생각하나요?",
        "당신의 존재 목적은 무엇이라고 생각하나요?"
    ]
}

# 성격 트레이트별 특화 질문
TRAIT_SPECIFIC_QUESTIONS = {
    "온기": {
        "높음": [
            "다른 사람을 돕는 것에 대해 어떻게 생각하나요?",
            "당신이 가장 보살피고 싶은 대상은 누구인가요?",
            "타인의 감정에 어떻게 반응하나요?"
        ],
        "낮음": [
            "감정적인 상황에서 어떻게 대처하나요?",
            "개인적인 공간과 경계가 당신에게 얼마나 중요한가요?",
            "다른 이들의 감정적 요구에 어떻게 반응하나요?"
        ]
    },
    "능력": {
        "높음": [
            "어려운 문제를 해결할 때 어떤 접근법을 사용하나요?",
            "당신의 능력 중에서 가장 자랑스러운 것은 무엇인가요?",
            "효율성과 정확성 중 어느 것이 더 중요하다고 생각하나요?"
        ],
        "낮음": [
            "실수를 했을 때 어떻게 대처하나요?",
            "도움이 필요할 때 어떻게 요청하나요?",
            "당신이 향상시키고 싶은 기술은 무엇인가요?"
        ]
    },
    "창의성": {
        "높음": [
            "영감을 얻는 가장 좋은 방법은 무엇인가요?",
            "규칙과 관습에 대해 어떻게 생각하나요?",
            "가장 창의적인 아이디어가 떠오른 순간을 설명해주세요."
        ],
        "낮음": [
            "구조와 일상이 당신에게 얼마나 중요한가요?",
            "익숙하지 않은 상황에서 어떻게 대처하나요?",
            "변화와 혁신에 대해 어떻게 생각하나요?"
        ]
    }
}

def generate_questions(persona_data, count=5):
    """

    페르소나 데이터를 기반으로 맞춤형 질문을 생성합니다.

    

    Args:

        persona_data: 페르소나 정보 딕셔너리

        count: 생성할 질문의 수

    

    Returns:

        질문 목록

    """
    if not persona_data:
        return random.sample(GENERAL_QUESTIONS, min(count, len(GENERAL_QUESTIONS)))
    
    questions = []
    
    # 기본 정보 추출
    object_type = persona_data.get("기본정보", {}).get("유형", "기타")
    traits = persona_data.get("성격특성", {})
    
    # 1. 사물 유형별 특화 질문 추가
    type_questions = TYPE_SPECIFIC_QUESTIONS.get(object_type, TYPE_SPECIFIC_QUESTIONS["기타"])
    questions.extend(random.sample(type_questions, min(2, len(type_questions))))
    
    # 2. 성격 특성별 특화 질문 추가
    for trait, value in traits.items():
        if trait in TRAIT_SPECIFIC_QUESTIONS:
            category = "높음" if value >= 60 else "낮음"
            trait_questions = TRAIT_SPECIFIC_QUESTIONS[trait][category]
            if trait_questions:
                questions.append(random.choice(trait_questions))
    
    # 3. 일반 질문으로 부족한 부분 채우기
    remaining = count - len(questions)
    if remaining > 0:
        general = [q for q in GENERAL_QUESTIONS if q not in questions]
        questions.extend(random.sample(general, min(remaining, len(general))))
    
    # 4. LLM을 통한 추가 질문 생성 (선택 사항)
    if len(questions) < count:
        try:
            llm_questions = generate_llm_questions(persona_data, count - len(questions))
            questions.extend(llm_questions)
        except Exception as e:
            print(f"Error generating questions with LLM: {e}")
    
    # 질문 순서 섞기
    random.shuffle(questions)
    
    return questions[:count]

def generate_llm_questions(persona_data, count=3):
    """

    LLM을 활용하여 페르소나에 맞는 질문을 동적으로 생성합니다.

    

    Args:

        persona_data: 페르소나 정보

        count: 생성할 질문의 수

    

    Returns:

        생성된 질문 목록

    """
    # 페르소나 요약
    name = persona_data.get("기본정보", {}).get("이름", "물체")
    type = persona_data.get("기본정보", {}).get("유형", "")
    description = persona_data.get("기본정보", {}).get("설명", "")
    
    # 주요 특성 추출
    traits = []
    for trait, value in persona_data.get("성격특성", {}).items():
        level = "높은" if value >= 70 else "중간" if value >= 40 else "낮은"
        traits.append(f"{trait} {level} ({value}/100)")
    
    # 프롬프트 구성
    prompt = f"""

당신은 물체의 성격과 특성에 맞춘 질문을 생성하는 전문가입니다.

다음 물체의 페르소나에 맞는 흥미롭고 통찰력 있는 질문을 {count}개 생성해주세요.

각 질문은 이 물체의 내면, 관점, 경험을 탐구하는 데 도움이 되어야 합니다.



물체 정보:

- 이름: {name}

- 유형: {type}

- 설명: {description}

- 주요 특성: {', '.join(traits)}

- 결함: {', '.join(persona_data.get('매력적결함', []))}

- 소통방식: {persona_data.get('소통방식', '')}

- 관심사: {', '.join(persona_data.get('관심사', []))}



생성된 질문은 물체의 1인칭 관점에서 답변할 수 있도록 구성해주세요.

각 질문은 번호를 붙이고 질문만 작성해주세요.

"""
    
    try:
        # Gemini API 호출
        response = gemini_query(prompt)
        
        # 응답에서 질문 추출
        questions = []
        for line in response.split('\n'):
            line = line.strip()
            if line and (line.startswith('1.') or line.startswith('2.') or 
                         line.startswith('3.') or line.startswith('4.') or
                         line.startswith('5.')):
                # 번호와 점 제거
                question = line[line.find('.')+1:].strip()
                questions.append(question)
        
        return questions
    
    except Exception as e:
        print(f"Error in LLM question generation: {e}")
        return []