Week 1. 온톨로지 공학 입문
지식 표현의 역사, 상부 온톨로지, 도메인 온톨로지 설계
학습 목표
이 튜토리얼을 완료하면 다음을 할 수 있습니다:
- 지식 표현(Knowledge Representation) 의 역사와 필요성 이해
- 상부 온톨로지(Upper Ontology) 와 도메인 온톨로지의 관계 파악
- 도메인 특화 온톨로지 설계 방법론 습득
- Python 코드로 간단한 온톨로지 모델링
핵심 개념
1. 지식 표현이란?
지식 표현(Knowledge Representation, KR)은 인간의 지식을 컴퓨터가 처리할 수 있는 형태로 표현하는 분야입니다.
1960년대: 시맨틱 네트워크
1970년대: 프레임 이론 (Minsky)
1980년대: 전문가 시스템
1990년대: 기술 논리 (Description Logic)
2000년대: 시맨틱 웹 (RDF, OWL)
2020년대: LLM + 지식 그래프왜 지식 그래프인가?
"파일 캐비닛" vs "탐정의 마인드맵"
복잡한 금융 사기 사건을 조사한다고 상상해보세요.
- 관계형 데이터베이스(SQL) 는 잘 정리된 파일 캐비닛과 같습니다. "사용자", "거래", "장소" 폴더가 따로 있죠. 연결 고리(예: "사용자 A와 B가 같은 장소에서 거래했는가?")를 찾으려면 여러 폴더를 꺼내 종이를 대조해야 합니다. 데이터베이스 용어로는 "JOIN" 연산입니다. 너무 많이 하면 방이 종이로 가득 차서(일명 "조인 폭탄"), 조사가 마비됩니다.
- 지식 그래프는 벽에 붙은 탐정의 마인드맵과 같습니다. 사람과 장소 사진이 붙어 있고, 붉은 실이 그들을 물리적으로 연결합니다. 연결을 찾으려면 실을 따라가기만 하면 됩니다. 폴더를 뒤적거릴 필요가 없죠.
이 차이는 SQL이 거래 기록에 뛰어난 반면, 그래프는 맥락과 연결을 이해하는 데 훨씬 우수함을 의미합니다.
| 접근 방식 | 장점 | 단점 |
|---|---|---|
| 관계형 DB | 성숙한 기술, ACID | 스키마 유연성 부족 |
| 문서 DB | 유연한 스키마 | 관계 표현 어려움 |
| 벡터 DB | 시맨틱 검색 | 블랙박스 |
| 지식 그래프 | 관계 + 추론 | 구축 복잡성 |
2. 온톨로지 구조
상부 온톨로지 (Upper Ontology)
모든 도메인에 적용 가능한 추상적 온톨로지입니다.
"레고(LEGO) 표준 규격" 비유
친구 10명과 거대한 레고 도시를 짓는다고 상상해보세요.
- 각자 자신만의 블록을 정의한다면(누군가는 2x4 블록을 "벽돌"이라 부르고, 다른 누군가는 "직육면체"라 부른다면), 함께 조립할 수 없습니다. 아무것도 맞지 않죠.
- 상부 온톨로지는 레고 표준 규격 정의서입니다. 모두가 동의하는 상위 수준의 보편적 개념("객체", "사건", "프로세스", "시간" 등)을 정의합니다.
자신의 도메인 온톨로지를 이 표준("상부 온톨로지")에 맞춤으로써, 나중에 다른 사람의 데이터와 연결할 수 있게 됩니다. 지식의 '범용 어댑터' 역할을 하는 셈이죠.
Thing
├── Entity
│ ├── Physical
│ │ ├── Object
│ │ └── Process
│ └── Abstract
│ ├── Concept
│ └── Relation
└── Property
├── Attribute
└── Relation대표적인 상부 온톨로지:
- SUMO (Suggested Upper Merged Ontology)
- DOLCE (Descriptive Ontology for Linguistic and Cognitive Engineering)
- BFO (Basic Formal Ontology)
도메인 온톨로지
특정 도메인에 특화된 온톨로지입니다.
# 영화 도메인 온톨로지 예시
class Movie:
title: str
release_date: date
genre: List[Genre]
class Person:
name: str
birth_date: date
class Director(Person):
directed: List[Movie]
class Actor(Person):
acted_in: List[Movie]
# 관계
# Director --directed--> Movie
# Actor --acted_in--> Movie
# Movie --has_genre--> Genre3. 온톨로지 설계 원칙
Step 1: 범위 정의
역량 질문(Competency Questions) 정의:
- "영화 X를 감독한 사람은 누구인가?"
- "배우 Y가 출연한 영화는 무엇인가?"
- "2024년에 개봉한 영화는 무엇인가?"
Step 2: 개념 식별
명사 추출: 영화, 감독, 배우, 장르, 시상식...
Step 3: 계층 정의
Entity
├── Person
│ ├── Director
│ ├── Actor
│ └── Producer
├── CreativeWork
│ ├── Movie
│ └── TVShow
└── Organization
└── StudioStep 4: 속성 정의
title(Movie → String)directed(Director → Movie)release_date(Movie → Date)
Step 5: 제약조건 추가
- 영화는 최소 한 명의 감독이 있어야 함
- 개봉일은 유효한 날짜여야 함
- 장르는 정해진 목록에서 선택
실습 코드
Python으로 영화 온톨로지 모델링
from dataclasses import dataclass
from typing import List, Optional
from datetime import date
@dataclass
class Genre:
name: str
description: str
@dataclass
class Person:
name: str
birth_date: Optional[date] = None
@dataclass
class Movie:
title: str
release_date: date
genres: List[Genre]
directors: List[Person]
actors: List[Person]
runtime_minutes: int
# 인스턴스 생성
nolan = Person(name="Christopher Nolan", birth_date=date(1970, 7, 30))
inception = Movie(
title="Inception",
release_date=date(2010, 7, 16),
genres=[Genre("Sci-Fi", "Science Fiction")],
directors=[nolan],
actors=[Person("Leonardo DiCaprio")],
runtime_minutes=148
)체크리스트
| 단계 | 체크 항목 |
|---|---|
| 개념 이해 | ☐ 지식 표현의 역사 이해 |
| ☐ 상부 온톨로지 vs 도메인 온톨로지 구분 | |
| 설계 | ☐ 역량 질문 정의 |
| ☐ 개념 및 계층 식별 | |
| ☐ 속성 및 관계 정의 | |
| 구현 | ☐ Python 클래스로 모델링 |
면접 질문 맛보기
Q: 온톨로지와 스키마의 차이점은?
- 스키마: 데이터 구조 정의 (테이블, 컬럼)
- 온톨로지: 개념의 의미와 관계 정의 (시맨틱)
예시: 영화 테이블 스키마는 단순히 컬럼을 정의하지만, 온톨로지는 "감독은 Person의 일종이며, Movie와 'directed' 관계를 갖는다"를 표현합니다.
더 많은 면접 질문은 Premium Interviews (opens in a new tab)에서 확인하세요.
🎬 프로젝트: 영화 추천 지식그래프
이 과정에서는 9주에 걸쳐 영화 추천 지식그래프를 완성합니다. 매주 배운 개념을 프로젝트에 적용하며 실력을 쌓아갑니다.
프로젝트 개요
| Week | 주제 | 프로젝트 마일스톤 |
|---|---|---|
| 1 | 온톨로지 입문 | 영화 도메인 설계 |
| 2 | RDF & RDFS | 영화 데이터를 트리플로 표현 |
| 3 | OWL & 추론 | 추론 규칙으로 숨은 관계 발견 |
| 4 | 지식 추출 | 위키피디아에서 영화 정보 수집 |
| 5 | Neo4j | 그래프 DB에 저장 및 쿼리 |
| 6 | GraphRAG | "놀란 감독 스타일 영화 추천" 자연어 질의 |
| 7 | 온톨로지 에이전트 | 새 영화 자동 업데이트 |
| 8 | 도메인 확장 | 의료/법률/금융 케이스 |
| 9 | 서비스 배포 | API + 대시보드 |
Week 1 마일스톤: 영화 도메인 온톨로지 설계
이번 주에는 영화 추천 시스템의 기반이 될 온톨로지를 설계합니다.
목표 질문 (Competency Questions):
- "인셉션을 감독한 사람은?"
- "레오나르도 디카프리오가 출연한 SF 영화는?"
- "2010년 이후 평점 8.0 이상 영화는?"
설계할 클래스:
Movie
├── title: string
├── releaseDate: date
├── rating: float
└── runtime: integer
Person
├── name: string
└── birthDate: date
Director (extends Person)
└── directed: Movie[]
Actor (extends Person)
└── actedIn: Movie[]
Genre
└── name: string설계할 관계:
directed: Director → MovieactedIn: Actor → MoviehasGenre: Movie → Genre
프로젝트 노트북에서 영화 추천 지식그래프의 첫 번째 단계를 시작합니다.
프로젝트 노트북에서는 다음을 직접 구현합니다:
- owlready2로 Movie, Person, Director, Actor, Genre 클래스 생성
- directed, actedIn, hasGenre 관계 정의
- 인셉션, 다크나이트 등 실제 영화 데이터 입력
- "놀란 감독 영화 찾기" 쿼리 작성
9주 후 완성되는 것: "놀란 감독 스타일의 SF 영화 추천해줘"라고 물으면, 지식그래프에서 감독-장르-평점 관계를 추론하고 자연어로 답변하는 AI 에이전트
실습 노트북
이론을 더 깊이 탐구하고 싶다면:
실습 노트북에서는 추가로 다음 내용을 다룹니다:
- SUMO, DOLCE, BFO 상부 온톨로지 비교
- 의료/법률 도메인 온톨로지 설계 연습
- OWL 파일(.owl) 저장 및 로드
- 역량 질문 기반 온톨로지 검증