Spaces:
Sleeping
Sleeping
| 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 [] |