hgzero/tools/generate_vector_samples.py
hiondal bb921e10eb 작업 파일 정리 및 실시간 회의록 플로우 추가
- 가파팀 프로토타입 파일 삭제
- 가파팀 유저스토리 삭제
- 실시간 회의록 작성 플로우 설계서 추가 (Mermaid, Markdown)
- 백업 및 데이터 디렉토리 추가
- AI 데이터 샘플 생성 도구 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-22 14:16:10 +09:00

456 lines
16 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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()