Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Esistono due ricerche attualmente supportate nelle astrazioni dell'archivio di vettori del Semantic Kernel.
-
search
-> vai a Ricerca hybrid_search
- Si tratta di una ricerca basata su un valore di testo e un vettore, se il vettore non viene fornito, verrà generato usando il
embedding_generator
campo nel modello di dati o nella definizione di record o dall'archivio vettoriale stesso.
- Si tratta di una ricerca basata su un valore di testo e un vettore, se il vettore non viene fornito, verrà generato usando il
Tutte le ricerche possono accettare un set facoltativo di parametri:
-
vector
: Un vettore usato per la ricerca può essere fornito al posto dei valori o in aggiunta ai valori per una configurazione ibrida. -
top
: numero di risultati da restituire, il valore predefinito è 3. -
skip
: numero di risultati da ignorare, il valore predefinito è 0. -
include_vectors
: indica se includere i vettori nei risultati, per impostazione predefinita èfalse
. -
filter
: filtro da applicare ai risultati prima dell'applicazione della ricerca vettoriale, il valore predefinito èNone
, sotto forma di espressione lambda:lambda record: record.property == "value"
. -
vector_property_name
: nome della proprietà vector da usare per la ricerca, per impostazione predefinita viene utilizzata la prima proprietà vettoriale presente nel modello di dati o nella definizione di record. -
additional_property_name
: nome del campo aggiuntivo da usare per la ricerca di testo della ricerca ibrida. -
include_total_count
: indica se includere il conteggio totale dei risultati nel risultato della ricerca, per impostazione predefinita èfalse
.
Supponendo di avere una raccolta che contiene già dati, è possibile cercarli facilmente. Di seguito è riportato un esempio di uso di Ricerca intelligenza artificiale di Azure.
from semantic_kernel.connectors.azure_ai_search import AzureAISearchCollection, AzureAISearchStore
# Create a Azure AI Search VectorStore object and choose an existing collection that already contains records.
# Hotels is the data model decorated class.
store = AzureAISearchStore()
collection: AzureAISearchCollection[str, Hotels] = store.get_collection(Hotels, collection_name="skhotels")
search_results = await collection.hybrid_search(
query, vector_property_name="vector", additional_property_name="description"
)
hotels = [record.record async for record in search_results.results]
print(f"Found hotels: {hotels}")
Consiglio
Per altre informazioni su come generare incorporamenti, vedere generazione di incorporamento.
Filtri
Il filter
parametro può essere usato per fornire un filtro per filtrare i record nella raccolta scelta. È definito come espressione lambda o stringa di un'espressione lambda, ad esempio lambda record: record.property == "value"
.
È importante comprendere che questi non vengono eseguiti direttamente, ma vengono analizzati nella sintassi corrispondente agli archivi vettoriali, l'unica eccezione a questo è che InMemoryCollection
esegue direttamente il filtro.
Data questa flessibilità, è importante esaminare la documentazione di un archivio specifico per comprendere quali filtri sono supportati, ad esempio non tutti gli archivi vettoriali supportano filtri negativi (ad lambda x: not x.value
esempio ) e che non diventano evidenti fino a quando non viene eseguita la ricerca.
Avvertimento
La funzionalità di archiviazione vettoriale del Kernel Semantico è in anteprima e i miglioramenti che richiedono cambiamenti significativi possono ancora verificarsi in circostanze limitate prima del rilascio.
Il kernel semantico offre funzionalità di ricerca ibrida come parte delle astrazioni di Vector Store. Ciò supporta il filtro e molte altre opzioni, che questo articolo illustra in modo più dettagliato.
Attualmente il tipo di ricerca ibrida supportata è basato su una ricerca vettoriale, più una ricerca di parole chiave, entrambe eseguite in parallelo, dopo la quale viene restituita un'unione dei due set di risultati. La ricerca ibrida basata su vettori di tipo sparse non è attualmente supportata.
Per eseguire una ricerca ibrida, lo schema del database deve avere un campo vettoriale e un campo stringa con funzionalità di ricerca full-text abilitate.
Se stai creando una raccolta usando i connettori di archiviazione vettoriale del kernel semantico, assicurati di abilitare l'opzione IsFullTextIndexed
nel campo stringa di destinazione per la ricerca di parole chiave.
Consiglio
Per altre informazioni su come abilitare fare IsFullTextIndexed
riferimento ai parametri VectorStoreDataAttribute o alle impostazioni di configurazione VectorStoreDataProperty
Ricerca ibrida
Il metodo HybridSearchAsync
consente la ricerca usando un vettore e un ICollection
di parole chiave stringa. Accetta anche una classe HybridSearchOptions<TRecord>
facoltativa come input.
Questo metodo è disponibile nell'interfaccia seguente:
IKeywordHybridSearchable<TRecord>
Solo i connettori per i database che attualmente supportano la ricerca ibrida con vettori e parole chiave implementano questa interfaccia.
Supponendo di avere una raccolta che contiene già dati, è possibile eseguire facilmente una ricerca ibrida. Di seguito è riportato un esempio di uso di Qdrant.
using Microsoft.SemanticKernel.Connectors.Qdrant;
using Microsoft.Extensions.VectorData;
using Qdrant.Client;
// Placeholder embedding generation method.
async Task<ReadOnlyMemory<float>> GenerateEmbeddingAsync(string textToVectorize)
{
// your logic here
}
// Create a Qdrant VectorStore object and choose an existing collection that already contains records.
VectorStore vectorStore = new QdrantVectorStore(new QdrantClient("localhost"), ownsClient: true);
IKeywordHybridSearchable<Hotel> collection = (IKeywordHybridSearchable<Hotel>)vectorStore.GetCollection<ulong, Hotel>("skhotels");
// Generate a vector for your search text, using your chosen embedding generation implementation.
ReadOnlyMemory<float> searchVector = await GenerateEmbeddingAsync("I'm looking for a hotel where customer happiness is the priority.");
// Do the search, passing an options object with a Top value to limit results to the single top match.
var searchResult = collection.HybridSearchAsync(searchVector, ["happiness", "hotel", "customer"], top: 1);
// Inspect the returned hotel.
await foreach (var record in searchResult)
{
Console.WriteLine("Found hotel description: " + record.Record.Description);
Console.WriteLine("Found record score: " + record.Score);
}
Consiglio
Per altre informazioni su come generare incorporamenti, vedere generazione di incorporamento.
Tipi di vettore supportati
HybridSearchAsync
accetta un tipo generico come parametro vector.
I tipi di vettori supportati da ogni archivio dati variano.
Per l'elenco dei tipi di vettore supportati, vedere la documentazione relativa a ogni connettore.
È anche importante che il tipo di vettore di ricerca corrisponda al vettore di destinazione in cui viene eseguita la ricerca, ad esempio se si dispone di due vettori nello stesso record con tipi di vettore diversi, assicurarsi che il vettore di ricerca fornito corrisponda al tipo del vettore specifico di destinazione. Per selezionare un vettore obiettivo, vedere VectorProperty e AdditionalProperty se si dispone di più di uno per record.
Opzioni di ricerca ibrida
È possibile specificare le opzioni seguenti usando la classe HybridSearchOptions<TRecord>
.
ProprietàVettoriale e ProprietàAggiuntiva
Le opzioni VectorProperty
e AdditionalProperty
possono essere utilizzate per specificare la proprietà vector e la proprietà di ricerca full-text da impostare come destinazione durante la ricerca.
Se non viene fornita alcuna VectorProperty
e il modello di dati contiene un solo vettore, verrà usato tale vettore.
Se il modello di dati non contiene alcun vettore o contiene più vettori, e non viene fornito VectorProperty
, il metodo di ricerca genererà un'eccezione.
Se non viene specificata alcuna AdditionalProperty
e il modello di dati contiene una sola proprietà di ricerca full-text, verrà utilizzata tale proprietà.
Se il modello di dati non contiene una proprietà di ricerca full-text o contiene più proprietà di ricerca full-text e AdditionalProperty
non viene fornito, il metodo di ricerca genererà un'eccezione.
using Microsoft.SemanticKernel.Connectors.Qdrant;
using Microsoft.Extensions.VectorData;
using Qdrant.Client;
var vectorStore = new QdrantVectorStore(new QdrantClient("localhost"), ownsClient: true);
var collection = (IKeywordHybridSearchable<Product>)vectorStore.GetCollection<ulong, Product>("skproducts");
// Create the hybrid search options and indicate that we want
// to search the DescriptionEmbedding vector property and the
// Description full text search property.
var hybridSearchOptions = new HybridSearchOptions<Product>
{
VectorProperty = r => r.DescriptionEmbedding,
AdditionalProperty = r => r.Description
};
// This snippet assumes searchVector is already provided, having been created using the embedding model of your choice.
var searchResult = collection.HybridSearchAsync(searchVector, ["happiness", "hotel", "customer"], top: 3, hybridSearchOptions);
public sealed class Product
{
[VectorStoreKey]
public int Key { get; set; }
[VectorStoreData(IsFullTextIndexed = true)]
public string Name { get; set; }
[VectorStoreData(IsFullTextIndexed = true)]
public string Description { get; set; }
[VectorStoreData]
public List<string> FeatureList { get; set; }
[VectorStoreVector(1536)]
public ReadOnlyMemory<float> DescriptionEmbedding { get; set; }
[VectorStoreVector(1536)]
public ReadOnlyMemory<float> FeatureListEmbedding { get; set; }
}
Inizio e Salta
Le opzioni Top
e Skip
consentono di limitare il numero di risultati ai primi n risultati e di ignorare un numero di risultati dall'inizio del set di risultati.
È possibile usare Top e Skip per eseguire il paging se si desidera recuperare un numero elevato di risultati usando chiamate separate.
// Create the vector search options and indicate that we want to skip the first 40 results and then pass 20 to search to get the next 20.
var hybridSearchOptions = new HybridSearchOptions<Product>
{
Skip = 40
};
// This snippet assumes searchVector is already provided, having been created using the embedding model of your choice.
var searchResult = collection.HybridSearchAsync(searchVector, ["happiness", "hotel", "customer"], top: 20, hybridSearchOptions);
// Iterate over the search results.
await foreach (var result in searchResult)
{
Console.WriteLine(result.Record.Description);
}
I valori predefiniti per Skip
sono 0.
IncludiVettori
L'opzione IncludeVectors
consente di specificare se si desidera restituire vettori nei risultati della ricerca.
Se false
, le proprietà del vettore nel modello restituito verranno lasciate null.
L'uso di false
può ridurre significativamente la quantità di dati recuperati dall'archivio vettoriale durante la ricerca, rendendo le ricerche più efficienti.
Il valore predefinito per IncludeVectors
è false
.
// Create the hybrid search options and indicate that we want to include vectors in the search results.
var hybridSearchOptions = new HybridSearchOptions<Product>
{
IncludeVectors = true
};
// This snippet assumes searchVector is already provided, having been created using the embedding model of your choice.
var searchResult = collection.HybridSearchAsync(searchVector, ["happiness", "hotel", "customer"], top: 3, hybridSearchOptions);
// Iterate over the search results.
await foreach (var result in searchResult)
{
Console.WriteLine(result.Record.FeatureList);
}
Filtro
L'opzione di filtro di ricerca vettoriale può essere usata per fornire un filtro per filtrare i record nella raccolta scelta prima di applicare la ricerca vettoriale.
Questo offre diversi vantaggi:
- Ridurre la latenza e i costi di elaborazione, poiché devono essere confrontati solo i record rimanenti dopo il filtro con il vettore di ricerca e quindi è necessario eseguire un minor numero di confronti vettoriali.
- Limitare il set di risultati per scopi di controllo di accesso, ad esempio, escludendo i dati a cui l'utente non deve avere accesso.
Si noti che affinché i campi vengano usati per filtrare, molti archivi vettoriali richiedono che tali campi vengano indicizzati per primi. Alcuni archivi vettoriali consentiranno di filtrare usando qualsiasi campo, ma possono facoltativamente consentire l'indicizzazione per migliorare le prestazioni di filtro.
Se si crea una raccolta tramite le astrazioni dell'archivio vettoriale del kernel semantico e si desidera abilitare il filtro in un campo, impostare la proprietà IsFilterable
su true quando si definisce il modello di dati o quando si crea la definizione del record.
Consiglio
Per altre informazioni su come impostare la IsFilterable
proprietà, fare riferimento ai parametri VectorStoreRecordDataAttribute o alle impostazioni di configurazione VectorStoreRecordDataField.
I filtri vengono espressi usando espressioni LINQ in base al tipo del modello di dati. Il set di espressioni LINQ supportate varia a seconda delle funzionalità supportate da ogni database, ma tutti i database supportano un'ampia base di espressioni comuni, ad esempio uguali, non uguali e così via.
// Create the hybrid search options and set the filter on the options.
var hybridSearchOptions = new HybridSearchOptions<Glossary>
{
Filter = r => r.Category == "External Definitions" && r.Tags.Contains("memory")
};
// This snippet assumes searchVector is already provided, having been created using the embedding model of your choice.
var searchResult = collection.HybridSearchAsync(searchVector, ["happiness", "hotel", "customer"], top: 3, hybridSearchOptions);
// Iterate over the search results.
await foreach (var result in searchResult)
{
Console.WriteLine(result.Record.Definition);
}
sealed class Glossary
{
[VectorStoreKey]
public ulong Key { get; set; }
// Category is marked as indexed, since we want to filter using this property.
[VectorStoreData(IsIndexed = true)]
public string Category { get; set; }
// Tags is marked as indexed, since we want to filter using this property.
[VectorStoreData(IsIndexed = true)]
public List<string> Tags { get; set; }
[VectorStoreData]
public string Term { get; set; }
[VectorStoreData(IsFullTextIndexed = true)]
public string Definition { get; set; }
[VectorStoreVector(1536)]
public ReadOnlyMemory<float> DefinitionEmbedding { get; set; }
}
Prossimamente
Altre informazioni saranno presto disponibili.
Prossimamente
Altre informazioni saranno presto disponibili.