🔥 세상에서 가장 빠르고 가장 컴팩트한 임베디드 벡터 데이터베이스 🌍
Egoist Machines, Inc. 제작 - 신뢰할 수 있는 AI 시스템을 위한 효율적인 풀스택 인프라.
LodeDB는 로컬 RAG에 탁월합니다. 극도로 빠르고, 기본적으로 정확하며, in-process 방식이고, on-disk 기반입니다. 저희는 LangChain, LlamaIndex, mem0를 위한 최고의 드롭인(drop-in) 내구성 메모리 백엔드입니다. 가장 컴팩트한 디스크 용량, 단일 쿼리당 가장 빠른 속도, 배치 검색을 위한 GPU 가속 지원, 그리고 쓰기 시 약 밀리초 단위로 내구성을 제공합니다. 이들 중 어느 곳이든 기본 스토어 대신 LodeDB를 연결해 보세요. 프레임워크별 기본 설정 기준 17.5k개 이상의 문서에 대한 비교 결과는 다음과 같습니다:
| vs the framework's default store | LangChain InMemoryVectorStore | LlamaIndex SimpleVectorStore | mem0 Qdrant |
|---|
| On-disk footprint (디스크 용량) | 13.6배 작음 (15 vs 199 MB) | 9.9배 작음 (15 vs 145 MB) | 5.7배 작음 (12 vs 70 MB) |
| Single-query p50 (CPU, 단일 쿼리 중앙값) | ~600배 빠름 (0.45 vs 272 ms) | ~620배 빠름 (0.44 vs 272 ms) | ~46배 빠름 (0.59 vs 27 ms) |
| Batched retrieval, 64 (GPU, 배치 검색) | ~2,880배 (11,049 vs ~4 qps) | ~3,050배 (11,297 vs ~4 qps) | ~139배 (5,084 vs 36 qps) |
| Durable add of one memory (단일 메모리 내구성 추가) | ~26,000배 빠름 (0.26 ms vs 6.9 s) | ~57,000배 빠름 (0.26 ms vs 14.8 s) | 0.28 vs 0.44 ms (둘 다 밀리초 미만) |
임베디드 스토어 중 LodeDB는 가장 작은 용량과 가장 빠른 단일 쿼리 및 배치 검색 속도를 자랑하며, 내구성 추가 측면에서도 가장 빠른 lazy-append 스토어(sqlite-vec, qdrant)를 능가합니다:
embedded stores | durable add p50 | single-query p50 | batch-64/query | memory footprint (메모리 용량) |
|---|---|---|---|
| LodeDB | 0.26 ms | 0.45 ms | 0.09 ms | 15 MB |
| sqlite-vec | 0.42 ms | 26.8 ms | 24.7 ms | 96 MB |
| qdrant | 0.48 ms | 13.9 ms | 14.2 ms | 81 MB |
| pgvector | 2.29 ms | 35.1 ms | 37.0 ms | 48 MB |
| ... | | | | |
모든 수치는 L40S 서버에서 독립적인 3회 실행의 평균으로 보고되었습니다. 전체 벤치마크는 모든 백엔드(FAISS, Chroma, Qdrant, LanceDB, sqlite-vec, pgvector)와 방법을 포함합니다.
프로젝트의 코딩 어시스턴트에게 egoistmachines.com/lodedb/install-agent를 지정하면 기존 스토어를 LodeDB 백엔드로 마이그레이션합니다.
대부분의 임베디드 벡터 데이터베이스는 CPU에서 작동하는 데 그칩니다. 하지만 LodeDB는 GPU가 있는 경우 온디스크 인덱스를 GPU에서도 동일하게 실행할 수 있습니다: A10에서는 24k 쿼리/초, L40S에서는 53k qps의 배치 검색을 달성하며, 재현율(recall)은 CPU 스캔과 일치합니다. 또한 변경된 행을 점진적으로 영속화하므로 커밋이 1M 벡터에서도 서브밀리초로 유지됩니다.
GPU 기반 배치 검색: 인덱스의 float32 복사본이 GPU에 존재하며, cuBLAS GEMM과 온디바이스 top-k ([gpu], Linux/CUDA)를 사용하여 점수화합니다. 작동 방식: O(변경분) 영속성: 변경된 행만 커밋하므로 전체 재작성보다 173배에서 1,308배 빠릅니다. 작동 방식: 압축 저장소: MIT TurboVec 코어는 벡터를 2/4비트 코드로 패킹하고 SIMD CPU 커널로 스캔합니다. 보존된 문서 텍스트는 zstd 압축(기본값이며, compression=을 사용하여 생성 시 설정)으로 저장됩니다. 인프로세스, 온디스크 (.tvim / .tvd / .jsd): 데몬도, 계정도, API 키도 필요 없습니다. 안전한 동시성: 경로당 하나의 라이터와 많은 락 프리 리더를 지원합니다. 모든 커밋은 충돌에 안전(crash-atomic)하며 실패 시 마지막으로 커밋된 상태로 롤백되어 손상된 스토어(torn store)가 발생하지 않습니다. 작동 방식: 기본적으로 비공개: 텍스트, ID, 벡터는 로컬에 유지됩니다. 원격 측정(telemetry)은 메트릭만 제공합니다 (카운트, 바이트, 지연 시간), 원시 페이로드는 절대 전송되지 않습니다. 로컬 임베딩: 기본적으로 ONNX Runtime을 사용하며 (쿼리당 낮은 지연 시간), PyTorch의 sentence-transformers를 폴백(fallback)으로 사용합니다. CPU, CUDA 또는 MPS에서 실행됩니다. embedding_runtime=으로 선택할 수 있습니다. NVIDIA GPU 설치 시 onnxruntime-gpu를 설치해야 합니다 (기본 휠은 CPU 전용입니다). LodeDB는 임베딩이 조용히 CPU로 폴백하는 경우 경고합니다. GPU에서 실행: 멀티모달: 단일 공유 CLIP 공간 (`model=
CLI는 loopback/private-network 개발 서버이며, MCP 서버 역할을 합니다. LangChain, LlamaIndex, mem0 어댑터(VectorStores), cognee 벡터-DB 제공자, 그리고 LlamaIndex 어댑터를 기반으로 구축된 원라인 PrivateGPT 벡터 스토어 제공자를 지원합니다.Swift / iOS 바인딩: 동일한 Rust 코어를 사용하여 macOS 및 iOS용 네이티브 Swift 패키지이며, 온디바이스(on-device) 벡터, 텍스트, 하이브리드 검색, 영구 저장소(durable storage), 메타데이터 필터, 후기 상호작용(late-interaction)(MaxSim), 그리고 에이전트 메모리 파사드를 제공합니다. Swift 가이드가 swift-lodedb SwiftPM 패키지로 게시되었습니다.LodeDB로 마이그레이션: lodedb migrate는 기존 LangChain, LlamaIndex 또는 mem0 스토어, 또는 pgvector와 같은 직접적인 제공자를 계획 우선(plan-first), 비파괴적 검사/계획/드라이런/실행/검증 경로를 따라 로컬 LodeDB 경로로 이동시킵니다. 마이그레이션 가이드.
🏢
Enterprise: LodeDB 코어는 Apache-2.0 라이선스이며 사용에 제한이 없습니다. 상업적 지원, 관리 및 대규모 서비스 제공, 온프레미스/BYOC 배포를 위해서는 엔터프라이즈 라이선스가 제공됩니다. [email protected]으로 문의하십시오.
pip install "lodedb[embeddings]" # 벡터 스토어 + 내장 텍스트 임베딩 (ONNX, PyTorch 불필요)
사전 구축된 휠(wheels)은 Python 3.11 이상에서 Linux, macOS(Apple Silicon 및 Intel), Windows를 지원하며 TurboVec (Rust) 코어를 번들로 포함하므로 컴파일할 것이 없습니다. lodedb doctor로 설치를 확인하십시오.
자체 벡터 또는 임베딩 모델을 가져오시겠습니까? 기본 설치에는 임베딩 런타임이 포함되어 있지 않습니다. 이는 의존성이 적은 벡터 스토어(open_vector_store / add_vectors / search_by_vector)를 사용하거나 자체 embedder=를 전달할 수 있습니다:
pip install lodedb
선택적 추가 기능:
pip install "lodedb[embeddings,torch]" # + PyTorch 폴백, CLIP, Apple MPS
pip install "lodedb[gpu]" # GPU 기반 스캔 (Linux/CUDA)
pip install "lodedb[image]" # 이미지 + 텍스트 (CLIP) 임베딩 (model="clip")
...
코딩 어시스턴트의 메모리로 LodeDB를 사용하시겠습니까? mcp,embeddings 추가 기능을 설치한 후 한 단계로 서버를 등록하십시오 (MCP 서버로 사용하는 방법은 아래 참조):
lodedb mcp install --client claude-code # 또는: claude-desktop | cursor | lm-studio | codex | all
Windows: NVIDIA GPU 임베딩
Windows에서는 PyPI가 기본적으로 CPU 전용 PyTorch 빌드를 제공하므로, PyTorch 계층(pip install "lodedb[torch]" 및 uv)을 설치해도 CUDA 장치에서 임베딩이 여전히 CPU에 남아 있게 됩니다. 또한 어떤 torch wheel을 pip가 해결할지 패키지 메타데이터로는 덮어쓸 수 없습니다. lodedb doctor는 이를 감지하고 수정 방법을 출력하며, lodedb doctor --fix를 실행하면 CUDA 빌드를 다시 설치해 줍니다:
lodedb doctor # Windows에서 CPU 전용 PyTorch를 플래그 지정하고 명령을 출력합니다.
lodedb doctor --fix # CUDA 빌드를 재설치하여 임베딩이 NVIDIA GPU를 사용하도록 합니다.
또는 수동으로 다시 설치할 때, PyTorch 설치 가이드에서 자신의 CUDA 버전에 맞는 인덱스(cu121, cu124 등)를 선택합니다:
pip install torch --force-reinstall --no-deps --index-url https://download.pytorch.org/whl/cu121
uv pip install torch --reinstall --index-url https://download.pytorch.org/whl/cu121 # uv 사용 시
이 방법은 Windows 전용입니다. 기본 Linux PyPI wheel에는 이미 CUDA가 번들되어 있으며, macOS는 CPU 또는 MPS를 사용합니다.
소스에서 빌드하기 (기여자 또는 wheel이 없는 플랫폼)
Rust 툴체인과 CBLAS 제공자(macOS의 Accelerate, Linux의 libopenblas-dev)가 필요합니다. uv가 코어 빌드와 번들링을 대신 해줍니다:
git clone https://github.com/Egoist-Machines/LodeDB && cd LodeDB
uv sync # maturin을 통해 TurboVec 코어를 빌드하고 번들링합니다.
uv sync --extra embeddings --extra torch # + 내장 텍스트 임베딩 (ONNX + PyTorch)
...
uv run으로 실행합니다 (예: uv run lodedb doctor).
from lodedb import LodeDB
with LodeDB(path="./data", model="minilm") as db:
fox = db.add("the quick brown fox jumps", metadata={"topic": "animals"})
...
LodeDB(path="./data")로 다시 열면 마이그레이션 단계가 없습니다. 원본 텍스트는 db.get을 위해 .tvtext 사이드카에 보존되며, store_text=False를 전달할 수 있습니다.
아무것도 유지하지 않도록 하려면 minilm(384차원), bge(768차원), e5-small(384차원, 다국어), 그리고 clip(512차원, 이미지+텍스트) 프리셋을 사용할 수 있으며, 가중치는 첫 사용 시 Hugging Face에서 가져옵니다. 자세한 내용은 examples/를 참고하세요.
다른 프로세스가 쓰고 있는 스토어를 읽어야 하나요? 읽기 전용으로 여세요. 쓰기 잠금(writer lock)이 필요하지 않으므로, 쓰기 작업자에게 막히거나(또는 쓰기 작업자에 의해 막히지 않습니다):
reader = LodeDB.open_readonly("./data") # 또는 LodeDB(path="./data", read_only=True)
reader.search("fox", k=5) # 커밋된 스냅샷을 읽습니다
reader.add("nope") # ReadOnlyError를 발생시킵니다
...
읽기 전용 핸들은 refresh()를 호출할 때까지 마지막으로 커밋된 생성(generation)의 안정적인 스냅샷입니다. 이 함수는 잠금이나 체크포인트를 취하지 않으면서, 다른 프로세스(또는 Appender)가 이후에 작성한 내용을 통합합니다. 읽기-쓰기 일관성(read-your-writes)을 위해서는 applied_lsn()을 append가 반환한 LSN과 비교하세요. 레코드는 applied_lsn() >= 해당_lsn일 때 보입니다.
어떤 주체가 임베딩을 소유하는지에 따라 모드를 선택하세요. 위의 Quickstart는 권장되는 기본값을 사용하며, 다른 하나는 이미 벡터를 직접 계산하는 경우에 사용됩니다.
텍스트 입력 (RAG에 권장). LodeDB(path, model="minilm")이 임베더를 소유합니다: 사용자가 add와 search로 텍스트를 제공하면, LodeDB가 이를 임베딩하고 보관하며 하이브리드 BM25 + 벡터 검색을 실행할 수 있습니다. 이것이 대부분의 애플리케이션이 원하는 방식입니다.벡터 입력 (자체 벡터 사용). LodeDB.open_vector_store(path, vector_dim=...)는 임베더가 없습니다: 사용자가 다른 곳에서 계산한 벡터를 사용하여 add_vectors와 search_by_vector를 수행합니다(모든 모델 또는 호스팅된 API). 임베딩 단계를 직접 소유하거나 LodeDB가 번들하지 않은 모델이 필요한 경우에 사용하세요.
Text-in (model= ) |
Vector-in (open_vector_store ) |
|
|---|---|---|
| Add | add / add_many (text) | add_vectors / add_vectors_many (vectors) |
| Search | search / search_many (text) | search_by_vector / search_many_by_vector |
| Explicit stored-vector read | get_vectors | get_vectors |
| Hybrid / lexical BM25 | yes (mode="hybrid" ) | no (no text to rank) |
| Raw-text retrieval (get ) | yes (store_text=True , default) | no (metadata still returned) |
| Embedding runtime | bundled (ONNX / PyTorch) | none (you bring vectors) |
| Calling text verbs on it | works | raises VectorOnlyIndexError |
get_vectors(ids)
is 명시적인 페이로드 기반 읽기입니다. 문서 ID는 현재 청크로 확장되며, 청크 ID는 개별 행을 선택합니다. 이 함수는 컴팩트 인덱스에서 원본 임베딩 좌표 공간의 f32 재구성을 반환하므로, 양자화 과정에서 소스 임베딩과 약간 다를 수 있습니다.
검색 결과와 get_document
은 벡터가 없습니다. 임베딩은 소스 정보를 인코딩할 수 있으므로, 반환되는 벡터는 문서 데이터처럼 보호해야 합니다.
테넌트별 격리를 위해, 각 테넌트마다 자체 경로에 텍스트 기반의 LodeDB를 열고 (선택적으로 embedder=로 단일 로드 모델을 공유할 수 있습니다). GPU 설정, 성능 조정 장치(performance knobs), 모델 별칭 테이블(model-alias table), 그리고 운영상의 주의점(operational gotchas)은 배포 및 성능 섹션에 나와 있습니다.
하이브리드 검색이 기본값입니다. 벡터 검색만으로는 임베딩이 포착하지 못하는 정확한 토큰들(오류 코드(E1234), 일련번호(ABC-123), 날짜(2024-01-15))을 놓칠 수 있습니다. 기본적으로 LodeDB는 벡터 스캔과 병행하여 렉시컬 BM25 랭커(lexical BM25 ranker)를 실행하고, 이를 Reciprocal Rank Fusion으로 두 개의 순위 목록을 융합합니다. 따라서 본문에 해당 코드가 포함된 문서의 경우, 임베딩이 아무리 낮은 순위를 매겨도 복구됩니다. 기본 설정은 텍스트 소스가 사용 가능한 경우(기본 구성)에는 하이브리드로 해결되며, 그렇지 않으면 일반 벡터 스캔으로 폴백하므로 벡터 전용 저장소에서는 절대 오류가 발생하지 않습니다.
db.add("터빈이 정지하고 오류 코드 E1234를 보고했습니다", metadata={"unit": "t3"})
db.search("E1234", k=5) # 기본값: 텍스트가 유지될 경우 하이브리드(BM25 + RRF)
db.search("E1234", k=5, mode="vector") # 벡터 스캔만 사용 시: 정확한 코드를 놓칠 수 있음
...
사전 준비 사항 (Prerequisites)
mode="hybrid"와 mode="lexical"은 텍스트에 대한 BM25 인덱스를 구축하므로, 데이터베이스를 열 때 텍스트 소스가 활성화되어야 합니다. 두 텍스트 소스 모두 기본적으로 켜져 있으므로 하이브리드(hybrid) 기본값이 별도의 설정 없이 작동합니다. mode="vector"는 아무것도 필요하지 않으며, 텍스트 소스가 없을 때의 자동 폴백(fallback)입니다.
| 모드 (Mode) | 활성화 여부 (Enable) | BM25 인덱스 출처 (Source of the BM25 index) |
|---|---|
| "hybrid" (기본값), "lexical" | store_text=True (기본값 켜짐) | 유지된 원시 텍스트에서 메모리에 재구축됨 |
| "hybrid" (기본값), "lexical" | index_text=True (기본값 켜짐, store_text 따름) | 내구성 있는 디스크 기반 포스팅 저장소(postings store). 원시 텍스트 불필요 |
| "vector" (폴백) | 아무것도 아님 | 사용되지 않음 |
두 소스 모두 기본적으로 활성화되어 있으므로 하이브리드와 레็ก시컬이 별도의 설정 없이 작동합니다: store_text=True는 원시 텍스트를 유지하고, index_text는