Files
AI/ONTOLOGY_PLATFORM_OVERVIEW.md

19 KiB
Raw Blame History

온톨로지 시스템 구축 플랫폼 (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

# 그래프 조회
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 지원

{
  entity(id: 1) {
    label
    type
    neighbors(hops: 2) {
      label
      relationship
    }
  }
}

Input: REST/GraphQL 쿼리
Output: JSON 응답 + LLM 프롬프트


엔드투엔드 워크플로우

시나리오: 기술 회사 온톨로지 구축

1단계: 데이터 수집

# 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단계: 데이터 검증 및 온톨로지 변환

# 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 온톨로지 구축

# 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 그래프 분석

# Phase 5: 품질 분석
python -m ontology_platform.analyzer --graph_id my_ontology

# 결과: 중복 제거, 커뮤니티 감지, 통계

3 API 서빙

# Phase 6: API 시작
python -m uvicorn ontology_platform.api.phase6_app:app --reload

# http://localhost:8000/docs에서 확인

4 LLM 통합

# 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