내부 구현: AI 메모리를 위한 하이브리드 검색 엔진 구축 (Node.js + pgvector)
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(키워드 검색) 추가입니다.
프로젝트 링크
- GitHub Repository: https://github.com/jakops88-hub/Long-Term-Memory-API
- NPM Package: https://www.npmjs.com/package/memvault-sdk-jakops88
- Live Demo: https://memvault-demo-g38n.vercel.app/
- License: MIT
5. 빠른 시작
셀프 호스팅(Docker) 또는 매니지드 API(RapidAPI) 중 선택하세요.
| Feature | Self‑Hosted (Docker) | Managed API (RapidAPI) |
|---|---|---|
| Price | 무료 (오픈 소스) | 무료 티어 제공 |
| Setup Time | ~15 분 | ~30 초 |
| Data Privacy | 서버에 100 % 보관 | 우리에게 호스팅됨 |
| Maintenance | 직접 업데이트 관리 | 모든 것을 우리가 처리 |
| Link | Self‑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 구현에 대한 질문이 있거나 하이브리드 스코어링 로직에 기여하고 싶다면 자유롭게 이슈를 열거나 풀 리퀘스트를 제출하세요!