내부 구현: 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

관련 글

더 보기 »

Day 1276 : 커리어 클라이밍

토요일 역으로 가기 전에, 현재 진행 중인 사이드 프로젝트에서 코딩을 했어요. 꽤 좋은 진전을 이루었고, 이제 나갈 시간이었어요. Made i...

JavaScript 제너레이터: 코드의 'Pause' 버튼

소개 표준 JavaScript 함수에 대해 이해하고 있다면, 실행 완료 규칙(run‑to‑completion rule)을 알고 있을 것입니다: 일반 함수가 실행을 시작하면, 아무것도 그것을 멈출 수 없습니다 u...