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

https://alexgarcia.xyz/sqlite-vec/features/knn.html

https://alexgarcia.xyz/sqlite-vec/features/vec0.html

posted on 2025-10-01 08:14  荣锋亮  阅读(56)  评论(0)    收藏  举报

导航