mirror of
https://github.com/asg017/sqlite-vec.git
synced 2026-04-24 16:26:37 +02:00
example updates
This commit is contained in:
parent
12c96fc6fe
commit
85fac4c5ef
10 changed files with 112 additions and 76 deletions
|
|
@ -1,5 +1,4 @@
|
|||
import { Database } from "bun:sqlite";
|
||||
|
||||
Database.setCustomSQLite("/usr/local/opt/sqlite3/lib/libsqlite3.dylib");
|
||||
|
||||
const db = new Database(":memory:");
|
||||
|
|
@ -14,6 +13,15 @@ const { sqlite_version, vec_version } = db
|
|||
|
||||
console.log(`sqlite_version=${sqlite_version}, vec_version=${vec_version}`);
|
||||
|
||||
const items = [
|
||||
[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]],
|
||||
];
|
||||
const query = [0.3, 0.3, 0.3, 0.3];
|
||||
|
||||
db.exec("CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[8])");
|
||||
|
||||
const insertStmt = db.prepare(
|
||||
|
|
@ -22,16 +30,12 @@ const insertStmt = db.prepare(
|
|||
|
||||
const insertVectors = db.transaction((items) => {
|
||||
for (const [id, vector] of items) {
|
||||
insertStmt.run(BigInt(id), vector);
|
||||
insertStmt.run(BigInt(id), new Float32Array(vector));
|
||||
}
|
||||
});
|
||||
|
||||
insertVectors([
|
||||
[1, new Float32Array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8])],
|
||||
[2, new Float32Array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8])],
|
||||
]);
|
||||
insertVectors(items);
|
||||
|
||||
const query = new Float32Array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]);
|
||||
const rows = db
|
||||
.prepare(
|
||||
`
|
||||
|
|
@ -41,7 +45,7 @@ const rows = db
|
|||
FROM vec_items
|
||||
WHERE embedding MATCH ?
|
||||
ORDER BY distance
|
||||
LIMIT 5
|
||||
LIMIT 3
|
||||
`
|
||||
)
|
||||
.all(query);
|
||||
|
|
|
|||
|
|
@ -22,21 +22,25 @@ int main(int argc, char *argv[]) {
|
|||
printf("sqlite_version=%s, vec_version=%s\n", sqlite3_column_text(stmt, 0), sqlite3_column_text(stmt, 1));
|
||||
sqlite3_finalize(stmt);
|
||||
|
||||
rc = sqlite3_prepare_v2(db, "CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[8])", -1, &stmt, NULL);
|
||||
static const struct {
|
||||
sqlite3_int64 id;
|
||||
float vector[4];
|
||||
} items[] = {
|
||||
{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}},
|
||||
};
|
||||
float query[4] = {0.3, 0.3, 0.3, 0.3};
|
||||
|
||||
|
||||
rc = sqlite3_prepare_v2(db, "CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[4])", -1, &stmt, NULL);
|
||||
assert(rc == SQLITE_OK);
|
||||
rc = sqlite3_step(stmt);
|
||||
assert(rc == SQLITE_DONE);
|
||||
sqlite3_finalize(stmt);
|
||||
|
||||
|
||||
static const struct {
|
||||
sqlite3_int64 id;
|
||||
float vector[8];
|
||||
} items[] = {
|
||||
{1, {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8}},
|
||||
{2, {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8}},
|
||||
};
|
||||
|
||||
rc = sqlite3_exec(db, "BEGIN", NULL, NULL, NULL);
|
||||
assert(rc == SQLITE_OK);
|
||||
rc = sqlite3_prepare_v2(db, "INSERT INTO vec_items(rowid, embedding) VALUES (?, ?)", -1, &stmt, NULL);
|
||||
|
|
@ -52,7 +56,6 @@ int main(int argc, char *argv[]) {
|
|||
rc = sqlite3_exec(db, "COMMIT", NULL, NULL, NULL);
|
||||
assert(rc == SQLITE_OK);
|
||||
|
||||
|
||||
rc = sqlite3_prepare_v2(db,
|
||||
"SELECT "
|
||||
" rowid, "
|
||||
|
|
@ -60,11 +63,10 @@ int main(int argc, char *argv[]) {
|
|||
"FROM vec_items "
|
||||
"WHERE embedding MATCH ?1 "
|
||||
"ORDER BY distance "
|
||||
"LIMIT 5 "
|
||||
"LIMIT 3 "
|
||||
, -1, &stmt, NULL);
|
||||
assert(rc == SQLITE_OK);
|
||||
|
||||
float query[8] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8};
|
||||
sqlite3_bind_blob(stmt, 1, query, sizeof(query), SQLITE_STATIC);
|
||||
|
||||
while(1) {
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
import { Database } from "jsr:@db/sqlite@0.11";
|
||||
//import { loadablePath } from "npm:sqlite-vec";
|
||||
import * as sqliteVec from "npm:sqlite-vec@0.0.1-alpha.3";
|
||||
|
||||
const db = new Database(":memory:");
|
||||
db.enableLoadExtension = true;
|
||||
db.loadExtension("../../dist/vec0");
|
||||
sqliteVec.load(db);
|
||||
db.enableLoadExtension = false;
|
||||
|
||||
const [sqlite_version, vec_version] = db
|
||||
|
|
@ -11,24 +11,29 @@ const [sqlite_version, vec_version] = db
|
|||
.value<[string]>()!;
|
||||
console.log(`sqlite_version=${sqlite_version}, vec_version=${vec_version}`);
|
||||
|
||||
db.exec("CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[8])");
|
||||
const items = [
|
||||
[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]],
|
||||
];
|
||||
const query = [0.3, 0.3, 0.3, 0.3];
|
||||
|
||||
db.exec("CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[4])");
|
||||
|
||||
const insertStmt = db.prepare(
|
||||
"INSERT INTO vec_items(rowid, embedding) VALUES (?1, vec_f32(?2))"
|
||||
"INSERT INTO vec_items(rowid, embedding) VALUES (?, ?)"
|
||||
);
|
||||
|
||||
const insertVectors = db.transaction((items) => {
|
||||
for (const [id, vector] of items) {
|
||||
insertStmt.run(BigInt(id), new Uint8Array(vector.buffer));
|
||||
insertStmt.run(BigInt(id), new Uint8Array(new Float32Array(vector).buffer));
|
||||
}
|
||||
});
|
||||
|
||||
insertVectors([
|
||||
[1, new Float32Array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8])],
|
||||
[2, new Float32Array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8])],
|
||||
]);
|
||||
insertVectors(items);
|
||||
|
||||
const query = new Float32Array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]);
|
||||
const rows = db
|
||||
.prepare(
|
||||
`
|
||||
|
|
@ -41,7 +46,7 @@ const rows = db
|
|||
LIMIT 5
|
||||
`
|
||||
)
|
||||
.all([new Uint8Array(query.buffer)]);
|
||||
.all([new Uint8Array(new Float32Array(query).buffer)]);
|
||||
|
||||
console.log(rows);
|
||||
|
||||
|
|
|
|||
|
|
@ -38,15 +38,19 @@ func main() {
|
|||
}
|
||||
fmt.Printf("sqlite_version=%s, vec_version=%s\n", sqliteVersion, vecVersion)
|
||||
|
||||
_, err = db.Exec("CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[8])")
|
||||
_, err = db.Exec("CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[4])")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
items := map[int][]float32{
|
||||
1: {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8},
|
||||
2: {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8},
|
||||
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},
|
||||
}
|
||||
q := []float32{0.3, 0.3, 0.3, 0.3}
|
||||
|
||||
for id, values := range items {
|
||||
v, err := serializeFloat32(values)
|
||||
|
|
@ -59,7 +63,6 @@ func main() {
|
|||
}
|
||||
}
|
||||
|
||||
q := []float32{0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8}
|
||||
query, err := serializeFloat32(q)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
|
|
@ -72,7 +75,7 @@ func main() {
|
|||
FROM vec_items
|
||||
WHERE embedding MATCH ?
|
||||
ORDER BY distance
|
||||
LIMIT 5
|
||||
LIMIT 3
|
||||
`, query)
|
||||
|
||||
if err != nil {
|
||||
|
|
|
|||
|
|
@ -12,24 +12,29 @@ const { sqlite_version, vec_version } = db
|
|||
|
||||
console.log(`sqlite_version=${sqlite_version}, vec_version=${vec_version}`);
|
||||
|
||||
db.exec("CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[8])");
|
||||
const items = [
|
||||
[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]],
|
||||
];
|
||||
const query = [0.3, 0.3, 0.3, 0.3];
|
||||
|
||||
db.exec("CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[4])");
|
||||
|
||||
const insertStmt = db.prepare(
|
||||
"INSERT INTO vec_items(rowid, embedding) VALUES (?, vec_f32(?))"
|
||||
"INSERT INTO vec_items(rowid, embedding) VALUES (?, ?)"
|
||||
);
|
||||
|
||||
const insertVectors = db.transaction((items) => {
|
||||
for (const [id, vector] of items) {
|
||||
insertStmt.run(BigInt(id), vector);
|
||||
insertStmt.run(BigInt(id), new Float32Array(vector));
|
||||
}
|
||||
});
|
||||
|
||||
insertVectors([
|
||||
[1, new Float32Array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8])],
|
||||
[2, new Float32Array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8])],
|
||||
]);
|
||||
insertVectors(items);
|
||||
|
||||
const query = new Float32Array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]);
|
||||
const rows = db
|
||||
.prepare(
|
||||
`
|
||||
|
|
@ -39,9 +44,9 @@ const rows = db
|
|||
FROM vec_items
|
||||
WHERE embedding MATCH ?
|
||||
ORDER BY distance
|
||||
LIMIT 5
|
||||
LIMIT 3
|
||||
`
|
||||
)
|
||||
.all(query);
|
||||
.all(new Float32Array(query));
|
||||
|
||||
console.log(rows);
|
||||
|
|
|
|||
|
|
@ -27,11 +27,14 @@ sqlite_version, vec_version = db.execute(
|
|||
print(f"sqlite_version={sqlite_version}, vec_version={vec_version}")
|
||||
|
||||
|
||||
db.execute("CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[8])")
|
||||
db.execute("CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[4])")
|
||||
|
||||
items = [
|
||||
(1, [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]),
|
||||
(2, [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]),
|
||||
(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]),
|
||||
]
|
||||
with db:
|
||||
for item in items:
|
||||
|
|
@ -40,7 +43,7 @@ with db:
|
|||
[item[0], serialize_f32(item[1])],
|
||||
)
|
||||
|
||||
query = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]
|
||||
query = [0.3, 0.3, 0.3, 0.3]
|
||||
rows = db.execute(
|
||||
"""
|
||||
SELECT
|
||||
|
|
@ -49,7 +52,7 @@ rows = db.execute(
|
|||
FROM vec_items
|
||||
WHERE embedding MATCH ?
|
||||
ORDER BY distance
|
||||
LIMIT 5
|
||||
LIMIT 3
|
||||
""",
|
||||
[serialize_f32(query)],
|
||||
).fetchall()
|
||||
|
|
|
|||
|
|
@ -10,19 +10,23 @@ 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}"
|
||||
|
||||
db.execute("CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[8])")
|
||||
db.execute("CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[4])")
|
||||
|
||||
items = [
|
||||
[1, [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]],
|
||||
[2, [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]]
|
||||
[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]],
|
||||
]
|
||||
|
||||
db.transaction do
|
||||
items.each do |item|
|
||||
db.execute("INSERT INTO vec_items(rowid, embedding) VALUES (?, ?)", [item[0], item[1].pack("f*")])
|
||||
end
|
||||
end
|
||||
|
||||
query = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]
|
||||
query = [0.3, 0.3, 0.3, 0.3]
|
||||
rows = db.execute(<<-SQL, [query.pack("f*")])
|
||||
SELECT
|
||||
rowid,
|
||||
|
|
@ -30,7 +34,7 @@ rows = db.execute(<<-SQL, [query.pack("f*")])
|
|||
FROM vec_items
|
||||
WHERE embedding MATCH ?
|
||||
ORDER BY distance
|
||||
LIMIT 5
|
||||
LIMIT 3
|
||||
SQL
|
||||
|
||||
puts rows
|
||||
|
|
|
|||
|
|
@ -19,13 +19,16 @@ fn main() -> Result<()> {
|
|||
println!("sqlite_version={sqlite_version}, vec_version={vec_version}");
|
||||
|
||||
let items: Vec<(usize, Vec<f32>)> = vec![
|
||||
(1, vec![0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]),
|
||||
(2, vec![0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]),
|
||||
(1, vec![0.1, 0.1, 0.1, 0.1]),
|
||||
(2, vec![0.2, 0.2, 0.2, 0.2]),
|
||||
(3, vec![0.3, 0.3, 0.3, 0.3]),
|
||||
(4, vec![0.4, 0.4, 0.4, 0.4]),
|
||||
(5, vec![0.5, 0.5, 0.5, 0.5]),
|
||||
];
|
||||
println!("{x}");
|
||||
|
||||
db.execute(
|
||||
"CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[8])",
|
||||
"CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[4])",
|
||||
[],
|
||||
)?;
|
||||
let mut stmt = db.prepare("INSERT INTO vec_items(rowid, embedding) VALUES (?, ?)")?;
|
||||
|
|
@ -33,7 +36,7 @@ fn main() -> Result<()> {
|
|||
stmt.execute(rusqlite::params![item.0, item.1.as_bytes()])?;
|
||||
}
|
||||
|
||||
let query: Vec<f32> = vec![0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8];
|
||||
let query: Vec<f32> = vec![0.3, 0.3, 0.3, 0.3];
|
||||
let result: Vec<(i64, f64)> = db
|
||||
.prepare(
|
||||
r"
|
||||
|
|
@ -43,7 +46,7 @@ fn main() -> Result<()> {
|
|||
FROM vec_items
|
||||
WHERE embedding MATCH ?1
|
||||
ORDER BY distance
|
||||
LIMIT 5
|
||||
LIMIT 3
|
||||
",
|
||||
)?
|
||||
.query_map([query.as_bytes()], |r| Ok((r.get(0)?, r.get(1)?)))?
|
||||
|
|
|
|||
|
|
@ -4,21 +4,24 @@
|
|||
|
||||
select sqlite_version(), vec_version();
|
||||
|
||||
CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[8]);
|
||||
CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[4]);
|
||||
|
||||
INSERT INTO vec_items(rowid, embedding)
|
||||
select
|
||||
value ->> 0,
|
||||
value ->> 1
|
||||
from json_each('[
|
||||
[1, [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]],
|
||||
[2, [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]]
|
||||
[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]]
|
||||
]');
|
||||
|
||||
SELECT
|
||||
rowid,
|
||||
distance
|
||||
FROM vec_items
|
||||
WHERE embedding MATCH '[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]'
|
||||
WHERE embedding MATCH '[0.3, 0.3, 0.3, 0.3]'
|
||||
ORDER BY distance
|
||||
LIMIT 5;
|
||||
LIMIT 3;
|
||||
|
|
|
|||
|
|
@ -5,33 +5,37 @@
|
|||
<div id="target"></div>
|
||||
<script type="module">
|
||||
import {default as init} from "https://cdn.jsdelivr.net/npm/sqlite-vec-wasm-demo@latest/sqlite3.mjs";
|
||||
|
||||
function log(msg) {
|
||||
const pre = document.querySelector('#target').appendChild(document.createElement("pre"));
|
||||
pre.textContent = msg;
|
||||
}
|
||||
|
||||
const sqlite3 = await init();
|
||||
const db = new sqlite3.oo1.DB(":memory:");
|
||||
window.db = db;
|
||||
|
||||
const [sqlite_version, vec_version] = db.selectArray('select sqlite_version(), vec_version();')
|
||||
log(`sqlite_version=${sqlite_version}, vec_version=${vec_version}`);
|
||||
|
||||
|
||||
const items = [
|
||||
[1, new Float32Array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8])],
|
||||
[2, new Float32Array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8])]
|
||||
[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]],
|
||||
];
|
||||
const query = [0.3, 0.3, 0.3, 0.3];
|
||||
|
||||
db.exec('CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[8]);');
|
||||
db.exec('CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[4]);');
|
||||
const stmt = db.prepare("INSERT INTO vec_items(rowid, embedding) VALUES (?, ?)");
|
||||
for(const item of items) {
|
||||
stmt
|
||||
.bind(1, item[0])
|
||||
.bind(2, item[1].buffer)
|
||||
.bind(2, new Float32Array(item[1]).buffer)
|
||||
.stepReset();
|
||||
}
|
||||
stmt.finalize();
|
||||
|
||||
const query = new Float32Array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]);
|
||||
const rows = db
|
||||
.selectArrays(
|
||||
`
|
||||
|
|
@ -41,8 +45,8 @@
|
|||
FROM vec_items
|
||||
WHERE embedding MATCH ?
|
||||
ORDER BY distance
|
||||
LIMIT 5
|
||||
`, query.buffer
|
||||
LIMIT 3
|
||||
`, new Float32Array(query).buffer
|
||||
);
|
||||
|
||||
log(JSON.stringify(rows));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue