/pgvector-dart

pgvector support for Dart

Primary LanguageDartMIT LicenseMIT

pgvector-dart

pgvector support for Dart

Supports the postgres package

Build Status

Getting Started

Run:

dart pub add pgvector

And follow the instructions for your database library:

postgres

Import the library

import 'package:pgvector/pgvector.dart';

Enable the extension

await connection.execute("CREATE EXTENSION IF NOT EXISTS vector");

Create a table

await connection.execute("CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3))");

Insert vectors

await connection.execute(
    "INSERT INTO items (embedding) VALUES (@a), (@b), (@c)",
    substitutionValues: {
      "a": pgvector.encode([1, 1, 1]),
      "b": pgvector.encode([2, 2, 2]),
      "c": pgvector.encode([1, 1, 2])
    });

Get the nearest neighbors

List<List<dynamic>> results = await connection.query(
    "SELECT id, embedding FROM items ORDER BY embedding <-> @embedding LIMIT 5",
    substitutionValues: {
      "embedding": pgvector.encode([1, 1, 1])
    });
for (final row in results) {
  print(row[0]);
  print(pgvector.decode(row[1]));
}

Add an approximate index

await connection.execute("CREATE INDEX ON items USING hnsw (embedding vector_l2_ops)");
// or
await connection.execute("CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100)");

Use vector_ip_ops for inner product and vector_cosine_ops for cosine distance

See a full example

Contributing

Everyone is encouraged to help improve this project. Here are a few ways you can help:

To get started with development:

git clone https://github.com/pgvector/pgvector-dart.git
cd pgvector-dart
createdb pgvector_dart_test
dart test