Partilhar via


Usando o conector do Armazém de Vetores do SQL Server (Versão Prévia)

Advertência

A funcionalidade SQL Server Vector Store está em fase de testes, e melhorias que exigem alterações significativas ainda podem ocorrer em circunstâncias limitadas em espera de lançamento.

Advertência

A funcionalidade Semantic Kernel Vector Store está em fase de testes, e melhorias que exigem alterações significativas ainda podem ocorrer em circunstâncias limitadas antes do lançamento oficial.

Advertência

A funcionalidade Semantic Kernel Vector Store está em fase de testes, e melhorias que exigem alterações significativas ainda podem ocorrer em circunstâncias limitadas antes do lançamento oficial.

Visão geral

O conector do SQL Server Vetor Store pode ser usado para acessar e gerenciar dados no SQL Server. O conector tem as seguintes características.

Área de Destaque Apoio
A coleção corresponde a Tabela do SQL Server
Tipos de propriedades-chave suportados
  • Int
  • longo
  • corda
  • Guia
  • Data e Hora
  • byte[]
Tipos de propriedade de dados suportados
  • Int
  • curto
  • byte
  • longo
  • Guia
  • corda
  • Bool
  • flutuante
  • duplo
  • decimais
  • byte[]
  • Data e Hora
  • TimeOnly
Tipos de propriedade vetorial suportados
  • ReadOnlyMemory
  • Flutuador de incorporação<>
  • flutuar[]
Tipos de índice suportados
  • Apartamento
Funções de distância suportadas
  • CosineDistância
  • Similaridade de Produto Escalar Negativo
  • Distância Euclidiana
Suporta vários vetores em um registro Sim
IsIndexed é suportado? Sim
"É suportado IsFullTextIndexed?" Não
Está StorageName suportado? Sim
O HybridSearch é suportado? Não

Como Começar

Adicione o pacote NuGet do conector SQL Server Vector Store ao seu projeto.

dotnet add package Microsoft.SemanticKernel.Connectors.SqlServer --prerelease

Você pode adicionar o armazenamento de vetores ao contêiner de injeção de dependência IServiceCollection usando métodos de extensão fornecidos pelo Semantic Kernel.

using Microsoft.Extensions.DependencyInjection;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSqlServerVectorStore(_ => "<connectionstring>");
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSqlServerVectorStore(_ => "<connectionstring>")

Você pode construir uma instância do Sql Server Vetor Store diretamente.

using Microsoft.SemanticKernel.Connectors.SqlServer;

var vectorStore = new SqlServerVectorStore("<connectionstring>");

É possível construir uma referência direta a uma coleção nomeada.

using Microsoft.SemanticKernel.Connectors.SqlServer;

var collection = new SqlServerCollection<string, Hotel>("<connectionstring>", "skhotels");

Mapeamento de dados

O conector do SQL Server Vetor Store fornece um mapeador padrão ao mapear do modelo de dados para o armazenamento. Esse mapeador faz uma conversão direta da lista de propriedades no modelo de dados para as colunas no SQL Server.

Substituição do nome da propriedade

Você pode fornecer nomes de propriedade de substituição para usar no armazenamento que sejam diferentes dos nomes de propriedade no modelo de dados. A substituição do nome da propriedade é realizada configurando a opção StorageName nos atributos de propriedade do modelo de dados ou na definição de registo.

Aqui está um exemplo de um modelo de dados com StorageName definido em seus atributos e como isso será representado em um comando do SQL Server.

using Microsoft.Extensions.VectorData;

public class Hotel
{
    [VectorStoreKey]
    public ulong HotelId { get; set; }

    [VectorStoreData(StorageName = "hotel_name")]
    public string? HotelName { get; set; }

    [VectorStoreData(StorageName = "hotel_description")]
    public string? Description { get; set; }

    [VectorStoreVector(Dimensions: 4, DistanceFunction = DistanceFunction.CosineDistance)]
    public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
}
CREATE TABLE Hotel (
[HotelId] BIGINT NOT NULL,
[hotel_name] NVARCHAR(MAX),
[hotel_description] NVARCHAR(MAX),
[DescriptionEmbedding] VECTOR(4),
PRIMARY KEY ([HotelId])
);

Visão geral

O conector SQL Server do Armazenamento Vetorial é uma implementação fornecida pelo Semantic Kernel que utiliza o Azure SQL como um armazenamento vetorial. Uma vez que o SQL Server on-prem oferece suporte a vetores, ele também pode ser usado com isso.

O conector tem as seguintes características.

Área de Destaque Apoio
A coleção corresponde a Dicionário de tabelas
Tipos de propriedades-chave suportados
  • STR
  • Int
Tipos de propriedade de dados suportados Qualquer tipo
Tipos de propriedade vetorial suportados
  • lista[float]
  • array numpy
Tipos de índice suportados
  • Apartamento
Funções de distância suportadas
  • Distância de Cosseno
  • Semelhança do produto Dot
  • Distância Euclidiana
Suporta vários vetores em um registro Sim
Está is_filterable suportado? Sim
A pesquisa em texto completo é suportada? Não

Como Começar

Adicione o pacote Semantic Kernel ao seu projeto.

pip install semantic-kernel[sql]

O conector do SQL Server usa o pacote pyodbc para se conectar ao SQL Server. O extra instalará o pacote, mas você precisará instalar o driver ODBC para SQL Server separadamente, isso difere de acordo com a plataforma, consulte a Documentação do SQL do Azure para obter detalhes.

Para que o armazenamento e a coleção funcionem, ele precisa de uma cadeia de conexão, que pode ser passada para o construtor ou ser definida na variável SQL_SERVER_CONNECTION_STRINGde ambiente. Para lidar adequadamente com vetores, a opção LongAsMax=yes será adicionada se não for encontrada. Ele também pode usar tanto nome de usuário / senha ou segurança integrada, para o último, o DefaultAzureCredential é usado.

Nos trechos abaixo, supõe-se que você tenha uma classe de modelo de dados definida chamada 'DataModel'.

from semantic_kernel.connectors.sql_server import SqlServerStore

vector_store = SqlServerStore()

# OR

vector_store = SqlServerStore(connection_string="Driver={ODBC Driver 18 for SQL Server};Server=server_name;Database=database_name;UID=user;PWD=password;LongAsMax=yes;")

vector_collection = vector_store.get_collection("dbo.table_name", DataModel)

É possível construir uma referência direta a uma coleção nomeada.

from semantic_kernel.connectors.sql_server import SqlServerCollection

vector_collection = SqlServerCollection("dbo.table_name", DataModel)

Nota: O nome da coleção pode ser especificado como uma cadeia de caracteres simples (por exemplotable_name) ou como um nome totalmente qualificado (por exemplo). dbo.table_name Este último é recomendado para evitar ambiguidade, se nenhum esquema for especificado, o esquema padrão (dbo) será usado.

Quando você tem requisitos específicos para a conexão, você também pode passar um pyodbc.Connection objeto para o SqlServerStore construtor. Isso permite que você use uma cadeia de conexão personalizada ou outras opções de conexão:

from semantic_kernel.connectors.sql_server import SqlServerStore
import pyodbc

# Create a connection to the SQL Server database
connection = pyodbc.connect("Driver={ODBC Driver 18 for SQL Server};Server=server_name;Database=database_name;UID=user;PWD=password;LongAsMax=yes;")
# Create a SqlServerStore with the connection
vector_store = SqlServerStore(connection=connection)

Você terá que se certificar de fechar a conexão sozinho, pois a loja ou coleção não fará isso por você.

Criar consultas personalizadas

O conector do SQL Server é limitado ao tipo de índice Plano.

O ensure_collection_exists método no SqlServerCollection permite que você passe uma única ou várias consultas personalizadas para criar a coleção. As consultas são executadas na ordem em que são passadas, nenhum resultado é retornado.

Se isso for feito, não há garantia de que os outros métodos ainda funcionem conforme o esperado. O conector não está ciente das consultas personalizadas e não as validará.

Se os DataModel tiverem id, content e vector como campos, então, por exemplo, pode-se criar a tabela da seguinte forma para também criar um índice no campo de conteúdo:

from semantic_kernel.connectors.sql_server import SqlServerCollection

# Create a collection with a custom query
async with SqlServerCollection("dbo.table_name", DataModel) as collection:    
    collection.ensure_collection_exists(
        queries=["CREATE TABLE dbo.table_name (id INT PRIMARY KEY, content NVARCHAR(3000) NULL, vector VECTOR(1536) NULL ) PRIMARY KEY (id);",
        "CREATE INDEX idx_content ON dbo.table_name (content);"]
    )

Brevemente

Mais informações em breve.