fos-blog/study
01 / 홈02 / 카테고리03 / 시리즈
01 / 홈02 / 카테고리03 / 시리즈

카테고리

  • AI 페이지로 이동
    • RAG 페이지로 이동
    • agent 페이지로 이동
    • langgraph 페이지로 이동
    • 사람용 CLI와 AI 에이전트용 CLI는 설계가 다르다
    • agents.md
    • Claude Code 메모리: CLAUDE.md와 .claude/rules를 규칙으로 쓰는 법
    • Claude Code의 Skill 시스템 - 개발자를 위한 AI 자동화의 새로운 차원
    • Claude Code를 5주 더 쓴 결과 — 스킬·CLAUDE.md를 키워가는 방식
    • Claude Code를 11일 동안 쓴 결과 — 데이터로 본 나의 사용 패턴
    • Claude Code 멀티 에이전트 — Teams
    • AI 에이전트와 디자인의 새 컨벤션 — DESIGN.md, Google Stitch, Claude Design
    • Docling — IBM Research 의 문서 파싱 toolkit 상세 정리
    • 하네스 엔지니어링 실전 — 4인 에이전트 팀으로 코딩 파이프라인 구축하기
    • 하네스 엔지니어링 — 오래 실행되는 AI 에이전트를 위한 설계
    • 멀티모달 LLM (Multimodal Large Language Model)
    • AI 에이전트와 함께 MVP 만들기 — dooray-cli 사례
    • 온톨로지에서 코딩 에이전트 컨텍스트까지 — 클래스·관계 설계와 그래프 평가
    • OpenClaw는 context와 memory를 어떻게 관리하나 — 나만의 에이전트를 구성하는 법
    • OpenClaw vs Hermes Agent — 갈아탈까 고민하며 정리한 비교
  • ai 페이지로 이동
    • agent 페이지로 이동
    • [초안] AI 제품 백엔드 안정성 — 지연·비용·권한·관측·도구 실패·폴백/재시도/사람 에스컬레이션
    • [초안] LLM 평가 프레임워크: 골든셋, 회귀 테스트, LLM-as-a-judge, 사람 피드백 루프
  • algorithm 페이지로 이동
    • live-coding 페이지로 이동
    • 분산 계산을 위한 알고리즘
  • architecture 페이지로 이동
    • 시니어 백엔드를 위한 API 설계 실전 스터디 팩
    • API 버저닝과 하위 호환성: 모바일·외부 컨슈머까지 안전하게 진화시키기
    • 캐시 설계 전략 총정리
    • [초안] 커머스 Spring 서비스에 Clean/Hexagonal Architecture를 실용적으로 적용하기
    • [초안] 커머스 도메인 모델링: 주문·재고·노출의 세 축을 분리해서 설계하기
    • 커머스 주문 상태와 데이터 정합성 기본기
    • [초안] 쿠폰/프로모션 동시성과 정합성 기본기 — 선착순·중복 사용 방지·발급/사용/복구
    • [초안] DDD와 도메인 모델링: 시니어 백엔드 관점의 전술/전략 패턴 실전 가이드
    • [초안] Decorator & Chain of Responsibility — 행동을 체인으로 조립하는 두 가지 방식
    • 디자인 패턴
    • [초안] 분산 아키텍처 완전 정복: Java 백엔드 시니어 인터뷰 대비 실전 가이드
    • [초안] 분산 트랜잭션과 Outbox 패턴 — 왜 2PC를 피하고 어떻게 대신할 것인가
    • 분산 트랜잭션
    • [초안] e-Commerce 주문·결제 도메인 모델링: 상태머신, 멱등성, Outbox/Saga 실전 정리
    • [초안] Event Sourcing과 CQRS — 상태가 아니라 변화를 저장한다는 발상
    • [학습중] 금융 거래 취소·정정·대사·일마감 운영
    • [학습중] 금융 거래 상태와 원장 설계
    • [초안] F&B 쿠폰·프로모션·멤버십·포인트 설계
    • [초안] F&B · e-Commerce 디지털 채널 도메인 한 장 정리
    • [초안] F&B 주문/매장/픽업 상태머신 설계
    • [초안] F&B 이커머스 결제·환불·정산 운영 가이드
    • [초안] Hexagonal / Clean Architecture를 Spring 백엔드에 적용하기
    • [초안] 대규모 커머스 트래픽 처리 패턴 — 대규모 회원과 메가 프로모션을 버티는 설계
    • [초안] 레거시 JSP/jQuery 화면과 신규 API가 공존하는 백엔드 운영 전략
    • [학습중] 모듈러 모놀리스에서 MSA로 점진 전환하는 실습
    • [초안] MSA 서비스 간 통신: Redis [Cache-Aside](../database/redis/cache-aside.md) × Kafka 이벤트 하이브리드 설계
    • [초안] Observability 입문: 시니어 백엔드가 장애를 탐지하고 대응하는 방식
    • [초안] Outbox / Inbox Pattern 심화 — 분산 메시징의 정합성 문제를 DB 트랜잭션으로 풀어내기
    • [초안] 결제 도메인 멱등성과 트랜잭션 재시도 기본기
    • [초안] 시니어 백엔드를 위한 Resilience 패턴 실전 가이드 — Timeout, Retry, Circuit Breaker, Bulkhead, Backpressure
    • [초안] Spring Batch vs Event-Driven — 같은 비동기처럼 보이지만 전혀 다른 두 패러다임
    • [초안] Strategy Pattern — 분기문을 없애는 설계, 시니어 백엔드 인터뷰 핵심 패턴
    • [초안] 시니어 백엔드를 위한 시스템 설계 입문 스터디 팩
    • [초안] 템플릿 메서드 패턴 - 백엔드 처리 골격을 강제하는 가장 오래되고 가장 위험한 패턴
    • [초안] 대규모 트래픽 중 무중단 마이그레이션 — Feature Flag + Shadow Mode 실전
  • database 페이지로 이동
    • milvus 페이지로 이동
    • mysql 페이지로 이동
    • opensearch 페이지로 이동
    • qdrant 페이지로 이동
    • redis 페이지로 이동
    • vespa 페이지로 이동
    • 김영한의-실전-데이터베이스-설계 페이지로 이동
    • [초안] DB Connection Pool Saturation과 Thread Pool 격리
    • 커넥션 풀 크기는 얼마나 조정해야 할까?
    • 인덱스 - DB 성능 최적화의 핵심
    • [초안] JPA N+1과 커머스 조회 모델: 주문/메뉴/쿠폰 도메인에서 살아남기
    • [초안] MyBatis 기본기 — XML Mapper, resultMap, 동적 SQL, 운영 패턴 정리
    • [초안] MyBatis와 JPA/Hibernate 트레이드오프 — 레거시 백엔드를 다루는 시니어 관점
    • 한국어 형태소 분석기 Nori vs Lindera — OpenSearch에서 Milvus로 갈 때 어휘 검색은 유지되나
    • 벡터 DB 5종, 아키텍처는 어떻게 다른가
    • 벡터 DB 5종을 실제로 벤치마크했다 — 같은 recall에서 QPS는 얼마나 갈리나
    • 벡터 DB 어떻게 고를까 — OpenSearch · Milvus · Qdrant · Vespa · pgvector 비교
    • 벡터 DB를 실제로 도입한 사례 — 빅테크 프로덕션
    • 역정규화 (Denormalization)
    • 데이터 베이스 정규화
  • devops 페이지로 이동
    • docker 페이지로 이동
    • k8s 페이지로 이동
    • k8s-in-action 페이지로 이동
    • observability 페이지로 이동
    • [초안] 커머스/F&B 채널 장애 첫 5분과 관측성 기본기
    • [초안] 운영 데이터 정합성 장애 대응 — 결제 취소 누락과 중복 적재 런북
    • Envoy Proxy
    • [초안] F&B / e-Commerce 운영 장애 대응과 모니터링 — 백엔드 관점 정리
    • Graceful Shutdown
    • [초안] 시니어 백엔드를 위한 SLO와 Error Budget 기반 장애 대응
  • http 페이지로 이동
    • HTTP Connection Pool
    • HTTPS는 어떻게 안전한가 — TLS, 인증서, 그리고 termination
  • interview 페이지로 이동
    • [초안] AI 서비스 팀 경험 기반 시니어 백엔드 면접 질문 뱅크 — Spring Batch RAG / gRPC graceful shutdown / 캐시 정합성 / 12일 AI 웹툰 MVP
    • Observability — 면접 답변 프레임
    • [초안] 시니어 Java 백엔드 면접 마스터 플레이북 — 김병태
    • [초안] NSC 슬롯팀 경험 기반 질문 은행 — 도메인 모델링·동시성·성능·AI 협업
  • java 페이지로 이동
    • concurrency 페이지로 이동
    • jdbc 페이지로 이동
    • opentelemetry 페이지로 이동
    • spring 페이지로 이동
    • spring-batch 페이지로 이동
    • testing 페이지로 이동
    • 더_자바_코드를_조작하는_다양한_방법 페이지로 이동
    • [초안] Java 동시성 락 정리 — 커머스 메뉴/프로모션 정책 캐시 갱신 관점
    • [초안] JVM 튜닝 실전: 메모리 구조부터 Virtual Threads, GC 튜닝, 프로파일링까지
    • Java의 로깅 환경
    • MDC (Mapped Diagnostic Context)
    • Java StampedLock — 읽기 폭주에도 쓰기가 밀리지 않는 락
    • Virtual Thread와 Project Loom
  • javascript 페이지로 이동
    • typescript 페이지로 이동
    • AbortController
    • Async Iterator와 제너레이터
    • CommonJS와 ECMAScript Modules
    • 제너레이터(Generator)
    • Http Client
    • Node 백엔드 운영 패턴 — Streams 백프레셔, pipe/pipeline, 멱등성 vs 분산 락
    • Node.js
    • npm vs pnpm — 어떤 기준으로 선택했나
    • `setImmediate()`
  • kafka 페이지로 이동
    • [초안] Kafka 기본 개념 — 토픽, 파티션, 오프셋, 복제
    • Kafka를 사용하여 **데이터 정합성**은 어떻게 유지해야 할까?
    • [초안] Kafka 실전 설계: 파티션 전략, 컨슈머 그룹, 전달 보장, 재시도, 순서 보장 트레이드오프
    • [학습중] Kafka 파티션·리밸런스·컨슈머 지연 운영
    • 메시지 전송 신뢰성
    • [초안] Spring Kafka 컨슈머 오프셋 커밋과 트랜잭션 정렬: AckMode, manual ack, 멱등 처리
  • linux 페이지로 이동
    • fsync — 리눅스 파일 동기화 시스템 콜
    • tmux — Terminal Multiplexer
  • mlops 페이지로 이동
    • llm-serving 페이지로 이동
    • serving-frameworks 페이지로 이동
    • Python CUDA 버전 생태계 — nvidia-smi, nvcc, pip, conda가 다 다른 버전을 말하는 이유
    • GPU 컨테이너의 CUDA 버전 호환성 — nvidia-smi부터 이미지 다이어트까지
    • Kubernetes GPU 노드에서 /run tmpfs가 꽉 차서 Pod가 안 뜰 때
    • GPU·CUDA·MPS 기초 — 자바 백엔드 개발자가 처음 만나는 그림
    • Multi-process GPU 워크로드 — 자바 ThreadPool 사용자가 만나는 모델 차이
    • ML 서비스 성능 분석 워크플로 — 자바 백엔드 트러블슈팅과 다른 점
    • 한 GPU 를 여러 프로세스가 나눠 쓰기 — Time-Slicing 과 MPS
  • network 페이지로 이동
    • Connection reset by peer는 누가 보낸 걸까 — 리버스 프록시 홉마다 TCP 연결은 따로 논다
    • L2(스위치)와 L3(라우터)의 역할 차이
    • L4와 VIP(Virtual IP Address)
    • IP Subnet
  • python 페이지로 이동
    • Python async/await — CompletableFuture·Reactor 와 다른 점, 그리고 blocking I/O 함정
    • Python 의존성 관리 — Java Maven/Gradle 사용자가 만나는 첫 충격
    • FastAPI 기초 — Spring Boot 사용자가 빠르게 익히는 법
    • Java 개발자를 위한 Python 심화 — OOP·데코레이터·컨텍스트 매니저
    • PyTorch 기초 — 텐서, 디바이스, 그리고 모델 로딩이 무거운 이유
    • Java 개발자를 위한 Python 문법 핵심
    • ThreadLocal 에서 contextvars 로 — Python 의 요청 컨텍스트 전파
    • OCR 동작 원리 — Layout · Text · Post-process 3단계
    • Python 서버의 RSS 가 안 줄어드는 이유 — gc.collect 의 한계와 malloc_trim
  • rabbitmq 페이지로 이동
    • [초안] RabbitMQ Basics — 실전 백엔드 관점에서 정리하는 메시지 브로커 기본기
    • [초안] RabbitMQ vs Kafka — 백엔드 메시징 선택 기준과 실전 운영 관점
  • resume 페이지로 이동
    • [초안] 김병태 경력기술서
    • [초안] 김병태 포트폴리오
  • security 페이지로 이동
    • [초안] 시니어 백엔드를 위한 보안 / 인증 스터디 팩 — Spring Security, JWT, OAuth2, OWASP Top 10
    • [초안] Spring Security 6.x OAuth2 + JWT 상용 인증 설계 — Grant 선택, Resource Server, Refresh Rotation, 로그아웃
  • task 페이지로 이동
    • ai-service-team 페이지로 이동
    • nsc-slot 페이지로 이동
    • sb-dev-team 페이지로 이동
    • the-future-company 페이지로 이동
  • testing 페이지로 이동
    • [초안] 시니어 Java 백엔드를 위한 테스트 전략 완전 정리 — 피라미드부터 TestContainers, 마이크로벤치, Contract까지
  • thinking 페이지로 이동
    • 좋은 일을 넘어 중요한 일을 하는 법
FOS-BLOG · FOOTERall systems normal·v0.1 · 2026.04.27·seoul, kr
Ffos-blog/study

개발 학습 기록을 정리하는 블로그입니다. 공부하면서 기록하고, 기록하면서 다시 배웁니다.

visitors
01site
  • Home↗
  • Posts↗
  • Categories↗
  • Glossary↗
  • About↗
02policy
  • 소개/about
  • 개인정보처리방침/privacy
  • 연락처/contact
03categories
  • AI↗
  • Algorithm↗
  • DB↗
  • DevOps↗
  • Java/Spring↗
  • JS/TS↗
  • React↗
  • Next.js↗
  • System↗
04connect
  • GitHub@jon890↗
  • Source repositoryjon890/fos-study↗
  • RSS feed/rss.xml↗
  • Newsletter매주 1 회 · 한 편의 글→
© 2026 FOS Study. All posts MIT-licensed.
built with·Next.js·Tailwind v4·Geist·Pretendard·oklch
fos-blog/AI/온톨로지에서 코딩 에이전트 컨텍스트까지 — …
ai

온톨로지에서 코딩 에이전트 컨텍스트까지 — 클래스·관계 설계와 그래프 평가

지식그래프를 만들어보면서 가장 어려웠던 건 노드를 저장하는 일이 아니었다. API Gateway, 게이트웨이, Gateway API처럼 비슷해 보이는 표현을 언제 하나로 묶고, 그 사이의 관계를 어떤 의미로 연결할지가 훨씬 어려웠다. 이번에 자료를 깊게 찾아보며 내린 결론은 이렇다. 온톨로지의 중심은 클래스 계약이고, 지식그래프의 가치는 벡터 RAG와 같은...

2026.07.28·22 min read·32 views

지식그래프를 만들어보면서 가장 어려웠던 건 노드를 저장하는 일이 아니었다. API Gateway, 게이트웨이, Gateway API처럼 비슷해 보이는 표현을 언제 하나로 묶고, 그 사이의 관계를 어떤 의미로 연결할지가 훨씬 어려웠다.

이번에 자료를 깊게 찾아보며 내린 결론은 이렇다. 온톨로지의 중심은 클래스 계약이고, 지식그래프의 가치는 벡터 RAG와 같은 조건에서 실제 질문으로 비교해야 증명할 수 있다.

이 글에서는 세 가지 질문을 따라간다.

  • 클래스와 인스턴스를 어떻게 나눠야 관계가 무너지지 않는가?
  • 비슷한 표현을 언제 같은 개체로 묶고 언제 분리해야 하는가?
  • 그래프를 힘들게 구축한 만큼 벡터 RAG보다 나아졌는지 어떻게 측정하는가?

에이전트의 메모리와 권한을 포함한 전체 운영 구조가 먼저 필요하다면 엔터프라이즈 AI Agent 설계를 함께 보면 좋다.

이 글의 클래스·관계 계약을 Neo4j에 옮기고 검색 도구로 구현하는 과정은 Neo4j GraphRAG로 에이전트 컨텍스트 제공자 만들기에서 이어간다.

그래프 데이터베이스보다 온톨로지가 먼저다

처음에는 노드와 관계가 많아지면 자연스럽게 지식그래프가 좋아질 거라고 생각하기 쉽다. 하지만 그래프 데이터베이스는 데이터를 저장하고 탐색하는 기술이지, 무엇을 같은 것으로 볼지 결정해주지는 않는다.

온톨로지는 도메인에서 사용하는 의미의 계약이다.

  • 어떤 종류의 대상이 존재하는가?
  • 각 대상은 무엇으로 식별하는가?
  • 어떤 관계를 허용하는가?
  • 관계의 방향은 무엇인가?
  • 어떤 주장은 반드시 근거를 가져야 하는가?
  • 변경되거나 폐기된 개념은 어떻게 추적하는가?

W3C의 OWL 2 입문서는 온톨로지를 클래스, 속성, 개체와 이들 사이의 공리로 설명한다.

OWL 2는 무엇인가

OWL은 웹 온톨로지 언어(Web Ontology Language)의 약자다. OWL 2는 어떤 도메인의 개념과 관계를 컴퓨터가 논리적으로 해석하고 새로운 사실을 추론할 수 있도록 의미를 명시하는 W3C 표준 언어다.

이름에 Web이 들어가지만 웹 화면을 만드는 기술은 아니다. 서로 다른 시스템이 같은 개념을 같은 의미로 교환하고, 명시된 규칙에서 추가 사실을 계산하는 지식 표현 언어에 가깝다.

OWL 2를 이해할 때는 다섯 가지를 먼저 보면 된다.

구성 요소의미코딩 지식그래프 예시
클래스같은 성격을 가진 개체의 집합Component, APIGateway
개체현실의 구체적인 대상auth-gateway
객체 속성개체와 개체 사이의 관계dependsOn, ownedBy
데이터 속성개체와 문자열·숫자 같은 값의 관계version, createdAt
공리온톨로지 안에서 참이라고 선언한 의미 규칙모든 APIGateway는 Component다

여기서 공리(axiom)가 OWL 2의 핵심이다. 공리는 단순한 설명 문장이 아니라 추론기가 새로운 사실을 도출할 때 사용하는 논리 규칙이다.

다음은 OWL의 Manchester 문법을 단순화한 예다.

text
Class: Component
 
Class: APIGateway
  SubClassOf: Component
 
Class: AuthenticationGateway
  SubClassOf: APIGateway
 
Individual: auth-gateway
  Types: AuthenticationGateway

직접 적은 사실은 auth-gateway가 AuthenticationGateway라는 것뿐이다. 하지만 추론기는 클래스 계층을 따라 다음 사실도 도출할 수 있다.

  • auth-gateway는 APIGateway다.
  • auth-gateway는 Component다.
  • 모든 AuthenticationGateway는 Component다.

RDF가 auth-gateway dependsOn auth-service 같은 사실을 주어·관계·목적어 형태로 표현한다면, OWL 2는 클래스 계층, 동등성, 배타성, 속성의 특성처럼 그 사실들을 해석할 규칙을 더한다.

OWL 2는 데이터 검증 언어가 아니다

OWL 2를 처음 접할 때 가장 헷갈리기 쉬운 부분이다.

일반적인 데이터베이스나 Zod 검증에서는 필드가 없으면 오류라고 판단할 수 있다. 반면 OWL 2는 열린 세계 가정(open-world assumption)을 따른다. 그래프에 어떤 사실이 없다고 해서 그 사실이 거짓이라고 결론 내리지 않고, 아직 알려지지 않았을 가능성을 남긴다.

예를 들어 auth-gateway에 소유 팀이 기록되지 않았다고 해보자.

  • Zod나 SHACL은 owner가 필수라는 조건을 두고 누락을 오류로 판정할 수 있다.
  • OWL 2는 소유 팀 정보가 없다는 이유만으로 소유 팀이 존재하지 않는다고 판단하지 않는다.

속성의 도메인과 범위도 입력 검증 규칙과 다르게 작동한다. OWL 2에서 dependsOn의 시작과 끝을 Component로 선언한 뒤 A dependsOn B라는 사실이 들어오면, 추론기는 A와 B를 Component라고 추론할 수 있다. 잘못된 입력을 곧바로 거부하는 타입 검사와는 방향이 다르다.

역할을 구분하면 다음과 같다.

도구답하려는 질문
OWL 2현재 사실과 의미 규칙에서 무엇을 논리적으로 추론할 수 있는가?
SHACLRDF 데이터가 필요한 형태와 제약을 만족하는가?
Zod·JSON Schema애플리케이션 입력이 요구한 필드와 타입을 만족하는가?
Neo4j 제약그래프 키와 속성의 유일성·존재 조건을 만족하는가?

따라서 OWL 2와 SHACL은 경쟁 기술이라기보다 역할이 다르다. OWL 2로 의미와 추론 규칙을 표현하고, SHACL이나 애플리케이션 스키마로 실제 적재 데이터를 검증할 수 있다.

왜 OWL 2에도 여러 프로파일이 있는가

논리 표현력이 강해질수록 추론 비용도 커질 수 있다. OWL 2는 필요한 문제에 맞춰 표현력 일부를 제한한 세 가지 프로파일을 정의한다.

프로파일적합한 문제
OWL 2 EL클래스와 속성이 매우 많은 대규모 온톨로지에서 계층 추론이 중요할 때
OWL 2 QL인스턴스가 많고 관계형 데이터베이스 위에서 질의 응답이 중요할 때
OWL 2 RL규칙 엔진 방식으로 확장 가능한 추론을 구현할 때

프로파일은 더 좋은 버전을 고르는 문제가 아니다. 필요한 추론과 데이터 규모에 맞춰 표현력과 계산 비용을 교환하는 선택지다.

이 프로젝트에 OWL 2가 바로 필요한가

현재와 같은 Neo4j 속성 그래프가 있다고 해서 OWL 2로 전면 이주해야 하는 것은 아니다.

다음 요구가 생기면 OWL 2 도입을 검토할 가치가 있다.

  • 여러 시스템이 클래스와 관계의 의미를 표준 형식으로 공유해야 한다.
  • 클래스 계층과 속성 규칙에서 새로운 사실을 자동 추론해야 한다.
  • 서로 모순되는 클래스 정의를 논리적으로 검사해야 한다.
  • 외부 온톨로지와 식별자·정의를 연결해야 한다.

반대로 클래스 수가 작고, 필요한 관계 탐색이 Cypher로 충분하며, 애플리케이션 코드에서 제약을 명확히 관리할 수 있다면 TypeScript, Zod, Neo4j 제약으로 시작하는 편이 단순하다.

내가 이 글에서 OWL 2를 언급한 이유도 라이브러리 도입을 권하기 위해서가 아니다. 클래스, 관계, 인스턴스, 공리, 추론을 분리해서 생각하는 설계 규율을 가져오기 위해서다.

내가 중요하게 본 구분은 다음과 같다.

구분역할예시
클래스어떤 종류의 대상인지 정의한다Service, Component, Decision
인스턴스현실에 존재하는 구체적인 대상을 나타낸다주문 API, 인증 게이트웨이
관계 유형두 대상 사이에 허용되는 의미를 정의한다DEPENDS_ON, AFFECTS
주장특정 관계가 실제로 성립한다고 말한다주문 API가 인증 게이트웨이에 의존한다
근거그 주장을 뒷받침한다설계 문서, 코드 위치, 업무 댓글

클래스가 불명확하면 같은 Concept 안에 기술, 제품, 코드 심볼, 일반 명사가 섞인다. 그 상태에서 관계를 추가할수록 그래프는 풍부해지는 게 아니라 모호해진다.

클래스는 명사가 아니라 질문에서 나온다

문서에서 명사를 모두 뽑아 클래스로 만들면 온톨로지가 빠르게 비대해진다. Stanford의 Ontology Development 101은 먼저 도메인, 사용 목적, 사용자, 그리고 온톨로지가 답해야 할 질문을 정하라고 권한다.

이때 사용하는 질문을 역량 질문(competency question)이라고 부른다.

코딩 에이전트를 위한 지식그래프라면 다음과 같은 질문이 출발점이 될 수 있다.

  • 이 서비스가 의존하는 컴포넌트는 무엇인가?
  • 이 API 제거를 결정한 업무와 근거는 어디에 있는가?
  • 이 심볼을 수정하면 어떤 서비스와 테스트가 영향을 받는가?
  • 현재도 유효한 결정과 이미 대체된 결정은 무엇인가?
  • 이 관계는 어느 문서와 코드에서 추출됐는가?

질문을 적고 나면 필요한 클래스가 보인다.

예를 들어 변경 영향 질문을 답하려면 Service와 CodeSymbol만으로는 부족하다. 변경을 설명하는 Decision, 근거가 되는 Document, 시간에 따라 유효성이 달라지는 Claim이 필요할 수 있다.

반대로 어떤 클래스도 질문, 제약, 행동에 연결되지 않는다면 정식 온톨로지에 넣기보다 후보 상태로 두는 편이 낫다.

중간 수준의 클래스에서 시작한다

클래스를 만드는 방향은 크게 두 가지다.

  • 하향식은 Asset 같은 상위 개념에서 SoftwareAsset, Service, API로 내려간다.
  • 상향식은 order-service, gateway.yaml, PaymentController 같은 실제 데이터에서 공통점을 올려 찾는다.

Ontology Development 101은 두 방향을 섞어 먼저 눈에 띄는 중간 수준의 개념을 정하고, 필요에 따라 일반화하거나 구체화하는 결합 방식을 설명한다. 영상의 방법론 발표에서도 중간 수준의 개념에서 시작해 상위와 하위로 확장하는 접근을 설명한다. 이를 코딩 에이전트에 적용하면 실제로 반복해서 묻는 Service, API, Decision, Test 같은 개념에서 시작할 수 있다.

이 방식은 코딩 에이전트용 온톨로지와 잘 맞는다. 역량 질문에 필요할 때만 위로는 Asset을 만들고, 아래로는 REST API나 GraphQL API처럼 세분화할 수 있기 때문이다. 반대로 Controller와 Repository를 별도 질의하거나 제약하지 않는다면 처음에는 CodeSymbol의 속성으로 남겨도 된다.

코딩 에이전트를 위한 최소 클래스 모델

처음부터 모든 개발 지식을 모델링할 필요는 없다. 나는 다음 다섯 묶음부터 시작하는 편이 현실적이라고 봤다.

시스템 자산

  • System
  • Service
  • Component
  • API
  • DataStore
  • CodeSymbol

작업과 기록

  • WorkItem
  • Document
  • Comment
  • Commit
  • PullRequest

지식과 판단

  • Decision
  • Claim
  • Evidence
  • Incident

행위 주체

  • Person
  • Team
  • Agent

행동과 통제

  • Action
  • Capability
  • Workflow
  • Policy
  • Invariant
  • Tool

시스템 자산만 모델링하면 에이전트가 무엇을 알고 있는지는 표현할 수 있지만, 무엇을 해도 되는지와 어떤 조건을 지켜야 하는지는 표현하기 어렵다. Palantir의 공식 온톨로지 문서는 객체, 속성, 링크 같은 의미 요소와 함께 행동, 함수, 동적 보안 같은 실행 요소를 온톨로지의 구성으로 설명한다.

코딩 에이전트에도 같은 구분이 필요하다.

예를 들어 renameSymbol은 단순한 동사가 아니다. 대상 심볼, 허용 범위, 변경되는 파일, 보존해야 할 불변 조건, 통과해야 할 테스트를 함께 가진 행동 계약이다.

이 구성에서 일반 기술어는 곧바로 시스템 자산으로 취급하지 않는다. API Gateway라는 기술 개념과 조직이 운영하는 구체적인 게이트웨이 인스턴스는 다르다.

이 구분이 없으면 기술 문서에서 나온 일반 개념과 실제 운영 대상을 같은 노드로 합치게 된다. 그러면 에이전트가 변경 영향이나 소유권을 찾을 때 엉뚱한 경로를 따라간다.

API Gateway와 게이트웨이는 같은가

표현이 비슷하다는 사실과 같은 개체라는 사실은 다르다.

다음 표현을 생각해보자.

  • API Gateway
  • api-gateway
  • 게이트웨이
  • 인증 게이트웨이
  • Gateway API

앞의 두 표현은 표기 차이일 가능성이 높다. 게이트웨이는 문맥에 따라 API Gateway, 네트워크 게이트웨이, 결제 게이트웨이를 모두 가리킬 수 있다. Gateway API는 Kubernetes의 별도 API 표준을 의미할 수도 있으므로 문자열 토큰이 같다는 이유로 합치면 안 된다.

나는 이 문제를 문자열 정규화가 아니라 개체 동일성 판정 문제로 보는 편이 맞다고 생각한다.

표현과 개체를 분리한다

원문에서 발견한 표현은 먼저 Mention으로 취급한다. 검증을 통과한 뒤에만 정식 개체에 연결한다.

text
원문 표현
  → 동일성 후보 생성
  → 문맥과 관계 비교
  → 동일 / 관련 / 상하위 / 모호 / 별개 판정
  → 정식 개체 또는 검토 대기열 연결

같은 개체로 병합하려면 다음 근거를 조합한다.

  • 동일한 외부 식별자가 있는가?
  • 정의와 사용 범위가 같은가?
  • 같은 소유자와 시스템 경계를 가리키는가?
  • 주변 관계가 일치하는가?
  • 공식 문서가 동의어나 개명이라고 명시하는가?
  • 서로 바꿔 써도 역량 질문의 의미가 달라지지 않는가?

후보 생성과 최종 판정을 분리한다

후보를 넓게 찾는 단계에서는 여러 방법을 함께 쓸 수 있다.

  • 대소문자, 구분자, 조사 등을 제거한 문자열 정규화
  • 관리되는 별칭 사전
  • 임베딩 유사도
  • 주변 문장과 문서의 유사도
  • 연결된 서비스, 팀, 코드 심볼 같은 그래프 이웃

그러나 후보가 나왔다고 바로 병합하면 안 된다. 최종 판정에서는 다음 상태를 구분해야 한다.

판정예시처리
동일API Gateway, api-gateway정식 이름 하나와 별칭으로 관리한다
상위·하위Gateway, API Gateway클래스 또는 IS_A 관계를 검토한다
관련API Gateway, Ingress Controller목적에 맞는 관계로 연결한다
모호게이트웨이문맥이 충분해질 때까지 후보로 둔다
별개API Gateway, Gateway API다른 식별자를 유지한다

임베딩은 같은 후보를 찾는 데 유용하지만, 같은 개체임을 증명하지는 않는다. 병합은 검색 문제가 아니라 의미와 식별자의 변경이기 때문이다.

별칭도 변경 이력을 가진다

별칭 사전은 단순한 문자열 배열로 끝내기 쉽다. 하지만 운영하다 보면 누가 왜 같은 표현으로 승인했는지, 언제부터 유효했는지, 잘못된 병합을 어떻게 되돌릴지가 필요해진다.

최소한 다음 정보는 남기는 편이 좋다.

yaml
alias: 게이트웨이
canonicalEntityId: component:auth-gateway
status: candidate
scope: authentication-domain
evidence:
  - source: architecture-document
approvedBy: null
validFrom: null
replacedBy: null

출처와 범위가 없는 별칭은 전역 규칙으로 승격하지 않는다. 한 팀에서 게이트웨이가 인증 게이트웨이를 뜻한다고 해서 다른 저장소에서도 같은 의미라는 보장은 없기 때문이다.

온톨로지에 데이터를 입히는 과정

클래스와 관계를 정의한 뒤 원문에서 실제 인스턴스와 관계를 만드는 일을 온톨로지 적재(ontology population)라고 부른다. 영상의 LLM·온톨로지 결합 발표는 이 과정을 개체 후보 추출, 개체 연결, 관계 추출, 관계 연결, 검증으로 나눈다.

이 단계들은 한 번의 LLM 호출로 뭉치기보다 분리하는 편이 좋다. 앞 단계의 오류가 뒤 단계에서 그럴듯한 관계로 증폭될 수 있기 때문이다.

스키마를 LLM과 함께 제공한다

자유 형식으로 개체와 관계를 추출하게 하면 같은 의미에 다른 클래스 이름을 붙이거나 허용하지 않은 관계를 만들기 쉽다. 따라서 추출 요청에는 다음 정보를 함께 제공한다.

  • 허용하는 클래스와 관계
  • 관계의 시작 클래스와 도착 클래스
  • 필수 속성과 출처 위치
  • 포함 예와 제외 예
  • 모호하거나 새로운 표현을 처리하는 규칙

Ontology Population using LLMs는 특정 역사 데이터셋 실험에서 모듈화한 온톨로지를 프롬프트에 제공했을 때 정답 지식 트리플의 약 90퍼센트를 생성했다고 보고한다. 이는 온톨로지 스키마가 추출을 제약하는 데 유용할 수 있다는 사례이지, 다른 도메인에서도 같은 정확도를 보장한다는 뜻은 아니다.

실제 추출 계약은 다음처럼 허용 범위와 실패 처리를 명시할 수 있다.

json
{
  "allowedClasses": ["Service", "API", "CodeSymbol", "Decision"],
  "allowedRelations": ["EXPOSES", "DEPENDS_ON", "AFFECTS"],
  "requiredFields": ["sourceUri", "locator", "extractorVersion"],
  "unknownEntityPolicy": "emit-candidate",
  "unsupportedRelationPolicy": "reject"
}

새로운 표현을 발견해도 즉시 클래스를 늘리지 않는다. 후보로 보관한 뒤 반복 빈도, 역량 질문, 기존 클래스와의 충돌을 검토한다. LLM을 이용한 지식그래프·온톨로지 공학 연구도 모델링, 확장, 수정, 적재, 정렬, 개체 모호성 해소를 서로 다른 작업으로 나누고, 모듈화한 온톨로지가 중요하다고 설명한다.

적재 품질은 답변 품질과 따로 측정한다

좋은 답변이 한 번 나왔다고 그래프가 정확하게 적재됐다고 볼 수 없다. 적재 단계마다 다음 지표를 분리해 본다.

단계핵심 지표확인하려는 실패
개체 추출정밀도와 재현율실제 개체를 놓치거나 일반 명사를 개체로 만든다
개체 연결연결 정확도와 미연결 비율별개 개체를 합치거나 기존 개체를 찾지 못한다
관계 추출관계 정밀도와 방향 오류율관계 의미나 주체와 객체를 뒤집는다
스키마 검증제약 위반율허용하지 않은 클래스와 관계를 만든다
근거 연결출처 포함률과 원문 위치 정확도관계를 원문까지 추적할 수 없다
사람 검토승인율과 반려 사유자동화가 반복해서 만드는 오류를 찾는다

자동 승인율을 높이는 것 자체가 목표는 아니다. 모호한 데이터를 정직하게 미연결 후보로 남기는 시스템이 틀린 관계를 자신 있게 확정하는 시스템보다 안전하다.

데이터 준비가 안 됐다면 온톨로지보다 먼저 고친다

영상의 데이터 기반 발표는 온톨로지 이전에 신뢰할 수 있는 데이터 기반이 필요하다는 점을 강조한다. 코딩 지식그래프에서는 최소한 다음 조건을 확인할 수 있다.

  • 서비스, 저장소, API에 안정적인 식별자가 있는가?
  • 문서와 업무에 작성 시각, 수정 시각, 소유자가 있는가?
  • 코드 심볼과 테스트를 원문 위치까지 다시 찾을 수 있는가?
  • 삭제, 개명, 이동을 구분할 변경 이력이 있는가?
  • 관계 후보를 거부할 검증 규칙이 있는가?

이 정보가 없다면 먼저 메타데이터, 식별자, 변경 이력, 계약을 정비하는 편이 낫다. 작은 코드 인덱스나 관계형 테이블로 충분한 문제에 온톨로지를 추가해도 누락된 원천 데이터는 복구되지 않는다.

관계는 간선보다 주장에 가깝다

DEPENDS_ON, AFFECTS, CAUSED_BY 같은 관계는 문서에서 그대로 주어지지 않는 경우가 많다. LLM이나 규칙이 여러 문장을 해석해 만든 결과일 수 있다.

이런 관계를 확정 사실처럼 저장하면 다음 문제가 생긴다.

  • 잘못된 관계를 누가 만들었는지 알 수 없다.
  • 원문이 바뀌어도 오래된 관계가 남는다.
  • 서로 충돌하는 문서를 함께 표현하기 어렵다.
  • 에이전트가 추론과 구조적 사실을 구분하지 못한다.

작성자, 담당자, 댓글 소속, 명시적 링크처럼 원천에서 직접 얻는 관계는 구조적 사실로 저장해도 된다. 반면 해석이 들어간 관계는 Claim으로 승격하는 편이 안전하다.

모든 간선을 Claim 노드로 바꿀 필요는 없다. 충돌 가능성, 시간 변화, 검토 필요성이 큰 관계부터 적용하면 된다.

위험도에 따라 승인 기준을 다르게 둔다

모든 주장에 같은 검토 비용을 쓰면 운영하기 어렵다. 그 주장이 틀렸을 때 생기는 피해를 기준으로 승인 문턱을 나눈다.

위험도사용 예승인 기준
낮음검색 후보와 읽을 문서 추천단일 근거와 낮은 신뢰도도 후보로 허용한다
중간변경 영향과 팀 소유권 안내복수 근거 또는 명시적 규칙으로 교차 검증한다
높음코드 변경, 운영 조작, 정책 판단테스트와 사람 승인을 거쳐야 실행한다

모델이 출력한 신뢰도 점수만으로 위험을 통제할 수는 없다. 출처, 생성 활동, 생성 주체, 생성 시각, 파생 관계를 함께 기록해야 한다. W3C PROV-O의 Entity, Activity, Agent, wasGeneratedBy, wasDerivedFrom은 이 이력을 서로 다른 시스템에서도 표현하기 위한 기본 어휘를 제공한다.

온톨로지는 고정된 분류표가 아니다

영상의 온톨로지 진화 사례는 연료 기반 자동차 중심의 분류가 전기차의 등장으로 달라지는 예를 든다. 소프트웨어 조직에서도 서버리스, 생성형 AI, 새로운 배포 단위가 들어오면 기존 클래스의 경계와 관계가 달라질 수 있다.

Stanford의 Ontology Development 101도 온톨로지 개발을 반복적인 과정으로 설명한다. 운영 단계에서는 다음 변경을 코드처럼 관리해야 한다.

  • 클래스와 관계의 추가, 사용 중단, 대체
  • 이름이 바뀌어도 유지되는 안정적인 식별자
  • 관계의 의미, 방향, 시작 클래스, 도착 클래스 변경
  • 기존 인스턴스를 새 스키마로 옮기는 마이그레이션
  • 역량 질문과 검증 질의를 이용한 회귀 검사

버전, 마이그레이션, 검증 없이 클래스를 계속 고치면 과거 근거와 현재 질문이 어느 스키마를 기준으로 하는지 알 수 없어진다.

그래프가 벡터 RAG보다 좋은지 어떻게 증명할까

지식그래프를 만들었다는 사실만으로 검색 품질이 좋아졌다고 말할 수는 없다. 그래프는 구축과 유지 비용이 크므로, 같은 데이터와 같은 질문에서 벡터 RAG보다 어떤 가치를 더했는지 측정해야 한다.

비교 대상은 최소 세 가지가 필요하다.

  • 벡터 검색만 사용하는 RAG
  • 지식그래프 경로만 사용하는 검색
  • 벡터 검색과 지식그래프를 결합한 혼합 검색

내 예상으로는 한 방식이 모든 질문에서 이기지는 않는다. 표현이 다양한 단일 문서 검색은 벡터 검색이 유리할 수 있고, 의존 관계나 결정 이력처럼 여러 단계를 따라가야 하는 질문은 그래프가 유리할 가능성이 크다. 중요한 것은 이 예상을 실제 질문으로 검증하는 것이다.

질문을 유형별로 나눈다

평가 질문을 섞어서 평균 하나만 내면 왜 좋아졌는지 알 수 없다.

질문 유형예시예상되는 강점
의미 검색게이트웨이 장애 대응 문서는 어디에 있는가?벡터 RAG
별칭 해소게이트웨이가 가리키는 실제 컴포넌트는 무엇인가?혼합 검색
다단계 관계API 제거 결정과 영향을 받는 서비스를 찾아라지식그래프
시간 변화현재 유효한 결정과 대체된 결정을 구분하라지식그래프
전역 요약여러 프로젝트의 공통 장애 원인을 요약하라GraphRAG 또는 혼합 검색
코드 작업이 심볼 변경에 필요한 파일과 근거를 찾아라코드 인덱스와 혼합 검색

검색과 답변을 따로 평가한다

최종 답변 점수만 보면 검색 실패와 생성 실패를 구분하기 어렵다. 평가를 다섯 층으로 나누는 편이 좋다.

온톨로지 적재

  • 개체와 관계 추출의 정밀도와 재현율
  • 기존 개체 연결 정확도
  • 클래스와 관계 제약 위반율
  • 출처와 원문 위치를 가진 주장 비율
  • 사람 검토 승인율과 주요 반려 사유

개체 해소

  • 정식 개체 연결 정확도
  • 잘못 병합한 비율
  • 놓친 별칭 비율
  • 클러스터 정밀도와 재현율

별칭 병합에서는 재현율보다 정밀도를 먼저 지키는 편이 안전하다. 놓친 별칭은 검색 후보를 늘려 보완할 수 있지만, 잘못 합친 개체는 이후의 모든 관계와 답변을 오염시킨다.

근거 검색

  • 필수 근거 Recall@K
  • 검색 결과 Precision@K
  • 최초 정답 순위의 역수인 MRR
  • 근거의 출처와 원문 위치가 맞는 비율

답변 품질

  • 질문에 대한 정답률
  • 인용이 실제 문장을 뒷받침하는 비율
  • 근거 없이 추가한 주장 비율
  • 답변 불가능한 질문을 올바르게 거절하는 비율

에이전트 작업

  • 실제 작업 성공률
  • 잘못 수정한 파일 수
  • 사용한 입력 토큰과 도구 호출 수
  • 응답 시간과 비용
  • 같은 작업을 반복했을 때의 결과 안정성

비교 조건을 고정한다

그래프 쪽에 더 많은 원문과 토큰을 주면 공정한 비교가 아니다. 다음 조건을 같게 맞춘다.

  • 같은 원천 문서와 시점
  • 같은 평가 질문과 정답 근거
  • 같은 생성 모델과 설정
  • 같은 최대 입력 토큰
  • 같은 최종 답변 형식
  • 같은 권한 필터

그리고 각 방식을 여러 번 반복한다. LLM이 한 번 맞힌 결과는 안정성을 증명하지 못한다.

승리 조건을 미리 적는다

그래프를 도입한 뒤 유리한 지표만 고르면 결론을 믿기 어렵다. 실험 전에 성공 기준을 고정한다.

예를 들어 다음처럼 정의할 수 있다.

text
다단계 관계 질문:
  필수 근거 Recall@5가 벡터 RAG보다 높아야 한다.
  잘못된 관계 경로 비율은 기준 이하이어야 한다.
 
별칭 질문:
  잘못 병합한 개체 비율을 증가시키지 않으면서
  정식 개체 연결 성공률을 높여야 한다.
 
코딩 작업:
  작업 성공률을 높이되
  입력 토큰과 잘못 수정한 파일 수를 함께 줄여야 한다.

그래프가 의미 검색에서 벡터 RAG보다 낮아도 실패라고 볼 필요는 없다. 벡터 검색이 잘하는 일은 벡터 검색에 맡기고, 그래프가 필요한 질문에서 이기는 혼합 구조가 더 현실적이다.

코딩 에이전트에는 그래프 전체가 아니라 근거 묶음을 준다

지식그래프를 만들고 나면 전체 그래프를 에이전트 프롬프트에 넣고 싶어진다. 하지만 컨텍스트 창이 크다고 검색 문제가 사라지는 것은 아니다. Lost in the Middle 연구는 긴 입력에서 관련 정보의 위치에 따라 모델의 활용 성능이 달라질 수 있음을 보여줬다.

에이전트에는 현재 작업에 필요한 작은 근거 묶음만 전달해야 한다.

지속 규칙은 AGENTS.md 같은 파일에 둔다. 세션을 넘어 보존할 관찰은 메모리 계층에 둔다. 변경 가능한 업무·문서·코드 사실은 검색 시점에 다시 가져온다.

이 차이는 OpenClaw는 context와 memory를 어떻게 관리하나에서 제품 사례를 중심으로 더 자세히 다뤘다.

읽기 전용 컨텍스트 제공자부터 만든다

첫 버전에서 그래프를 수정하는 도구까지 만들 필요는 없다. 에이전트가 근거를 찾고 확장할 수 있는 읽기 도구만으로 충분하다.

text
searchEntities(query, filters)
getEntity(id)
expandRelations(id, relationTypes, depth)
getEvidence(claimId)
getDecisionTrace(entityId, timeRange)
getChangeImpact(ontologyElementId)

응답은 최종 자연어 답변보다 구조화된 근거여야 한다.

json
{
  "id": "component:auth-gateway",
  "kind": "entity",
  "canonicalName": "인증 게이트웨이",
  "aliases": ["API Gateway", "게이트웨이"],
  "status": "active",
  "relationPath": ["service:order", "DEPENDS_ON", "component:auth-gateway"],
  "citations": [
    {
      "uri": "repo://architecture/gateway.md",
      "locator": "인증 흐름"
    }
  ],
  "tokenEstimate": 180
}

MCP는 이런 자원과 도구를 에이전트에 노출하는 표준 경계로 사용할 수 있다. 다만 MCP 서버를 만들었다고 검색 품질이 자동으로 좋아지는 것은 아니다. 검색 순위, 별칭 판정, 권한, 최신성, 중복 제거, 토큰 예산은 제공자 내부의 책임이다. MCP 공식 아키텍처 문서도 MCP가 컨텍스트 교환을 표준화하지만, 애플리케이션이 컨텍스트를 어떻게 선택하고 관리할지는 규정하지 않는다고 설명한다.

프로젝트 지침을 어떤 형태로 전달할지는 AGENTS.md 포맷도 함께 참고할 수 있다.

읽기 이후에는 후보 주장만 되돌려 쓴다

읽기 전용 제공자가 안정화된 뒤에도 에이전트가 정식 그래프를 직접 수정하게 해서는 안 된다. 작업 중 발견한 지식은 우선 근거가 딸린 후보 주장으로 되돌려 쓴다.

예를 들어 테스트 실패를 보고 새로운 의존 관계를 추론했다면 실패 로그, 패키지 선언, 실제 임포트 위치를 연결한 뒤 후보로 남긴다. 검증을 통과한 경우에만 정식 관계로 승격하고, 나중에 재평가할 수 있도록 승인과 대체 이력도 보존한다.

MCP와 A2A는 다른 경계를 다룬다

두 프로토콜은 경쟁 관계라기보다 연결 대상이 다르다.

경계주된 역할이 글에서의 사용
MCP에이전트와 도구, 자원, API 연결개체 검색, 관계 확장, 근거 조회를 제공한다
A2A독립 에이전트 사이의 발견, 위임, 결과 공유원격 전문 에이전트에 작업을 맡기고 결과를 받는다

A2A 공식 문서도 MCP를 에이전트와 도구·자원의 연결로, A2A를 독립 에이전트 사이의 협업으로 구분한다. 단일 코딩 에이전트가 지식그래프를 조회하는 단계에는 MCP로 충분하다. 서로 다른 권한과 수명 주기를 가진 원격 에이전트가 협업할 때만 A2A 같은 에이전트 간 경계를 추가하는 편이 단순하다.

작은 실험으로 시작한다

처음부터 완성된 조직 지식그래프를 만들려고 하면 모델링과 데이터 정제에 시간을 쓰다가 실제 가치를 확인하지 못할 수 있다.

나는 다음 순서로 실험해보려 한다.

역량 질문과 클래스 계약을 고정한다

  • 실제 코딩 작업과 기술 질문을 모은다.
  • 질문마다 필요한 클래스, 관계, 근거를 연결한다.
  • 클래스마다 포함 예와 제외 예를 작성한다.
  • 어떤 질문에도 쓰이지 않는 클래스는 후보로 내린다.

별칭 골든셋을 만든다

  • 동일한 표현 쌍
  • 상위·하위 표현 쌍
  • 관련 있지만 다른 표현 쌍
  • 문자열은 비슷하지만 다른 표현 쌍
  • 문맥 없이는 판정할 수 없는 표현 쌍

API Gateway와 Gateway API 같은 어려운 반례를 반드시 포함한다.

세 검색 방식을 비교한다

  • 벡터 RAG
  • 그래프 검색
  • 혼합 검색

질문 유형별 근거 회수율, 정답률, 인용 정확도, 토큰, 도구 호출 수를 같은 조건에서 비교한다.

읽기 전용 제공자를 붙인다

MCP 서버, 로컬 CLI, REST API 중 하나만 선택한다. 에이전트가 전체 그래프를 받지 않고도 개체, 관계, 원문 근거를 단계적으로 확장할 수 있는지 확인한다.

언제 지식그래프를 만들지 말아야 할까

다음 조건에서는 벡터 RAG와 메타데이터 필터만으로 충분할 수 있다.

  • 질문이 대부분 한 문서 안에서 끝난다.
  • 개체 동일성과 관계 경로가 답에 중요하지 않다.
  • 원천 데이터가 자주 바뀌지만 변경 이력을 관리할 여력이 없다.
  • 클래스와 관계의 소유자를 정할 수 없다.
  • 평가 질문과 정답 근거를 만들 수 없다.

반대로 다음 요구가 반복되면 그래프의 가치가 커진다.

  • 여러 문서와 시스템을 잇는 질문
  • 별칭과 개체 동일성 해소
  • 의존성, 소유권, 인과, 시간 관계 탐색
  • 결정과 근거의 추적
  • 변경 영향 분석
  • 사람과 에이전트가 같은 의미 계약을 공유해야 하는 상황

그래프의 장점은 정보를 많이 담는 데 있지 않다. 어떤 경로로 답에 도달했고, 그 관계를 왜 믿을 수 있는지 설명하는 데 있다.

남은 판단

이번 조사를 통해 클래스가 먼저라는 생각은 더 분명해졌다. 클래스는 보기 좋은 분류표가 아니라, 어떤 데이터를 인스턴스로 받아들이고 어떤 관계를 허용할지 결정하는 실행 계약이다.

동시에 온톨로지를 잘 만들었다는 것과 실제 검색이 좋아졌다는 것은 다른 문제다. 클래스와 관계는 역량 질문으로 검증하고, 검색과 에이전트 성능은 벡터 RAG·그래프·혼합 검색을 같은 조건에서 비교해야 한다.

앞으로 가장 먼저 해볼 일은 거대한 온톨로지를 만드는 것이 아니다. API Gateway 주변의 작은 클래스와 별칭 골든셋을 만들고, 몇 개의 다단계 질문에서 그래프가 실제로 더 나은 근거를 찾아오는지 측정하는 일이다.

영상의 여러 발표도 문제와 의사결정, 데이터에서 출발해야 한다는 방향을 공유한다. 다만 환각 제거, 정확도 향상, 비용 절감처럼 수치로 제시된 효과 가운데 공개된 평가 설계와 원자료로 재현하기 어려운 내용은 이 글의 근거로 사용하지 않았다. 실제 도입 판단은 이 글에서 제시한 적재 지표와 검색·작업 평가로 다시 검증해야 한다.

참고 링크

  • 에이전틱 AI의 마지막 퍼즐, 온톨로지
  • Ontology Development 101
  • W3C OWL 2 Primer
  • W3C OWL 2 Profiles
  • W3C SHACL
  • W3C PROV-O
  • OBO Foundry Term Stability
  • Ontology Evolution: A Survey
  • Retrieval-Augmented Generation
  • From Local to Global: A Graph RAG Approach
  • Microsoft GraphRAG Overview
  • Lost in the Middle
  • RepoCoder
  • Aider Repository Map
  • Model Context Protocol Architecture
  • A2A Protocol
  • Palantir Ontology Overview
  • Ontology Population using LLMs
  • Accelerating Knowledge Graph and Ontology Engineering with Large Language Models
  • Sourcegraph Cody Context
  • Continue Custom Context Providers
  • LinkedIn Knowledge Graph
  • Airbnb Knowledge Graph
on this page
  • 01그래프 데이터베이스보다 온톨로지가 먼저다
  • OWL 2는 무엇인가
  • OWL 2는 데이터 검증 언어가 아니다
  • 왜 OWL 2에도 여러 프로파일이 있는가
  • 이 프로젝트에 OWL 2가 바로 필요한가
  • 02클래스는 명사가 아니라 질문에서 나온다
  • 중간 수준의 클래스에서 시작한다
  • 03코딩 에이전트를 위한 최소 클래스 모델
  • 시스템 자산
  • 작업과 기록
  • 지식과 판단
  • 행위 주체
  • 행동과 통제
  • 04`API Gateway`와 `게이트웨이`는 같은가
  • 표현과 개체를 분리한다
  • 후보 생성과 최종 판정을 분리한다
  • 별칭도 변경 이력을 가진다
  • 05온톨로지에 데이터를 입히는 과정
  • 스키마를 LLM과 함께 제공한다
  • 적재 품질은 답변 품질과 따로 측정한다
  • 데이터 준비가 안 됐다면 온톨로지보다 먼저 고친다
  • 06관계는 간선보다 주장에 가깝다
  • 위험도에 따라 승인 기준을 다르게 둔다
  • 온톨로지는 고정된 분류표가 아니다
  • 07그래프가 벡터 RAG보다 좋은지 어떻게 증명할까
  • 질문을 유형별로 나눈다
  • 검색과 답변을 따로 평가한다
  • 비교 조건을 고정한다
  • 승리 조건을 미리 적는다
  • 08코딩 에이전트에는 그래프 전체가 아니라 근거 묶음을 준다
  • 읽기 전용 컨텍스트 제공자부터 만든다
  • 읽기 이후에는 후보 주장만 되돌려 쓴다
  • MCP와 A2A는 다른 경계를 다룬다
  • 09작은 실험으로 시작한다
  • 역량 질문과 클래스 계약을 고정한다
  • 별칭 골든셋을 만든다
  • 세 검색 방식을 비교한다
  • 읽기 전용 제공자를 붙인다
  • 10언제 지식그래프를 만들지 말아야 할까
  • 11남은 판단
  • 12참고 링크
tags
#심화

이런 글도

  • 권한·최신성·성능을 포함한 Neo4j 운영 설계
    운영 설계의 결론은 학습 환경과 제품 환경을 분리하는 것이다. Neo4j Community Edition은 로컬 학습과 단일 인스턴스 실습에 충분할 수 있지만, 사내 컨텍스트 제공자가 권한, 가용성, 백업, 운영 보안을 요구하면 Enterprise 또는 Aura 기능 범위를 따로 검토해야 한다. Text2Cypher는 특히 조심해야 한다. 읽기 전용 권한,...
    🤖 ai
    ai
    2026.07.30
  • GraphRAG 평가와 벡터 RAG 제거 실험
    GraphRAG 평가는 "답이 맞았다" 하나로 끝나면 안 된다. 이 글의 결론은, 그래프 구축 품질, 후보와 근거 회수, 최종 컨텍스트 정밀도와 재현율, 출처·최신성·권한·지연·비용을 단계별로 나누고, 반드시 벡터 전용 기준선과 제거 실험으로 비교해야 한다는 것이다. 그래프를 만들었다는 사실은 성공 기준이 아니다. 벡터 RAG가 놓친 관계형 질문에서, 권한...
    🤖 ai
    ai
    2026.07.30
  • 에이전트를 위한 Neo4j 컨텍스트 제공자 설계
    컨텍스트 제공자는 검색기를 감싼 얇은 함수가 아니다. 이 글의 결론은, 사내 에이전트에 붙이는 Neo4j 컨텍스트 제공자는 읽기 전용 도구이며 ACL 선필터, 출처, 최신성, 토큰 예산, 시간 제한, 출력 계약을 함께 보장해야 한다는 것이다. 그래프 탐색은 유용하지만 위험도 크다. 관계 경로가 답처럼 보일수록, 그 경로를 누가 볼 수 있고 어떤 원문이 지지...
    🤖 ai
    ai
    2026.07.30
  • 벡터·전문·그래프 탐색을 결합한 하이브리드 검색
    벡터 검색만으로 놓치는 질문은 대부분 "가까운 문장"이 아니라 "연결된 사실"을 요구한다. 이 글의 결론은 단순하다. Neo4j GraphRAG의 하이브리드 검색은 벡터와 전문 검색으로 후보를 넓히고, VectorCypherRetriever나 HybridCypherRetriever로 관계를 확장한 뒤, 최종 컨텍스트는 반드시 원문 Document와 Chun...
    🤖 ai
    ai
    2026.07.30

댓글 (0)