Week 7. 온톨로지 기반 에이전트 설계
규칙 기반 액션 플래닝, 멀티 에이전트 협업, SHACL 검증
학습 목표
이 튜토리얼을 완료하면 다음을 할 수 있습니다:
- 온톨로지를 활용한 Action Plan 생성
- 규칙 기반 에이전트 의사결정
- 멀티 에이전트 간 온톨로지 공유
- SHACL을 이용한 액션 검증
핵심 개념
1. 왜 온톨로지 기반 에이전트인가?
"GPS 내비게이션" 비유
LLM을 강력한 스포츠카 엔진이라고 생각해보세요. 엄청난 속도와 파워(추론 능력)를 가졌지만, 도로의 규칙이나 지도는 모릅니다. 그냥 달리면 낭떠러지로 떨어질 수 있습니다(Hallucination).
온톨로지는 GPS 지도이자 교통 법규입니다.
- 유효한 도로: 실제로 수행 가능한 액션은 무엇인가?
- 교통 규칙: 진입 조건(Precondition)은 무엇인가? (예: "결제 완료" 상태여야 "배송" 가능)
LLM(엔진) 과 온톨로지(지도) 를 결합해야만, 목적지까지 안전하게 도달하는 자율주행차(Agent) 를 만들 수 있습니다.
LLM 에이전트의 한계
일반 LLM 에이전트:
- "주문 취소해줘" → 취소 프로세스 추론 (환각 가능)
온톨로지 기반 에이전트:
- 온톨로지에 정의된 취소 규칙/절차 참조
- 허용된 액션만 수행, 검증 가능2. 액션 온톨로지 설계
# 도메인 액션 온톨로지
class ActionOntology:
actions = {
"CancelOrder": {
"preconditions": [
"order.status == 'pending'",
"order.created_at > now() - 24h"
],
"effects": [
"order.status = 'cancelled'",
"user.refund = order.amount"
],
"required_permissions": ["customer", "admin"]
},
"RefundOrder": {
"preconditions": [
"order.status == 'delivered'",
"order.delivered_at > now() - 7d"
],
"effects": [
"order.status = 'refunded'",
"user.refund = order.amount"
],
"required_permissions": ["admin"]
}
}3. 규칙 기반 플래너
class OntologyGuidedPlanner:
def __init__(self, action_ontology, state_graph):
self.ontology = action_ontology
self.graph = state_graph
def get_valid_actions(self, current_state, user_permissions):
"""현재 상태에서 가능한 액션 목록 반환"""
valid_actions = []
for action_name, action_def in self.ontology.actions.items():
# 권한 체크
if not any(p in user_permissions for p in action_def["required_permissions"]):
continue
# 전제조건 체크
if self._check_preconditions(action_def["preconditions"], current_state):
valid_actions.append(action_name)
return valid_actions
def plan(self, goal, current_state, user_permissions):
"""목표 달성을 위한 액션 시퀀스 생성"""
valid_actions = self.get_valid_actions(current_state, user_permissions)
# LLM에게 유효한 액션만 제공
prompt = f"""
목표: {goal}
현재 상태: {current_state}
가능한 액션: {valid_actions}
최적의 액션 시퀀스를 선택하세요.
"""
return self.llm.invoke(prompt)4. 멀티 에이전트 온톨로지 공유
# 공유 온톨로지 서버
class SharedOntologyServer:
def __init__(self):
self.ontology_graph = Graph()
self.load_base_ontology()
def register_agent(self, agent_id, capabilities):
"""에이전트 등록 및 역할 할당"""
self.ontology_graph.add((
URIRef(f"agent:{agent_id}"),
RDF.type,
AGENT.Agent
))
for cap in capabilities:
self.ontology_graph.add((
URIRef(f"agent:{agent_id}"),
AGENT.hasCapability,
URIRef(f"cap:{cap}")
))
def query_capable_agents(self, required_capability):
"""특정 역량을 가진 에이전트 조회"""
query = f"""
SELECT ?agent WHERE {{
?agent agent:hasCapability cap:{required_capability}
}}
"""
return self.ontology_graph.query(query)
# 에이전트 협업
class CollaborativeAgent:
def __init__(self, agent_id, ontology_server):
self.id = agent_id
self.server = ontology_server
def delegate_task(self, task):
"""온톨로지 기반으로 적절한 에이전트에게 위임"""
required_cap = self._analyze_required_capability(task)
capable_agents = self.server.query_capable_agents(required_cap)
return self._select_best_agent(capable_agents, task)5. SHACL 검증
from pyshacl import validate
# SHACL 규칙 정의
shacl_shapes = """
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix ex: <http://example.org/> .
ex:OrderCancelShape a sh:NodeShape ;
sh:targetClass ex:CancelAction ;
sh:property [
sh:path ex:targetOrder ;
sh:property [
sh:path ex:status ;
sh:in ("pending" "processing") ;
] ;
] .
"""
# 액션 검증
def validate_action(action_graph, shacl_shapes):
conforms, results_graph, results_text = validate(
action_graph,
shacl_graph=shacl_shapes,
inference='rdfs'
)
return conforms, results_text면접 질문 맛보기
Q: 온톨로지 기반 에이전트의 장점은?
- 검증 가능성: 모든 액션이 규칙에 따라 검증됨
- 설명 가능성: 왜 그 액션을 선택했는지 추적 가능
- 일관성: 도메인 규칙 일관되게 적용
- 확장성: 새 규칙 추가로 행동 확장
더 많은 면접 질문은 Premium Interviews (opens in a new tab)에서 확인하세요.
🎬 프로젝트: 영화 추천 지식그래프
진행 현황
| Week | 주제 | 프로젝트 마일스톤 |
|---|---|---|
| 1 | 온톨로지 입문 | ✅ 영화 도메인 설계 완료 |
| 2 | RDF & RDFS | ✅ 영화 10편 RDF 변환 완료 |
| 3 | OWL & 추론 | ✅ 추론 규칙 적용 완료 |
| 4 | 지식 추출 | ✅ 영화 100편 자동 수집 완료 |
| 5 | Neo4j | ✅ 그래프 DB 구축 완료 |
| 6 | GraphRAG | ✅ 자연어 질의 시스템 완료 |
| 7 | 온톨로지 에이전트 | 새 영화 자동 업데이트 에이전트 |
| 8 | 도메인 확장 | 의료/법률/금융 케이스 |
| 9 | 서비스 배포 | API + 대시보드 |
Week 7 마일스톤: 영화 지식그래프 자동 업데이트 에이전트
새 영화가 개봉하면 자동으로 정보를 수집하고 지식그래프에 추가하는 에이전트를 구축합니다.
에이전트 아키텍처:
[Scheduler] 매일 00:00 실행
↓
[Monitor Agent] 새 개봉 영화 감지
↓ 새 영화 발견
[Extractor Agent] 위키피디아/IMDB에서 정보 추출
↓
[Validator Agent] 온톨로지 스키마 검증
↓ 검증 통과
[Updater Agent] Neo4j에 추가
↓
[Notifier Agent] Slack 알림 전송에이전트 도구:
search_new_movies: 최근 개봉 영화 검색extract_movie_info: 영화 상세 정보 추출validate_schema: 온톨로지 스키마 검증add_to_graph: Neo4j에 노드/관계 추가send_notification: 업데이트 알림 전송
온톨로지 기반 플래닝:
# 온톨로지 규칙: 영화 추가 시 필수 관계
REQUIRED_RELATIONS = [
("Movie", "DIRECTED", "Person"), # 감독 필수
("Movie", "HAS_GENRE", "Genre"), # 장르 필수
]프로젝트 노트북에서 새 영화를 자동으로 수집하는 에이전트를 구현합니다.
프로젝트 노트북에서는 다음을 직접 구현합니다:
- LangGraph로 멀티 에이전트 파이프라인 구성
- Monitor → Extractor → Validator → Updater 체인
- 온톨로지 규칙 기반 액션 검증 (SHACL)
- Slack 알림으로 업데이트 통보
9주 후 완성되는 것: "놀란 감독 스타일의 SF 영화 추천해줘"라고 물으면, 지식그래프에서 감독-장르-평점 관계를 추론하고 자연어로 답변하는 AI 에이전트
실습 노트북
이론을 더 깊이 탐구하고 싶다면:
실습 노트북에서는 추가로 다음 내용을 다룹니다:
- 에이전트 도구(Tool) 정의 패턴
- 멀티 에이전트 협업 프로토콜
- SHACL 규칙 작성 및 검증
- 에이전트 디버깅 및 모니터링
다음: Week 8: 도메인 프로젝트