2024-05-10 20:51:42 -07:00
|
|
|
require 'sqlite3'
|
|
|
|
|
require 'sqlite_vec'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
db = SQLite3::Database.new(':memory:')
|
|
|
|
|
db.enable_load_extension(true)
|
|
|
|
|
SqliteVec.load(db)
|
|
|
|
|
db.enable_load_extension(false)
|
|
|
|
|
|
|
|
|
|
sqlite_version, vec_version = db.execute("select sqlite_version(), vec_version()").first
|
|
|
|
|
puts "sqlite_version=#{sqlite_version}, vec_version=#{vec_version}"
|
|
|
|
|
|
2024-05-11 00:21:44 -07:00
|
|
|
db.execute("CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[4])")
|
2024-05-10 20:51:42 -07:00
|
|
|
|
|
|
|
|
items = [
|
2024-05-11 00:21:44 -07:00
|
|
|
[1, [0.1, 0.1, 0.1, 0.1]],
|
|
|
|
|
[2, [0.2, 0.2, 0.2, 0.2]],
|
|
|
|
|
[3, [0.3, 0.3, 0.3, 0.3]],
|
|
|
|
|
[4, [0.4, 0.4, 0.4, 0.4]],
|
|
|
|
|
[5, [0.5, 0.5, 0.5, 0.5]],
|
2024-05-10 20:51:42 -07:00
|
|
|
]
|
2024-05-11 00:21:44 -07:00
|
|
|
|
2024-05-10 20:51:42 -07:00
|
|
|
db.transaction do
|
|
|
|
|
items.each do |item|
|
|
|
|
|
db.execute("INSERT INTO vec_items(rowid, embedding) VALUES (?, ?)", [item[0], item[1].pack("f*")])
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2024-05-11 00:21:44 -07:00
|
|
|
query = [0.3, 0.3, 0.3, 0.3]
|
2024-05-10 20:51:42 -07:00
|
|
|
rows = db.execute(<<-SQL, [query.pack("f*")])
|
|
|
|
|
SELECT
|
|
|
|
|
rowid,
|
|
|
|
|
distance
|
|
|
|
|
FROM vec_items
|
|
|
|
|
WHERE embedding MATCH ?
|
|
|
|
|
ORDER BY distance
|
2024-05-11 00:21:44 -07:00
|
|
|
LIMIT 3
|
2024-05-10 20:51:42 -07:00
|
|
|
SQL
|
|
|
|
|
|
|
|
|
|
puts rows
|