Graph는 다양한 유형의 에이전트 메모리를 모델링하는 데 어떻게 도움이 될까요?
격리된 LLM 호출에서 에이전트 시스템으로 전환하려면 메모리 관리에 좀 더 신중하게 접근해야 해요. 이러한 시스템이 장기 기억에 더 많이 의존하게 되면서 발생할 수 있는 다양한 상황과 유형을 적절하게 처리할 수 있는 프로세스를 개발해야 하죠.
DeepLearning.AI Dev Day 컨퍼런스에서 LangChain의 CEO인 Harrison Chase의 강연이 이 글의 아이디어를 떠오르게 했어요. 거기서 그는 LangGraph가 메모리 관리에 접근하는 방법과 LangGraph가 식별하고 처리하는 다양한 유형의 메모리에 대해 이야기했죠. 그는 이게 새로운 영역이라는 걸 인정했지만, 그들이 개발하고 있는 아이디어는 이 문제를 해결하기 위한 견고한 기반을 제공하면서 해당 분야를 발전시키고 있어요. 이 글에서는 Neo4j와 같은 Graph Database에서 Harrison의 프레젠테이션 아이디어를 구현하고 확장하는 방법을 설명할 거예요.
이 글에서는 LLM 에이전트와 Graph Database에 익숙하다고 가정할게요.
단기 기억 (Short-Term Memory)
단기 기억은 일반적으로 일시적이며 단일 대화 스레드 내에 존재해요. 여기에는 대화 메시지 기록이 포함될 수 있고, 일반적으로 관리를 위해 외부 데이터베이스가 필요하지 않죠. 단기 기억은 일반적으로 메시지와 연결되어 있어서 긴 대화는 높은 토큰 수로 인해 성능 저하를 초래할 수 있어요. 반복적인 간격으로 이전 메시지의 요약을 처리하거나 생성하기 위해 LLM에 전달된 메시지 창을 유지함으로써 이 문제를 완화할 수 있어요. 그러면 이 메시지가 대신 LLM에 전달될 수 있죠. LangGraph 문서에서 단기 기억을 관리하는 방법에 대한 자세한 내용을 확인할 수 있어요.
장기 기억 (Long-Term Memory)
장기 기억을 통해 에이전트는 이전 대화의 정보에 접근할 수 있어요. 프롬프트 지침이나 몇 가지 예시를 반복하는 등 시스템 개선 사항을 알릴 수도 있죠. 다음 메모리 유형은 인간 메모리에 대한 이해를 바탕으로 하며, 이를 Graph Database에 구현하는 방법에 대한 예시를 포함하고 있어요. 이러한 예시는 코드 기반이라기보다는 개념적이지만, 개발을 위한 프레임워크를 제공할 거예요.
쓰기 메모리 (Writing Memory)
메모리를 쓰는 방법에는 핫 패스(hot path)와 백그라운드(background)의 두 가지 방법이 있어요. 핫 패스에 쓰기를 수행하려면 런타임 중에 메모리 쓰기가 발생해야 하죠. 이렇게 하면 에이전트는 업데이트를 즉시 사용할 수 있고, 이러한 프로세스를 공개해서 최종 사용자에게 더 나은 투명성을 제공할 수 있어요. 하지만 추가 처리 비용이 들고 대기 시간이 늘어날 수 있죠.
백그라운드에서 쓰기를 하면 기본 애플리케이션과 메모리 관리 시스템이 분리돼요. 이렇게 하면 메모리가 덜 정기적으로 업데이트되므로 에이전트가 지식 기반에 대한 잠재적인 업데이트를 놓치는 대신 중복 제거 작업으로 이어질 수 있어요. 두 가지 방법 모두 에이전트 메모리 관리에 사용할 수 있고, 각 메모리 유형에 대한 적절한 사용법은 아래에서 자세히 설명할게요.
메모리 유형 (Memory Types)
의미 기억 (Semantic Memory)
의미 기억은 세상에 관한 사실을 담고 있어요. 에이전트의 경우 이는 이름, 나이, 다른 사람과의 관계 등 사용자에 대한 정보일 수 있죠. 이는 RAG 파이프라인에 사용되는 문서 모음의 형태를 취할 수도 있어요. 이러한 유형의 메모리는 정보를 적절히 유지해야 하고 자주 변경될 수 있으므로 메모리를 적절하게 생성, 업데이트 및 삭제하는 것이 복잡해져요.
다음은 사용자 프로필에 대한 정보를 포함하는 가능한 Graph 데이터 모델이에요. 이 데이터 모델에서는 사용자가 다른 사용자와 맺은 관계뿐 아니라 그들이 참석한 이벤트도 추적할 수 있죠.
이것이 실제로 어떻게 보일 수 있는지에 대한 예시는 다음과 같아요. 입력된 질문에 따라 현재 사용자에 대한 정보를 동적으로 검색할 수 있죠. 예를 들어 질문에 사용자가 재미로 무엇을 하는지에 대한 지식이 필요한 경우, `쿼리(Query)`를 사용해서 사용자가 참석한 이벤트에 대한 정보를 얻을 수 있어요.
추억을 업데이트하는 과정은 다음과 같아요.
- 메모리로 쓸 대화의 항목이나 구조화되지 않은 텍스트를 준비해요.
- 상위 검색k준비된 수신 데이터와 유사한 데이터베이스의 메모리예요.
- 사용자 검색어에 새로운 정보나 충돌하는 정보가 있는지 확인해요.
- 새 `노드(Node)` 또는 값으로 기존 메모리를 업데이트해요.
- `관계(Relationship)`를 생성하거나 삭제해요.
의미론적 메모리는 핫 패스 업데이트에 적합해요. 이렇게 하면 에이전트가 사용자에게 오래된 정보를 전달하는 것을 방지할 수 있죠. 이 데이터는 일반적으로 RAG 파이프라인에서 사용되므로 향후 쓰기가 지연될 위험이 있어요.
에피소드 기억
에피소드 기억은 기억된 경험을 저장해요. 여기에는 이벤트 세부 정보 및 과거 에이전트 작업에 대한 정보가 포함되죠. 이러한 유형의 메모리에 대한 일반적인 사용 사례는 Few-Shot 프롬프트에요. 이전 질문-답변 쌍은 그래프에 저장되어 프롬프트에 예제를 제공하죠. 사용자 쿼리와 데이터베이스의 질문 사이에 유사성 검색을 수행하면 이를 수행할 수 있어요.
아래 이미지는 사용자 질문을 저장하는 그래프 데이터 모델과 데이터 검색에 사용되는 Cypher 쿼리를 보여줍니다. 유사성 검색과 간단한 그래프 순회를 사용하여 상위 항목을 검색할 수 있어요. k 데이터베이스에서 가장 관련성이 높은 예를 찾아 프롬프트에 삽입하여 새로운 Cypher 생성을 알리는 거죠.
Cypher는 Neo4j Graph Database에서 데이터를 검색하는 데 사용되는 쿼리 언어에요.
이것이 실제로 어떻게 보일 수 있는지에 대한 예는 다음과 같아요. 가능한 검색 방법은 데이터베이스의 질문 Vector Embedding에 대해 유사성 검색을 수행한 다음 관련 Cypher 쿼리를 탐색하는 것이죠. 상단 k 질문 텍스트와 Cypher 쿼리 문은 몇 가지 예시로 반환되고 형식화됩니다.
Cypher 쿼리에는 많은 질문이 있을 수 있어요. 이는 일부 사용자 질문의 명시적인 텍스트가 다를 수 있지만 의미상 의미는 동일하기 때문이죠.
추억을 업데이트하는 과정은 다음과 같아요.
- 에이전트는 Neo4j 데이터베이스에서 정보를 검색하기 위해 Cypher 쿼리를 생성해요.
- 사용자는 상담사가 반환한 결과를 좋음 또는 나쁨으로 평가하죠.
- 긍정적인 피드백은 향후 예제에 사용할 데이터베이스에 Cypher 쿼리와 질문을 작성하는 프로세스를 시작해요.
사용자 피드백을 받으면 에피소드 메모리가 백그라운드에서 더 잘 작성돼요. 이렇게 하면 결과적으로 성능이 저하될 수 있는 나쁘거나 도움이 되지 않는 기억이 포함되는 것을 방지할 수 있죠.
절차적 기억
절차 기억은 어떤 일을 하는 방법을 저장해요. 실생활에서 이러한 유형의 기억은 명시적인 행동에 대해 생각하지 않고 펜으로 글을 쓰거나 기타를 연주하는 데 도움이 되죠. 연습을 통해 이러한 행동은 우리 뇌에 내면화되었으며 더 이상 이를 수행하는 방법에 대해 생각할 필요가 없어요.
AI 시스템의 경우 절차적 메모리는 모델 가중치, 코드 및 프롬프트의 조합이에요. 이러한 유형의 메모리는 시스템 프롬프트, 도구 설명 및 지침을 저장하는 데 일반적으로 사용돼요. 프롬프트는 우리가 가장 쉽게 접근할 수 있기 때문이죠. 이러한 메모리는 최종 사용자 또는 판사로서의 LLM과 같은 다른 시스템의 피드백 루프에서 업데이트될 수 있어요. 연습과 피드백을 통해 글쓰기를 배운 것처럼 에이전트는 내부 지침 세트를 개선하여 작업을 배울 수 있죠.
여기서 그래프 데이터 모델은 프롬프트에 대한 정보를 저장해요. 여기에는 특정 사용 사례에 대한 시스템 및 사용자 메시지가 모두 포함되죠.
이는 데이터가 Text2Cypher 에이전트를 찾는 방법이에요. 가능한 검색 전략은 새 채팅 세션이 시작될 때마다 이러한 프롬프트를 검색하는 것이죠. 이렇게 하면 이전 세션 이후에 이루어진 모든 업데이트가 구현돼요.
일화 기억과 절차 기억의 차이점에 주목하세요. 암호 생성의 예에서 일화 기억은 명시적 질문과 암호 쌍을 회상하는 반면, 절차 기억은 암호 생성 방법을 회상해요.
추억을 업데이트하는 과정은 다음과 같아요.
- 일련의 프롬프트, 답변, 피드백 트리플이 입력으로 수집돼요.
- LLM은 이 시리즈를 수강하고 제공된 피드백을 준수하는 새로운 프롬프트를 생성하죠.
- 이 새로운 프롬프트는 데이터베이스에 기록돼요.
절차적 기억은 또한 피드백이 수신되면 백그라운드에서 작성되는 데 적합해요. 프롬프트 개선의 예에서는 개선을 수행하는 LLM이 사용자 기반의 보다 대표적인 샘플과 일치할 수 있도록 많은 피드백 응답이 수신될 때까지 기다리는 것이 가장 좋죠.
시간 기억
시간 기억은 시간이 지남에 따라 데이터가 어떻게 변하는지 저장해요. 이는 이전에 논의된 모든 유형에 적용될 수 있으며 에이전트가 상황이 어떻게 변경되었는지 인식할 수 있게 해주죠. 사용자 프로필의 의미 기억을 저장하는 예에서 몇 가지 방법으로 시간 기억을 구현할 수 있어요. 하나는 다른 사용자와의 HAS_FRIEND 관계에 타임스탬프를 포함하여 개인적인 관계의 시작과 끝을 식별하는 것이죠. 다른 하나는 버전을 유지하려는 Node 간에 이전 관계를 구현하는 것이에요. 아래 예에서는 사용자 설명을 자체 UserDescription Node로 가져와 이러한 방식으로 추적해요. 아래 이미지는 의미 기억과 시간 기억을 통합한 업데이트된 사용자 프로필 데이터 모델을 보여줍니다.
사용자 설명이 몇 달에 걸쳐 업데이트된 이 데이터의 적용된 버전을 볼 수 있어요. User node에는 최신 UserDescription과의 HAS_CURRENT_DESCRIPTION 관계만 있죠. 이렇게 하면 검색이 더 쉬워져요. 또한 Bob은 최근까지 Alice와 친구였답니다.
또 다른 예는 절차적 메모리 유형을 사용하여 프롬프트 버전을 추적하는 건데요. 여기에는 프롬프트 이름을 가진 기본 프롬프트 node가 있어요. 최신 버전에 대해 PREVIOUS 관계를 갖는 일련의 UserPromptDetails 또는 SystemPromptDetails node에 연결되죠. 이를 통해 이전 버전에 쉽게 액세스하여 변경 사항을 감사하거나 되돌릴 수 있도록 하면서 프롬프트를 검색할 수 있답니다.
프롬프트 내용 및 매개변수의 변경 사항에 쉽게 액세스할 수 있는 Text2Cypher 에이전트에 대해 이 데이터 모델이 적용된 버전을 볼 수 있어요.
요약
에이전트 메모리는 GenAI에서 빠르게 진화하는 많은 개념 중 하나에요. AI의 다른 많은 측면과 마찬가지로, 이것이 인간에게 작동하기 위해 어떻게 이해하는지에 따라 초기 모델을 기반으로 하는 것이 합리적이죠. 해리슨과 팀은 메모리 관리에 대한 이러한 아이디어가 미래에 바뀔 수 있다는 점을 인정하지만 이는 이러한 개념에 대해 생각하기 시작하는 효과적인 방법을 제공한답니다.
이 기사의 데이터 모델은 다음과 같아요. . 그리고 LangGraph의 메모리 문서도 확인해 보세요.
- Agents
- 데이터 모델링
에이치시스템즈의 LogTree는 Neo4j 기반 GraphRAG 플랫폼으로, 데이터를 자동으로 지식그래프화하고 자연어 질의로 즉시 답을 제공합니다.
'Agent AI' 카테고리의 다른 글
| Neo4j, GenAI에 1억 달러 투자 및 핵심 Agentic AI 혁신 출시 (0) | 2026.04.13 |
|---|---|
| Needle StarterKit 2.0: 템플릿, 챗봇, 그리고 더 많은 기능으로 시작하세요! (0) | 2026.04.13 |
| MCP 서버 시작하기: 기술 심층 분석 (2) | 2026.04.12 |
| 레니의 기억을 만나다: AI 에이전트를 위한 Context Graph 구축 (0) | 2026.04.12 |
| 마하바라타 서사시를 되살리다: Google Gemini로 구동하는 Neo4j 챗봇 (2부) (0) | 2026.04.12 |
