sqlite-vec 简单试用
sqlite-vec 官方实际有一些文档,同时github 也有不少示例,以下就是一个简单使用(集成python)
创建虚拟表
- 参考命令
import sqlite3
import sqlite_vec
from sqlite_vec import serialize_float32
import numpy as np
import uuid
db = sqlite3.connect("demo3.db", isolation_level=None)
db.enable_load_extension(True)
sqlite_vec.load(db)
db.enable_load_extension(False)
dimension = 2
collection_name = "vec_documents"
# 注意我们可以使用给INTEGER 类型的做为主键,但是支持的类型有一些限制,比如text 是支持的,当然元数据列的定义也是类似的,对于vecro 也可以定义distance_metric 方便通过knn 检索处理
result = db.execute(f"create virtual table if not exists {collection_name} using vec0 (id text PRIMARY KEY, vector float[{dimension}] distance_metric=cosine, user_id text, type text, version text)")
- 数据写入
注意存储是blob 我们可以通过serialize_float32 方法转换
for i in range(20,30):
if is_first:
db.execute("insert into vec_documents (id, vector, user_id, type, version) values (?,?, ?, ?, ?)", (str(uuid.uuid4()), first_embedding, f"user_{i}", "text", "v1"))
print(first_embedding)
is_first = False
else:
embedding = np.random.rand(2).astype(np.float32)
print(embedding)
db.execute("insert into vec_documents (id, vector, user_id, type, version) values (?,?, ?, ?, ?)", (str(uuid.uuid4()), serialize_float32(embedding), f"user_{i}", "text", "v1"))
- 查询knn模式的 我们定义了distance_metric=cosine 这样,通过match 就可以返回余弦相似的数值了
search_result = db.execute("select id, user_id,vector, ROUND(vec_distance_cosine(vector,?), 7) distance from vec_documents where vector match ? and type = ? and version = ? and k = 10 order by distance", (first_embedding,first_embedding,"text","v1")).fetchall()
说明
sqlite-vec 不少特性在官方文档都是有说明的,仔细阅读文档还是比较重要的,否则简单看官方一些示例可能会觉得不是很清晰(尤其是knn 匹配的metrics 问题,我们使用cosine的会多一些)
参考资料
https://github.com/asg017/sqlite-vec/tree/main
https://alexgarcia.xyz/sqlite-vec/python.html
浙公网安备 33010602011771号