TriviumDB Banner
<div align="center">
<!-- 动态打字效果 Slogan -->
<a href="https://github.com/YoKONCy/TriviumDB">
<img src="https://readme-typing-svg.demolab.com/?font=Noto+Serif+SC&weight=600&size=24&duration=4000&pause=1000&color=1E90FF¢er=true&vCenter=true&multiline=true&repeat=false&width=800&height=70&lines=%E4%B8%89%E4%BD%8D%E4%B8%80%E4%BD%93%E7%9A%84+AI+%E5%8E%9F%E7%94%9F%E5%B5%8C%E5%85%A5%E5%BC%8F%E6%95%B0%E6%8D%AE%E5%BA%93;%E5%90%91%E9%87%8F+%C3%97+%E5%9B%BE%E8%B0%B1+%C3%97+%E5%85%B3%E7%B3%BB%E5%9E%8B;%E4%B8%BA+Agent+%E6%89%93%E9%80%A0%E7%9A%84%E9%AB%98%E6%80%A7%E8%83%BD%E8%AE%B0%E5%BF%86%E6%A0%B8%E5%BF%83" alt="Slogan" />
</a>
<br/>
TriviumDB
벡터 × 그래프 × 문서 — 삼위일체의 AI 네이티브 임베디드 데이터베이스
미션 크리티컬하고 에어 갭된 환경에서 배틀 테스트를 거쳤습니다.
Trivium: 라틴어로
🧪 자유 DIY 혼합 쿼리 파이프라인 — TQL은 벡터 검색, 속성 인덱스, 그래프 확장, 그래프 알고리즘, 경로, 집합 대수, 반복, 집계 및 재정렬을 자유롭게 오케스트레이션 가능한 연산자로 변환하며, 결정론적 Cascades 최적화기가 이를 통합 계획합니다.
📊 4가지 유형의 영구 속성 인덱스 — Hash / Ordered ART / Composite ART / Roaring Bitmap 등가(equality), 범위(range), 접두사(prefix), 복합 조건 및 저기수 집합 연산 모두 인덱싱 가속을 제공합니다.
🧮 내장 그래프 알고리즘 라이브러리 — PageRank / WCC / SCC / K-Core / Articulation Points / Triangle Count / Local Clustering Coefficient / HITS / Harmonic Centrality / Node Similarity / Leiden / Betweenness / Degree / Label Propagation / SA-PPR를 쿼리 내에서 직접 호출할 수 있으며, Weighted Dijkstra, Yen K-Shortest Paths, PairSet 및 유한 경로/집합 연산자를 지원합니다.
🗃️ Rom/Mmap 이중 엔진 전환 — Rom은 단일 파일 *.tdb 복사본을 지원하며; Mmap은 벡터와 게시된 Payload를 .vec와 generation화된 .pld.<generation>으로 분리하여 필요에 따라 매핑합니다.
❄️ Payload 냉/열 계층화 — 게시된 raw JSON은 mmap의 콜드 기본 레이어에 남아있고, 새로 쓰거나 업데이트되는 내용은 메모리 델타(delta)로 들어가며, 파싱 결과는 하드 바이트 상한선이 있는 LRU 캐시에 들어갑니다. ANN/BQ/Exact 후보 단계에서는 Payload를 파싱하지 않습니다.
🔗 노드가 곧 모든 것 — 각 노드는 본질적으로 제한된 길이의 밀집 벡터(dense vector), 희소 텍스트 역색인 빈도, 메타데이터 및 그래프 관계를 동시에 가지며, ID는 전역 고유하고 위치 지정이 불가능합니다.
🧠 AI를 위해 태어남 — 선택적으로
거의 모든 AI 애플리케이션(Agent / RAG / 추천 시스템)은 세 가지 데이터 능력을 동시에 필요로 하지만, 현재 시장에는 이들을 원시적으로 모두 지원하는 엔진이 없습니다:
flowchart TD
classDef old fill:#ffebee,stroke:#ff5252,stroke-width:2px,color:#000;
classDef new fill:#e8f5e9,stroke:#4caf50,stroke-width:2px,color:#000;
...
구체적인 예시
만약 AI 대화 기억 시스템을 만든다고 가정하고, 사용자가 "어제 소홍이랑 카페 갔었어"라고 말했다고 해봅시다.
| 단계 | 전통적인 3개 저장소 방식 (Traditional Three-Store Scheme) | TriviumDB |
|---|
| ① 의미 벡터 저장 | Qdrant API를 호출하여 embedding을 쓰기함 | db.insert(vec, payload) 한 번에 완료 |
| ... | | |
적용 시나리오 (Applicable Scenarios)
| 시나리오 | TriviumDB 사용 방법 |
|---|
| 🤖 AI Agent 장기 기억 | 대화마다 노드(embedding + 원문 + 타임스탬프)로 저장하고, 인물/장소/사건 간에 관계를 구축합니다. 검색 시 벡터 매칭을 먼저 수행한 후 관계 사슬을 따라 확산시킵니다. |
빠른 시작 (Quick Start)
설치 (Installation)
💡 TriviumDB의 핵심은 Rust로 작성되었지만, 저희가 이미 클라우드 환경에서 모든 플랫폼에 대한 바이너리를 교차 컴파일하여 준비해 두었기 때문에, 로컬에 어떤 컴파일 환경도 설치할 필요 없이 즉시 설치할 수 있습니다!
Linux ARM64 / 쿤펑(Kunpeng) 지원: TriviumDB는 Linux AArch64를 지원하며, ARM NEON 최적화, ARM64 CI, Python manylinux ARM64 wheel 및 Node.js ARM64 addon 빌드 체인을 포함하고 있어 Linux AArch64 기반의 쿤펑 서버 시스템에서 실행할 수 있습니다.
🐍 Python 사용자
초고속 uv 사용을 권장합니다 (밀리초 단위만 소요):
또는 전통적인 pip을 사용합니다:
🌐 Node.js / 프론트엔드 사용자
크로스 플랫폼 패키지에 *.node 사전 컴파일 확장 기능이 포함되어 있으며, 완전한 TypeScript 자동 완성 기능을 제공합니다:
npm install triviumdb
pnpm add triviumdb
🦀 Rust 네이티브 사용자
라이브러리 의존성으로 직접 추가할 수 있습니다:
🧪 체험판: HTTP 서버 버전 (nightly) — TriviumDB의 공식 제품 형태는 항상 임베디드 데이터베이스입니다(프로세스 내 라이브러리, 즉 설치 후 바로 사용 가능하며 배포가 필요 없습니다). 저장소에 있는 triviumdb-server는 선택적인 HTTP 래퍼를 제공합니다 (다중 클라이언트 동시 읽기/쓰기, OCC, 스트리밍 NDJSON 등) 현재 nightly 프리뷰 상태이며, 체험 및 발전 방향 추적용으로만 사용해야 합니다. 프로토콜은 언제든지 변경될 수 있으므로 운영 환경에 사용하지 마십시오. 자세한 내용은 Server 설명 (nightly)을 참조하십시오. 모든 API 및 사용법 설명은 임베디드 버전을 기준으로 합니다.
30초 만에 시작하기
import triviumdb
with triviumdb.TriviumDB("memory.tdb", dim=3) as db:
...
대량 ANN(Approximate Nearest Neighbor) 검색은 Rust의 공유 스레드 풀을 통해 병렬로 실행됩니다. Python은 GIL(Global Interpreter Lock)을 전체적으로 해제하며, Node.js는 Promise를 반환하여 이벤트 루프를 차단하지 않습니다. 동일한 경로에서는 데이터베이스 인스턴스를 하나만 열면 됩니다:
batch_results = db.search_batch(
[[0.10, -0.48, 0.80], [0.72, 0.11, -0.35]],
top_k=10,
...
const batchResults = await db.searchBatch(queryVectors, 10, 0, 0.0)
parallelism=0은 동시성도를 자동으로 선택하며, 최대 허용값은 64입니다. 결과의 최상위 순서는 입력된 쿼리 순서와 엄격하게 일치합니다. 배치 API는 상태가 없는(stateless) 쿼리만 지원하며, fatigue 의미론을 허용하지 않습니다.
📖 전체 API 참고 사항, 고급 사용법 및 Rust 예제는 **API Reference 문서**를 참조하십시오.
한 번의 저장, 다양한 조회
TriviumDB 내의 하나의 노드는 벡터(Vector), JSON 문서, 희소 텍스트(Sparse Text) 및 그래프 관계를 동시에 가질 수 있습니다. 이 데이터들은 동일한 NodeId, 트랜잭션, WAL 및 생명주기를 공유하므로, 벡터 저장소, 문서 저장소, 그래프 저장소 간에 복사본을 동기화할 필요가 없습니다. 같은 데이터를 한 번 쓰면, 비즈니스 문제에 따라 다른 조회 경로를 선택하여 사용할 수 있습니다.
TQL: 자유로운 DIY의 통합 쿼리 언어
**TQL(Trivium Query Language)**은 단순히 세 가지 쿼리 구문을 합친 것이 아니라, 자유롭게 오케스트레이션할 수 있는 삼중 모드 실행 파이프라인입니다. 각 WITH 단계는 명명된 NodeSet을 산출하며, 벡터, BM25/AC 텍스트 검색(recall), 속성 인덱스, 그래프 확장, 그래프 알고리즘, FISTA, DPP, NMF, 경로 및 집합 대수 모두 비즈니스 의미론에 따라 자유롭게 연결될 수 있으며, 최종적으로 Cascades 최적화기가 예산 내에서 물리 계획을 선택합니다:
FIND {type: "paper", year: {$gte: 2024}} RETURN * LIMIT 10
...
또한, 하나의 조회 내에서 TEXT BM25/AC/HYBRID를 사용하여 희소 검색을 수행하고, RESIDUAL로 FISTA 잔차 검색을 수행하며, DIVERSIFY로 DPP 다양화 검색을 수행하고, TOPICS로 유한 NMF 주제 할당을 수행하며, SA_PPR_CONFIG로 확산 파라미터를 제어할 수 있습니다. 또한 union / intersect / except를 사용하여 다중 후보 집합 연산을 수행하거나, iterate로 고정점 반복 확산을 수행하고, COUNT/SUM/AVG/MIN/MAX/COLLECT로 집계를 수행할 수 있습니다. text_score()、residual_score()、diversity_score()、topic() 및 topic_score()는 모두 일급 표현식(first-class expression)입니다. EXPLAIN은 Cascades가 선택한 물리 연산자, 예상 행 수, 임시 바이트 및 예산 슬라이스를 노출합니다.
search_advanced()가 TQL로 대체되지 않는 이유도 있습니다. 이는 여전히 SearchConfig를 통해 텍스트 혼합, FISTA, SA-PPR, DPP 및 피로 비적절 기간(fatigue period)을 자유롭게 시작/중지할 수 있으며, 공식적으로 고정된 순서에 따라 실행됩니다. 반면 TQL은 동일한 기본 알고리즘을 재사용하여 고급 사용자가 상태가 없는 연산자의 순서를 자유롭게 배열할 수 있게 합니다.
prepared = db.prepare_tql('FIND {kind: "note"} RETURN $bonus + 1 AS score')
print(prepared.parameter_names())
...
Rust / Python / Node.js 세 가지 언어가 동일한 TQL, Prepared, 네 가지 유형의 속성 인덱스 및 일급 조회 값을 공유합니다. HTTP Server는 별도로 유한 이웃 서브 그래프, 방향화된 엣지 페이지네이션, 배치 노드 읽기 및 단계별(step-by-step) 엣지 정보를 포함하는 경로 엔드포인트를 제공합니다. 자세한 문법은 **TQL 조회 언어 참고**를 참조하십시오.
다양한 그래프와 혼합 검색
| 조회 방식 | 핵심 의미론 | 전형적 용도 |
|---|
| 그래프 패턴 매칭(MATCH) | 노드 속성, 엣지 방향, 레이블 및 경로 패턴을 기준으로 구조 매칭 | |
| 지식 그래프 조회, 관계 필터링, 구조화된 연결 | | |
| ... | | |
| 이러한 능력들은 서로 대체하는 조회 방식이 아닙니다. Reachability는 | | |
| 특성 | 설명 |
|---|
| 🧪 자유 DIY 혼합 쿼리 | TQL WITH 파이프라인: 벡터 / BM25 / AC / 속성 / 그래프 확장 / FISTA / DPP / NMF / 경로 / 집합 / 집계 자유 오케스트레이션, 결정론적 Cascades 옵티마이저 + EXPLAIN 비용 투명화 |
| ... | |
📖 아키텍처 설계 및 기술 세부 정보는 **지원 특성 상세**를 참조하십시오.
벡터 인덱싱 전략: QuIVer
QuIVer (Quantized Index for Vector Retrieval)는 TriviumDB가 자체 개발한 근사 최근접 이웃(ANN) 그래프 인덱스입니다. 현재 소스 코드는 BQ 빠른 구성 + 비훈련 SM-L2 탐색 + 원시 벡터 코사인 정밀 검색을 사용합니다. 탐색은 2진 코드와 각 벡터의 크기 정보를 결합하여 재구성된 제곱 L2를 계산하며, 검색(Recall) 및 처리량(Throughput)은 데이터, 파라미터 및 정밀 검색 예산에 따라 달라집니다.
📄 제출 상태: ICDE 제출을 목표로 리팩토링 버전이며, 아직 채택 또는 발표된 것은 아닙니다. 구 버전 arXiv 프리프린트에 과거 방법 및 실험이 기록되어 있습니다.
🔬 구현 및 재현: 현재 아키텍처, 모드 경계 및 실험 기준 · 데이터 및 실험 가이드. 현재 소스 코드 버전은 0.8.10이며, 구성 연결성 보호 기능을 포함합니다. 공식 제품 상태는 배포 파이프라인과 각 패키지 저장소를 따릅니다. 변경 설명을 참조하십시오. 기본 SM-L2는 0.8.9에서 도입되었으며, 이전 0.8.8 릴리스 패키지에는 이 변경 사항이 포함되어 있지 않습니다.
구 버전 프리프린트의 12개 라이브러리 Recall/QPS와 열 메모리 수치는 현재 리팩토링 버전을 직접적으로 나타내지 않습니다. 현재 평가는 구현, 그래프, 측정 기준, 예산 및 데이터 식별자에 따라 개별적으로 보고됩니다. SM-L2 코사인 작업, 명시적 네이티브 L2, 과거 BQ 결과는 혼합하여 사용할 수 없습니다.
⚠️ 차원 권장 사항: 데이터베이스 벡터 차원은 3072를 초과하지 않도록 강력히 권장합니다. TriviumDB의 범용 저장소 및 정확한 BruteForce 검색은 더 높은 차원을 허용하지만, QuIVer의 BQ 시그니처 안전 상한선은 3072차원입니다. 이 차원을 초과할 경우 엔진은 자동으로 QuIVer를 구성하지 않으며, 검색은 안정적으로 BruteForce로 폴백됩니다. 수동으로 QuIVer를 구성하더라도 명확한 오류가 반환됩니다. 고차원 데이터베이스도 사용 가능하지만, QuIVer ANN 가속을 얻을 수 없으며 메모리 및 계산 오버헤드가 크게 증가합니다.
TriviumDB는 지능형 적응형 이중 엔진 벡터 인덱싱을 채택합니다. 자동 QuIVer 임계값은 ceil(8,000,000 / dim)으로 계산되며 2,500–10,000 노드로 제한됩니다. 저차원 데이터는 더 오래 정확한 BruteForce를 유지하고, 고차원 데이터는 더 일찍 ANN로 전환합니다:
| 단계 | 엔진 | 활성화 조건 | 특징 |
|---|
| 소규모 핫 영역 | BruteForce | 노드 수가 현재 차원의 동적 임계값보다 낮거나 QuIVer가 준비되지 않음 | 100% 정확한 검색, rayon 멀티코어 |
| 대규모 콜드 영역 | QuIVer | 차원 ≤ 3072 및 동적 임계값 도달 (2,500–10,000 노드) | BQ 구성 + SM-L2 탐색 + 원시 벡터 코사인 정밀 검색 |
예를 들어, 384/768 차원은 여전히 10,000 노드에서 트리거되며, 1024 차원은 약 7,813, 1536 차원은 약 5,209, 3072 차원은 약 2,605입니다.
QuIVer의 핵심 설계
콜드/핫 분리 아키텍처: 원시 벡터는 벡터 풀의 콜드 레이어에 남아 있으며, 정밀 검색 시 예산에 따라 읽힙니다. 열 메모리에는 여전히 보존되는 BQ, SM 비트 코드 및 크기, 그래프, ID/슬롯 매핑 및 스레드 작업 공간이 포함되어야 합니다. 메모리 이득은 구체적인 구성으로 측정해야 하며, 이전 버전의 고정 비율을 사용할 수 없습니다.
Mmap은 전체 로드(full load)와 중복 복사(duplicate copy)를 제거하지만, 디스크 I/O 자체는 제거하지 않습니다. 콜드 벡터 페이지가 메모리에 상주하지 않을 경우 Major Page Fault가 발생하며, 무작위 쿼리 작업 집합이 물리적 메모리를 초과할 때 처리량과 꼬리 지연 시간(tail latency)은 PageCache 적중률, 스토리지 장치의 무작위 읽기 능력 및 시스템 회수 압력에 따라 달라집니다. QuIVer의 열 인덱스는 파일 PageCache가 아닌 익명 힙 메모리에 위치하며, 현재 메모리 예산 통계에는 OS PageCache가 포함되지 않습니다.
증분 그래프 유지보수(Incremental Graph Maintenance): 기존 HNSW와 달리, QuIVer는 진정한 증분 작업을 지원합니다:
- ✅ 증분 삽입(Incremental Insert): 새 노드가 그래프에 실시간으로 삽입되며 전체 재구성이 필요 없습니다.
- ✅ 증분 삭제(Incremental Delete): Tombstone을 이용한 소프트 삭제를 수행하며, 25% 퇴화 임계치 도달 시 재구성을 트리거합니다.
- ✅ 증분 업데이트(Incremental Update): soft_delete + incremental_insert 방식으로 원자적으로 교체됩니다.
- ✅ 트랜잭션 안전성(Transaction Safety): 시간선 아키텍처를 분리하여 트랜잭션 커밋이 실패할 수 없으며, QuIVer 동기화는 롤백이 필요 없습니다.
독립적 영속화(Independent Persistence): QuIVer 그래프는 .tdb.quiver라는 독립 파일로 저장됩니다. 유효한 그래프를 로드할 때, 기본 SM 상태에서 실제 벡터 풀로부터 스트리밍 방식으로 복구되며, 전체 라이브러리를 FP32 형태로 두 번째로 상주시키지는 않지만, 콜드 벡터를 읽고 시작 비용으로 계산해야 합니다. 이전 인덱스는 새로운 구성 보호(graph protection)가 적용되려면 재구성이 필요하며, 연결이 끊긴 인덱스가 감지되면 기존의 재구성/거부 프로세스를 따르므로 로드 시 보간(edge filling)을 수행하지 않습니다.
연구 최전선: TSNG 삼중 신호 탐색 (Tri-Signal Navigation)
**TSNG(Tri-Signal Navigation Graph)**는 TriviumDB의 하이브리드 검색 연구 라인입니다. 하나의 쿼리에서 벡터 신호, 속성 신호 및 그래프 신호를 동시에 선언하고, TsngWeights로 세 가지 경로의 가중치를 제어하여 통일된 점수(score)를 가진 후보 집합을 얻습니다. 이는
v0.6 — TQL 쿼리 언어 + 크로스 아키텍처 적응 ✅
v0.7 — QuIVer SOTA ANN 인덱스 ✅
v0.8 — 자유 DIY 혼합 쿼리 및 엔지니어링 시대 ✅ (현재)