Pgvector 0.1.4
Prefix ReservedSee the version list below for details.
dotnet add package Pgvector --version 0.1.4
NuGet\Install-Package Pgvector -Version 0.1.4
<PackageReference Include="Pgvector" Version="0.1.4" />
paket add Pgvector --version 0.1.4
#r "nuget: Pgvector, 0.1.4"
// Install Pgvector as a Cake Addin #addin nuget:?package=Pgvector&version=0.1.4 // Install Pgvector as a Cake Tool #tool nuget:?package=Pgvector&version=0.1.4
pgvector-dotnet
pgvector support for C#
Supports Npgsql, Dapper, and Entity Framework Core
Getting Started
Follow the instructions for your database library:
Npgsql
Run:
dotnet add package Pgvector
Import the library
using Pgvector.Npgsql;
Create a connection
var dataSourceBuilder = new NpgsqlDataSourceBuilder(connString);
dataSourceBuilder.UseVector();
await using var dataSource = dataSourceBuilder.Build();
var conn = dataSource.OpenConnection();
Enable the extension
await using (var cmd = new NpgsqlCommand("CREATE EXTENSION IF NOT EXISTS vector", conn))
{
await cmd.ExecuteNonQueryAsync();
}
conn.ReloadTypes();
Create a table
await using (var cmd = new NpgsqlCommand("CREATE TABLE items (id serial PRIMARY KEY, embedding vector(3))", conn))
{
await cmd.ExecuteNonQueryAsync();
}
Insert a vector
await using (var cmd = new NpgsqlCommand("INSERT INTO items (embedding) VALUES ($1)", conn))
{
var embedding = new Vector(new float[] { 1, 1, 1 });
cmd.Parameters.AddWithValue(embedding);
await cmd.ExecuteNonQueryAsync();
}
Get the nearest neighbors
await using (var cmd = new NpgsqlCommand("SELECT * FROM items ORDER BY embedding <-> $1 LIMIT 5", conn))
{
var embedding = new Vector(new float[] { 1, 1, 1 });
cmd.Parameters.AddWithValue(embedding);
await using (var reader = await cmd.ExecuteReaderAsync())
{
while (await reader.ReadAsync())
{
Console.WriteLine((Vector)reader.GetValue(0));
}
}
}
Add an approximate index
await using (var cmd = new NpgsqlCommand("CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100)", conn))
{
await cmd.ExecuteNonQueryAsync();
}
Use vector_ip_ops
for inner product and vector_cosine_ops
for cosine distance
See a full example
Dapper
Run:
dotnet add package Pgvector.Dapper
Import the library
using Pgvector.Dapper;
using Pgvector.Npgsql;
Create a connection
SqlMapper.AddTypeHandler(new VectorTypeHandler());
var dataSourceBuilder = new NpgsqlDataSourceBuilder(connString);
dataSourceBuilder.UseVector();
await using var dataSource = dataSourceBuilder.Build();
var conn = dataSource.OpenConnection();
Enable the extension
conn.Execute("CREATE EXTENSION IF NOT EXISTS vector");
conn.ReloadTypes();
Define a class
public class Item
{
public int Id { get; set; }
public Vector? Embedding { get; set; }
}
Create a table
conn.Execute("CREATE TABLE items (id serial PRIMARY KEY, embedding vector(3))");
Insert a vector
var embedding = new Vector(new float[] { 1, 1, 1 });
conn.Execute(@"INSERT INTO items (embedding) VALUES (@embedding)", new { embedding });
Get the nearest neighbors
var embedding = new Vector(new float[] { 1, 1, 1 });
var items = conn.Query<Item>("SELECT * FROM items ORDER BY embedding <-> @embedding LIMIT 5", new { embedding });
foreach (Item item in items)
{
Console.WriteLine(item.Embedding);
}
Add an approximate index
conn.Execute("CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100)");
// or
conn.Execute("CREATE INDEX ON items USING hnsw (embedding vector_l2_ops)");
Use vector_ip_ops
for inner product and vector_cosine_ops
for cosine distance
See a full example
Entity Framework Core
Run:
dotnet add package Pgvector.EntityFrameworkCore
Import the library
using Pgvector.EntityFrameworkCore;
Enable the extension
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasPostgresExtension("vector");
}
Configure the connection
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseNpgsql("connString", o => o.UseVector());
}
Define a model
public class Item
{
[Column(TypeName = "vector(3)")]
public Vector? Embedding { get; set; }
}
Insert a vector
ctx.Items.Add(new Item { Embedding = new Vector(new float[] { 1, 1, 1 }) });
ctx.SaveChanges();
Get the nearest neighbors
var embedding = new Vector(new float[] { 1, 1, 1 });
var items = await ctx.Items.FromSql($"SELECT * FROM items ORDER BY embedding <-> {embedding} LIMIT 5").ToListAsync();
foreach (Item item in items)
{
if (item.Embedding != null)
{
Console.WriteLine(item.Embedding);
}
}
Add an approximate index
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Item>()
.HasIndex(i => i.Embedding)
.HasMethod("ivfflat") // or hnsw
.HasOperators("vector_l2_ops");
}
Use vector_ip_ops
for inner product and vector_cosine_ops
for cosine distance
See a full example
History
Contributing
Everyone is encouraged to help improve this project. Here are a few ways you can help:
- Report bugs
- Fix bugs and submit pull requests
- Write, clarify, or fix documentation
- Suggest or add new features
To get started with development:
git clone https://github.com/pgvector/pgvector-dotnet.git
cd pgvector-dotnet
createdb pgvector_dotnet_test
dotnet test
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
NuGet packages (6)
Showing the top 5 NuGet packages that depend on Pgvector:
Package | Downloads |
---|---|
Pgvector.EntityFrameworkCore
pgvector support for Entity Framework Core |
|
Microsoft.KernelMemory.MemoryDb.Postgres
Postgres(with pgvector extension) connector for Microsoft Kernel Memory, to store and search memory using Postgres vector indexing and Postgres features. |
|
Microsoft.SemanticKernel.Connectors.Postgres
Postgres(with pgvector extension) connector for Semantic Kernel plugins and semantic memory |
|
LangChain.Databases.Postgres
Postgres for LangChain. |
|
Pgvector.Dapper
pgvector support for Dapper |
GitHub repositories (4)
Showing the top 4 popular GitHub repositories that depend on Pgvector:
Repository | Stars |
---|---|
microsoft/semantic-kernel
Integrate cutting-edge LLM technology quickly and easily into your apps
|
|
dotnet/eShop
A reference .NET application implementing an eCommerce site
|
|
microsoft/kernel-memory
RAG architecture: index and query any data using LLM and natural language, track sources, show citations, asynchronous memory patterns.
|
|
Azure-Samples/eShopOnAzure
A variant of https://github.com/dotnet/eShop that uses Azure services
|
Version | Downloads | Last updated |
---|---|---|
0.3.0 | 180,864 | 6/26/2024 |
0.2.0 | 478,884 | 11/24/2023 |
0.2.0-rc.2 | 6,785 | 10/26/2023 |
0.2.0-rc.1 | 748 | 10/14/2023 |
0.1.4 | 97,328 | 9/25/2023 |
0.1.3 | 149,489 | 5/20/2023 |
0.1.2 | 4,619 | 4/25/2023 |
0.1.1 | 68,020 | 3/12/2023 |
0.1.0 | 841 | 3/10/2023 |