튜토리얼
Week 7: 온톨로지 에이전트

Week 7. 온톨로지 기반 에이전트 설계

규칙 기반 액션 플래닝, 멀티 에이전트 협업, SHACL 검증


학습 목표

이 튜토리얼을 완료하면 다음을 할 수 있습니다:

  1. 온톨로지를 활용한 Action Plan 생성
  • 규칙 기반 에이전트 의사결정
  • 멀티 에이전트 간 온톨로지 공유
  1. 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온톨로지 입문✅ 영화 도메인 설계 완료
2RDF & RDFS✅ 영화 10편 RDF 변환 완료
3OWL & 추론✅ 추론 규칙 적용 완료
4지식 추출✅ 영화 100편 자동 수집 완료
5Neo4j✅ 그래프 DB 구축 완료
6GraphRAG✅ 자연어 질의 시스템 완료
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: 도메인 프로젝트