MariaDB 向量
Sergei Golubchik
MariaDB
关于我
- MariaDB 首席架构师
- MariaDB 基金会,董事会成员
- MySQL 核心开发者:1998-2009
- MariaDB 核心开发者:2010-…
如何?
- 将数据文本(图像、音频)转换为向量
- 将向量存储到数据库中
- 进行搜索时,您需要将查询文本(图像、音频)转换为向量
什么是“向量”?
- 一个浮点数列表
[0.4187, 0.8099, 0.82319, 0.5982, 0.03326]
- 典型长度:20–2000 个数值
- 搜索“最接近的”
什么是“MHNSW”?
- 在 MariaDB 中使用的向量搜索算法
- HNSW = 分层可导航小世界
- MariaDB 使用了一个修改过的变体,并带有各种增强功能
表格
CREATE TABLE embeddings (
doc_id BIGINT UNSIGNED PRIMARY KEY,
embedding VECTOR(1536) NOT NULL,
VECTOR INDEX (embedding) M=8 DISTANCE=COSINE
);
Python
from openai import OpenAI
client = OpenAI()
model = "text-embedding-3-small"
def get_embedding(text):
return client.embeddings.create(input = [text],
model=model).data[0].embedding
索引
import mariadb v = get_embedding(document[i]) cur.execute("INSERT embeddings VALUES (%d, Vec_FromText(%s))", (i, str(v)))
import mariadb import array v = get_embedding(document[i]) cur.execute("INSERT embeddings VALUES (%d, %s)", (i, array.array("f", v).tobytes()))
搜索
import mariadb
import array
q = get_embedding(user_question)
cur.execute("""
SELECT doc_id FROM embeddings
ORDER BY VEC_DISTANCE(%s, embedding)
LIMIT 5
""", array.array("f", q).tobytes()))
LlamaIndex
from llama_index.vector_stores.mariadb import MariaDBVector
vector_store = MariaDBVector.from_params(
host="localhost",
user="llamaindex",
password="********",
database="llamaindexdb",
table_name="vectorstore",
embed_dim=1536
)
LangChain
from langchain_mariadb import MariaDBStore, DistanceStrategy
vector_store = MariaDBStore(
embeddings=OpenAIEmbeddings(),
embedding_length=1536,
distance_strategy=DistanceStrategy.COSINE,
pool=mariadb.ConnectionPool(
host="localhost",
user="langchain",
password="*********",
database="langchaindb"
)
)
调优很难
- 许多 (>10) 算法参数
- 难以描述它们的作用
- 参数之间复杂的相互作用
服务器变量
SET @@mhnsw_max_cache_size = 16777216;
SET @@mhnsw_ef_search = 20;
SET @@mhnsw_default_distance = EUCLIDEAN;
SET @@mhnsw_default_m = 6;
DISTANCE (mhnsw_default_distance)
CREATE TABLE embeddings (
doc_id BIGINT UNSIGNED PRIMARY KEY,
embedding VECTOR(100) NOT NULL,
VECTOR INDEX (embedding) DISTANCE=COSINE
);
mhnsw_ef_search 和 M (mhnsw_default_m)
- 慢而精确 ↔ 快而不精确?
- 快速写入 / 慢速搜索 ↔ 慢速写入 / 快速搜索?
- mhnsw_ef_search 仅影响搜索
- M (mhnsw_default_m) 影响写入和搜索
qps vs 召回率
|
构建时间 vs 召回率
|
小型:6 万向量,784 维度,欧几里得
构建时间 vs 召回率 | | qps vs 召回率 |
|
|
|
大型:100 万向量,960 维度,欧几里得
构建时间 vs 召回率 | | qps vs 召回率 |
|
|
|
复杂:29 万向量,256 维度,余弦
构建时间 vs 召回率 | | qps vs 召回率 |
|
|
|
当前已实现
- VECTOR(N) 数据类型
- 文本和直接二进制输入
- 使用 MHNSW 算法的 VECTOR 索引类型
- 两种距离函数
- 两个调优参数
- 不错的性能
当前已实现(更多)
- 具有 SQL 语义的 WHERE 子句(WHERE 后面的 LIMIT)
- 后置过滤
- 很少有向量数据库支持它
- pgvector 自 0.8.0 版本以来支持它
- 16 位精度
- 一半大小(32 位浮点数的一半)
- 不是半精度浮点数(具有 8–10 位精度)
由以下支持
- LlamaIndex — v0.12.11
- SpringAI — v1.0.0-M5
- Hibernate — 7.0
- LangChain — discussions/29203
- LangChain4J — pull/2225
- LangChainJS — pull/7360
限制
- 每表只有一个向量索引
- 仅支持非 NULL 值
- 仅支持 InnoDB、MyISAM 和 Aria
- 不支持分区
- 不支持 XA
未来计划
- 距离(汉明?L1?杰卡德?)
- 向量搜索算法(IVFFlat?DiskANN?)
- 可观测性改进
- 混合搜索(带有倒数秩融合)
- 更多性能提升(预过滤、量化等)
- 消除限制
可用版本
- MariaDB Server 11.7
- MariaDB Enterprise Server 11.4