jeffhajewski/latticedb
Embedded single-file knowledge graph database with vector search and full-text search for AI/RAG apps
LatticeDB – 임베디드 그래프+벡터 검색 데이터베이스
정의 – LatticeDB는 단일 파일 임베디드 속성 그래프 데이터베이스로, 고차원 벡터(HNSW 경유)와 전문(BM25)도 인덱싱합니다. 로컬 프로그램이 하나의 Cypher 스타일 쿼리 언어를 사용하여 관계, 의미적 유사성 또는 키워드 검색으로 동일한 데이터를 쿼리할 수 있습니다.
주요 장점
- 단일 파일, 구성 불필요 – 전체 데이터베이스(그래프, 벡터, FTS, WAL)가 휴대용 파일에 저장됩니다. 서버 프로세스가 필요 없습니다.
- 통합 쿼리 레이어 –
MATCH … WHERE node.embedding <=> $vec < 0.3 AND node.text @@ "keyword"가 단일 문에서 작동합니다. - 임베디드, 단일 작성자 모델 – 단일 머신에서 실행되는 데스크톱 앱, 도구 또는 에이전트에 이상적입니다.
- 빠름 – 서브마이크로초 노드 조회, 100만 벡터에서 약 0.8ms의 10-NN 검색(100% 재현율), 19µs의 BM25 텍스트 검색.
- 바인딩 – 네이티브 C API와 Python, TypeScript/Node, Go, Java용 일급 라이브러리.
설치
| 언어 | 명령 |
|---|---|
| CLI | curl -fsSL https://raw.githubusercontent.com/jeffhajewski/latticedb/main/dist/install.sh | bash |
| Python | pip install latticedb |
| TypeScript / Node | npm install @hajewski/latticedb |
| Java | bindings/java README를 통해 JNI 브리지 빌드(JDK 21+). |
| Go | bindings/go/README.md 참조(cgo 워크플로우). |
패키지는 지원되는 플랫폼에서 네이티브 liblattice 라이브러리를 번들합니다. LATTICE_BUNDLE_LIB_DIR 환경 변수를 사용하여 사용자 지정 빌드를 스테이징할 수도 있습니다.
빠른 예제(Python)
from latticedb import Database
from latticedb.embedding import hash_embed
with Database("knowledge.db", create=True, enable_vectors=True, vector_dimensions=128) as db:
db.create_node_fts_index("Chunk", "text")
with db.write() as txn:
alice = txn.create_node(labels=["Person"], properties={"name": "Alice"})
doc = txn.create_node(labels=["Document"], properties={"title": "Attention Is All You Need"})
chunk = txn.create_node(labels=["Chunk"], properties={"text": "The transformer architecture uses self‑attention..."})
txn.set_vector(chunk.id, "embedding", hash_embed("transformer self‑attention", 128))
txn.create_edge(chunk.id, doc.id, "PART_OF")
txn.create_edge(doc.id, alice.id, "AUTHORED_BY")
txn.commit()
results = db.query(
"""
MATCH (c:Chunk)-[:PART_OF]->(d:Document)-[:AUTHORED_BY]->(a:Person)
WHERE c.embedding <=> $q < 0.5
RETURN d.title, c.text, a.name
ORDER BY c.embedding <=> $q
LIMIT 5
""",
parameters={"q": hash_embed("attention mechanism", 128)}
)
for r in results:
print(r["d.title"], "by", r["a.name"])
동일한 패턴이 TypeScript, Go, Java에서도 작동합니다(전체 스니펫은 README 참조).
성능 하이라이트(저장소 벤치마크에서)
| 작업 | 지연 시간 | 처리량 |
|---|---|---|
| 노드 조회(캐시됨) | 0.13µs | 7.9M ops/s |
| 10-NN HNSW(100만 벡터) | 0.83ms(평균, 100% 재현율) | 1.2K 쿼리/s |
| 전문 BM25(100개 문서) | 19µs | 53K 쿼리/s |
| 2홉 그래프 순회(10만 노드) | 39µs | – |
인기 있는 대안과 비교할 때, LatticeDB의 노드 조회는 인메모리 RocksDB와 일치하고, 벡터 검색은 FAISS 단일 스레드 HNSW를 능가하며 서버 기반 Weaviate/Qdrant와 동등합니다. BM25 검색은 SQLite FTS5보다 약 300배 빠릅니다.
핵심 기능
- 그래프 – 레이블이 있는 노드/엣지, 속성 인덱스, ACID 트랜잭션, MERGE/UNWIND, 집계.
- 벡터 검색 – HNSW ANN, 구성 가능한
M/ef, 대량 수집, 내장 해시 임베드 헬퍼 또는 실제 모델용 HTTP 클라이언트. - 전문 – BM25 역색인, 토큰화, 형태소 분석, 퍼지 Levenshtein 검색.
- Cypher 방언 –
MATCH,WHERE,RETURN,CREATE,DELETE,ORDER BY,LIMIT및 사용자 지정 연산자<=>(벡터 거리)와@@(텍스트 매치). - 내구성 – 쓰기 전 로그, 특정 시점 백업, 핫 백업, 프리리스트 압축.
- 이벤트 스트림 – 명명된 체인지피드가 동일한 WAL을 공유하며, 반응형 에이전트에 유용합니다.
- 인메모리 모드 –
:memory:는 파일 I/O 없이 임시 데이터베이스를 엽니다.
일반적인 사용 사례
- 그래프 관계와 의미 검색이 모두 필요한 로컬 지식 베이스, 메모 앱 또는 개인 검색 도구.
- 단일 프로세스가 청크, 임베딩, 메타데이터를 저장하고 함께 쿼리하는 에이전트 메모리 / RAG 파이프라인.
- 별도 서버를 실행하지 않고 그래프 중심 애플리케이션을 프로토타이핑(Neo4j 또는 Weaviate의 경량 대안).
다른 옵션을 고려해야 할 경우
- 다중 프로세스 또는 네트워크 워크로드 – LatticeDB는 한 번에 하나의 작성자만 허용합니다.
- 순수 테이블 형식 데이터 – 관계형 데이터베이스(SQLite, PostgreSQL)가 더 간단할 수 있습니다.
- 대규모 동시 쓰기 또는 분산 확장 – 클라이언트-서버 시스템(예: Neo4j, Qdrant)이 더 적합합니다.
다음 단계
- 시작하기 –
docs/getting_started.md에서 CLI, Python, TS, Go, Java 설정을 안내합니다. - 예제 –
examples/cli,examples/go및 언어별 README에서 실행 가능한 데모를 확인하세요. - 벤치마크 –
zig build benchmark또는 특정 벡터/그래프/FTS 벤치마크를 실행하여 수치를 재현하세요.
LatticeDB는 그래프 순회, 벡터 유사성, 전문 검색을 모두 함께 처리할 수 있는 빠르고 로컬이며 단일 파일 저장소를 원하는 모든 사람을 위한 특수 목적 엔진입니다.
관련
- Dispatch
- 프로젝트
- 프로젝트
- 프로젝트
- 프로젝트