File size: 2,758 Bytes
a005c19
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import json
from typing import Dict, List, Tuple

def load_config(config_path: str) -> Dict:
    """JSON 설정 파일을 읽어서 딕셔너리로 반환"""
    with open(config_path, 'r', encoding='utf-8') as f:
        return json.load(f)

class PromptManager:
    def __init__(self, config_path: str):
        self.config = load_config(config_path)
        self.sentences, self.index_mapping = self._extract_all_sentences_with_index()
        self.reverse_mapping = self._create_reverse_mapping()
    
    def _extract_all_sentences_with_index(self) -> Tuple[List[str], Dict]:
        """모든 sentence와 인덱스 매핑 추출"""
        sentences = []
        index_mapping = {}
        
        for event_idx, event_config in enumerate(self.config.get('PROMPT_CFG', [])):
            prompts = event_config.get('prompts', {})
            for status in ['normal', 'abnormal']:
                for prompt_idx, prompt in enumerate(prompts.get(status, [])):
                    sentence = prompt.get('sentence', '')
                    sentences.append(sentence)
                    index_mapping[(event_idx, status, prompt_idx)] = sentence
        
        return sentences, index_mapping
    
    def _create_reverse_mapping(self) -> Dict:
        """sentence -> indices 역방향 매핑 생성"""
        reverse_map = {}
        for indices, sent in self.index_mapping.items():
            if sent not in reverse_map:
                reverse_map[sent] = []
            reverse_map[sent].append(indices)
        return reverse_map
    
    def get_sentence_indices(self, sentence: str) -> List[Tuple[int, str, int]]:
        """특정 sentence의 모든 인덱스 위치 반환"""
        return self.reverse_mapping.get(sentence, [])
    
    def get_details_by_sentence(self, sentence: str) -> List[Dict]:
        """sentence로 모든 관련 상세 정보 찾아 반환"""
        indices = self.get_sentence_indices(sentence)
        return [self.get_details_by_index(*idx) for idx in indices]
    
    def get_details_by_index(self, event_idx: int, status: str, prompt_idx: int) -> Dict:
        """인덱스로 상세 정보 찾아 반환"""
        event_config = self.config['PROMPT_CFG'][event_idx]
        prompt = event_config['prompts'][status][prompt_idx]
        
        return {
            'event': event_config['event'],
            'status': status,
            'sentence': prompt['sentence'],
            'top_candidates': event_config['top_candidates'],
            'alert_threshold': event_config['alert_threshold'],
            'event_idx': event_idx,
            'prompt_idx': prompt_idx
        }
    
    def get_all_sentences(self) -> List[str]:
        """모든 sentence 리스트 반환"""
        return self.sentences