mirror of
https://github.com/hwanny1128/HGZero.git
synced 2025-12-06 21:56:24 +00:00
- 가파팀 프로토타입 파일 삭제 - 가파팀 유저스토리 삭제 - 실시간 회의록 작성 플로우 설계서 추가 (Mermaid, Markdown) - 백업 및 데이터 디렉토리 추가 - AI 데이터 샘플 생성 도구 추가 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
456 lines
16 KiB
Python
456 lines
16 KiB
Python
#!/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()
|