728x90
반응형
  • 에이전트 AI

레니의 기억을 만나보세요: AI 에이전트를 위한 완전한 메모리

lennys-memory.vercel.app

AI 에이전트는 조직의 업무 방식을 변화시키고 있지만, 메모리 문제가 있는 거 있죠. 에이전트에게 지난주 대화에 대해 물어보면 멍하니 쳐다볼 거예요. 조직 전체에 여러 에이전트를 배포하면 그들은 배운 내용을 공유할 수 없어요. 문제가 발생하면 에이전트가 그러한 결정을 내린 이유를 설명하는 감사 추적이 없다는 것도 문제고요.

업계에서는 AI 에이전트 메모리에 Graph Database가 필수적이라는 점을 인식하고 있어요. Zep, Cognee, Mem0 등과 같은 회사는 Neo4j를 사용하여 대화 및 엔터티 지식을 저장하는 인상적인 시스템을 구축했죠. 하지만 효과적인 컨텍스트 그래프를 구축하려면 세 가지 메모리 유형이 함께 작동해야 해요.

  • : 대화 기록 및 세션 상태
  • : 엔터티, 관계 및 학습된 기본 설정에 대한 정보
  • : 의사결정 추적, 도구 사용 감사 및 출처 확인

대부분의 기존 구현은 처음 두 가지를 포함하지만, 추론 메모리는 건너뛰는 경우가 많아요. 그게 없으면 결정을 설명하거나, 경험을 통해 배우거나, 예상치 못한 동작을 디버깅할 수 없거든요.

오늘 저희는 neo4j-agent-memory를 출시합니다! 이 프로젝트는 세 가지 메모리 유형을 모두 제공하는 Neo4j Labs 프로젝트예요. 프로덕션에서 AI 에이전트를 구축하는 고객과 직접 협력하여 개발한 모범 사례를 바탕으로 만들어졌죠. 이 라이브러리는 최신 에이전트 프레임워크(LangChain, Pydantic AI, LlamaIndex, OpenAI Agents, CrewAI 등)와 통합되고 전체 컨텍스트 그래프를 Neo4j에 저장하는 오픈 소스 Python 라이브러리랍니다.

GitHub – neo4j-labs/agent-memory: AI 에이전트 및 컨텍스트 그래프를 위한 그래프 네이티브 메모리 시스템이에요. 대화를 저장하고, Knowledge Graph를 구축하고, 에이전트가 자신의 추론을 통해 학습할 수 있도록 하세요. 이 모든 것은 Neo4j의 지원을 받습니다.

실제 사례 보기: Lenny's Memory

레니의 기억을 사용해 보세요 →

Lenny's Memory In Action의 스크린샷

프로젝트를 좀 더 구체적으로 보여드리기 위해 Lenny's Memory 데모 앱을 준비했어요. 이 앱은 300개 이상의 팟캐스트 에피소드, 그 중에서도 유명한 Lenny's Podcast 에피소드를 로드해서 완전한 기억을 가진 AI 에이전트를 통해 탐색할 수 있게 해줍니다.

저희는 에피소드를 neo4j-agent-memory에 로드해서 게스트, 회사, 주제, 위치, 그리고 그 관계를 추출했어요. 그런 다음 세 가지 메모리 유형을 모두 사용하는 19가지 전문 도구가 포함된 Pydantic AI로 채팅 에이전트를 만들었답니다.

`@neo4j-labs/agent-memory` 패키지를 사용하는 Lenny's Memory 데모 앱 아키텍처.

사람들과 그들의 아이디어에 대해 질문해 보세요.

“브라이언 체스키가 채용에 관해 뭐라고 말했나요?”

에이전트는 브라이언 체스키가 출연한 모든 에피소드를 검색하고 채용에 대한 그의 명언을 찾아서, 더 자세히 알아볼 수 있도록 에피소드 참조와 함께 답변을 정리해 줘요.

연결을 탐색해 보세요:

“어떤 게스트가 제품 시장 적합성과 가격 책정에 관해 이야기했나요?”

단순한 키워드 검색이 아니에요! 에이전트는 엔터티(사람, 회사, 개념)와 그 관계에 대한 Knowledge Graph를 탐색해서 의미 있는 교차점을 찾아낸답니다.

맞춤 추천을 받아보세요:

"제가 물어본 내용에 따르면 다음에는 어떤 에피소드를 들어야 할까요?"

에이전트는 여러분의 대화 기록과 학습된 선호도를 기억하고, 이를 사용해서 추천을 맞춤화해 줘요.

Knowledge Graph를 확인해 보세요:

대화형 시각화를 통해 게스트, 회사, 주제가 어떻게 연결되는지 탐색할 수 있어요. 관계를 확장하려면 Node를 두 번 클릭하세요. 엔터티 유형별로 필터링하고, 맥락을 파악하기 위해 Wikipedia가 강화된 카드를 확인해 보세요.

응답과 대화의 Knowledge Graph

컨텍스트 그래프를 위한 세 가지 유형의 메모리

컨텍스트 그래프를 완성하려면 세 가지 메모리 유형이 모두 필요해요. 대부분의 기존 솔루션은 처음 두 가지를 다루지만, 설명 가능성과 경험을 통한 학습에 필수적인 추론 메모리는 건너뛴답니다.

에이전트 메모리 유형 및 API

단기 기억: 방금 일어난 일

대화의 모든 메시지는 해당 메시지의 맥락, 즉 누가, 언제, 이전에 어떤 메시지가 왔는지와 함께 저장돼요. 이를 통해 상담원은 일관된 다단계 대화를 유지하고 채팅의 이전 부분을 참조할 수 있죠.

# The agent stores each message as you chat
await memory.short_term.add_message(
    session_id="user-123",
    role="user",
    content="What did Brian Chesky say about culture?",
    metadata={"source": "chat"}
)

# And can search across your conversation history
results = await memory.short_term.search_messages(
    "startup culture",
    session_id="user-123",
    limit=10
)

Lenny's Memory에서는 이것이 대화 흐름에 힘을 실어줘요. 상담원은 사용자가 두 개의 메시지 전에 요청한 내용을 알고 이를 기반으로 구축할 수 있답니다.

장기 기억: 상담사가 알고 있는 것

여기서부터 정말 흥미로워져요! 장기 기억은 개체와 그 관계에 대한 Knowledge Graph를 추출하고 저장해요. 팟캐스트에서 언급된 모든 게스트, 회사, 주제, 위치는 Node가 돼요. 관계가 그들을 연결하죠: 브라이언 체스키(Brian Chesky)가 에어비앤비를 설립했어요. 에어비앤비는 LOCATED_IN 샌프란시스코에 있어요. 브라이언은 에피소드 45에서 '채용'에 대해 논의했죠.

# Entities are automatically typed using the POLE+O model
# (Person, Organization, Location, Event, Object)
entity, dedup = await memory.long_term.add_entity(
    name="Brian Chesky",
    type="PERSON",
    description="Co-founder and CEO of Airbnb"
)

# Geospatial queries find locations within a radius
nearby = await memory.long_term.search_locations_near(
    latitude=37.7749,
    longitude=-122.4194,
    radius_km=50
)

추론 기억: 누락된 조각

이게 바로 대부분의 메모리 구현에서 부족한 부분이에요. 에이전트가 문제 해결(계획 단계, 도구 호출, 결과 평가)을 위해 추론할 때마다 해당 과정을 기록하는 거죠. 다음에 비슷한 작업이 생기면 뭐가 효과적이었는지 참고할 수 있도록요.

from neo4j_agent_memory import StreamingTraceRecorder

# Record the agent's reasoning process
async with StreamingTraceRecorder(
    memory.reasoning,
    session_id="user-123",
    task="Find episodes about pricing strategy"
) as recorder:
    step = await recorder.start_step(
        thought="I should search for pricing-related content",
        action="search_episodes"
    )
    await recorder.record_tool_call(
        tool_name="search_episodes",
        arguments={"query": "pricing strategy"},
        result=[{"title": "Ep 45: Pricing Your Product"}],
        status=ToolCallStatus.SUCCESS,
        duration_ms=145
    )

# Later: find similar successful reasoning
similar = await memory.reasoning.get_similar_traces(
    task="Find episodes about monetization",
    success_only=True
)

Lenny's Memory에서는 각 질문에 답하기 전에 에이전트가 이전에 비슷한 문제를 해결한 적이 있는지 확인해요. 만약 좋은 접근 방식을 찾았다면,"가격 전략" 질문이 있을 때 해당 패턴을 재사용해서“수익화” 질문에 활용할 수 있는 거죠.

추론 메모리가 설명 가능성을 가능하게 하는 이유

추론 메모리는 에이전트의 학습을 돕는 것 이상으로 AI 의사 결정을 투명하고 감사 가능하게 만들어 줘요.

모든 추론 추적은 전체 체인을 캡처하는데요.

  • 어떤 메시지가 작업을 트리거했는지,
  • 에이전트의 생각,
  • 호출한 도구(인수 및 결과 포함), 그리고
  • 접근 방식이 성공했는지 여부까지요.

이 구조를 사용하면 강력한 쿼리가 가능해져요.

// Find the reasoning behind a specific answer
MATCH (m:Message {content: "What did Brian say about hiring?"})
      -[:TRIGGERED]->(t:ReasoningTrace)
      -[:HAS_STEP]->(s:ReasoningStep)
      -[:USED_TOOL]->(tc:ToolCall)
RETURN s.thought, tc.tool_name, tc.arguments, tc.result

// Audit which data sources influenced a decision
MATCH (t:ReasoningTrace)-[:HAS_STEP]->()-[:USED_TOOL]->(tc:ToolCall)
WHERE t.task CONTAINS "recommendation"
RETURN tc.tool_name, count(*) AS usage, avg(tc.duration_ms) AS avg_latency

가 내장되어 있다는 점도 중요해요. 에이전트가 어떤 주장을 하면,추론 단계를 통해 다시 추적해서 정보를 제공하는 특정 도구 호출 및 데이터 소스를 확인할 수 있어요. 이는 규제 대상 산업, 예상치 못한 동작 디버깅, 사용자 신뢰 구축에 정말 중요하죠.

도 쿼리를 통해 가능해져요. 에이전트를 블랙박스로 취급하는 대신 “이 에피소드를 추천한 이유는 뭐지?”라고 질문할 수 있고, 사후 합리화가 아닌, 그 결정을 내리게 된 실제 추론의 흔적을 통해 구체적인 답변을 얻을 수 있는 거예요.

추론 메모리는 또한을 가능하게 해요. By 을 통해 성공 및 실패 추적을 분석하면 어떤 작업에 가장 적합한 도구, 에이전트가 어려움을 겪는 부분, 프롬프트 또는 도구 디자인을 최적화하는 방법을 식별할 수 있답니다.

엔터티 추출 파이프라인

팟캐스트 에피소드를 로드한다는 건 게스트, 회사, 컨셉, 위치 등 수천 개의 항목을 추출하는 걸 의미해요. 그런데 LLM 호출만으로 이 작업을 수행하는 건 느리고 비용도 많이 들죠.

그래서 저희는 다단계 파이프라인을 구축했어요.

엔터티 추출 파이프라인
  1. spaCy(~5ms, 무료): 빠른 통계 NER가 일반적인 항목을 잡아내요.
  2. GLiNER2(~50ms, 무료): 도메인별 스키마를 갖춘 제로샷 NER
  3. LLM 대체(gpt-4o-mini)(~500ms, 비용): 복잡한 사례에 대한 최고 정확도를 자랑하죠.

또한 파이프라인은 중복 제거(“Brian”이 “Brian Chesky”와 동일한 사람인가?), 관계 추출 및 선택적 Wikipedia 보강도 처리해요.

from neo4j_agent_memory.extraction import ExtractorBuilder

extractor = (
    ExtractorBuilder()
    .with_spacy(model="en_core_web_sm")
    .with_gliner_schema("podcast", threshold=0.5)  # 8 domain schemas available
    .with_llm_fallback(model="gpt-4o-mini")
    .with_merge_strategy("confidence")
    .build()
)
result = await extractor.extract(
    "Brian Chesky founded Airbnb in San Francisco in 2008"
)

# Extracts: Person(Brian Chesky), Organization(Airbnb), 
#           Location(San Francisco), Event(founding, 2008)

그래프 스키마

Neo4j에서 세 가지 메모리 유형을 연결하는 방법은 다음과 같아요.

단기, 장기, 추론 메모리를 하나의 연결된 그래프로 표현합니다.

이 스키마의 강점은 모든 것이 세 가지 메모리 유형 연결을 공유 `Node`를 통해 제공한다는 점이에요. 메시지는 다른 메시지에서 언급된 엔터티를 검색하는 도구를 사용하는 추론 추적을 트리거하죠.

이 상호 연결을 통해 다음과 같은 가 가능해져요. 예를 들어 “이 추천에 영향을 준 모든 엔터티를 보여주세요.” 라거나 "어떤 추론 패턴이 가장 높은 사용자 만족도를 이끌어냈는지." 와 같은 질문에 답할 수 있죠.

AI 에이전트 프레임워크와 통합

주요 디자인 목표는 neo4j-agent-memory 팀이 이미 사용하고 있는 프레임워크 및 플랫폼과 원활하게 통합되는 것이에요. 에이전트 아키텍처를 다시 작성하도록 강요하는 대신 기존 워크플로우에 연결되도록 설계되었죠.

Pydantic AI(Lenny의 Memory에 사용됨):

from neo4j_agent_memory.integrations.pydantic_ai import create_memory_tools
tools = create_memory_tools(client)
agent = Agent(model="gpt-4o", tools=tools)

Langchain

from neo4j_agent_memory.integrations.langchain import Neo4jAgentMemory
memory = Neo4jAgentMemory(client, session_id="user-123")
chain = ConversationChain(llm=llm, memory=memory)

OpenAI Agents:

from neo4j_agent_memory.integrations.openai_agents import Neo4jMemoryTool
tool = Neo4jMemoryTool(client)
agent = Agent(tools=[tool])

다음도 지원해요: LlamaIndex, CrewAI, 사용자 정의 도구나 메모리 백엔드를 허용하는 모든 프레임워크.

통합은 다음의 복잡성을 처리해 준답니다.

  • 비동기 작업,
  • 스트리밍 응답,

따라서 메모리 연결보다는 에이전트의 로직에 집중할 수 있어요.

그래프 기반 메모리가 조직에 중요한 이유

Vector Database는 AI 메모리 문제의 일부를 해결하죠. 즉, 과거 상호작용에 대한 Semantic Search를 가능하게 해요. 하지만 각 정보 조각을 고립된 `Embedding`으로 취급해서 지식을 가치 있게 만드는 연결을 놓치게 돼요.

그래프 기반 메모리는 벡터가 포착할 수 없는 것을 포착한답니다.

`Relationship`은 일급 시민이에요. Brian Chesky가 언급한 Airbnb의 문화는 단순한 텍스트가 아니죠. FOUNDED `Relationship`을 통해 조직에 연결된 사람이며 대화 내용이 출처로 저장되어 있어요. 그래프를 `Query`해서 찾아보세요. “가격 전략을 논의한 게스트가 언급한 모든 회사”처럼 모호한 유사성 일치가 아닌 정확한 답변을 얻을 수 있어요.

에이전트 전체에 걸쳐 지식이 결합돼요. 한 에이전트가 사용자가 자세한 기술 설명을 선호한다는 사실을 알게 되면 해당 선호도가 그래프에 저장되죠. 동일한 데이터베이스를 `Query`하는 다른 에이전트는 재교육이나 Prompt Engineering 없이 해당 지식을 상속받게 돼요.

결정을 감사할 수 있게 돼요. 이것이 추론 기억이 성과를 거두는 곳이죠. 규제 대상 산업에서는 AI 결정을 설명해야 해요. 그래프에 세 가지 메모리 유형이 모두 있으면 완전한 감사 추적이 가능해져요: 결정에 대한 정보를 제공한 데이터 소스, 에이전트가 취한 추론 단계, 과거에 유사한 접근 방식이 성공했는지 여부 등을 알 수 있죠.

통찰력은 구조에서 나와요. 그래프 분석은 플랫 데이터에서 보이지 않는 패턴, 즉 어떤 주제가 함께 클러스터되어 있는지, 어떤 개체가 서로 다른 대화를 연결하는지, 지식 격차가 존재하는 패턴을 보여줘요.
이러한 통찰력은 에이전트 행동 및 비즈니스 전략 모두에 정보를 제공하죠.

Neo4j-agent-memory는 그래프 모델링, 벡터 인덱싱, `Query` 최적화를 처리하는 세 가지 메모리 유형을 모두 제공해요.

AI 에이전트 메모리 부문에서 그래프가 유리한 이유

시장에선 AI 에이전트 메모리의 기반으로 Graph Database를 검증했어요.

새롭게 떠오르는 풍경을 한번 살펴볼까요?

  • Zep은 사용자, 세션, 사실을 연결하는 Knowledge Graph를 사용하여 AI 도우미를 위한 장기 기억을 구축하고 있어요.
  • Graffity는 시간이 지남에 따라 정보가 어떻게 변화하는지 추적하는 시간적 Knowledge Graph를 만들고 있죠.
  • Cognigy는 그래프를 사용하여 상담원이 추론할 수 있는 구조화된 메모리 레이어를 구축하고 있답니다.
  • Mem0: 그래프 기반 엔터티 관계로 개인화된 AI 메모리를 제공한대요.
  • LangMem: LangChain은 에이전트 경험을 연결된 메모리 그래프로 저장하고요.

이러한 도구들은 관계형 테이블이나 Vector Embedding처럼 단순한 저장 방식으로는 지식의 상호 연결된 특성을 제대로 포착할 수 없다는 걸 인지한 거죠.

만약 에이전트가 *"고객이 3분기 예산 문제와 관련해서 가격 책정에 대해 뭐라고 말했지?"* 같은 질문에 답변해야 한다면, 단순히 비슷한 텍스트를 찾는 게 아니라 관계를 따라 쿼리해야 해요.

그런데 효과적인 컨텍스트 그래프를 구축하려면 세 가지 메모리 유형이 모두 필요해요. 대부분의 구현은 단기(대화) 및 장기(엔터티) 메모리는 다루지만, 추론 메모리는 그냥 넘어가더라고요. 상담원이 문제를 어떻게 생각하는지 기록하지 않으면 다음과 같은 것들을 할 수 없는 컨텍스트 그래프만 남게 돼요.

  • 상담사가 특정 결정을 내린 이유를 설명하기
  • 성공적인 (그리고 실패한) 접근 방식으로부터 배우기
  • 완전한 출처를 바탕으로 예상치 못한 동작 디버깅하기
  • 실제로 효과가 있었던 것을 바탕으로 상담사 성과를 개선하기

Neo4j-agent-memory는 이 세 가지를 모두 제공해요. 단기, 장기, 그리고 추론 메모리를 말이죠. 질문부터 답변까지 전체 출처를 단일 그래프로 연결해 준답니다.

고객 패턴부터 오픈소스 구성 요소까지

저희는 프로덕션 환경에서 AI 에이전트를 구축하는 팀과 직접 협력해 왔는데요. 구현 전반에 걸쳐 반복되는 패턴이 neo4j-agent-memory에 영감을 줬어요.

다들 똑같은 세 개의 레이어를 만들더라고요. 고객 서비스 봇이든, 연구 보조자이든, 생산 에이전트에게는 대화 기록(단기), 엔터티 지식(장기), 그리고 추론 추적이 필요하죠. 각 팀이 이 아키텍처를 계속 재창조하는 대신, 저희가 이걸 하나의 패키지로 만들었어요.

추론 메모리는 나중에 생각하게 되는 경우가 많아요. 필요성을 느끼기 전까지는요. 팀들은 대화와 엔터티로 시작했다가, 나중에 에이전트 행동을 디버깅하거나 결정을 설명할 수 없다는 걸 깨닫게 되죠. 그 때 추론 메모리를 추가하려고 하면, 기존 스키마에 출처를 다시 맞춰야 하는 문제가 생겨요. 처음부터 함께 구축하는 게 훨씬 깔끔하답니다.

엔터티 추출에 병목 현상이 생기는 경우도 많아요. 팀들이 비싼 LLM 호출에 너무 많이 의존하거나, 추출 품질에 대한 투자가 부족한 거죠. 다단계 파이프라인(빠른 통계적 NER, 제로샷 모델, LLM 대체)은 저희가 찾은 가장 효과적인 비용/품질 절충안이에요.

프레임워크 통합은 기본이죠. 메모리를 추가하려고 에이전트 아키텍처를 다시 작성하고 싶어하는 사람은 없을 거예요. LangChain, Pydantic AI, LlamaIndex, OpenAI Agents 및 CrewAI와의 통합을 통해 neo4j-agent-memory를 점진적으로 채택할 수 있도록 했어요.

Neo4j-agent-memory는 독점 플랫폼이 아니라, 이러한 모범 사례를 인코딩하는 오픈 소스 라이브러리예요. 있는 그대로 사용하거나, 포크하거나, 자체 아키텍처에 대한 참조 구현으로 활용해 보세요. 목표는 Neo4j에서 프로덕션 수준의 AI 에이전트 메모리를 구축하는 데 대한 장벽을 낮추는 거랍니다. 그리고 저장소에 피드백도 많이 남겨주세요!

직접 실행해 보세요!

라이브 데모를 사용해 보세요

neo4j-agent-memory를 경험하는 가장 빠른 방법은 호스팅된 데모를 사용해 보는 거예요.

lennys-memory.vercel.app →

Lenny의 팟캐스트 탐색기

자신의 프로젝트에서 라이브러리 사용

neo4j-agent-memory 프로젝트는 pip 및 기타 인기 있는 Python 패키지 관리자를 통해 사용할 수 있어요.

pip install neo4j-agent-memory

# With optional dependencies
pip install neo4j-agent-memory[extraction]  # Entity extraction
pip install neo4j-agent-memory[langchain]   # LangChain integration
pip install neo4j-agent-memory[all]         # Everything

빠른 시작:

from neo4j_agent_memory import MemoryClient, MemorySettings

settings = MemorySettings()  # Reads from environment

async with MemoryClient(settings) as memory:
    # Store a conversation
    await memory.short_term.add_message(
        session_id="demo",
        role="user", 
        content="I'm interested in product-market fit"
    )
    
    # Learn a preference
    await memory.long_term.add_preference(
        category="topics",
        preference="product-market fit",
        context="User expressed interest"
    )
    
    # Get context for your LLM prompt
    context = await memory.get_context("startup advice")

로드맵 형성에 참여하세요!

저희는 공개적으로 neo4j-agent-memory를 구축하고 있고, 무엇이 가장 가치 있는지에 대한 여러분의 피드백을 기다리고 있어요!

  • 무엇이 빠졌나요? 이 목록에는 없지만 필요한 기능이 있다면 알려주세요.
  • 가장 긴급한 일은 무엇인가요? 여러분의 사용 사례를 막고 있는 로드맵 항목은 무엇인가요?
  • 무엇이 혼란스럽나요? 문서에 부족한 부분, 이해하기 어려운 API, 예상치 못한 동작이 있다면 알려주세요.
  • 무엇이 잘 작동하나요? 효과적이라고 생각되는 패턴이 있다면 알려주세요 (예제에 추가할게요).

GitHub Issues 만들기 여기서 피드백을 공유하고, 기능 요청도 하고, 버그도 알려주세요! Neo4j 커뮤니티 포럼에서 토론에 참여할 수도 있어요 (Agent Memory 태그를 달아주세요!).

그래프 기반 AI Agent Memory는 패턴 생성 시스템에서 채택하는 패턴 생산 시스템이에요. Context Graph를 도입할 때 추가된 요구 사항은 Agent 시스템이 효과적이려면 단기, 장기, 추론의 세 가지 메모리 유형이 모두 필요하다는 점이죠.

Neo4j-agent-memory는 프로덕션 시스템에서 요구하는 출처 및 설명 가능성과 함께 이 세 가지를 모두 제공한답니다.

>>>> ⚠️ Neo4j Labs 프로젝트— 이 프로젝트는 Neo4j Labs의 일부이며 활발하게 유지 관리되고 있지만 상업적으로 지원되지는 않아요. API는 변경될 수 있다는 점 참고해주세요. 질문이나 지원이 필요하시면 Neo4j 커뮤니티 포럼 and GitHub Issues를 이용해주세요.


  • AI 에이전트
  • Context Graph

에이치시스템즈LogTree는 Neo4j 기반 GraphRAG 플랫폼으로, 데이터를 자동으로 지식그래프화하고 자연어 질의로 즉시 답을 제공합니다.

👉 에이치시스템즈 홈페이지

728x90
반응형

+ Recent posts