#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 벡터DB용 통신 업무 도메인 샘플 데이터 자동 생성 스크립트 생성 목표: 15개 도메인 × 4개 소스 × 5개 = 300개 샘플 """ import json import random from datetime import datetime, timedelta from typing import List, Dict # 도메인 정의 DOMAINS = [ "네트워크 인프라", "기술 개발 및 연구", "고객 서비스", "영업 및 마케팅", "요금 및 청구", "네트워크 운용", "서비스 기획 및 상품 개발", "정보보안", "시스템 운영 및 관리", "가입자 관리", "망 품질 관리", "규제 대응 및 준법", "기업 영업", "로밍 및 국제 업무", "신사업" ] # 문서 유형 DOC_TYPES = { "meeting_minutes": "이전 회의록", "manual": "조직문서", "project_doc": "프로젝트 문서", "operation_doc": "운영문서" } # 도메인별 키워드 및 토픽 DOMAIN_KEYWORDS = { "네트워크 인프라": { "keywords": ["5G", "LTE", "기지국", "광케이블", "RAN", "코어망", "백홀", "전송망"], "topics": ["5G 구축", "기지국 설치", "망 이중화", "광케이블 교체", "커버리지 확대"] }, "기술 개발 및 연구": { "keywords": ["AI", "빅데이터", "IoT", "클라우드", "머신러닝", "NFV", "SDN", "엣지컴퓨팅"], "topics": ["AI 기술 연구", "빅데이터 플랫폼", "IoT 표준화", "클라우드 아키텍처", "기술 PoC"] }, "고객 서비스": { "keywords": ["VoC", "NPS", "고객만족도", "CS", "콜센터", "챗봇", "응대품질", "민원"], "topics": ["VoC 분석", "상담품질 개선", "챗봇 도입", "고객만족도 향상", "민원 처리"] }, "영업 및 마케팅": { "keywords": ["요금제", "프로모션", "ARPU", "가입자", "캠페인", "번들", "마케팅", "유통"], "topics": ["요금제 개편", "프로모션 기획", "가입자 확대", "브랜드 마케팅", "유통채널 관리"] }, "요금 및 청구": { "keywords": ["과금", "청구", "미수금", "정산", "빌링", "ERP", "요금오류", "환불"], "topics": ["청구 시스템 개선", "미수금 관리", "요금 오류 분석", "정산 자동화", "환불 처리"] }, "네트워크 운용": { "keywords": ["장애", "모니터링", "트래픽", "NOC", "복구", "성능", "최적화", "KPI"], "topics": ["장애 대응", "망 모니터링", "트래픽 분석", "성능 최적화", "품질 관리"] }, "서비스 기획 및 상품 개발": { "keywords": ["신규서비스", "부가서비스", "콘텐츠", "OTT", "상품기획", "MVP", "베타테스트"], "topics": ["신규 서비스 기획", "부가서비스 개발", "콘텐츠 제휴", "상품 출시", "베타 테스트"] }, "정보보안": { "keywords": ["보안", "개인정보", "ISMS-P", "DDoS", "침해사고", "취약점", "암호화", "인증"], "topics": ["보안 정책 수립", "개인정보 보호", "침해사고 대응", "취약점 점검", "보안 인증"] }, "시스템 운영 및 관리": { "keywords": ["IDC", "클라우드", "DevOps", "CI/CD", "Kubernetes", "Docker", "모니터링", "백업"], "topics": ["시스템 운영", "클라우드 전환", "DevOps 구축", "인프라 관리", "재해복구"] }, "가입자 관리": { "keywords": ["MNP", "개통", "해지", "명의변경", "USIM", "가입자정보", "번호이동", "CRM"], "topics": ["가입자 정보 관리", "번호이동 처리", "개통 절차", "해지 방지", "USIM 관리"] }, "망 품질 관리": { "keywords": ["QoS", "SLA", "품질측정", "KPI", "성능지표", "커버리지", "통화품질", "데이터속도"], "topics": ["품질 측정", "SLA 관리", "커버리지 개선", "통화품질 향상", "성능 지표 분석"] }, "규제 대응 및 준법": { "keywords": ["전기통신사업법", "규제", "과기정통부", "방통위", "허가", "신고", "컴플라이언스", "법규"], "topics": ["규제 대응", "법규 준수", "허가 신청", "정부 정책", "컴플라이언스"] }, "기업 영업": { "keywords": ["B2B", "전용선", "MPLS", "VPN", "IDC", "클라우드", "AICC", "SIP"], "topics": ["B2B 영업", "전용선 구축", "클라우드 솔루션", "AICC 제안", "데이터센터"] }, "로밍 및 국제 업무": { "keywords": ["로밍", "GSMA", "TADIG", "eSIM", "국제전화", "해외통신사", "정산", "협정"], "topics": ["로밍 서비스", "eSIM 도입", "국제 협력", "TADIG 관리", "로밍 정산"] }, "신사업": { "keywords": ["OTT", "핀테크", "스마트홈", "IoT", "AI", "간편결제", "콘텐츠", "플랫폼"], "topics": ["OTT 플랫폼", "핀테크 서비스", "스마트홈", "IoT 사업", "신규 플랫폼"] } } # 작성자 이름 풀 AUTHORS = [ "김철수", "이영희", "박민수", "정수진", "최영호", "강민지", "윤서연", "장현우", "임지혜", "한동훈", "오세진", "백지영", "신동엽", "권혁진", "송민재", "조윤서" ] def get_random_date(start_date: str = "2024-01-01", end_date: str = "2025-01-22") -> str: """랜덤 날짜 생성""" start = datetime.strptime(start_date, "%Y-%m-%d") end = datetime.strptime(end_date, "%Y-%m-%d") random_date = start + timedelta(days=random.randint(0, (end - start).days)) return random_date.strftime("%Y-%m-%d") def generate_meeting_minutes(domain: str, index: int) -> Dict: """회의록 생성""" keywords = DOMAIN_KEYWORDS[domain]["keywords"] topics = DOMAIN_KEYWORDS[domain]["topics"] topic = random.choice(topics) keyword1 = random.choice(keywords) keyword2 = random.choice([k for k in keywords if k != keyword1]) participants = random.sample(AUTHORS, k=random.randint(3, 5)) content = f"""회의 일시: {get_random_date()} 14:00~16:00 참석자: {', '.join(participants)} 논의 내용: 1. {topic} 현황 분석 - 현재 상황 및 문제점 파악 - {keyword1} 관련 이슈 검토 - {keyword2} 개선 방안 논의 2. 주요 의사결정 사항 - {topic} 추진 방향 결정 - 예산 및 일정 확정 - 담당자 역할 분담 3. 기대 효과 - 서비스 품질 향상 - 운영 효율성 증대 - 고객 만족도 개선 결정 사항: - {topic} 프로젝트 착수 - 월 1회 진행상황 점검 - 다음 회의: 2주 후 액션 아이템: - {participants[0]}: 상세 계획 수립 (D+7) - {participants[1]}: 기술 검토 및 설계 (D+14) - {participants[2]}: 예산 확보 및 승인 (D+10) """ return { "document_id": f"{domain.replace(' ', '_')}_meeting_{index:03d}", "document_type": "meeting_minutes", "title": f"{topic} 회의", "content": content, "metadata": { "domain": domain, "date": get_random_date(), "author": participants[0], "tags": [keyword1, keyword2, topic.split()[0]], "organization_id": "org_telecom_001", "folder_id": f"folder_{domain.replace(' ', '_')}" } } def generate_manual(domain: str, index: int) -> Dict: """매뉴얼/조직문서 생성""" keywords = DOMAIN_KEYWORDS[domain]["keywords"] topics = DOMAIN_KEYWORDS[domain]["topics"] topic = random.choice(topics) keyword1 = random.choice(keywords) keyword2 = random.choice([k for k in keywords if k != keyword1]) content = f"""# {topic} 업무 매뉴얼 ## 1. 목적 본 매뉴얼은 {domain} 분야의 {topic} 업무 수행을 위한 표준 절차를 정의한다. ## 2. 적용 범위 - 대상 부서: {domain} 담당 부서 - 관련 시스템: {keyword1}, {keyword2} 관련 시스템 ## 3. 업무 프로세스 ### 3.1 사전 준비 - 필요 자료 및 도구 준비 - 시스템 접근 권한 확인 - 관련 부서 협조 요청 ### 3.2 주요 업무 수행 1. {keyword1} 관련 작업 - 현황 파악 및 분석 - 계획 수립 및 승인 - 실행 및 모니터링 2. {keyword2} 관련 작업 - 기술 검토 및 설계 - 구현 및 테스트 - 배포 및 운영 ### 3.3 사후 관리 - 결과 보고서 작성 - 성과 평가 및 피드백 - 개선사항 도출 ## 4. 주의 사항 - 보안 정책 준수 - 관련 법규 및 규정 확인 - 정기적인 절차 개선 ## 5. 문의처 - 담당 부서: {domain}팀 - 이메일: {domain.replace(' ', '_').lower()}@telecom.com """ return { "document_id": f"{domain.replace(' ', '_')}_manual_{index:03d}", "document_type": "manual", "title": f"{topic} 업무 매뉴얼", "content": content, "metadata": { "domain": domain, "date": get_random_date(), "author": f"{domain}본부", "tags": [keyword1, keyword2, "매뉴얼", "프로세스"], "organization_id": "org_telecom_001", "folder_id": f"folder_{domain.replace(' ', '_')}" } } def generate_project_doc(domain: str, index: int) -> Dict: """프로젝트 문서 생성""" keywords = DOMAIN_KEYWORDS[domain]["keywords"] topics = DOMAIN_KEYWORDS[domain]["topics"] topic = random.choice(topics) keyword1 = random.choice(keywords) keyword2 = random.choice([k for k in keywords if k != keyword1]) content = f"""# {topic} 프로젝트 계획서 ## 1. 프로젝트 개요 - 프로젝트명: {topic} 구축 프로젝트 - 기간: {get_random_date()} ~ {get_random_date("2025-03-01", "2025-12-31")} - 예산: 약 {random.randint(5, 50)}억원 ## 2. 추진 배경 {domain} 분야에서 {keyword1} 및 {keyword2} 관련 업무의 효율성을 높이고 서비스 품질을 향상시키기 위해 본 프로젝트를 추진한다. ## 3. 주요 목표 - {keyword1} 시스템 구축 및 고도화 - {keyword2} 프로세스 개선 - 운영 효율성 30% 향상 - 고객 만족도 20% 개선 ## 4. 추진 전략 ### 4.1 기술 전략 - {keyword1} 최신 기술 적용 - {keyword2} 표준 준수 - 확장 가능한 아키텍처 설계 ### 4.2 일정 계획 - 1단계 (1~3개월): 요구사항 분석 및 설계 - 2단계 (4~6개월): 개발 및 구축 - 3단계 (7~9개월): 테스트 및 안정화 - 4단계 (10~12개월): 운영 이관 및 교육 ## 5. 기대 효과 - 업무 처리 시간 50% 단축 - 운영 비용 연간 {random.randint(5, 20)}억원 절감 - 서비스 품질 향상 - 시장 경쟁력 강화 ## 6. 리스크 관리 - 기술적 리스크: 신기술 적용에 따른 안정성 검증 - 일정 리스크: 외부 요인에 의한 지연 가능성 - 예산 리스크: 환율 변동 및 추가 요구사항 ## 7. 프로젝트 조직 - PM: {random.choice(AUTHORS)} - 기술팀장: {random.choice(AUTHORS)} - 운영팀장: {random.choice(AUTHORS)} """ return { "document_id": f"{domain.replace(' ', '_')}_project_{index:03d}", "document_type": "project_doc", "title": f"{topic} 프로젝트 계획서", "content": content, "metadata": { "domain": domain, "date": get_random_date(), "author": random.choice(AUTHORS), "tags": [keyword1, keyword2, "프로젝트", topic.split()[0]], "organization_id": "org_telecom_001", "folder_id": f"folder_{domain.replace(' ', '_')}" } } def generate_operation_doc(domain: str, index: int) -> Dict: """운영문서 생성""" keywords = DOMAIN_KEYWORDS[domain]["keywords"] topics = DOMAIN_KEYWORDS[domain]["topics"] topic = random.choice(topics) keyword1 = random.choice(keywords) keyword2 = random.choice([k for k in keywords if k != keyword1]) severity = random.choice(["긴급", "높음", "보통", "낮음"]) content = f"""# {topic} 운영 보고서 ## 1. 보고 개요 - 일시: {get_random_date()} - 작성자: {random.choice(AUTHORS)} - 심각도: {severity} ## 2. 상황 요약 {domain} 분야에서 {keyword1} 관련 {topic} 이슈가 발생하였으며, {keyword2} 시스템에 영향을 미쳤다. ## 3. 상세 내용 ### 3.1 발생 경위 - 발생 시각: {get_random_date()} {random.randint(0, 23):02d}:{random.randint(0, 59):02d} - 감지 방법: 자동 모니터링 시스템 알람 - 영향 범위: {random.choice(['전국', '수도권', '특정 지역', '일부 고객'])} ### 3.2 원인 분석 - 직접 원인: {keyword1} 시스템 {random.choice(['오류', '성능 저하', '장애', '설정 오류'])} - 근본 원인: {keyword2} {random.choice(['업데이트', '설정 변경', '트래픽 급증', '외부 요인'])} ### 3.3 조치 사항 1. 즉시 조치 - {keyword1} 시스템 재시작 - {keyword2} 설정 롤백 - 백업 시스템 전환 2. 후속 조치 - 근본 원인 제거 - 재발 방지 대책 수립 - 관련 프로세스 개선 ## 4. 영향 분석 - 영향 받은 고객 수: 약 {random.randint(100, 10000):,}명 - 서비스 중단 시간: 약 {random.randint(5, 180)}분 - 예상 손실액: 약 {random.randint(100, 5000):,}만원 ## 5. 재발 방지 대책 - 모니터링 강화 - 사전 테스트 절차 보완 - 백업 시스템 이중화 - 운영 매뉴얼 개선 ## 6. 결론 신속한 대응으로 서비스 영향을 최소화하였으며, 재발 방지 대책을 수립하여 향후 유사 이슈 발생을 예방한다. """ return { "document_id": f"{domain.replace(' ', '_')}_operation_{index:03d}", "document_type": "operation_doc", "title": f"{topic} 운영 보고서", "content": content, "metadata": { "domain": domain, "date": get_random_date(), "author": random.choice(AUTHORS), "tags": [keyword1, keyword2, "운영", severity], "organization_id": "org_telecom_001", "folder_id": f"folder_{domain.replace(' ', '_')}" } } def generate_all_samples() -> List[Dict]: """전체 샘플 생성 (15 도메인 × 4 소스 × 5개 = 300개)""" all_samples = [] for domain in DOMAINS: print(f"생성 중: {domain}") # 각 문서 유형별로 5개씩 생성 for i in range(5): all_samples.append(generate_meeting_minutes(domain, i + 1)) all_samples.append(generate_manual(domain, i + 1)) all_samples.append(generate_project_doc(domain, i + 1)) all_samples.append(generate_operation_doc(domain, i + 1)) return all_samples def main(): """메인 실행 함수""" print("=" * 60) print("벡터DB용 통신 업무 샘플 데이터 생성 시작") print(f"목표: 15개 도메인 × 4개 소스 × 5개 = 300개") print("=" * 60) print() # 샘플 생성 samples = generate_all_samples() print() print(f"총 {len(samples)}개 샘플 생성 완료") print() # JSON 파일로 저장 output_file = "data/samples/vector_db_samples_300.json" # 디렉토리 생성 import os os.makedirs(os.path.dirname(output_file), exist_ok=True) with open(output_file, 'w', encoding='utf-8') as f: json.dump(samples, f, ensure_ascii=False, indent=2) print(f"파일 저장 완료: {output_file}") print() # 통계 출력 print("=" * 60) print("생성 통계") print("=" * 60) doc_type_count = {} domain_count = {} for sample in samples: doc_type = sample['document_type'] domain = sample['metadata']['domain'] doc_type_count[doc_type] = doc_type_count.get(doc_type, 0) + 1 domain_count[domain] = domain_count.get(domain, 0) + 1 print("\n문서 유형별:") for doc_type, count in sorted(doc_type_count.items()): print(f" {DOC_TYPES[doc_type]}: {count}개") print("\n도메인별:") for domain, count in sorted(domain_count.items()): print(f" {domain}: {count}개") print("\n" + "=" * 60) print("완료!") print("=" * 60) if __name__ == "__main__": main()