persona_create / modules /prompt_templates.py
haepada's picture
Upload 12 files
5581923 verified
"""
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
)