내부 구현: AI 메모리를 위한 하이브리드 검색 엔진 구축 (Node.js + pgvector)

발행: (2025년 11월 30일 오전 08:59 GMT+9)
4 min read
원문: Dev.to

Source: Dev.to

1. 핵심 철학: 실용주의

아키텍처는 별도의 벡터 데이터베이스를 사용하지 않음으로써 인프라 인지 부하를 감소시키도록 설계되었습니다. 모든 벡터와 메타데이터는 pgvector 확장을 사용한 PostgreSQL에 저장되어 ACID 준수를 유지하고 스택을 단순화합니다.

  • 런타임: Node.js (DB/LLM 호출을 조율하는 이벤트‑드리븐 I/O)
  • 언어: TypeScript (1536‑차원 부동소수점 배열에 대한 엄격한 타입)
  • 스토리지: PostgreSQL + pgvector (벡터 + session_id, user_id를 동일 엔진에 저장)

2. 하이브리드 검색 알고리즘

MemVault는 실시간으로 가중 점수를 계산합니다:

Score = (SemanticSimilarity * α) + (RecencyScore * β) + (Importance * γ)

구성 요소

  • Semantic Similarity (α)pgvector가 계산하는 코사인 거리. 주제 일치를 측정합니다.
  • Recency Decay (β) – 타임스탬프에 적용되는 감쇠 함수로, 오래된 기억은 강화되지 않으면 점점 사라집니다.
  • Importance (γ) – 절대 사라지면 안 되는 사실(예: “사용자는 견과류 알레르기가 있다”)에 대한 명시적 가중치.

일반적인 기본값: 80 % 의미론적, 20 % 최신성. α, β, γ를 조정해 에이전트 동작을 튜닝할 수 있습니다.

3. 가시성: “블랙 박스” 문제

벡터 검색은 불투명하기 때문에 환각을 디버깅하기가 어렵습니다. MemVault는 실시간 시각화 도구를 포함하고 있어 고차원 벡터를 2‑D 그래프로 투영해 클러스터를 확인하고 임베딩 문제를 찾아낼 수 있습니다.

4. 오픈 소스 & 로드맵

MemVault는 완전 오픈 소스입니다. 다음 로드맵 마일스톤은 순수 의미론적 검색이 어려운 식별자(예: 제품 ID)를 처리하기 위한 BM25(키워드 검색) 추가입니다.

프로젝트 링크

5. 빠른 시작

셀프 호스팅(Docker) 또는 매니지드 API(RapidAPI) 중 선택하세요.

FeatureSelf‑Hosted (Docker)Managed API (RapidAPI)
Price무료 (오픈 소스)무료 티어 제공
Setup Time~15 분~30 초
Data Privacy서버에 100 % 보관우리에게 호스팅됨
Maintenance직접 업데이트 관리모든 것을 우리가 처리
LinkSelf‑hosting guide

시작하기

# Clone the repo
git clone https://github.com/jakops88-hub/Long-Term-Memory-API.git
cd Long-Term-Memory-API

# Build and run with Docker
docker compose up -d

그 다음 SDK를 설치합니다:

npm install memvault-sdk-jakops88

SDK를 사용해 청크를 저장하고, 임베딩하고, 하이브리드 점수로 쿼리합니다:

import { MemVault } from 'memvault-sdk-jakops88';

const client = new MemVault({ connectionString: process.env.DATABASE_URL });

await client.storeChunk({
  session_id: 'abc123',
  user_id: 'user42',
  content: 'User is allergic to peanuts',
  importance: 1.0, // never decays
});

const results = await client.search({
  query: 'What can I eat?',
  topK: 5,
  alpha: 0.8,
  beta: 0.2,
  gamma: 0.0,
});

pgvector 구현에 대한 질문이 있거나 하이브리드 스코어링 로직에 기여하고 싶다면 자유롭게 이슈를 열거나 풀 리퀘스트를 제출하세요!

Back to Blog

관련 글

더 보기 »

Dev 커뮤니티 신규 회원

여러분 안녕하세요, 저는 dev 커뮤니티에 새로 온 사람이고 코딩 여정을 다시 시작하고 있습니다. 저는 2013년부터 2018년까지 코딩을 했었습니다. 그 이후에 새로운 기회를 탐색했고, st...

core.async: 심층 탐구 — 온라인 밋업

이벤트 개요: 12월 10일 GMT+1 기준 18:00에 Health Samurai가 온라인 밋업 “core.async: Deep Dive”를 주최합니다. 이번 강연은 clojure.core의 내부를 파헤칩니다....