Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
A biblioteca Microsoft.Extensions.VectorData fornece capacidades de pesquisa vetorial como parte das suas abstrações de armazenamento vetorial. Estas capacidades incluem filtragem e muitas outras opções.
Pesquisa vetorial
O SearchAsync método realiza uma pesquisa de similaridade, retornando registos cuja propriedade vetorial é mais semelhante a um dado valor. Assumindo que tem uma coleção que já contém dados, aqui está uma amostra mínima que mostra pesquisa vetorial usando Qdrant:
// Create a Qdrant VectorStore object and get a VectorStoreCollection for a collection that already contains records
VectorStore vectorStore = new QdrantVectorStore(new QdrantClient("localhost"), ownsClient: true);
VectorStoreCollection<ulong, Hotel> collection = vectorStore.GetCollection<ulong, Hotel>("skhotels");
// Get the 3 hotels whose vector property is most similar to the query text
IAsyncEnumerable<VectorSearchResult<Hotel>> results = collection.SearchAsync("Big rooms with a view", top: 3);
// Inspect the returned hotels and their similarity scores
await foreach (VectorSearchResult<Hotel> record in results)
{
Console.WriteLine("Found hotel description: " + record.Record.Description);
Console.WriteLine("Found record score: " + record.Score);
}
Para mais informações sobre geração de embedding, veja Propriedades vetoriais e geração de embedding.
Número de resultados e omitir resultados
SearchAsync tem um parâmetro obrigatório top que controla o número máximo de registos devolvidos da pesquisa. Considera sempre quantos registos de topo realmente precisas, pois a obtenção excessiva pode reduzir o desempenho da aplicação.
IAsyncEnumerable<VectorSearchResult<Hotel>> searchResult = collection.SearchAsync("Big rooms with a view", top: 3);
Além disso, pode, opcionalmente, saltar registos. Por exemplo, a pesquisa seguinte devolve os 20 produtos mais relevantes após saltar 40:
IAsyncEnumerable<VectorSearchResult<Product>> results = collection.SearchAsync(
"Green socks",
top: 20,
new() { Skip = 40 });
top e Skip pode ser usado para realizar paginação e obter um grande número de resultados usando chamadas separadas. No entanto, esta técnica pode não funcionar bem na sua base de dados, pois ainda terá de encontrar e processar os registos ignorados. Para mais informações, consulte a documentação da sua base de dados.
Filtragem de metadados
Use a VectorSearchOptions<TRecord>.Filter opção de filtrar os registos na coleção escolhida antes de aplicar a pesquisa vetorial. Isto tem múltiplos benefícios:
- Reduz a latência e o custo de processamento, pois apenas os registos restantes após filtragem precisam de ser comparados com o vetor de pesquisa e, por isso, menos comparações vetoriais têm de ser feitas.
- Limita o conjunto de resultados. Por exemplo, pode implementar controlo de acesso excluindo dados a que o utilizador não deveria ter acesso, ou pesquisar apenas dentro de uma categoria específica de produtos.
Para que os campos sejam usados para filtragem, muitos armazenamentos vetoriais exigem que esses campos sejam indexados primeiro. Para mais informações sobre como ativar a indexação em propriedades de dados, consulte a propriedade de dados.
Os filtros são expressos usando expressões LINQ baseadas no tipo do modelo de dados. O conjunto de expressões LINQ suportadas varia consoante a funcionalidade suportada por cada base de dados, mas todas as bases de dados suportam uma base ampla de expressões comuns, por exemplo, iguais, não iguais, and, e or.
class Glossary
{
// ...
// Category is marked as indexed, since you want to filter using this property.
[VectorStoreData(IsIndexed = true)]
public required string Category { get; set; }
// Tags is marked as indexed, since you want to filter using this property.
[VectorStoreData(IsIndexed = true)]
public required List<string> Tags { get; set; }
}
IAsyncEnumerable<VectorSearchResult<Glossary>> results = collection.SearchAsync(
"Some term",
top: 3,
new()
{
Filter = r => r.Category == "External Definitions" && r.Tags.Contains("memory")
});
Incluir vetores nos resultados
Por defeito, as propriedades vetoriais não estão incluídas nos resultados de pesquisa, o que reduz a transferência de dados. Pode configurar a pesquisa para os incluir:
IAsyncEnumerable<VectorSearchResult<Product>> results = collection.SearchAsync(
"Green socks",
top: 3,
new() { IncludeVectors = true });
Especifique a propriedade vetorial
Na maioria dos cenários, apenas uma única propriedade vetorial é definida no modelo de dados e SearchAsync procura automaticamente contra ela. No entanto, quando múltiplas propriedades vetoriais são definidas, deve especificar qual deve ser usada:
class Product
{
// ...
// Multiple vector properties:
[VectorStoreVector(1536)]
public ReadOnlyMemory<float> DescriptionEmbedding { get; set; }
[VectorStoreVector(1536)]
public ReadOnlyMemory<float> FeatureListEmbedding { get; set; }
}
IAsyncEnumerable<VectorSearchResult<Hotel>> results = collection.SearchAsync(
"I'm looking for a product with a specific feature.",
top: 3,
new() { VectorProperty = r => r.FeatureListEmbedding });
Pesquisa híbrida
A pesquisa híbrida combina a pesquisa por similaridade vetorial com a pesquisa tradicional por palavras-chave, executando ambos em paralelo e devolvendo uma combinação dos dois conjuntos de resultados. Isto pode melhorar a qualidade da pesquisa, uma vez que a correspondência de palavras-chave pode capturar correspondências exatas de termos que a similaridade vetorial pode não captar, e vice-versa.
Observação
A pesquisa híbrida só está disponível em bases de dados que a suportam. Apenas os fornecedores destas bases de dados implementam a IKeywordHybridSearchable<TRecord> interface.
Para usar a pesquisa híbrida, o seu modelo de dados precisa de um campo string com pesquisa em texto completo ativada via IsFullTextIndexed:
class Hotel
{
[VectorStoreKey]
public ulong Key { get; set; }
[VectorStoreData(IsFullTextIndexed = true)]
public required string Description { get; set; }
[VectorStoreVector(1536)]
public string DescriptionEmbedding { get; set; }
}
Depois chame HybridSearchAsync, passando tanto o texto de pesquisa como palavras-chave:
var hybridCollection = (IKeywordHybridSearchable<Hotel>)collection;
IAsyncEnumerable<VectorSearchResult<Hotel>> results = hybridCollection.HybridSearchAsync(
"I'm looking for a hotel where customer happiness is the priority.",
["happiness", "hotel", "customer"],
top: 3);
Todas as opções descritas para pesquisa vetorial (top, Skip, Filter, IncludeVectors, VectorProperty) também estão disponíveis para pesquisa híbrida via HybridSearchOptions<TRecord>.
Além disso, a pesquisa híbrida suporta uma AdditionalProperty opção para especificar qual a propriedade de pesquisa em texto completo a atingir. Se o seu modelo de dados tiver apenas uma propriedade com IsFullTextIndexed = true, ela é usada automaticamente; se existirem várias, deve especificar qual:
IAsyncEnumerable<VectorSearchResult<Hotel>> results = hybridCollection.HybridSearchAsync(
"I'm looking for a hotel where customer happiness is the priority.",
["happiness", "hotel", "customer"],
top: 3,
new()
{
VectorProperty = r => r.DescriptionEmbedding,
AdditionalProperty = r => r.Description
});