📚 文档 • 🤝 贡献 • 🤖 RAG Open WebUI 指南
TIP
Docker 支持: 更喜欢使用容器?根目录中包含 Dockerfile 可用于创建镜像。
KektorDB 是一个用纯 Go 编写的内存型可嵌入的向量 + 图数据库。
它将强大的 HNSW 引擎 与轻量级的 语义图 结合在一起,使你能够将向量相似性与显式关系(如 parent、next、mentions)结合,而无需传统图数据库的复杂性和开销。
基于 SQLite 的哲学构建:无服务器选项、零依赖和易于管理。
KektorDB 通过将 数据库、搜索引擎 和 AI 中间件 统一到一个无依赖的二进制文件中,简化了技术栈。
KektorDB 不是为了替代管理数十亿向量的分布式集群。相反,它在特定且高价值的场景中表现出色:
非常适合为构建单体应用或微服务的开发者提供语义搜索,而无需分布式集群的运营开销。
import "github.com/sanonone/kektordb/pkg/engine" 以在进程内运行数据库。非常适合桌面应用、本地 AI 代理或私有文档搜索,其中数据隐私至关重要。
充当智能代理,以优化 LLM 应用的成本和延迟。
KektorDB 可以作为 智能中间件 在你的聊天 UI 和 LLM 之间运行。它拦截请求,执行检索并自动注入上下文。
架构:
Open WebUI -> KektorDB 代理 (9092) -> Ollama / LocalAI (11434)
配置方法:
vectorizers.yaml 指向你的文档并启用实体提取。proxy.yaml 指向你的本地 LLM(Ollama)或 OpenAI。./kektordb -vectorizers-config='vectorizers.yaml' -enable-proxy -proxy-config='proxy.yaml'
http://localhost:9092/v1kektor(或任何字符串)。👉 阅读完整指南:使用 Open WebUI 构建快速 RAG 系统
/metrics)和结构化日志。prev(上一个)、next(下一个)、parent(父级)和 mentions(提及)链接,以提供整体上下文窗口。
通过提取的实体可视化文档之间的语义连接。
可在 http://localhost:9091/ui/ 访问。
docker run -p 9091:9091 -p 9092:9092 -v $(pwd)/data:/data sanonone/kektordb:latest
从 发布页面 下载预编译的二进制文件。
# Linux/macOS
./kektordb
兼容性说明: 所有开发和测试均在 Linux (x86_64) 上进行。纯 Go 构建应该可以在 Windows/Mac/ARM 上运行。
KektorDB 可以直接导入到你的 Go 应用程序中,无需外部服务或容器。
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. 初始化引擎(自动管理持久化)
opts := engine.DefaultOptions("./kektor_data")
db, err := engine.Open(opts)
if err != nil { panic(err) }
defer db.Close()
// 2. 创建索引
db.VCreate("products", distance.Cosine, 16, 200, distance.Float32, "english", nil)
// 3. 添加数据
db.VAdd("products", "p1", []float32{0.1, 0.2}, map[string]any{"category": "electronics"})
// 4. 搜索
results, _ := db.VSearch("products", []float32{0.1, 0.2}, 10, "category=electronics", 100, 0.5)
fmt.Println("找到的 ID:", results)
}
此示例演示了完整的工作流程:创建索引、批量插入带有元数据的数据以及执行混合搜索(向量 + 关键词)。
安装客户端和工具:
pip install kektordb-client sentence-transformers
运行脚本:
from kektordb_client import KektorDBClient
from sentence_transformers import SentenceTransformer
# 1. 初始化
client = KektorDBClient(port=9091)
model = SentenceTransformer('all-MiniLM-L6-v2')
index = "quickstart"
# 2. 创建索引(启用混合搜索)
try: client.delete_index(index)
except: pass
client.vcreate(index, metric="cosine", text_language="english")
# 3. 添加数据(批量)
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"已索引 {len(batch)} 个文档。")
# 4. 搜索(混合:向量 + 元数据过滤)
# 查找 "fast programming languages" 但仅在 'code' 类别中
query_vec = model.encode("fast programming languages").tolist()
results = client.vsearch(
index,
query_vector=query_vec,
k=2,
filter_str="category='code'", # 元数据过滤
alpha=0.7 # 70% 向量相似性,30% 关键词排名
)
print(f"排名最高的结果 ID: {results[0]}")
KektorDB 包含一个用于 LangChain Python 的集成包装器,允许你直接将其连接到现有的 AI 管道。
from kektordb_client.langchain import KektorVectorStore
基准测试在本地 Linux 机器(消费级硬件,Intel i5-12500)上执行。与 Qdrant 和 ChromaDB(通过 Docker 并使用主机网络)进行比较,以确保公平的基准。
警告: 数据库基准测试很复杂。这些结果反映了在我的开发机器上的特定场景(单节点、重读取、Python 客户端)。它们旨在展示 KektorDB 作为高性能嵌入式引擎的能力,而不是声称在生产分布式场景中的绝对优势。
40 万向量,float32 精度。 KektorDB 利用针对余弦相似性优化的 Go Assembly(Gonum)。在此特定设置中,它显示了非常高的吞吐量。
| 数据库 | Recall@10 | QPS(查询/秒) | 索引时间(秒) |
|---|---|---|---|
| KektorDB | 0.9664 | 1073 | 102.9s |
| Qdrant | 0.9695 | 848 | 32.3s |
| ChromaDB | 0.9519 | 802 | 51.5s |
100 万向量,float32 精度。
KektorDB 使用混合 Go/Rust 引擎(-tags rust)进行此测试。尽管 128d 向量有 CGO 开销,但性能与原生 C++/Rust 引擎相当。
| 数据库 | Recall@10 | QPS(查询/秒) | 索引时间(秒) |
|---|---|---|---|
| KektorDB | 0.9906 | 881 | 481.4s |
| Qdrant | 0.998 | 845 | 88.5s |
| ChromaDB | 0.9956 | 735 | 211.2s |
关于索引速度的说明: KektorDB 目前在摄取方面比成熟的引擎更慢。这部分是因为它在插入时立即构建完全可查询的图,但主要是由于当前的单图架构。*优化大规模摄取(bulk)速度是下一个主要版本的绝对优先级。
TIP
性能优化:"快速摄取,稍后优化"
如果你需要快速索引大型数据集,请使用较低的 ef_construction(例如 40)创建索引。这显著减少索引时间。
然后可以启用具有更高质量目标(例如 200)的 Refine 后台进程。KektorDB 将在后台逐步优化图连接,同时保持可用于查询。
KektorDB 通过量化和压缩提供显著的内存节省,使你能够将更大的数据集放入 RAM 中,而对性能或召回率的影响最小。
| 场景 | 配置 | 内存影响 | QPS | Recall |
|---|---|---|---|---|
| NLP (GloVe-100d) | Float32 | 100%(基准) | ~1073 | 0.9664 |
| Int8 | ~25% | ~858 | 0.905 | |
| Vision (SIFT-1M) | Float32 | 100%(基准) | ~881 | 0.9906 |
| Float16 | ~50% | ~834 | 0.9770 |
(Rust 加速构建中的"智能分派"逻辑根据向量维度自动为每个操作选择最佳实现——Go、Gonum 或 Rust。纯 Go 版本的 float16 和 int8 作为可移植的回退。)
有关所有功能和 API 端点的完整指南,请参阅 完整文档。
POST /vector/actions/search:混合向量搜索。POST /vector/actions/import:高速批量加载。POST /vector/indexes:创建和管理索引。POST /graph/actions/link:创建语义关系。POST /graph/actions/traverse:从特定节点 ID 开始的深度图遍历(N-Hop)。POST /rag/retrieve:获取 RAG 的文本块。GET /system/tasks/{id}:监控长时间运行的任务。POST /system/save:手动快照。KektorDB 是一个处于活跃开发中的年轻项目。
下一个重要里程碑侧重于突破 RAM 限制并提高数据一致性保证。
旨在使 KektorDB 为生产做好准备且更快的功能。
proxy.yaml 中定义自定义图遍历路径,而不是依赖硬编码的默认值。WHERE user_id = X)。研究中的功能。它们的实现取决于实际采用、反馈和可用开发时间。
想影响路线图? 打开 Issue 或对现有问题投票!
虽然雄心勃勃,但开发速度取决于可用的空闲时间和社区贡献。路线图代表了技术 愿景,但优先级可能会根据用户反馈和稳定性需求而变化。
如果你喜欢这个愿景并希望加速进程,Pull Request 是受欢迎的!
KektorDB 是一个从学习欲望中诞生的个人项目。
作为唯一的维护者,我构建这个引擎是为了探索 CGO、SIMD 和低级 Go 优化。我为迄今为止达到的性能感到自豪,但我知道总有更好的写代码方式。
如果你注意到竞态条件、错过的优化或非惯用的 Go 模式,请打开 Issue 或 PR。
👉 了解更多
在 Apache 2.0 许可证下分发。有关详细信息,请参阅 LICENSE 文件。
如果你觉得这个工具对你的本地 RAG 设置或 Go 应用程序有用,请考虑支持开发。
你的支持帮助我投入更多时间进行维护、新功能和文档。