AI VIDEO BRIEFING

AI 에이전트 장기 기억 구조 해설: Mem0의 저장소와 수집·검색 파이프라인 뜯어보기

허깅페이스 해설 영상이 오픈소스 메모리 라이브러리 Mem0를 예로 들어, AI 에이전트의 장기 기억이 세 개의 저장소와 수집·검색 파이프라인으로 어떻게 굴러가는지, 또 이 구조 전체를 작은 오픈 모델로 자기 컴퓨터에서 돌리려면 무엇이 필요한지 단계별로 뜯어본다.

AI 에이전트의 장기 기억은 어떻게 작동하나 — Mem0 구조 해부 영상 대표 이미지

핵심 메시지

  • 대화 기억과 장기 기억은 다른 물건이다. 대화 기억은 매번 전체 히스토리를 다시 보내는 방식이라 세션이 바뀌면 사라지고, 장기 기억은 대화 바깥에 따로 두어야 여러 대화와 여러 에이전트가 함께 쓸 수 있다.
  • Mem0는 메모리 문장과 메타데이터를 담는 벡터 저장소, 인물·장소 같은 개체를 따로 담는 엔티티 저장소, 변경 이력과 최근 메시지 10개를 담는 SQLite 세 곳을 함께 쓴다.
  • 기억을 저장하는 수집 단계의 핵심은 작은 언어모델이 대화에서 기억할 문장을 뽑아 구조화된 JSON으로 내놓는 추출 과정이며, 이때 사용자 요약·최근 메모리·최근 메시지가 함께 프롬프트에 들어간다.
  • 검색은 임베딩 검색으로 넉넉한 후보 풀을 만든 뒤 키워드 일치 점수와 엔티티 가산점을 더해 다시 순위를 매기는 구조라, 단순한 벡터 유사도 검색보다 여러 겹이 더 있다.
  • 추출과 임베딩 모두 작은 오픈 모델로 대체할 수 있어, 마음만 먹으면 이 구조 전체를 자기 컴퓨터 안에서 돌릴 수 있다.

쉽게 이해하기

언어모델 자체는 상태를 갖지 않는다. 프롬프트를 보내면 답을 만들어 줄 뿐, 다음 요청에서 앞의 대화를 기억하지 못한다. 그래서 에이전트 도구들은 지금까지 오간 메시지를 통째로 다시 실어 보내는 방식으로 대화의 맥락을 유지한다. 이것이 대화 기억이고, 새 대화창을 열면 그대로 사라진다.

장기 기억은 이 흐름 바깥에 따로 두는 별도의 서비스다. 모든 대화에서 얻은 사실을 쌓아 두고, 에이전트가 턴을 돌 때마다 그 저장소를 조회해 답에 반영한다. 세션 저장소와 물리적으로 분리해 두는 것이 중요하고, 기억을 사용자 중심으로 설계하면 여러 도구가 같은 기억을 공유할 수도 있다.

영상은 널리 쓰이는 오픈소스 구현인 Mem0를 예로 들어 내부를 연다. 메인 벡터 저장소에는 "이 사용자는 채식 식당을 선호한다" 같은 짧은 기억 문장과 함께 생성·수정 시각, 사용자의 것인지 에이전트의 것인지, 중복 제거용 해시, 키워드 검색용 표제어 형태 같은 메타데이터가 들어간다. 두 번째 엔티티 저장소는 기억에서 뽑아낸 사람·장소·고유명사를 따로 색인하고 각 개체가 어떤 기억과 연결돼 있는지를 기록해, 파리에 관해 물으면 파리라는 개체에 걸린 기억들을 함께 끌어오게 한다. 세 번째 SQLite는 저장소 변경 이력을 남기는 로그이자 최근 메시지 10개를 보관해 "그거", "그 사람" 같은 표현이 무엇을 가리키는지 판단하게 돕는다.

수집 단계는 에이전트가 한 턴을 마칠 때마다 돌아간다. 방식은 세 가지로, 수행한 절차를 요약해 두는 방식, 메시지를 그대로 임베딩해 넣는 방식, 그리고 언어모델로 기억을 추출하는 방식이 있다. 영상이 집중하는 것은 세 번째다. 추출용 프롬프트에는 역할 지시, 사용자 요약, 이번 입력 메시지, 최근 저장된 기억, 관련 기억, SQLite의 최근 메시지 10개, 대화 시각과 현재 시각이 들어가고 결과는 구조화된 JSON으로 나온다.

검색은 에이전트가 도구를 호출해 직접 기억을 찾을 때와 사용자가 말을 걸 때마다 자동으로 관련 기억을 붙여 줄 때 모두 같은 파이프라인을 탄다. 질의를 임베딩해 벡터 저장소에서 가까운 기억을 찾되, 요청한 개수의 네 배 또는 최소 60개 중 큰 쪽만큼 넉넉히 뽑아 둔 다음 다시 순위를 매긴다. 재순위에는 질의와 기억의 단어 겹침을 BM25로 잰 키워드 점수와 질의에서 뽑은 개체에 걸린 기억에 주는 가산점이 더해지는데, 가산점은 그 개체에 연결된 기억이 적을수록 커진다. 세 점수를 합쳐 최대치인 2.5로 나눈 값이 최종 점수가 되고, 그중 상위 몇 개만 에이전트에게 돌아간다.

주요 인사이트

  • 재순위 단계는 후보를 새로 늘리지 못한다. 처음 벡터 검색이 놓친 기억은 키워드 점수나 개체 가산점으로도 되살아나지 않으므로, 초기 후보 풀을 넉넉히 잡는 설정이 검색 품질을 크게 좌우한다.
  • 중복 제거가 문장 해시로만 이뤄진다는 점은 분명한 한계다. 표현만 조금 달라도 같은 사실이 여러 벌 쌓이기 때문에, 실제 서비스에서는 별도의 병합 전략을 고민해야 한다.
  • Mem0에는 질의 재작성 단계가 기본으로 들어 있지 않다. 발표자는 검색 품질을 높이고 싶다면 에이전트 쪽에서 작은 모델로 질의를 다듬어 넘기라고 권한다.
  • 기억 추출은 생각보다 단순한 작업이라 10억~120억 파라미터 정도의 작은 오픈 모델로 충분하다는 것이 발표자의 판단이다. 10억 미만은 별도 미세조정 없이는 권하지 않는다.
  • 임베딩 모델은 용도에 맞춰 고르는 편이 낫다. 공개된 임베딩 벤치마크는 언어별·도메인별 성적을 따로 제공하므로, 의료처럼 특수한 맥락을 다룬다면 해당 항목을 보고 선택하고 장기 운영이라면 미세조정도 고려할 만하다.

자주 묻는 질문

대화 기억이 있는데 왜 장기 기억이 따로 필요한가요?

대화 기억은 지금 열려 있는 대화의 메시지를 통째로 다시 보내 유지하는 방식이라 세션 안에서만 유효합니다. 새 대화를 시작하면 이전 대화의 내용은 다른 맥락에 있어 참조되지 않기 때문에, 대화를 넘나드는 기억이 필요하면 세션 저장소와 분리된 별도의 장기 기억 서비스를 두어야 합니다.

Mem0는 왜 저장소를 세 개나 쓰나요?

역할이 다르기 때문입니다. 벡터 저장소는 기억 문장과 메타데이터를 담아 의미 기반 검색을 담당하고, 엔티티 저장소는 인물·장소 같은 개체를 따로 색인해 특정 대상에 걸린 기억을 모아 오는 통로가 되며, SQLite는 저장소 변경 이력을 남기고 최근 메시지 10개를 보관해 대명사가 무엇을 가리키는지 판단하는 데 쓰입니다.

이 구조를 전부 로컬에서 돌릴 수 있나요?

영상은 가능하다고 말합니다. Mem0가 기본값으로는 외부 상용 모델을 쓰지만, 기억을 뽑아내는 추출 단계는 작은 오픈 모델로, 임베딩 단계는 공개된 임베딩 모델로 각각 바꿀 수 있습니다. 발표자는 추출용으로 80억 파라미터급 모델을 예로 들었습니다.

검색 결과의 최종 점수는 어떻게 계산되나요?

0~1 범위의 벡터 유사도 점수, 0~1 범위의 키워드 일치 점수, 0~0.5 범위의 엔티티 가산점을 더한 뒤 최대치인 2.5로 나눕니다. 이렇게 나온 값으로 후보들을 다시 정렬하고, 사용자가 요청한 개수만큼 상위 기억을 돌려줍니다.

원문과 출처

이 글은 원본 영상의 자막을 바탕으로 한국어 독자를 위해 요약했습니다. 전체 맥락과 최신 정보는 원문에서 확인하세요.

YouTube 원본 영상 보기 ↗

관련 AI 소식