""" Graph Extraction 프롬프트 엔티티(인물/장소)와 관계(사건)를 추출하는 GraphRAG 기반 프롬프트 """ from typing import Optional def get_graph_extraction_prompt( episode_content: str, episode_title: str, full_content: Optional[str] = None, parent_chunk_info: Optional[str] = None, max_length: int = 10000 ) -> str: """ Graph Extraction을 위한 프롬프트 생성 Args: episode_content: 분석할 회차 내용 episode_title: 회차 제목 (예: '1화', '2화') full_content: 원본 웹소설 전체 내용 (참고용) parent_chunk_info: Parent Chunk 정보 (선택사항) max_length: 프롬프트에 포함할 최대 텍스트 길이 Returns: 프롬프트 문자열 """ # 회차 내용 길이 제한 content_preview = episode_content[:max_length] is_truncated = len(episode_content) > max_length truncation_note = "\n(참고: 회차 내용이 길어 일부만 사용되었습니다.)" if is_truncated else "" # 전체 내용 참고용 (선택사항) full_content_preview = "" if full_content: # 전체 내용이 너무 길면 앞부분과 뒷부분 일부만 사용 if len(full_content) > 30000: full_content_preview = full_content[:15000] + "\n... (중간 생략) ...\n" + full_content[-15000:] else: full_content_preview = full_content prompt = f"""다음 웹소설의 {episode_title} 회차에서 엔티티(인물/장소)와 관계(사건)를 추출해주세요. {parent_chunk_info if parent_chunk_info else ""} 원본 웹소설 전체 내용 (참고용): {full_content_preview[:50000] if full_content_preview else "없음"} 분석할 회차 내용 ({episode_title}): {content_preview}{truncation_note} 다음 형식으로 JSON 형식으로만 응답하세요: {{ "entities": {{ "characters": [ {{ "name": "인물 이름", "type": "인물", "description": "인물에 대한 간단한 설명", "role": "이 회차에서의 역할 (예: 주인공, 조연, 악역 등)" }} ], "locations": [ {{ "name": "장소 이름", "type": "장소", "description": "장소에 대한 간단한 설명", "category": "장소 유형 (예: 도시, 건물, 차원 등)" }} ] }}, "relationships": [ {{ "source": "관계의 주체 (인물 이름)", "target": "관계의 대상 (인물 이름 또는 장소 이름)", "type": "관계 유형 (예: 친구, 적, 연인, 거주지, 방문지 등)", "description": "관계에 대한 상세 설명", "event": "이 관계를 형성하거나 변화시킨 사건 (있는 경우)" }} ], "events": [ {{ "name": "사건 이름", "description": "사건에 대한 상세 설명", "participants": ["관련 인물1", "관련 인물2"], "location": "사건이 발생한 장소", "significance": "사건의 중요도 (예: 주요 사건, 부수 사건 등)" }} ] }} 중요 사항: 1. 엔티티는 이 회차에서 실제로 등장하거나 언급된 인물과 장소만 추출하세요. 2. 관계는 이 회차에서 새로 형성되거나 변화한 관계를 중심으로 추출하세요. 3. 사건은 이 회차에서 일어난 구체적인 사건들을 추출하세요. 4. 응답은 오직 JSON 형식만 사용하고, 다른 설명이나 마크다운은 포함하지 마세요. 5. JSON 형식이 올바른지 반드시 확인하세요 (따옴표 이스케이프 등). 6. 배열이 비어있을 경우 빈 배열 []로 표시하세요. 7. 필드 값이 없는 경우 null 대신 빈 문자열 "" 또는 빈 배열 []을 사용하세요.""" return prompt