특정 분야에 어떤 개념이 있고 서로 어떤 관계인지 기계가 읽을 수 있게 적어 둔 규칙집이자, 사람과 프로그램이 같은 단어를 같은 뜻으로 쓰게 하는 공용 어휘집이다. 실제 데이터를 담는 지식 그래프와 달리 그 틀(스키마)에 해당하며, 지식 그래프를 설계하거나 LLM이 문서에서 그래프를 뽑을 때 기준으로 쓴다.
| 구분 | 온톨로지 | 지식 그래프 |
|---|---|---|
| 역할 | 틀 (스키마) | 틀에 채운 실제 데이터 |
| 예시 | '환자는 질환을 진단받는다' | '환자 A가 제2형 당뇨를 진단받았다' |
| 비유 | 설계 도면 | 도면대로 지은 건물 |
'전기차는 자동차다', '자동차는 탈것이다'를 적어 두면 시스템은 '아이오닉 5는 탈것이다'를 따로 입력받지 않아도 알아낸다.
요즘 온톨로지가 가장 많이 쓰이는 곳은 GraphRAG다. 틀 없이 LLM에게 그래프를 뽑으라고 하면 '제2형 당뇨병'과 'T2D'를 다른 질환으로 저장하고, 관계 이름도 '진단받음', 'HAS_DISEASE'처럼 문서마다 달라져 나중에 일관되게 검색할 수 없다.
그래서 추출할 때 온톨로지를 스키마로 넘긴다. neo4j-graphrag 패키지의 SimpleKGPipeline에 노드 타입, 관계 타입, 허용되는 연결 패턴을 지정하면 LLM이 그 틀 안에서만 뽑는다. 필수 속성이 빠진 노드나 정의되지 않은 관계도 막을 수 있다.
| 지정할 것 | 예시 |
|---|---|
| 노드 타입 | Patient, Condition, Medication |
| 관계 타입 | DIAGNOSED_WITH, PRESCRIBED |
| 허용 패턴 | (Patient, DIAGNOSED_WITH, Condition) |
스키마 없이 LLM이 추정하게 두면 빠른 실험에는 편하다. 하지만 실제 서비스용 그래프라면 사람이 다듬은 온톨로지를 쓰는 편이 안전하다.
표준 언어는 W3C의 RDF와 OWL이다. 개념의 상하 관계, 속성, '주민등록번호는 하나뿐' 같은 제약을 적을 수 있다. 공개된 온톨로지에서 필요한 부분만 가져와 늘리거나, LLM에게 도메인 문서를 주고 초안을 뽑게 한 뒤 전문가가 다듬는 방법도 많이 쓴다.
| 하고 싶은 일 | 도구 |
|---|---|
| 눈으로 보며 설계 | Protégé (오픈소스 편집기) |
| Python에서 읽고 조회 | rdflib로 .ttl 파일 읽기, SPARQL로 질의 |
| 기존 온톨로지 가져오기 | 웹 전반은 schema.org, 의료는 SNOMED CT |
| 사내 OWL을 GraphRAG에 연결 | rdflib로 읽어 추출 스키마로 바꾸기 |
의료·법률·제조처럼 용어가 엄격하고 개념 사이 관계를 정확히 따라가야 하는 분야라면 온톨로지가 LLM의 구조화된 기억이 되어 환각을 줄인다. 반대로 질문이 대부분 "이 문서에 뭐라고 쓰여 있나" 수준이라면 벡터 검색 RAG로 충분하다.
업무 개념이 바뀔 때마다 스키마와 데이터를 함께 고쳐야 하므로 유지 비용이 든다. 그 비용이 얻는 이득보다 큰지 먼저 따져 보는 게 좋다.
가장 흔한 건 LLM이 그래프를 뽑을 때 넘기는 스키마로 쓰는 방식이다. 그 밖에는 같은 개념이 여러 이름으로 흩어지지 않도록 표준 어휘로 묶는 데 많이 쓴다.
| 어디서 | 어떻게 쓰나 |
|---|---|
| GraphRAG 구축 | 노드·관계 타입과 허용 패턴을 스키마로 넘겨 LLM 추출을 틀 안에 묶는다 |
| 의료 데이터 | SNOMED CT 같은 표준 용어로 '제2형 당뇨병'과 'T2D'를 하나의 개념으로 맞춘다 |
| 웹 페이지 | schema.org 어휘로 상품·기사 정보를 표시해 검색엔진이 읽게 한다 |
| 사내 지식 그래프 | 사내 OWL을 rdflib로 읽어 SPARQL로 조회하거나 추출 스키마로 바꾼다 |