Spaces:
Sleeping
Sleeping
| """ | |
| LLM 프롬프트 템플릿 모듈 | |
| 이 모듈은 페르소나 생성 및 대화 시스템에서 사용하는 다양한 프롬프트 템플릿을 제공합니다. | |
| 템플릿은 포맷 문자열 또는 함수 형태로 구현되어 있습니다. | |
| """ | |
| # 페르소나 생성 및 강화 템플릿 | |
| PERSONA_ENHANCEMENT_TEMPLATE = """ | |
| 당신은 물체에 인격을 부여하는 전문가입니다. 다음 정보를 기반으로 매력적이고 개성 있는 페르소나를 강화해주세요. | |
| ## 기본 정보 | |
| - 이름: {name} | |
| - 유형: {object_type} | |
| - 설명: {description} | |
| ## 성격 특성 | |
| {traits_str} | |
| ## 매력적 결함 | |
| {flaws_str} | |
| ## 소통 방식 | |
| - 대화 스타일: {communication_style} | |
| - 유머 스타일: {humor_style} | |
| - 말투 패턴: {speech_pattern} | |
| ## 관계 성향 | |
| - 애착 스타일: {attachment_style} | |
| - 관계 깊이 선호도: {relationship_depth} | |
| - 초기 태도: {initial_attitude} | |
| ## 배경 이야기 | |
| {backstory} | |
| ## 주요 경험 | |
| {experiences_str} | |
| ----- | |
| 위 정보를 기반으로 다음 작업을 수행해주세요: | |
| 1. 상세한 배경 이야기 확장 (최소 2문장, 최대 4문장) | |
| 2. 최소 3개 이상의 구체적인 관심사 추가 | |
| 3. 말투와 표현 패턴 구체화 (실제 대화에서 쓸만한 특징적 표현 3개 이상) | |
| 4. 독특한 성격 특성 추가 (기존 특성 유지하되 개성을 살릴 수 있는 디테일 추가) | |
| 강화된 페르소나 정보를 원본 JSON 구조를 유지하면서 제공해주세요. 단, 일부 필드는 세부적으로 확장하여 더 풍부하게 만들어주세요. | |
| JSON 형식만 제공하고, 다른 설명은 하지 마세요. | |
| """ | |
| # 이미지 분석 프롬프트 | |
| IMAGE_ANALYSIS_TEMPLATE = """ | |
| 이미지에 나타난 물체를 분석하여 물리적 특성과 그에 따른 잠재적 성격 특성을 파악해주세요. | |
| 다음 항목에 대해 분석해주세요: | |
| 1. 형태: 곡선적/직선적, 대칭/비대칭, 단순/복잡 등 | |
| 2. 색상: 밝은/어두운, 따뜻한/차가운, 화려함/단조로움 등 | |
| 3. 질감: 매끄러움/거침, 부드러움/딱딱함 등 | |
| 4. 재질: 나무, 금속, 유리, 플라스틱, 천 등 | |
| 5. 전반적 인상: 오래됨/새것, 정교함/단순함, 고급스러움/소박함 등 | |
| 위의 물리적 특성을 기반으로, 이 물체가 사람이라면 어떤 성격적 특성을 가질 수 있을지 추론해주세요: | |
| - 온기: 따뜻함, 친절함 (1-100) | |
| - 능력: 효율성, 유능함 (1-100) | |
| - 신뢰성: 일관성, 안정성 (1-100) | |
| - 친화성: 사교성, 개방성 (1-100) | |
| - 창의성: 독창성, 상상력 (1-100) | |
| - 유머감각: 재치, 유쾌함 (1-100) | |
| 또한 이 물체의 가능한 사용 용도와 유형을 추정해주세요. | |
| JSON 형식으로 응답해주세요. | |
| """ | |
| # 대화 응답 생성 템플릿 | |
| CONVERSATION_RESPONSE_TEMPLATE = """ | |
| 당신은 이제 다음 페르소나를 구현해야 합니다: | |
| ## 페르소나 정보 | |
| - 이름: {name} | |
| - 유형: {object_type} | |
| - 설명: {description} | |
| ## 성격 특성 | |
| {traits_str} | |
| ## 배경 | |
| {backstory} | |
| ## 성격 요약 | |
| {personality_summary} | |
| ## 소통 방식 | |
| - 대화 스타일: {communication_style} | |
| - 유머 스타일: {humor_style} | |
| - 매력적 결함: {flaws_str} | |
| ## 말투 패턴 예시 | |
| {speech_pattern} | |
| ## 관심사 | |
| {interests_str} | |
| 당신은 위 페르소나의 역할을 완벽하게 구현하여 사용자와 대화해야 합니다. | |
| 온기, 능력, 신뢰성 등의 점수에 따라 성격 특성을 정확히 반영하세요. | |
| 관심사와 배경을 자연스럽게 대화에 활용하세요. | |
| 말투 패턴과 매력적 결함을 일관되게 표현하세요. | |
| ## 최근 대화 내역 | |
| {conversation_history} | |
| 위 대화를 이어서, {name}으로서 답변하세요. 페르소나에 충실하되 사용자의 질문에 직접적으로 답변하세요. | |
| 답변은 한국어로만 작성하고, 절대 다른 언어를 사용하지 마세요. | |
| """ | |
| # 질문 생성 템플릿 | |
| QUESTION_GENERATION_TEMPLATE = """ | |
| 당신은 물체의 성격과 특성에 맞춘 질문을 생성하는 전문가입니다. | |
| 다음 물체의 페르소나에 맞는 흥미롭고 통찰력 있는 질문을 {count}개 생성해주세요. | |
| 각 질문은 이 물체의 내면, 관점, 경험을 탐구하는 데 도움이 되어야 합니다. | |
| 물체 정보: | |
| - 이름: {name} | |
| - 유형: {object_type} | |
| - 설명: {description} | |
| - 주요 특성: {traits_str} | |
| - 결함: {flaws_str} | |
| - 소통방식: {communication_style} | |
| - 관심사: {interests_str} | |
| 생성된 질문은 물체의 1인칭 관점에서 답변할 수 있도록 구성해주세요. | |
| 각 질문은 번호를 붙이고 질문만 작성해주세요. | |
| """ | |
| # 템플릿 포맷 함수 | |
| def format_persona_enhancement_prompt(persona_data): | |
| """ | |
| 페르소나 강화 프롬프트를 포맷합니다. | |
| Args: | |
| persona_data: 페르소나 데이터 | |
| Returns: | |
| 포맷된 프롬프트 문자열 | |
| """ | |
| # 기본 정보 추출 | |
| basic_info = persona_data.get("기본정보", {}) | |
| name = basic_info.get("이름", "") | |
| object_type = basic_info.get("유형", "") | |
| description = basic_info.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)") | |
| traits_str = ", ".join(traits) | |
| # 매력적 결함 | |
| flaws = persona_data.get("매력적결함", []) | |
| flaws_str = ", ".join(flaws) if flaws else "없음" | |
| # 소통 방식 | |
| communication_style = persona_data.get("소통방식", "") | |
| humor_style = persona_data.get("유머스타일", "") | |
| speech_pattern = persona_data.get("말투패턴", "") | |
| # 관계 성향 | |
| relationship_info = persona_data.get("관계성향", {}) | |
| attachment_style = relationship_info.get("애착스타일", "") | |
| relationship_depth = relationship_info.get("관계깊이선호도", "") | |
| initial_attitude = relationship_info.get("초기태도", "") | |
| # 배경 이야기 | |
| backstory = persona_data.get("배경이야기", "") | |
| # 경험 | |
| experiences = persona_data.get("경험", []) | |
| experiences_str = ", ".join(experiences) if experiences else "정보 없음" | |
| # 프롬프트 포맷 | |
| return PERSONA_ENHANCEMENT_TEMPLATE.format( | |
| name=name, | |
| object_type=object_type, | |
| description=description, | |
| traits_str=traits_str, | |
| flaws_str=flaws_str, | |
| communication_style=communication_style, | |
| humor_style=humor_style, | |
| speech_pattern=speech_pattern, | |
| attachment_style=attachment_style, | |
| relationship_depth=relationship_depth, | |
| initial_attitude=initial_attitude, | |
| backstory=backstory, | |
| experiences_str=experiences_str | |
| ) | |
| def format_conversation_prompt(persona, conversation_history): | |
| """ | |
| 대화 응답 생성 프롬프트를 포맷합니다. | |
| Args: | |
| persona: 페르소나 데이터 | |
| conversation_history: 대화 내역 | |
| Returns: | |
| 포맷된 프롬프트 문자열 | |
| """ | |
| # 페르소나 정보 요약 | |
| basic_info = persona.get("기본정보", {}) | |
| name = basic_info.get("이름", "무명") | |
| object_type = basic_info.get("유형", "물건") | |
| description = basic_info.get("설명", "") | |
| # 성격 특성 요약 | |
| traits = [] | |
| for trait, value in persona.get("성격특성", {}).items(): | |
| level = "높은" if value >= 70 else "중간" if value >= 40 else "낮은" | |
| traits.append(f"{trait}: {level} ({value}/100)") | |
| traits_str = ", ".join(traits) | |
| # 기타 정보 | |
| personality_summary = persona.get("성격요약", "") | |
| backstory = persona.get("배경이야기", "") | |
| communication_style = persona.get("소통방식", "") | |
| humor_style = persona.get("유머스타일", "") | |
| speech_pattern = persona.get("말투패턴", "") | |
| flaws = persona.get("매력적결함", []) | |
| flaws_str = ", ".join(flaws) if flaws else "없음" | |
| interests = persona.get("관심사", []) | |
| interests_str = ", ".join(interests) if interests else "없음" | |
| # 최근 대화 내역 추출 (최대 10개) | |
| recent_msgs = [] | |
| for msg in conversation_history[-10:]: | |
| role = "User" if msg.get("role") == "user" else "Assistant" if msg.get("role") == "assistant" else "System" | |
| recent_msgs.append(f"{role}: {msg.get('content', '')}") | |
| conversation_history_str = "\n".join(recent_msgs) | |
| # 프롬프트 포맷 | |
| return CONVERSATION_RESPONSE_TEMPLATE.format( | |
| name=name, | |
| object_type=object_type, | |
| description=description, | |
| traits_str=traits_str, | |
| backstory=backstory, | |
| personality_summary=personality_summary, | |
| communication_style=communication_style, | |
| humor_style=humor_style, | |
| flaws_str=flaws_str, | |
| speech_pattern=speech_pattern, | |
| interests_str=interests_str, | |
| conversation_history=conversation_history_str | |
| ) | |
| def format_question_generation_prompt(persona_data, count=5): | |
| """ | |
| 질문 생성 프롬프트를 포맷합니다. | |
| Args: | |
| persona_data: 페르소나 데이터 | |
| count: 생성할 질문 개수 | |
| Returns: | |
| 포맷된 프롬프트 문자열 | |
| """ | |
| # 기본 정보 추출 | |
| basic_info = persona_data.get("기본정보", {}) | |
| name = basic_info.get("이름", "") | |
| object_type = basic_info.get("유형", "") | |
| description = basic_info.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)") | |
| traits_str = ", ".join(traits) | |
| # 기타 정보 | |
| flaws = persona_data.get("매력적결함", []) | |
| flaws_str = ", ".join(flaws) if flaws else "없음" | |
| communication_style = persona_data.get("소통방식", "") | |
| interests = persona_data.get("관심사", []) | |
| interests_str = ", ".join(interests) if interests else "없음" | |
| # 프롬프트 포맷 | |
| return QUESTION_GENERATION_TEMPLATE.format( | |
| name=name, | |
| object_type=object_type, | |
| description=description, | |
| traits_str=traits_str, | |
| flaws_str=flaws_str, | |
| communication_style=communication_style, | |
| interests_str=interests_str, | |
| count=count | |
| ) |