luplo

세상에 없던 AI 메모리 도구

Born to be audited.

물어보세요.
기억이 없으면, luplo는 모른다고 대답합니다.

2026-04-22 09:23:14 actor:taehun query:"auth jwt rotation"3 items
hash:f9c2e8b… prev:7a1d3e4
2026-04-22 09:24:03 actor:taehun query:"prod db credentials"BLOCKED
policy:secrets-gate reason:"tag:prod not in actor.groups"
2026-04-22 09:24:52 actor:agent-01 query:"decision archaeology"12 items
hash:a8e9c1d… prev:f9c2e8b
2026-04-22 09:25:17 actor:contractor-42 query:"internal api keys"BLOCKED
policy:external-scope reason:"actor.role=external"
2026-04-22 09:25:44 actor:taehun query:"deploy rollback 2024-q4"5 items
hash:3b7f4a2… prev:a8e9c1d

모든 조회, 모든 차단, 모든 사유. 영구 보존. 해시 체인으로 변조 탐지.

아무도 문제라 부르지 않는 문제

AI 메모리가 회사 밖으로 빠져나가고 있습니다.
아무도 그걸 유출이라 부르지 않습니다.

누가 어떤 지식과 결정에 왜 접근했는지, 아무도 모릅니다. luplo는 여기서부터 시작합니다.

01 / markdown

퇴사를 앞둔 엔지니어가 md 파일 폴더를 압축합니다. 가지고 나갑니다.

그 폴더엔 3년치 설계 결정, 회의록, 장애 복기, 아키텍처의 "왜"가 들어 있습니다.

02 / memory stores

mem0 / Cognee DB를 다른 에이전트로 export

메모리는 구조화된 조직 지식입니다. 명령어 한 줄로 export해서 다른 곳에 import하면, 그대로 계속 일할 수 있습니다. 어떤 결정의 근거로 쓰였고 어떤 답을 만들어냈는지 — 어디에도 기록이 없습니다.

03 / the replay gap

"10월 14일에 그 답이 왜 나왔죠?"

PM의 질문입니다. 임베딩 모델은 시간이 지나면 바뀌고, 벡터 인덱스는 재빌드할 때마다 미묘하게 달라집니다.

설계 원칙

replay gap을 없애기 위한
세 가지 선택.

01 / DETERMINISTIC

같은 지식 위, 같은 쿼리는 언제나 같은 결과가 나옵니다.

코사인으로 "비슷해 보이는 것"이 아닙니다. tsquery는 같은 입력에 같은 출력을 돌려주고, 기억들은 append-only 이기 때문입니다.

02 / REPLAYABLE

모든 조회에 꼬리표가 붙습니다.

actor_id, timestamp, query, result_ids, prev_hash. 6개월 뒤 같은 migration_id로 감사를 재실행해도, 동일한 결과.

03 / GLOSSARY, NOT GUESSES

동의어는 임베딩이 아니라 단어장이 풀어줍니다.

약어와 별칭은 불투명한 벡터 공간이 아니라 결정 코퍼스 자체에서 추출된 용어집으로 확장됩니다. 모든 확장은 감사 가능합니다 — 어떤 용어인지, 어떤 별칭인지, 어떤 결정에서 왔는지, 그리고 누가 등록했는지까지.

$ luplo audit retrievals --actor taehun --since 2025-10-01
 
2025-10-14 09:23 taehun"auth & jwt"3 items
2025-10-14 09:24 taehun"deployment"BLOCKED
└─ policy:prod-config
2025-10-14 09:26 taehun"migration rollback"7 items
2025-10-14 11:02 taehun"oauth refresh race"2 items
2025-10-15 14:17 taehun"mcp session id"1 item
 
# 5 reads / 1 block · hash chain verified · export ready

모든 조회, 모든 차단, 모든 사유 — 영구 보존. 해시 체인, 변조 탐지, SOC 2 증거로 export 가능.

"비슷하다"로는 부족한 이유

"auth"는 세 가지를 의미합니다.
벡터 기반 검색은 그것을 하나로 취급합니다.

코드베이스에선 authn (누구인가), authz (무엇을 할 수 있나), 그리고 둘 중 하나의 줄임말로서의 "auth". SOC 2 감사에선 서로 다른 통제 항목입니다 (CC6.1 vs CC6.3). 벡터 스토어에선 같은 클러스터로 수렴합니다.

vector search
query:   "authz policy"
returns: 12 rows — login flows, password resets, OAuth, 2FA, …
reason:  "auth"가 임베딩을 지배
         authn / authz collapse into the same cluster
audit:   opaque — which rows are authz? which aren't?
luplo
query:     "authz policy"
glossary:  authz ≠ authn  (conf=0.97)
expanded:  (authz | "authorization") & policy & !authn
returns:   3 rows — authorization policy decisions
audit:     term #authz sourced from
           D-2025-03 "split authn/authz for SOC 2 CC6.1"

요구공학 학술 연구 기반

luplo의 용어집은 자동 용어 통합에 관한 REGICE / FastText-clustering / ILLOD+ 연구 계보 위에 있습니다. (Arora 2017, Bhatia 2020, Hasso 2022) 이 논문들은 feature-based 매칭을 쓰는 통제 어휘가 약어 확장과 철자 변이에 대해 벡터 임베딩보다 우수하다는 것을 입증했습니다. luplo는 이를 append-only 결정 코퍼스로 확장합니다. 결정이 supersede될 때마다 용어집이 변하고, 용어집 자체가 감사 대상이자 증거가 됩니다.

선제적 통제

접근할 수 없는 지식은 조회할 수 없습니다.

권한으로 경계를 그으세요. 이 파일이 곧 정책입니다. luplo는 에이전트가 컨텐츠를 보기 전에 요청을 필터링 합니다. luplo cloud는 대시보드에서 유저별로도 설정 가능합니다.

luplo.policy.yml
# deny-by-default for secrets; log every denial
rules:
  - match:
      tags: [prod, secrets]
    readable_by: [group:sre]
    audit_denials: true

  - match:
      item_type: decision
      visibility: internal
    readable_by: [role:employee]
    deny_export: true
trace / 2026-04-22 09:24:03
┌─ query
│ actor: contractor-42
│ query: "internal api keys"
├─ match
│ rule: secrets-gate
│ tag_hit: prod, secrets
│ required: [group:sre]
│ actor: [group:external]
├─ decision
BLOCKED
└─ logged
audit_id: f9c2e8b…
exports: SOC2·ISMS·ISO27001

벡터 스토어의 retrieval은 벡터 연산입니다. luplo의 retrieval은 권한 있는 읽기입니다. 거부는 감사 증거를 남깁니다 (집계 가능, export 가능, 방어 가능).

선을 긋는 지점

luplo 답지 않은 것.

luplo는 벡터 메모리의 대체재가 아닙니다. 에이전트가 비구조화된 대화 기록에 대해 의미론적 recall이 필요하다면 mem0, Cognee, LangMem 같은 도구들이 잘합니다. 그것들을 쓰세요.

luplo가 맡는 영역은 따로 있습니다 — 매번 같은 방식으로, 같은 쿼리에, 꼬리표와 함께 조회되어야 하는 조직 결정, 정책, 사실들을 위해.

정직한 비교

인접 도구들이 기능이라 부르지 않는 기능들.

메모리 제품들은 모두 recall을 제공합니다. 다만 어떻게 recall하는지에서 갈립니다. 이 제품들은 recall 품질, 임베딩 비용, 통합 수로 경쟁합니다. 증명 가능성은 이 도구들의 로드맵에 아예 없습니다. 차이가 생기는 지점입니다.

항목 luplo 벡터 기반
(mem0, LangMem)
그래프 기반
(Cognee, Zep)
Recall 방식
결과가 어떻게 만들어지나
결정적 확률적 Hybrid
같은 쿼리, 2개월 후에 같은 결과?
바이트 단위 재현
Yes No No
동의어 / 별칭 처리
감사 가능한 확장
Glossary layer Vector space
(불투명)
Entity linking
(불투명)
쿼리별 조회 로그
actor · timestamp · query · result_ids
전부 선택적 제품마다 다름
해시 체인 감사
변조 탐지 라인 체이닝
Yes
정책 게이트
접근 통제가 어디서 일어나나
읽기 전 (YAML) 앱 레이어
(별도 구현 필요)
앱 레이어
(별도 구현 필요)
OSS 라이선스
파생물 공개 강제 여부
AGPL Apache / MIT Apache

비교는 2026-Q2 기준 공개 문서를 반영합니다. 틀린 행이 있으면 PR 받습니다.

하나의 제품, 모두 다른 사용법

확정적 결과가 제공하는
안정감을 느껴보세요.

CISO에게

"모든 액션에 이유가 있고 모든 이유를 재현할 수 있습니다. Born to be audited!"

해시 체인 감사*. 행위자별 보존. 변조 탐지 export. 감사관에게 익숙한 포맷, 감사받기 위해 태어난 제품.

CTO에게

"이미 있는 스택 위에 얹습니다."

새 벤더 없음. 새 DB 없음. 새 인력 없음. Postgres를 운영하고 있다면, luplo 운영 비용은 0에 수렴합니다.

엔지니어에게

"자신만의 지식베이스 구축? Postgres 하나면 됩니다."

외부 임베딩 API 없음. 운영할 벡터 DB 없음. docker compose up 한 번으로 MCP 서버까지.

제품기획자에게

"Claude Code와 함께 만든 기획서를 Codex를 사용중인 동료에게."

왜 이 방식을 선택했고, 왜 이 방식은 선택하지 않았는지, 어떤 외부 리소스를 참조했는지까지 전달됩니다.

법무 / CPO에게

"누가 무엇을,
어떤 정책 아래 읽었는가."

모든 조회가 actor, tag, 정책 매치를 달고 기록됩니다. DSR, 보존. append-only 원칙과 잊힐 권리는 tombstone + 접근 차단으로 조화됩니다.

챗봇 개발자에게

"확정적 쿼리 — 모르면 모른다고 말할 수 있는 에이전트의 신뢰감."

매뉴얼대로 대응해야 하는 챗봇에게 벡터 기반 지식은 불확실성을 가중시킵니다. luplo는 안정감을 드립니다.

* v1.0 예정

Born to be audited.
Ready to be installed.

AGPL 코어. docker compose up 한 번으로 자체 호스팅 하거나, luplo cloud에서 무료로 체험해 볼 수 있습니다.