📚 Documentation • 🤝 Contributing • 🤖 RAG Open WebUI Guide
TIP
Supporto Docker: Preferisci i container? Un Dockerfile è incluso nella root per creare le tue immagini.
KektorDB è un database Vettoriale + Grafo in-memory, integrabile (embeddable) e scritto in puro Go.
Fonde un solido Motore HNSW con un Grafo Semantico leggero, permettendoti di combinare la similarità vettoriale con relazioni esplicite (come parent, next, mentions) senza la complessità e l'overhead dei tradizionali Database a Grafo.
Costruito con la filosofia di SQLite: opzione serverless, zero dipendenze e facile da gestire.
KektorDB semplifica lo stack unificando il Database, il Motore di Ricerca e il Middleware AI in un singolo binario privo di dipendenze.
KektorDB non è progettato per sostituire cluster distribuiti che gestiscono miliardi di vettori. Invece, brilla in scenari specifici e ad alto valore:
Ideale per sviluppatori che costruiscono monoliti o microservizi e necessitano di ricerca semantica senza l'overhead operativo di un cluster distribuito.
import "github.com/sanonone/kektordb/pkg/engine" per eseguire il DB in-process.Perfetto per applicazioni desktop, agenti AI locali o ricerca su documentazione privata dove la privacy dei dati è fondamentale.
Agisce come un proxy intelligente per ottimizzare costi e latenza delle applicazioni LLM.
KektorDB può funzionare come middleware intelligente tra la tua Chat UI e il tuo LLM. Intercetta le richieste, esegue il recupero e inietta il contesto automaticamente.
Architettura:
Open WebUI -> KektorDB Proxy (9092) -> Ollama / LocalAI (11434)
Come configurarlo:
vectorizers.yaml per puntare ai tuoi documenti e abilitare l'Estrazione Entità.proxy.yaml per puntare al tuo LLM Locale (Ollama) o OpenAI../kektordb -vectorizers-config='vectorizers.yaml' -enable-proxy -proxy-config='proxy.yaml'
http://localhost:9092/v1kektor (o qualsiasi stringa).👉 Leggi la Guida Completa: Costruire un Sistema RAG Veloce con Open WebUI
/metrics) e logging strutturato.prev (precedente), next (successivo), parent (genitore) e mentions (menziona) per fornire una finestra di contesto olistica.
Visualizzazione delle connessioni semantiche tra documenti tramite entità estratte.
Disponibile su http://localhost:9091/ui/.
docker run -p 9091:9091 -p 9092:9092 -v $(pwd)/data:/data sanonone/kektordb:latest
Scarica il binario pre-compilato dalla Pagina delle Release.
# Linux/macOS
./kektordb
Nota sulla Compatibilità: Tutto lo sviluppo e i test sono stati eseguiti su Linux (x86_64). Le build pure Go dovrebbero funzionare su Windows/Mac/ARM.
KektorDB può essere importato direttamente nella tua applicazione Go, rimuovendo la necessità di servizi esterni o container.
go get github.com/sanonone/kektordb
package main
import (
"fmt"
"github.com/sanonone/kektordb/pkg/core/distance"
"github.com/sanonone/kektordb/pkg/engine"
)
func main() {
// 1. Inizializza il Motore (gestisce la persistenza automaticamente)
opts := engine.DefaultOptions("./kektor_data")
db, err := engine.Open(opts)
if err != nil { panic(err) }
defer db.Close()
// 2. Crea Indice
db.VCreate("products", distance.Cosine, 16, 200, distance.Float32, "english", nil)
// 3. Aggiungi Dati
db.VAdd("products", "p1", []float32{0.1, 0.2}, map[string]any{"category": "electronics"})
// 4. Cerca
results, _ := db.VSearch("products", []float32{0.1, 0.2}, 10, "category=electronics", 100, 0.5)
fmt.Println("Trovati ID:", results)
}
Questo esempio dimostra un flusso di lavoro completo: creazione di un indice, inserimento batch di dati con metadati ed esecuzione di una Ricerca Ibrida (Vettoriale + Parole Chiave).
Installa Client & Utility:
pip install kektordb-client sentence-transformers
Esegui lo script:
from kektordb_client import KektorDBClient
from sentence_transformers import SentenceTransformer
# 1. Inizializzazione
client = KektorDBClient(port=9091)
model = SentenceTransformer('all-MiniLM-L6-v2')
index = "quickstart"
# 2. Crea Indice (Ibrido abilitato)
try: client.delete_index(index)
except: pass
client.vcreate(index, metric="cosine", text_language="english")
# 3. Aggiungi Dati (Batch)
docs = [
{"text": "Go is efficient for backend systems.", "type": "code"},
{"text": "Rust guarantees memory safety.", "type": "code"},
{"text": "Pizza margherita is classic Italian food.", "type": "food"},
]
batch = []
for i, doc in enumerate(docs):
batch.append({
"id": f"doc_{i}",
"vector": model.encode(doc["text"]).tolist(),
"metadata": {"content": doc["text"], "category": doc["type"]}
})
client.vadd_batch(index, batch)
print(f"Indicizzati {len(batch)} documenti.")
# 4. Cerca (Ibrido: Vettore + Filtro Metadati)
# Trovare "fast programming languages" MA solo nella categoria 'code'
query_vec = model.encode("fast programming languages").tolist()
results = client.vsearch(
index,
query_vector=query_vec,
k=2,
filter_str="category='code'", # Filtro Metadati
alpha=0.7 # 70% Sim. Vettoriale, 30% Rank Parole Chiave
)
print(f"ID Risultato Top: {results[0]}")
KektorDB include un wrapper integrato per LangChain Python, permettendoti di collegarlo direttamente alle tue pipeline AI esistenti.
from kektordb_client.langchain import KektorVectorStore
I benchmark sono stati eseguiti su una macchina Linux locale (Hardware Consumer, Intel i5-12500). Il confronto avviene contro Qdrant e ChromaDB (via Docker con host networking) per garantire una base di riferimento equa.
Avvertenza: Il benchmarking dei database è complesso. Questi risultati riflettono uno scenario specifico (nodo singolo, heavy-read, client Python) sulla mia macchina di sviluppo. Sono intesi per dimostrare le capacità di KektorDB come motore integrato ad alte prestazioni, non per rivendicare superiorità assoluta in scenari di produzione distribuiti.
400k vettori, precisione float32. KektorDB sfrutta Go Assembly (Gonum) ottimizzato per la similarità del Coseno. In questo setup specifico, mostra un throughput molto elevato.
| Database | Recall@10 | QPS (Query/sec) | Tempo Indicizzazione (s) |
|---|---|---|---|
| KektorDB | 0.9664 | 1073 | 102.9s |
| Qdrant | 0.9695 | 848 | 32.3s |
| ChromaDB | 0.9519 | 802 | 51.5s |
1 Milione di vettori, precisione float32.
KektorDB usa un motore ibrido Go/Rust (-tags rust) per questo test. Nonostante l'overhead di CGO per vettori da 128d, le prestazioni sono competitive con i motori nativi C++/Rust.
| Database | Recall@10 | QPS (Query/sec) | Tempo Indicizzazione (s) |
|---|---|---|---|
| KektorDB | 0.9906 | 881 | 481.4s |
| Qdrant | 0.998 | 845 | 88.5s |
| ChromaDB | 0.9956 | 735 | 211.2s |
Nota sulla Velocità di Indicizzazione: KektorDB è attualmente più lento nell'ingestione rispetto a motori maturi. Questo è in parte dovuto al fatto che costruisce il grafo completamente interrogabile immediatamente all'inserimento, ma soprattutto a causa dell'attuale architettura a grafo singolo. Ottimizzare la velocità di ingestione massiva (bulk) è la priorità assoluta per la prossima major release.
TIP
Ottimizzazione Prestazioni: "Ingest Fast, Refine Later"
Se devi indicizzare grandi dataset velocemente, crea l'indice con un ef_construction più basso (es. 40). Questo riduce significativamente il tempo di indicizzazione.
Puoi poi abilitare il processo di Refine in background con una qualità target più alta (es. 200). KektorDB ottimizzerà progressivamente le connessioni del grafo in background rimanendo disponibile per le query.
KektorDB offre risparmi di memoria significativi attraverso quantizzazione e compressione, permettendoti di far stare dataset più grandi in RAM con un impatto minimo su prestazioni o recall.
| Scenario | Config | Impatto Memoria | QPS | Recall |
|---|---|---|---|---|
| NLP (GloVe-100d) | Float32 | 100% (Base) | ~1073 | 0.9664 |
| Int8 | ~25% | ~858 | 0.905 | |
| Vision (SIFT-1M) | Float32 | 100% (Base) | ~881 | 0.9906 |
| Float16 | ~50% | ~834 | 0.9770 |
(La logica "Smart Dispatch" nella build accelerata con Rust seleziona automaticamente la migliore implementazione—Go, Gonum, o Rust—per ogni operazione basandosi sulle dimensioni del vettore. Le versioni in puro Go float16 e int8 servono come fallback portatili.)
Per una guida completa a tutte le funzionalità e agli endpoint API, consulta la Documentazione Completa.
POST /vector/actions/search: Ricerca vettoriale ibrida.POST /vector/actions/import: Caricamento massivo ad alta velocità.POST /vector/indexes: Crea e gestisci indici.POST /graph/actions/link: Crea relazioni semantiche.POST /graph/actions/traverse: Attraversamento profondo del grafo (N-Hop) partendo da un ID nodo specifico.POST /rag/retrieve: Ottieni chunk di testo per RAG.GET /system/tasks/{id}: Monitora task a lunga esecuzione.POST /system/save: Snapshot manuale.KektorDB è un progetto giovane in sviluppo attivo.
Il prossimo importante traguardo si concentra sul superamento del limite della RAM e sul miglioramento delle garanzie di coerenza dei dati.
Funzionalità che intendo sviluppare per rendere KektorDB pronto per la produzione e ancora più veloce.
proxy.yaml invece di affidarsi ai default hardcodati.WHERE user_id = X).Funzionalità in fase di ricerca. La loro implementazione dipende dall'adozione nel mondo reale, dal feedback e dal tempo di sviluppo disponibile.
Vuoi influenzare la roadmap? Apri una Issue o vota quelle esistenti!
Sebbene l'ambizione sia alta, la velocità di sviluppo dipende dal tempo libero disponibile e dai contributi della community. La roadmap rappresenta la visione tecnica, ma le priorità potrebbero cambiare in base al feedback degli utenti e alle necessità di stabilità.
Se ti piace la visione e vuoi accelerare il processo, le Pull Request sono le benvenute!
KektorDB è un progetto personale nato dal desiderio di imparare.
Come unico manutentore, ho costruito questo motore per esplorare CGO, SIMD e ottimizzazioni Go a basso livello. Sono orgoglioso delle prestazioni raggiunte finora, ma so che c'è sempre un modo migliore per scrivere codice.
Se noti race conditions, ottimizzazioni mancate o pattern Go non idiomatici, per favore apri una Issue o una PR.
Distribuito sotto Licenza Apache 2.0. Vedi il file LICENSE per i dettagli.
Se trovi questo strumento utile per il tuo setup RAG locale o le tue applicazioni Go, per favore considera di supportare lo sviluppo.
Il tuo supporto mi aiuta a dedicare più tempo alla manutenzione, a nuove funzionalità e alla documentazione.