persona_create / modules /question_generator.py
haepada's picture
Upload 12 files
5581923 verified
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 []