Partilhar via


Mudanças no Vetor Store - março 2025

Filtragem baseada em LINQ

Ao fazer pesquisas vetoriais é possível criar um filtro (além da semelhança vetorial) que atua nas propriedades dos dados para restringir a lista de registros correspondentes.

Este filtro está a mudar para suportar mais opções de filtragem. Anteriormente, o filtro teria sido expresso usando um tipo de VectorSearchFilter personalizado, mas com essa atualização o filtro seria expresso usando expressões LINQ.

A cláusula de filtro antiga ainda é preservada em uma propriedade chamada OldFilter e será removida no futuro.

// Before
var searchResult = await collection.VectorizedSearchAsync(
    searchVector,
    new() { Filter = new VectorSearchFilter().EqualTo(nameof(Glossary.Category), "External Definitions") });

// After
var searchResult = await collection.VectorizedSearchAsync(
    searchVector,
    new() { Filter = g => g.Category == "External Definitions" });

// The old filter option is still available
var searchResult = await collection.VectorizedSearchAsync(
    searchVector,
    new() { OldFilter = new VectorSearchFilter().EqualTo(nameof(Glossary.Category), "External Definitions") });

Ao fazer uma pesquisa vetorial, é possível escolher a propriedade vetorial contra a qual a pesquisa deve ser executada. Anteriormente, isso era feito através de uma opção na classe VectorSearchOptions chamada VectorPropertyName. VectorPropertyName era uma cadeia de caracteres que poderia conter o nome da propriedade de destino.

VectorPropertyName está sendo obsoleta em favor de uma nova propriedade chamada VectorProperty. VectorProperty é uma expressão que faz referência direta à propriedade necessária.

// Before
var options = new VectorSearchOptions() { VectorPropertyName = "DescriptionEmbedding" };

// After
var options = new VectorSearchOptions<MyRecord>() { VectorProperty = r => r.DescriptionEmbedding };

Especificar VectorProperty permanecerá opcional, assim como VectorPropertyName era opcional. O comportamento ao não especificar o nome da propriedade está mudando. Anteriormente, se não especificasse uma propriedade de destino e existisse mais de uma propriedade de vetor no modelo de dados, a pesquisa teria como alvo a primeira propriedade de vetor disponível no esquema.

Uma vez que a propriedade que é 'primeiro' pode mudar em muitas circunstâncias não relacionadas com o código de pesquisa, usar esta estratégia é arriscado. Estamos, portanto, mudando esse comportamento, de modo que, se houver mais de uma propriedade vetorial, uma deve ser escolhida.

VectorSearchOptions alteração para o tipo genérico

A VectorSearchOptions classe está mudando para VectorSearchOptions<TRecord>, para acomodar a filtragem baseada em LINQ e os novos seletores de propriedade mencionados acima.

Se você estiver construindo atualmente a classe options sem fornecer o nome da classe options, não haverá alteração. Por exemplo, VectorizedSearchAsync(embedding, new() { Top = 5 }).

Por outro lado, se você estiver usando new com o nome do tipo, você precisará adicionar o tipo de registro como um parâmetro genérico.

// Before
var options = new VectorSearchOptions() { Top = 5 };

// After
var options = new VectorSearchOptions<MyRecord>() { Top = 5 };

Remoção de fábricas de coleções em favor do padrão de herança e decorador

Cada implementação do VectorStore permite ao utilizador passar uma fábrica personalizada para utilizar na construção de coleções. Este padrão está a ser removido e a abordagem recomendada agora é herdar do VectorStore, onde se deseja uma construção personalizada e substituir o método GetCollection.

// Before
var vectorStore = new QdrantVectorStore(
    new QdrantClient("localhost"),
    new()
    {
        VectorStoreCollectionFactory = new CustomQdrantCollectionFactory(productDefinition)
    });

// After
public class QdrantCustomCollectionVectorStore(QdrantClient qdrantClient) : QdrantVectorStore(qdrantClient)
{
    public override IVectorStoreRecordCollection<TKey, TRecord> GetCollection<TKey, TRecord>(string name, VectorStoreRecordDefinition? vectorStoreRecordDefinition = null)
    {
        // custom construction logic...
    }
}

var vectorStore = new QdrantCustomCollectionVectorStore(new QdrantClient("localhost"));

Remoção das opções DeleteRecordOptions e UpsertRecordOptions

Os parâmetros DeleteRecordOptions e UpsertRecordOptions foram removidos dos métodos DeleteAsync, DeleteBatchAsync, UpsertAsync e UpsertBatchAsync na interface IVectorStoreRecordCollection<TKey, TRecord>.

Esses parâmetros eram todos opcionais e as classes de opções não continham nenhuma opção a ser definida.

Se você estava passando essas opções no passado, você precisará removê-las com esta atualização.

// Before
collection.DeleteAsync("mykey", new DeleteRecordOptions(), cancellationToken);

// After
collection.DeleteAsync("mykey", cancellationToken);

Não Aplicável

Atualmente, estas alterações só são aplicáveis em C#

Brevemente

Atualmente, estas alterações só são aplicáveis em C#