Epsilla 是一个开源向量数据库。我们专注于确保向量搜索的可扩展性、高性能和成本效益。EpsillaDB 弥合了信息检索和大型语言模型中记忆保留之间的差距。
使用 Docker 快速入门
1. 在 Docker 中运行后端
docker pull epsilla/vectordb
docker run --pull=always -d -p 8888:8888 -v /data:/data epsilla/vectordb
2. 与 Python 客户端交互
pip install pyepsilla
from pyepsilla import vectordb
client = vectordb.Client(host='localhost', port='8888')
client.load_db(db_name="MyDB", db_path="/data/epsilla")
client.use_db(db_name="MyDB")
client.create_table(
table_name="MyTable",
table_fields=[
{"name": "ID", "dataType": "INT", "primaryKey": True},
{"name": "Doc", "dataType": "STRING"},
],
indices=[
{"name": "Index", "field": "Doc"},
]
)
client.insert(
table_name="MyTable",
records=[
{"ID": 1, "Doc": "木星是太阳系中最大的行星。"},
{"ID": 2, "Doc": "猎豹是陆地上最快的动物,速度超过60英里每小时。"},
{"ID": 3, "Doc": "文森特·梵高画了著名的《星夜》作品。"},
{"ID": 4, "Doc": "亚马逊河是世界上最长的河流。"},
{"ID": 5, "Doc": "月球每27天完成一次绕地球的轨道。"},
],
)
client.query(
table_name="MyTable",
query_text="天体及其特征",
limit=2
)
# 结果
# {
# 'message': '查询成功。',
# 'result': [
# {'Doc': '木星是太阳系中最大的行星。', 'ID': 1},
# {'Doc': '月球每27天完成一次绕地球的轨道。', 'ID': 5}
# ],
# 'statusCode': 200
# }
特性:
-
嵌入向量的高性能和生产规模的相似性搜索。
-
完整的数据库管理系统,具有熟悉的数据库、表和字段概念。向量只是另一种字段类型。
-
元数据过滤。
-
稠密向量和稀疏向量融合的混合搜索。
-
内置嵌入支持,自然语言输入和输出的搜索体验。
-
云原生架构,计算与存储分离,无服务器和多租户。
-
丰富的生态系统集成,包括LangChain和LlamaIndex。
-
提供Python/JavaScript/Ruby客户端以及REST API接口。
Epsilla 的核心用 C++ 编写,并利用先进的学术并行图遍历技术进行向量索引,比 HNSW 快 10 倍,同时保持超过 99.9% 的精度。
Epsilla 云
访问我们的完全托管的向量数据库服务 Epsilla Cloud
(实验性)在不启动 Docker 镜像的情况下将 Epsilla 作为 Python 库使用
1. 构建 Epsilla Python Bindings 库包
cd engine/scripts
(如果是在Ubuntu上,首先运行这个: bash setup-dev.sh)
bash install_oatpp_modules.sh
cd ..
bash build.sh
ls -lh build/*.so
2. 使用上一步创建的 "epsilla.so" "libvectordb_dylib.so" 文件夹中的 python 绑定库运行测试
cd engine
export PYTHONPATH=./build/
export DB_PATH=/tmp/db33
python3 test/bindings/python/test.py
以下是一些示例代码:
import epsilla
epsilla.load_db(db_name="db", db_path="/data/epsilla")
epsilla.use_db(db_name="db")
epsilla.create_table(
table_name="MyTable",
table_fields=[
{"name": "ID", "dataType": "INT", "primaryKey": True},
{"name": "Doc", "dataType": "STRING"},
{"name": "EmbeddingEuclidean", "dataType": "VECTOR_FLOAT", "dimensions": 4, "metricType": "EUCLIDEAN"}
]
)
epsilla.insert(
table_name="MyTable",
records=[
{"ID": 1, "Doc": "柏林", "EmbeddingEuclidean": [0.05, 0.61, 0.76, 0.74]},
{"ID": 2, "Doc": "伦敦", "EmbeddingEuclidean": [0.19, 0.81, 0.75, 0.11]},
{"ID": 3, "Doc": "莫斯科", "EmbeddingEuclidean": [0.36, 0.55, 0.47, 0.94]}
]
)
(code, response) = epsilla.query(
table_name="MyTable",
query_field="EmbeddingEuclidean",
response_fields=["ID", "Doc", "EmbeddingEuclidean"],
query_vector=[0.35, 0.55, 0.47, 0.94],
filter="ID < 6",
limit=10,
with_distance=True
)
print(code, response)