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 []