Agentic Knowledge Graph: 그래프를 도구이자 기억으로, temporal KG

Agentic Knowledge Graph — 그래프를 도구(읽기)이자 기억(write-back)으로 에이전트 ↔ 그래프 — 도구이자 기억 지식 그래프 신규 에이전트 검색·추론·행동 도구 NL→Cypher·탐색 기억 write-back 시간적 지식 그래프 t 사실 A 유효… 사실 B 추가 A 무효화 갱신 사실마다 유효 기간 — 언제부터·언제까지 참이었나
Agentic Knowledge Graph를 한 장으로 — 에이전트가 그래프를 도구(자연어→Cypher로 탐색하는 읽기)이자 기억(새 사실을 write-back하는 쓰기)으로 쓴다. 사실마다 유효 기간이 붙어 시간과 함께 자라는 시간적 지식 그래프가 된다.

들어가며

이 글은 Agentic Knowledge Graph Curriculum7단계이자 이 시리즈의 심장입니다. 지금까지 우리는 그래프를 짓고(4단계), 검색하고(5단계), 예측·추론했습니다(6단계). 이 모든 것을 지금까지는 사람이 설계한 파이프라인이 수행했습니다. 이제 그 주체를 바꿉니다 — 에이전트가 그래프를 스스로 씁니다.

“Agentic”이 더하는 것은 두 가지입니다. 첫째, 그래프를 도구(tool)로 — 에이전트가 자연어 질문을 Cypher로 번역하거나 그래프 탐색을 스스로 계획해 답을 만듭니다. 둘째, 그래프를 기억(memory)으로 — 대화·관찰에서 얻은 새 사실을 그래프에 써 넣어(write-back) 시간이 지날수록 자라는 그래프를 만듭니다. 읽기 전용이던 그래프가 읽고 쓰는 살아있는 기억이 되는 것 — 이것이 Agentic Knowledge Graph의 본질입니다.

📌 이 글에서 다루는 내용

  • 그래프를 도구로: text-to-Cypher(자연어→그래프 질의), 질의 계획, 에이전트가 스스로 그래프를 탐색해 답을 만드는 방식과 그 신뢰 문제
  • 그래프를 기억으로: write-back, 시간적 지식 그래프(temporal KG), 사실의 유효 기간·버전·무효화, Graphiti/Zep식 에이전트 메모리
  • 에이전트 아키텍처: 검색–추론–행동 루프, GraphRAG·벡터·그래프 도구의 오케스트레이션, 신뢰와 평가

한눈에 보기 — 도구, 기억, 그리고 루프

에이전트와 그래프의 관계는 두 방향입니다 — 그래프에서 읽고(도구), 그래프에 쓴다(기억). 이 둘이 검색–추론–행동 루프 안에서 돌며 그래프를 자라게 합니다.

flowchart TD
    USER["사용자 / 환경"] --> AGENT

    subgraph LOOP["에이전트 루프"]
        AGENT["에이전트<br/>검색 · 추론 · 행동"]
        AGENT -->|"① 도구: NL→Cypher·탐색"| READ["그래프 읽기<br/>질의 계획 · 다중 홉"]
        READ --> REASON["추론 · 답 생성"]
        REASON -->|"② 기억: write-back"| WRITE["그래프 쓰기<br/>새 사실 · 유효 기간"]
    end

    READ -.-> KG[("시간적 지식 그래프")]
    WRITE -.-> KG
    KG -.->|"다음 턴의 문맥"| AGENT
    REASON --> USER

이 그림의 좌표는 하나입니다 — 그래프가 루프의 바깥에 있는 정적 DB가 아니라, 루프 안에서 읽히고 쓰이며 자라는 살아있는 기억이라는 것. 이 되먹임이 Agentic KG를 이전 단계들과 가릅니다.

그래프를 도구로 — 에이전트가 스스로 질의한다

text-to-Cypher와 질의 계획

가장 직접적인 방식은 에이전트에게 그래프 질의를 도구로 쥐여 주는 것입니다. 사용자가 자연어로 물으면, 에이전트가 그래프 스키마를 참고해 Cypher/SPARQL로 번역(text-to-Cypher)하고, 실행하고, 결과를 자연어로 답합니다.

# 에이전트 도구로 등록한 그래프 질의 (개념 스니펫)
def graph_query(cypher: str) -> list[dict]:
    """스키마에 맞는 Cypher를 실행해 결과를 반환한다."""
    return neo4j.run(cypher)

# 에이전트: 스키마를 시스템 프롬프트에 싣고, 질문을 Cypher로 번역해 이 도구를 호출
#   Q: "김지수와 3다리 안에 연결된 사람은?"
#   → MATCH (p:Person {name:'김지수'})-[*1..3]-(o:Person) RETURN DISTINCT o.name

단순 번역을 넘어, 어려운 질문은 질의 계획(query planning)이 필요합니다 — 한 번의 질의로 안 되면 에이전트가 스스로 여러 단계로 쪼개(먼저 개체를 찾고 → 그 이웃을 탐색하고 → 조건으로 거르고), 중간 결과를 보며 다음 질의를 정합니다. 6단계의 다중 홉 추론이 여기서 에이전트의 능동적 탐색으로 살아납니다.

질의 계획 — 어려운 질문 하나를 여러 그래프 질의로 분해 text-to-Cypher 질의 계획 — 쪼개서 탐색한다 자연어 질문 "미리내 팀과 3다리 안에 연결되고 ML을 하는 사람은?" 질의 계획 (query planning) 1 개체 찾기 MATCH (t:Team {name:'미리내'}) 중간 결과 2 이웃 탐색 (다중 홉) MATCH (t)-[*1..3]-(p:Person) 3 조건으로 거르기 → 답 WHERE p.skill='ML' RETURN p 중간 결과로 재계획
에이전트는 한 번에 풀 수 없는 질문을 여러 그래프 질의로 분해한다 — 개체를 찾고(①), 이웃을 탐색하고(②), 조건으로 거른다(③). 각 단계의 중간 결과를 보고 다음 질의를 다시 계획하는 것이 질의 계획이다.

도구를 여럿 쥐여 주기

실전 에이전트는 그래프 질의 하나만 쓰지 않습니다. 5단계 GraphRAG의 local/global 검색, 벡터 검색, 6단계의 링크 예측을 각각 도구로 쥐고, 질문에 따라 골라 씁니다 — 사실 조회는 그래프 질의로, 전체 요약은 global search로, “비슷한 것”은 벡터로. 이 도구 선택과 조합이 에이전트 설계의 핵심입니다.

flowchart TD
    Q["질문"] --> ROUTE{"에이전트<br/>도구 선택"}
    ROUTE -->|"사실 조회"| GQ["그래프 질의<br/>text-to-Cypher"]
    ROUTE -->|"전체 요약"| GG["GraphRAG<br/>global search"]
    ROUTE -->|"국소 근방"| GL["GraphRAG<br/>local search"]
    ROUTE -->|"비슷한 것"| VEC["벡터 검색"]
    ROUTE -->|"빠진 관계 추정"| LP["링크 예측"]
    GQ --> ANS["답 · 근거 경로"]
    GG --> ANS
    GL --> ANS
    VEC --> ANS
    LP --> ANS

여기엔 신뢰 문제가 따릅니다. 에이전트가 생성한 Cypher가 틀리거나(스키마 오해), 결과를 잘못 해석할 수 있습니다. 그래서 스키마 검증, 질의 실행 전 확인, 결과에 근거 경로 제시(1단계의 설명가능성) 같은 가드레일이 필요합니다.

그래프를 기억으로 — write-back과 시간적 KG

Agentic KG의 진짜 도약은 여기입니다. 에이전트가 그래프를 읽기만 하는 게 아니라, 대화·관찰에서 얻은 새 사실을 그래프에 써 넣습니다(write-back). 이 순간 그래프는 에이전트의 장기 기억이 됩니다.

왜 벡터 메모리가 아니라 그래프인가

많은 에이전트가 대화 기록을 벡터로 저장해 기억으로 씁니다. 하지만 벡터 메모리는 1단계에서 본 한계를 그대로 물려받습니다 — 흩어진 사실을 연결하지 못하고, “이 사용자에 대해 아는 것을 종합해줘” 같은 질문에 약합니다. 그래프 메모리는 사실을 개체·관계로 구조화해 저장하므로, 사용자·선호·사건이 하나의 연결된 기억으로 자랍니다.

시간적 지식 그래프(temporal KG)

기억에는 결정적 요구가 하나 있습니다 — 시간입니다. “김지수는 A팀 소속”이라는 사실은 한때 참이었지만 지금은 아닐 수 있습니다. 단순히 사실을 덮어쓰면 과거가 사라지고, 그냥 쌓기만 하면 모순된 사실이 공존합니다. 시간적 지식 그래프는 각 사실(엣지)에 유효 기간을 붙여 이를 해결합니다.

  • 유효 시간(valid time): 이 사실이 현실에서 언제부터 언제까지 참인가.
  • 기록 시간(transaction time): 이 사실을 그래프가 언제 알게 됐는가. (둘을 함께 다루면 bi-temporal)
  • 무효화(invalidation): 새 사실이 옛 사실과 모순되면, 옛 사실을 지우는 대신 “여기까지 유효”로 닫고 새 사실을 엽니다.

이 접근이 실무 에이전트 메모리 프레임워크의 뼈대입니다 — 예를 들어 Graphiti(Zep의 오픈소스 엔진)는 대화·이벤트에서 사실을 추출해 bi-temporal 그래프로 쌓고, 모순되는 사실을 무효화하며 시간을 관통하는 질의(“그때 김지수는 어느 팀이었나?”)에 답합니다. 사실을 지우지 않고 시간에 걸쳐 축적하기에, 에이전트가 “언제부터 이 선호가 바뀌었지?” 같은 질문에도 답할 수 있습니다.

# 사실이 시간에 걸쳐 무효화·갱신되는 모습 (개념)
(김지수)-[:소속 {valid_from:2024-01, valid_to:2025-06}]->(A팀)   # 닫힘
(김지수)-[:소속 {valid_from:2025-06, valid_to:null    }]->(B팀)   # 현재 유효
시간적 지식 그래프 — 사실을 지우지 않고 유효 기간을 닫아 무효화 사실은 덮어쓰지 않는다 — 유효 기간을 닫고 새로 연다 김지수 t 2024-01 2025-06 현재 :소속 → A팀 valid_from 2024-01 · valid_to 2025-06 valid_to 닫힘 (무효화) :소속 → B팀 valid_from 2025-06 · valid_to null 현재 유효 (열림) 과거 사실을 지우지 않아 "그때 김지수는 어느 팀?" 같은 시간 관통 질의에 답할 수 있다
시간적 지식 그래프의 무효화 — "김지수 소속 A팀"을 지우는 대신 valid_to를 2025-06으로 닫고, "소속 B팀"을 valid_to: null새로 연다. 과거가 보존되므로 그때의 사실도 질의할 수 있다.

에이전트 아키텍처 — 검색·추론·행동 루프

이 모두를 하나로 묶으면 검색–추론–행동 루프가 됩니다.

  1. 검색(retrieve): 그래프 도구·GraphRAG·벡터로 관련 사실을 모읍니다.
  2. 추론(reason): 모은 사실로 답을 만들거나 다음 행동을 정합니다. 필요하면 질의를 다시 계획합니다.
  3. 행동(act): 사용자에게 답하고, 새로 알게 된 사실을 그래프에 write-back합니다.

이 루프가 돌 때마다 그래프가 자라고, 자란 그래프가 다음 턴의 문맥이 됩니다. 대표 응용은 분명합니다 — 개인 어시스턴트(대화가 쌓여 자라는 장기 기억), 리서치 에이전트(도메인 지식 그래프 위를 걸으며 근거를 추적하고 발견을 기록), 고객지원 에이전트(고객·이력·제품 그래프를 읽고 상호작용을 되써 넣기).

관통하는 과제는 신뢰와 평가입니다. 에이전트가 그래프에 쓰는 순간, 4단계의 검증·휴먼인더루프 원칙이 다시 결정적이 됩니다 — 잘못 써 넣은 사실은 미래의 모든 답을 오염시키기 때문입니다. write-back에 신뢰도·출처를 남기고, 중요한 갱신은 검수하고, 에이전트의 답을 근거 경로로 평가하는 것이 프로덕션의 필수 조건입니다.

정리

  • Agentic KG는 그래프의 주체를 에이전트로 바꿉니다: 사람이 짠 파이프라인이 아니라, 에이전트가 그래프를 스스로 읽고 씁니다.
  • 그래프를 도구로: text-to-Cypher와 질의 계획으로 에이전트가 능동적으로 탐색하고, GraphRAG·벡터·예측을 도구로 골라 씁니다 — 신뢰 가드레일이 필수입니다.
  • 그래프를 기억으로: write-back으로 새 사실을 축적하고, 시간적 지식 그래프가 유효 기간·무효화로 시간을 다룹니다. 벡터 메모리가 못 하는 연결된 기억이 여기서 생깁니다.
  • 검색–추론–행동 루프가 이 모두를 묶어 그래프를 자라게 합니다. 쓰는 순간 검증·휴먼인더루프가 다시 결정적이 됩니다 — 잘못 쓴 사실은 미래를 오염시킵니다.

다음 글에서는 1~7단계를 하나로 꿰어 end-to-end로 직접 구축하고, 헬스케어·금융·보안 등 도메인별 활용 사례를 집대성합니다.

다음 학습 (Next Learning)