# 온톨로지 시스템 구축 플랫폼 (Ontology System Construction Platform) ## 플랫폼 개요 이 플랫폼은 **웹 데이터에서 시작하여 구조화된 지식 그래프(Knowledge Graph)를 자동으로 구축하고, 이를 활용해 지능형 응답을 제공하는 end-to-end 시스템**입니다. ### 핵심 목표 ``` Raw Web Data → Structured Ontology → Knowledge Graph → AI Reasoning ``` --- ## 온톨로지(Ontology)란? ### 정의 **온톨로지**: 어떤 영역의 개념(entities), 속성(properties), 관계(relationships)를 형식화(formalize)한 구조 ### 예시 ``` 의학 온톨로지: ├── Entity (개념) │ ├── Disease (질병) │ │ ├── Diabetes │ │ ├── Hypertension │ └── Drug (약) │ ├── Aspirin │ └── Metformin │ ├── Relationships │ ├── treats (약이 질병을 치료함) │ ├── causes (원인 관계) │ └── prevents (예방 관계) │ └── Properties ├── Disease.severity (중증도) ├── Drug.sideEffects (부작용) └── Drug.dosage (용량) Example: Aspirin --treats--> Headache Aspirin --has_sideEffect--> GastricBleeding ``` ### 온톨로지의 가치 - **상호운용성**: 다양한 시스템 간 데이터 교환 가능 - **추론 능력**: 규칙 기반 새로운 지식 도출 - **질의응답**: 구조화된 데이터로 정확한 답변 - **재사용성**: 한번 구축한 온톨로지는 여러 앱에서 사용 --- ## 플랫폼 아키텍처 ``` ┌─────────────────────────────────────────────────────────────┐ │ ONTOLOGY PLATFORM │ ├─────────────────────────────────────────────────────────────┤ │ │ │ [Phase 0-2: Data Collection & Extraction] │ │ ┌────────────────────────────────────────────────────┐ │ │ │ 웹 크롤링 → HTML/텍스트 추출 → 후보 데이터 수집 │ │ │ │ - URL 추출 (Phase 0) │ │ │ │ - Crawl4AI 동적 크롤링 (Phase 1-2) │ │ │ │ - 정적/동적 페이지 모두 지원 │ │ │ └────────────────────────────────────────────────────┘ │ │ ↓ │ │ [Phase 3: Validation & Cleaning] │ │ ┌────────────────────────────────────────────────────┐ │ │ │ 추출 데이터 검증 → 정제 → 온톨로지 변환 │ │ │ │ - OntoCast 가벼운 검증 (Phase 3) │ │ │ │ - 데이터 품질 확인 │ │ │ │ - RDF/트리플 변환 │ │ │ └────────────────────────────────────────────────────┘ │ │ ↓ │ │ [Phase 4: Knowledge Graph Storage] │ │ ┌────────────────────────────────────────────────────┐ │ │ │ 구조화된 데이터 → Neo4j 저장 │ │ │ │ - 벡터 임베딩 (all-MiniLM-L6-v2) │ │ │ │ - 유사도 기반 검색 가능 │ │ │ │ - 대규모 그래프 지원 (10K+ 노드) │ │ │ └────────────────────────────────────────────────────┘ │ │ ↓ │ │ [Phase 5: Graph Intelligence] │ │ ┌────────────────────────────────────────────────────┐ │ │ │ 그래프 분석 및 최적화 │ │ │ │ - 의미적 중복 제거 (Entity Resolution) │ │ │ │ - 부분 그래프 추출 (Subgraph Retrieval) │ │ │ │ - 패턴 분석 (Path Finding, Cycles, Motifs) │ │ │ │ - 중심성/커뮤니티 분석 (Graph Analytics) │ │ │ └────────────────────────────────────────────────────┘ │ │ ↓ │ │ [Phase 6: API & Integration] │ │ ┌────────────────────────────────────────────────────┐ │ │ │ REST API / GraphQL / RAG 파이프라인 제공 │ │ │ │ - /graph/* - 그래프 작업 (10개 엔드포인트) │ │ │ │ - /rag/* - RAG 컨텍스트 추출 │ │ │ │ - /graphql - 유연한 쿼리 │ │ │ └────────────────────────────────────────────────────┘ │ │ ↓ │ │ [Phase 7-8: Future Enhancements] │ │ ┌────────────────────────────────────────────────────┐ │ │ │ - Phase 7: LLM 직접 통합 (스트리밍, 캐싱) │ │ │ │ - Phase 8: 멀티테넌트, 실시간 업데이트 │ │ │ └────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ ``` --- ## Phase별 역할 정리 ### Phase 0-2: 데이터 수집 (Data Collection) **목표**: 웹에서 원본 데이터 추출 | Phase | 기능 | 기술 | |-------|------|------| | **0** | URL 기반 텍스트 추출 | Trafilatura | | **1** | 동적 페이지 크롤링 | Crawl4AI (Playwright) | | **2** | 프로필별 크롤링 전략 | fast_static, dynamic_page | **Input**: `웹 URL` **Output**: `텍스트, HTML, 메타데이터` ``` 예: https://example.com → "Apple is a technology company..." ``` --- ### Phase 3: 데이터 검증 (Validation & Cleaning) **목표**: 추출 데이터의 품질 확보 및 온톨로지 변환 | 작업 | 기술 | 결과 | |------|------|------| | **텍스트 정제** | 정규식, 토큰화 | 깔끔한 텍스트 | | **엔티티 추출** | NER (Named Entity Recognition) | ["Apple", "Tim Cook"] | | **관계 추출** | 경량 NLP | [("Apple", "produces", "iPhone")] | | **검증** | OntoCast, 규칙 기반 | 신뢰도 점수 | **Input**: `추출된 텍스트` **Output**: `RDF 트리플 (Subject-Predicate-Object)` ``` 예: ("Apple Inc.", "produces", "iPhone") ("Apple Inc.", "founded_by", "Steve Jobs") ("iPhone", "has_feature", "Face ID") ``` --- ### Phase 4: 그래프 저장 (Knowledge Graph Storage) **목표**: 온톨로지를 Neo4j 그래프 데이터베이스에 저장 | 작업 | 기술 | 특징 | |------|------|------| | **변환** | RDF → Property Graph | 노드 + 관계 변환 | | **임베딩** | SentenceTransformer | 벡터 유사도 검색 | | **인덱싱** | Neo4j 인덱스 | 빠른 조회 | | **배치 처리** | UNWIND + MERGE | 대량 데이터 효율 처리 | **Input**: `RDF 트리플` **Output**: `Neo4j Knowledge Graph` ``` Neo4j에 저장: (Apple:Company) -[produces]-> (iPhone:Product) (Apple:Company) -[founded_by]-> (Steve_Jobs:Person) (iPhone:Product) -[has_feature]-> (FaceID:Feature) 벡터 저장: Apple → [0.23, -0.45, 0.67, ...] (384차원) iPhone → [0.12, 0.34, -0.56, ...] (384차원) ``` --- ### Phase 5: 그래프 지능화 (Graph Intelligence) **목표**: 저장된 그래프를 분석하여 품질 향상 및 인사이트 도출 #### 5.0: 데이터 정제 (Deduplication & Conversion) - **Entity Resolver**: "Apple Inc." vs "Apple" 같은 중복 감지 - **RDF 변환**: 쿼리 성능을 위해 Property Graph 최적화 ``` Before: Apple, APPLE, Apple Inc., Apple Corporation (4개) After: Apple Inc. (1개) + aliases: [Apple, APPLE, Apple Inc., ...] ``` #### 5.1: 컨텍스트 추출 (Subgraph & Patterns) - **Neighborhood Extraction**: 특정 엔티티 주변 2-hop 이웃 추출 - **Pattern Matching**: 경로, 순환, 구조 패턴 분석 - **데이터 품질 검증**: 순환 의존성, 연결성 분석 ``` Apple의 2-hop 이웃: Apple → produces → iPhone → has_feature → Face ID Apple → founded_by → Steve Jobs Apple → headquarters → Cupertino ``` #### 5.2: 분석 (Analytics) - **중심성 분석**: 가장 중요한 엔티티 식별 - **커뮤니티 감지**: 자동으로 관련 엔티티 그룹화 - **그래프 통계**: 전체 구조 이해 ``` Top entities by importance: 1. Apple (PageRank: 0.95) 2. iPhone (PageRank: 0.87) 3. Steve Jobs (PageRank: 0.82) Communities: - Apple Products (iPhone, iPad, Mac) - Apple People (Tim Cook, Steve Jobs) - Apple Locations (Cupertino, China) ``` --- ### Phase 6: API & 통합 (API & RAG Integration) **목표**: 구축한 온톨로지를 외부에 공개하고 LLM과 연계 #### REST API ```bash # 그래프 조회 GET /api/v1/graph/analytics/influential → 가장 영향력 있는 엔티티들 # 패턴 분석 POST /api/v1/graph/patterns/paths → Apple에서 iPhone까지의 모든 경로 # RAG 컨텍스트 POST /api/v1/rag/context-extraction → "Apple의 제품?"에 필요한 그래프 컨텍스트 ``` #### RAG (Retrieval Augmented Generation) 파이프라인 ``` 사용자 쿼리: "Apple의 제품은?" ↓ 그래프 검색: Apple 엔티티 찾기 ↓ 컨텍스트 추출: Apple 주변 2-hop 이웃 ↓ LLM 프롬프트 구성: You are a helpful assistant. KNOWLEDGE GRAPH CONTEXT: Apple produces: iPhone, iPad, Mac, Apple Watch Apple was founded by Steve Jobs Apple is headquartered in Cupertino Question: Apple의 제품은? ↓ LLM 응답: "Apple의 주요 제품은..." ``` #### GraphQL 지원 ```graphql { entity(id: 1) { label type neighbors(hops: 2) { label relationship } } } ``` **Input**: `REST/GraphQL 쿼리` **Output**: `JSON 응답 + LLM 프롬프트` --- ## 엔드투엔드 워크플로우 ### 시나리오: 기술 회사 온톨로지 구축 #### 1단계: 데이터 수집 ```bash # Phase 0-2 URL 목록 입력: - apple.com - wikipedia.org/wiki/Apple - crunchbase.com/organization/apple ↓ 추출 결과: "Apple is a technology company..." "Founded by Steve Jobs in 1976" "Produces iPhone, iPad, Mac..." ``` #### 2단계: 데이터 검증 및 온톨로지 변환 ```python # Phase 3 Raw Text Input: "Apple produces iPhone and iPad" ↓ 검증 및 추출: Entity 1: Apple (Company) - confidence: 0.95 Entity 2: iPhone (Product) - confidence: 0.92 Relation: produces - confidence: 0.88 ↓ RDF 트리플: (Apple, produces, iPhone) (Apple, produces, iPad) ``` #### 3단계: 그래프 저장 및 벡터화 ``` # Phase 4 Neo4j 저장: CREATE (a:Company {name: "Apple"}) CREATE (p:Product {name: "iPhone"}) CREATE (a)-[:PRODUCES]->(p) SET a.embedding = [0.23, -0.45, ...] SET p.embedding = [0.12, 0.34, ...] ``` #### 4단계: 그래프 지능화 ``` # Phase 5 Quality Check: - 중복 감지: "Apple", "APPLE", "Apple Inc." → 1개로 통합 - 구조 분석: Apple의 2-hop 이웃 = 45개 엔티티 - 중요도: Apple (0.95), iPhone (0.87), iPad (0.85) Communities: - Apple Products: [iPhone, iPad, Mac, Watch] - Apple People: [Tim Cook, Steve Jobs] - Apple Locations: [Cupertino, China Factory] ``` #### 5단계: API 공개 및 LLM 통합 ``` # Phase 6 API 엔드포인트: GET /graph/analytics/influential → Top 20 entities by importance POST /graph/patterns/paths → Apple과 Steve Jobs를 연결하는 모든 경로 POST /rag/query Input: "Apple의 제품은?" Output: { "llm_prompt": "Knowledge Graph...\n\nQuestion: Apple의 제품은?", "context": {nodes: 45, edges: 120}, "relevant_entities": ["iPhone", "iPad", "Mac"] } ↓ LLM Service (외부): Input: llm_prompt Output: "Apple의 주요 제품은 iPhone, iPad, Mac 등입니다..." ``` --- ## 플랫폼이 해결하는 문제 ### 1️⃣ 정보의 구조화 **문제**: 웹에 산재된 정보는 비구조화 상태 **해결**: Phase 0-3으로 자동 구조화 ``` Before: "Apple produces iPhone, iPad, and Mac. Steve Jobs founded it." After: (Apple) -[produces]-> (iPhone) (Apple) -[produces]-> (iPad) (Apple) -[produces]-> (Mac) (Apple) -[founded_by]-> (Steve Jobs) ``` ### 2️⃣ 중복된 정보 **문제**: "Apple", "APPLE Inc.", "Apple Computer"는 같은가? **해결**: Phase 5.0 Entity Resolver로 자동 중복 제거 ``` Before: 100개 Apple 관련 엔티티 After: 1개 Apple + aliases: [APPLE, Apple Inc., ...] ``` ### 3️⃣ 데이터 품질 문제 **문제**: 추출 데이터에 오류, 불완전, 부정확 **해결**: Phase 3 검증 + Phase 5 분석으로 문제 식별 ``` 확인: ✓ 필수 엔티티 모두 포함? ✓ 관계가 논리적으로 타당? ✓ 순환 의존성은 없나? ✓ 신뢰도 점수는 충분한가? ``` ### 4️⃣ 정보 활용의 어려움 **문제**: "Apple의 제품은?" 같은 질문에 자동으로 답하기 어려움 **해결**: Phase 4-6으로 검색 가능한 지식 그래프 구축 + LLM 연계 ``` 자동 답변: Q: "Apple의 제품은?" A: "Apple은 iPhone, iPad, Mac, Watch를 생산합니다" ``` --- ## 플랫폼 사용 시나리오 ### 시나리오 1: 의료 온톨로지 구축 ``` 목표: 의약 정보 자동 추출 및 의사 지원 Phase 0-2: 의료 사이트 크롤링 ✓ FDA.gov, Medline, 의료 뉴스 등 Phase 3: 약물-질병-치료법 추출 ✓ "Aspirin treats Headache" ✓ "Metformin manages Diabetes" Phase 4: Neo4j에 저장 ✓ 약물, 질병, 부작용, 용량 등 관계 Phase 5: 의료 지식 분석 ✓ "이 증상을 일으키는 약물은?" ✓ "안전한 약물 조합은?" Phase 6: 의사용 API GET /api/drug/{drugId}/interactions → 상호작용 정보 즉시 제공 ``` ### 시나리오 2: 기업 경쟁 분석 ``` 목표: 경쟁사 정보 자동 수집 및 분석 Phase 0-2: 뉴스, 재무제표, 공식 사이트 크롤링 ✓ Samsung, Apple, Sony 정보 Phase 3: 제품, 전략, 파트너십 추출 ✓ "Samsung produces OLED displays" ✓ "Apple partners with TSMC" Phase 4: 경쟁 관계 그래프 ✓ 공급망, 기술 경쟁, M&A 관계 Phase 5: 분석 ✓ "Apple과 경쟁하는 기업은?" ✓ "가장 영향력 있는 기업은?" Phase 6: 분석가용 API POST /api/competitor-analysis → 경쟁 지형도 자동 생성 ``` ### 시나리오 3: 학술 지식 그래프 ``` 목표: 과학 논문에서 자동으로 지식 추출 Phase 0-2: arXiv, PubMed 크롤링 ✓ 학술 논문 데이터 Phase 3: 개념, 방법론, 결과 추출 ✓ "BERT improves NLP tasks" ✓ "Transformer uses attention mechanism" Phase 4: 학술 지식 그래프 ✓ 기술, 저자, 논문, 인용 관계 Phase 5: 분석 ✓ "가장 영향력 있는 논문은?" ✓ "이 분야의 선도 연구자는?" Phase 6: 연구자용 API GET /api/research-topics/trending → 최신 연구 방향 추천 ``` --- ## 기술 스택 ### 데이터 수집 - **Trafilatura**: HTML → 텍스트 추출 - **Crawl4AI**: 동적 페이지 크롤링 (Playwright 기반) ### NLP & 추출 - **LightweightExtractor**: 엔티티/관계 추출 - **OntoCast**: 검증 및 온톨로지 변환 ### 그래프 데이터베이스 - **Neo4j**: 그래프 저장 및 쿼리 - **SentenceTransformer**: 벡터 임베딩 ### API & 서빙 - **FastAPI**: REST API 서버 - **GraphQL**: 유연한 쿼리 언어 ### LLM 통합 - **OpenAI/Claude API**: 자연어 생성 - **SSE/WebSocket**: 스트리밍 응답 --- ## 플랫폼 사용 시작하기 ### 1️⃣ 온톨로지 구축 ```bash # Phase 0-2: 데이터 수집 python -m ontology_platform.crawler --url https://example.com # Phase 3: 검증 및 변환 python -m ontology_platform.validator --input extracted_data.json # Phase 4: 그래프 저장 python -m ontology_platform.graph_builder --triples ontology.rdf ``` ### 2️⃣ 그래프 분석 ```bash # Phase 5: 품질 분석 python -m ontology_platform.analyzer --graph_id my_ontology # 결과: 중복 제거, 커뮤니티 감지, 통계 ``` ### 3️⃣ API 서빙 ```bash # Phase 6: API 시작 python -m uvicorn ontology_platform.api.phase6_app:app --reload # http://localhost:8000/docs에서 확인 ``` ### 4️⃣ LLM 통합 ```python # Phase 6+: RAG 쿼리 response = requests.post( "http://localhost:8000/api/v1/rag/query", json={"query": "Apple의 제품은?"} ) # LLM으로 프롬프트 전달 llm_answer = call_llm(response["llm_prompt"]) print(llm_answer) ``` --- ## 성능 특성 | 작업 | 규모 | 시간 | |------|------|------| | 웹 크롤링 | 1 URL | 5-30초 | | 데이터 검증 | 1000 후보 | < 2초 | | 벡터 임베딩 | 10K 엔티티 | 4초 | | 배치 저장 | 100K 노드/에지 | 28초 | | 2-hop 쿼리 | 10K 노드 | < 200ms | | 경로 찾기 | max_length=5 | < 300ms | | 중심성 계산 | top_n=100 | < 600ms | --- ## 결론 이 **온톨로지 시스템 구축 플랫폼**은: ✅ **자동화**: 웹 데이터 → 구조화된 지식 자동 변환 ✅ **확장성**: 10K+ 노드 대규모 그래프 지원 ✅ **지능화**: 중복 제거, 패턴 분석, 중심성 계산 ✅ **통합성**: REST API, GraphQL, LLM 연계 ✅ **실용성**: 실제 비즈니스 문제 해결 가능 ### 다음 단계 - **Phase 7**: LLM 스트리밍 + 캐싱 - **Phase 8**: 멀티테넌트 + 실시간 업데이트 - **Production**: Docker/Kubernetes 배포 --- **플랫폼 버전**: 0.6.0 **상태**: Phase 0-6 완료, Phase 7-8 계획 **마지막 업데이트**: 2026-05-14