Mem0 on CF / Cloudflare에서 Mem0
지난 글에서는 개인 운영체제 API의 핵심 리소스 중 하나로 memories를 소개했다. 이번 글에서는 그 기억 레이어를 실제 코드로 옮기면서 Mem0를 어떻게 개조했는지 정리한다.
핵심은 세 가지다. Mem0 OSS를 사용했고, 모델과 저장소를 Cloudflare에 연결했으며, 기억 추가를 요청과 동시에 처리하지 않고 Queue와 Worker를 거치는 비동기 흐름으로 바꿨다.
Codex (MCP) / REST client
│
├─ add 요청 ─→ Cloudflare Queue ─→ Worker ─→ Mem0 OSS
│ ├─ Workers AI
│ └─ Vectorize
└─ 검색 요청 ──────────────────────────────→ Mem0 OSSMem0 OSS를 그대로 띄우는 대신
Mem0를 사용한다고 해서 반드시 Mem0의 호스팅 서비스를 써야 하는 건 아니다. 이 프로젝트는 mem0ai/oss 패키지를 서비스 코드에 붙여 직접 실행한다. 그래서 Mem0 자체는 기억을 추출하고 검색하는 라이브러리로 쓰고, 모델 호출과 벡터 저장은 별도의 provider로 연결했다.
여기서 Cloudflare Workers 환경에 맞게 손볼 부분이 있었다. Mem0의 SQLite 기반 history와 로컬 vector store 경로는 Worker 런타임에서 사용하지 않는다. 대신 history 기능을 비활성화하고 벡터 저장은 Cloudflare Vectorize로 보낸다. Mem0 OSS의 코드와 의존성에서 SQLite를 완전히 지운 것은 아니다. 이 Worker가 SQLite 구현을 초기화하지 못하도록 호환 패치를 적용하고, 실제 요청 경로에서는 Vectorize만 사용한다.
모델 호출도 같은 방식으로 바꿨다. Mem0가 기대하는 OpenAI 호환 인터페이스를 유지하면서 endpoint를 Cloudflare Workers AI의 OpenAI 호환 API로 향하게 했다. 현재 설정에서는 @cf/meta/llama-3.2-3b-instruct를 기억 추출용 LLM으로, @cf/baai/bge-m3를 임베딩 모델로 사용한다. 애플리케이션 입장에서는 Mem0의 adapter 설정을 통해 연결되므로, 기억 처리 코드를 직접 모델별 API에 묶지 않아도 된다.
정리하면 실행 구조는 다음과 같다.
Mem0 OSS
├─ 기억 추출 LLM → Cloudflare Workers AI API
├─ 임베딩 모델 → Cloudflare Workers AI API
└─ vector store → Cloudflare Vectorize이렇게 하면 파일 기반 SQLite 저장 대신 Worker에서 호출할 수 있는 Cloudflare API와 관리형 벡터 저장소를 사용하게 된다. Cloudflare Worker 안에 로컬 데이터베이스 파일을 유지할 필요도 없다.
기억 추가를 비동기로 바꾸다
두 번째 변화는 입력 경로다. 이전처럼 add 요청을 받은 API가 Mem0의 추출과 저장이 끝날 때까지 기다리는 대신, 요청을 Cloudflare Queue에 넣고 PENDING 상태와 이벤트 ID를 바로 돌려준다.
add 요청
→ Queue에 이벤트 저장
→ PENDING + event_id 반환
→ Worker가 이벤트 소비
→ Mem0가 기억 추출·저장실제 기억 처리는 Queue consumer로 연결된 Worker가 맡는다. Worker는 Mem0 OSS를 호출해 입력에서 저장할 기억을 추출하고 Vectorize에 기록한다. 일시적인 처리 실패는 Queue가 다시 전달하고, 설정된 재시도 횟수를 넘긴 메시지는 dead-letter queue로 보낸다.
무료 할당량으로 시작하기
Mem0 OSS를 직접 실행하면 Mem0의 호스팅 서비스에 의존하지 않는다. Vectorize를 사용하고, LLM과 임베딩 요청은 Workers AI로 보내며, 비동기 처리는 Queues에 맡긴다. 이 구성 요소에는 Cloudflare Free 플랜의 사용량 할당이 있으므로, 개인 프로젝트처럼 사용량이 적다면 별도의 Workers 유료 플랜 없이 시작할 수 있다.
내가 예상하는 개인적인 사용량에서는 이 무료 할당량을 넘지 않을 것으로 본다. 기억 추가와 검색이 개인용 규모로 이뤄지는 만큼, 현재 구성으로는 유료 플랜을 시작 조건으로 둘 필요가 없다.
SQLite 와 같이 파일 기반 로컬 저장 경로를 쓰면 결제를 해야해서 변경하게 되었다. 파일 기반 로컬 저장 경로를 Worker에서 쓰지 않고, Vectorize·Workers AI·Queues처럼 무료 사용량이 포함된 서비스를 사용하도록 바꾼 결과 별도 Mem0 호스팅이나 데이터베이스 서비스를 결제하지 않고도 작은 규모로 시작할 수 있게 됐다.
기억 레이어의 현재 범위
지난 글에서 제시한 resource → memory → task 같은 흐름 중, 지금 구체화한 부분은 기억을 받아들이고, 정리하고, 나중에 찾아오는 경로다. Mem0를 Cloudflare Workers의 실행 모델에 맞추고 저장소와 모델 API를 교체하면서, 개인용 API의 기억 레이어를 작은 비용으로 시작할 수 있는 형태로 만들었다.