Show GN: memnest, 세션이 바뀌어도 AI 코딩 에이전트가 기억을 잃지 않게 하는 로컬 메모리 서비스

1 hour ago 1

세션이 끝나면 에이전트가 전부 잊어버리는 게 계속 불편했습니다. 서비스가 어느 포트에서 도는지, 왜 이 라이브러리를 골랐는지, 두 번이나 고친 버그의 해결책이 뭐였는지를 매번 다시 설명하고 있었습니다. 하네스마다 반쪽짜리 메모리 기능이 따로 있긴 했는데 다른 도구로 넘어가면 그대로 사라졌습니다. memnest는 localhost에서 도는 Rust 서비스 하나가 그 기억을 들고 있다가 요청하는 에이전트에게 돌려주는 구조입니다. pi는 확장으로, Claude Code와 Codex는 MCP와 프롬프트 훅으로, 나머지 MCP 클라이언트는 같은 엔드포인트로 붙습니다. 저장소와 툴 계약이 하나라서 도구를 바꿔도 에이전트가 아는 내용이 초기화되지 않습니다. LLM을 전혀 호출하지 않습니다. 임베딩은 multilingual-e5-base로 로컬에서 돕니다. 내가 쓴 메모를 읽는 데 API 키가 필요한 메모리 시스템은 이상하다고 봤습니다. SQLite가 진실의 원본이고, 옆에 있는 Tantivy BM25 색인과 HNSW 벡터 색인은 파생물이라 언제든 다시 만들 수 있습니다. 색인 작업은 레코드와 같은 트랜잭션에 기록되고 두 색인이 모두 디스크에 안착한 뒤에만 지워집니다. 그래서 중간에 끊긴 쓰기는 색인을 조용히 잃는 대신 재시작 때 다시 재생됩니다. 색인이 두 개인 이유는 둘이 서로 다르게 실패하기 때문입니다. BM25는 포트 번호나 크레이트 이름 같은 정확한 토큰을 잘 찾지만 바꿔 말한 문장을 놓치고, 벡터는 바꿔 말한 문장을 찾지만 정작 내가 입력한 문자열에서 멀어집니다. 어느 쪽이 필요한지는 질의 시점에만 알 수 있어서 쓰기가 둘 다 부담합니다. 결과는 RRF(k=60)로 합치고 MMR(lambda=0.5)로 다시 정렬합니다. 일부러 저장한 기억(결정, 선호, 교정)과 민감정보를 가린 대화 기록을 분리해서 보관합니다. 둘 다 LLM 요약을 거치지 않고 원문 그대로 남습니다. 자격증명은 검색 대상에서 빠져서 AES-256-GCM 금고에 들어가고, 자격증명처럼 생긴 텍스트는 쓰기 경로에서 미리 가려집니다. 벤치마크 문서에는 채택하지 않은 실험도 그대로 적어놨습니다. CJK 2~3글자 ngram 토크나이저는 고립 실험에서 부분어 어휘 재현율을 0.167에서 1.000으로 올렸지만 실제 46개 질의 픽스처에서는 개선이 없었고 색인 크기만 2.9배가 되어서 껐습니다. Jina 교차 인코더 리랭커는 알려진 순위 오류 5건을 전부 고...

Read Entire Article