Aracılığıyla paylaş


AnlamSal Çekirdek Vektör Deposu bağlayıcıları nedir? (Önizleme)

Uyarı

Semantik Çekirdek Vektör Deposu işlevselliği önizleme aşamasındadır ve hataya neden olan değişiklikler gerektiren iyileştirmeler, sürümden önce sınırlı koşullarda yine de gerçekleşebilir.

İpucu

Eski Bellek Deposu bağlayıcıları hakkında bilgi arıyorsanız Bellek Depoları sayfasına bakın.

Vektör veritabanlarında, doğal dil işleme (NLP), görüntü işleme (CV), öneri sistemleri (RS) ve verilerin anlamsal olarak anlaşılmasını ve eşleşmesini gerektiren diğer alanları içeren farklı etki alanları ve uygulamalar arasında birçok kullanım örneği vardır.

Bilgileri vektör veritabanında depolamak için kullanılan bir kullanım örneği, büyük dil modellerinin (LLM) daha ilgili ve tutarlı yanıtlar oluşturmasını sağlamaktır. Büyük dil modelleri genellikle yanlış veya ilgisiz bilgiler oluşturma gibi zorluklarla karşı karşıya kalır; olgusal tutarlılık veya sağduyu eksikliği; kendilerini tekrarlayan veya çelişen; taraflı veya saldırgan olmak. Bu zorlukların üstesinden gelmeye yardımcı olmak için vektör veritabanını kullanarak istediğiniz etki alanı veya tarzla ilgili farklı konular, anahtar sözcükler, olgular, görüşler ve/veya kaynaklar hakkındaki bilgileri depolayabilirsiniz. Vektör veritabanı, belirli bir soru veya konuyla ilgili bilgilerin alt kümesini verimli bir şekilde bulmanıza olanak tanır. Ardından, daha doğru ve ilgili içerik oluşturmak için bilgi isteminizle vektör veritabanından büyük dil modelinize bilgi geçirebilirsiniz.

Örneğin, yapay zekadaki en son eğilimler hakkında bir blog gönderisi yazmak istiyorsanız, bir vektör veritabanı kullanarak bu konu hakkındaki en son bilgileri depolayabilir ve en son bilgilerden yararlanan bir blog gönderisi oluşturmak için bilgileri bir LLM'ye iletebilirsiniz.

Semantik Çekirdek ve .net, Vektör Depoları ile etkileşime yönelik bir soyutlama ve bu soyutlamaları uygulayan kullanıma hazır bağlayıcıların listesini sağlar. Özellikler arasında kayıt koleksiyonları oluşturma, listeleme ve silme, kayıtları karşıya yükleme, alma ve silme sayılabilir. Soyutlama, ücretsiz veya yerel olarak barındırılan bir Vektör Deposu ile denemeler yapmanızı ve ölçeği artırmanız gerektiğinde bir hizmete geçmeyi kolaylaştırır.

Vektör Depoları ile Artırılmış Nesil (RAG) Alma

Vektör deposu soyutlamaları, vektör depolarından veri eklemeye ve almaya yönelik düşük düzeyli bir api'dir. Semantik Çekirdek, RAG için Vektör Deposu uygulamalarından herhangi birini kullanmak için yerleşik desteğe sahiptir. Bu, IVectorizedSearch<TRecord>'ı sararak ve bir Metin Arama uygulaması olarak sunarak elde edilir.

İpucu

RAG için vektör depolarını kullanma hakkında daha fazla bilgi edinmek için bkz. Anlam Çekirdeği Metin Aramaile Vektör Depolarını kullanma .

İpucu

Metin araması hakkında daha fazla bilgi edinmek için bkz. Anlam Çekirdeği Metin Araması nedir?

Vektör Deposu Soyutlaması

Vektör Deposu soyutlamasında ana arabirimler şunlardır.

Microsoft.Extensions.VectorData.IVectorStore

IVectorStore , vektör deposundaki tüm koleksiyonlara yayılan işlemler içerir; örneğin, ListCollectionNames. Ayrıca örnekleri alma IVectorStoreRecordCollection<TKey, TRecord> olanağı da sağlar.

Microsoft.Extensions.VectorData.IVectorStoreRecordCollection<TKey, TRecord>

IVectorStoreRecordCollection<TKey, TRecord> bir koleksiyonu temsil eder. Bu koleksiyon var olabilir veya olmayabilir ve arabirim, koleksiyonun var olup olmadığını denetlemek, oluşturmak veya silmek için yöntemler sağlar. Arabirim ayrıca kayıtları eklemek, almak ve silmek için yöntemler sağlar. Son olarak, arabirim vektör arama özellikleri sağlamayı IVectorizedSearch<TRecord> devralır.

Microsoft.Extensions.VectorData.IVectorizedSearch<TRecord>

IVectorizedSearch<TRecord> vektör araması yapmak için bir yöntem içerir. IVectorStoreRecordCollection<TKey, TRecord>yalnızca aramanın gerekli olduğu ve kayıt veya koleksiyon yönetimi gerekmeyen durumlarda kendi başına kullanılmasını IVectorizedSearch<TRecord> mümkün kılmayı IVectorizedSearch<TRecord> devralır.

IVectorizableTextSearch<TRecord>

IVectorizableTextSearch<TRecord> , vektör veritabanının otomatik olarak ekleme oluşturma özelliğine sahip olduğu vektör aramaları yapmak için bir yöntem içerir. Örneğin, bu yöntemi bir metin dizesiyle çağırabilirsiniz; veritabanı sizin için ekleme oluşturur ve bir vektör alanında arama yapabilir. Bu, tüm vektör veritabanları tarafından desteklenmez ve bu nedenle yalnızca belirli bağlayıcılar tarafından uygulanır.

Vektör Depoları ile Artırılmış Nesil (RAG) Alma

Vektör deposu soyutlamaları, vektör depolarından veri eklemeye ve almaya yönelik düşük düzeyli bir api'dir. Semantik Çekirdek, RAG için Vektör Deposu uygulamalarından herhangi birini kullanmak için yerleşik desteğe sahiptir. VectorSearchBase[TKey, TModel], VectorizedSearchMixin[Tmodel], VectorizableTextSearchMixin[TModel] veya VectorTextSearch[TModel] ile sarmalanıp bir Metin Arama uygulaması olarak sunulduğunda bu elde edilir.

İpucu

RAG için vektör depolarını kullanma hakkında daha fazla bilgi edinmek için bkz. Anlam Çekirdeği Metin Aramaile Vektör Depolarını kullanma .

İpucu

Metin araması hakkında daha fazla bilgi edinmek için bkz. Anlam Çekirdeği Metin Araması nedir?

Vektör Deposu Soyutlaması

Vektör Deposu soyutlamasında ana arabirimler şunlardır.

com.microsoft.semantickernel.data.vectorstorage.VectorStore

VectorStore , vektör deposundaki tüm koleksiyonlara yayılan işlemleri (ör. listCollectionNames) içerir. Ayrıca örnekleri alma VectorStoreRecordCollection<Key, Record> olanağı da sağlar.

com.microsoft.semantickernel.data.vectorstorage.VectorStoreRecordCollection<Anahtarı, Kayıt>

VectorStoreRecordCollection<Key, Record> bir koleksiyonu temsil eder. Bu koleksiyon var olabilir veya olmayabilir ve arabirim, koleksiyonun var olup olmadığını denetlemek, oluşturmak veya silmek için yöntemler sağlar. Arabirim ayrıca kayıtları eklemek, almak ve silmek için yöntemler sağlar. Son olarak, arabirim vektör arama özellikleri sağlamayı VectorizedSearch<Record> devralır.

com.microsoft.semantickernel.data.vectorsearch.VectorizedSearch<Record>

VectorizedSearch<Record> vektör araması yapmak için bir yöntem içerir. VectorStoreRecordCollection<Key, Record>yalnızca aramanın gerekli olduğu ve kayıt veya koleksiyon yönetimi gerekmeyen durumlarda kendi başına kullanılmasını VectorizedSearch<Record> mümkün kılmayı VectorizedSearch<Record> devralır.

com.microsoft.semantickernel.data.vectorsearch.VectorizableTextSearch<Kaydı>

VectorizableTextSearch<Record> , vektör veritabanının otomatik olarak ekleme oluşturma özelliğine sahip olduğu vektör aramaları yapmak için bir yöntem içerir. Örneğin, bu yöntemi bir metin dizesiyle çağırabilirsiniz; veritabanı sizin için ekleme oluşturur ve bir vektör alanında arama yapabilir. Bu, tüm vektör veritabanları tarafından desteklenmez ve bu nedenle yalnızca belirli bağlayıcılar tarafından uygulanır.

Vektör Deposu bağlayıcılarını kullanmaya başlama

Gerekli nuget paketlerini içeri aktarma

Tüm vektör deposu arabirimleri ve soyutlamayla ilgili tüm sınıflar nuget paketinde Microsoft.Extensions.VectorData.Abstractions kullanılabilir. Her vektör deposu uygulaması kendi nuget paketinde kullanılabilir. Bilinen uygulamaların listesi için kullanıma hazır bağlayıcılar sayfasına bakın.

Soyutlama paketi aşağıdaki gibi eklenebilir.

dotnet add package Microsoft.Extensions.VectorData.Abstractions --prerelease

Uyarı

Anlam Çekirdeği'nin 1.23.0 sürümünden Vektör Deposu soyutlamaları kaldırıldı Microsoft.SemanticKernel.Abstractions ve yeni ayrılmış Microsoft.Extensions.VectorData.Abstractions pakette kullanılabilir.

Sürüm 1.23.0'da Microsoft.SemanticKernel.Abstractions bağımlılığı Microsoft.Extensions.VectorData.Abstractionsolduğunu, bu nedenle ek paketlere başvurmaya gerek olmadığını unutmayın. Ancak soyutlamalar artık yeni Microsoft.Extensions.VectorData ad alanında olacaktır.

1.22.0 veya önceki bir sürümden 1.23.0 veya sonraki bir sürüme yükseltirken, Vektör Deposu soyutlama türlerinden herhangi birinin kullanıldığı dosyalara ek using Microsoft.Extensions.VectorData; bir yan tümce eklemeniz gerekir. Örneğin IVectorStore, , IVectorStoreRecordCollection, VectorStoreRecordDataAttribute, , VectorStoreRecordKeyPropertyvb.

Bu değişiklik, kendi uygulamalarını oluştururken vektör deposu sağlayıcılarını desteklemek için yapılmıştır. Sağlayıcının yalnızca pakete başvurması Microsoft.Extensions.VectorData.Abstractions gerekir. Bu, olası sürüm çakışmalarını azaltır ve Anlam Çekirdeği'nin vektör deposu sağlayıcılarını etkilemeden hızla gelişmeye devam etmesini sağlar.

Veri modelinizi tanımlama

AnlamSal Çekirdek Vektör Deposu bağlayıcıları, veritabanlarıyla etkileşime geçmek için ilk olarak bir model yaklaşımı kullanır. Bu, ilk adımın depolama şemasına eşleyen bir veri modeli tanımlamak olduğu anlamına gelir. Bağlayıcıların kayıt koleksiyonları oluşturmalarına ve depolama şemasına eşlemlerine yardımcı olmak için modele her özelliğin işlevini göstermek üzere açıklama eklenebilir.

using Microsoft.Extensions.VectorData;

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

    [VectorStoreRecordData(IsFilterable = true)]
    public string HotelName { get; set; }

    [VectorStoreRecordData(IsFullTextSearchable = true)]
    public string Description { get; set; }

    [VectorStoreRecordVector(Dimensions: 4, DistanceFunction.CosineSimilarity, IndexKind.Hnsw)]
    public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }

    [VectorStoreRecordData(IsFilterable = true)]
    public string[] Tags { get; set; }
}
from dataclasses import dataclass, field
from typing import Annotated
from semantic_kernel.data import (
    DistanceFunction,
    IndexKind,
    VectorStoreRecordDataField,
    VectorStoreRecordDefinition,
    VectorStoreRecordKeyField,
    VectorStoreRecordVectorField,
    vectorstoremodel,
)

@vectorstoremodel
@dataclass
class Hotel:
    hotel_id: Annotated[str, VectorStoreRecordKeyField()] = field(default_factory=lambda: str(uuid4()))
    hotel_name: Annotated[str, VectorStoreRecordDataField(is_filterable=True)]
    description: Annotated[str, VectorStoreRecordDataField(is_full_text_searchable=True)]
    description_embedding: Annotated[list[float], VectorStoreRecordVectorField(dimensions=4, distance_function=DistanceFunction.COSINE, index_kind=IndexKind.HNSW)]
    tags: Annotated[list[str], VectorStoreRecordDataField(is_filterable=True)]
import com.microsoft.semantickernel.data.vectorstorage.annotations.VectorStoreRecordData;
import com.microsoft.semantickernel.data.vectorstorage.annotations.VectorStoreRecordKey;
import com.microsoft.semantickernel.data.vectorstorage.annotations.VectorStoreRecordVector;
import com.microsoft.semantickernel.data.vectorstorage.definition.DistanceFunction;
import com.microsoft.semantickernel.data.vectorstorage.definition.IndexKind;

import java.util.Collections;
import java.util.List;

public class Hotel {
    @VectorStoreRecordKey
    private String hotelId;

    @VectorStoreRecordData(isFilterable = true)
    private String name;

    @VectorStoreRecordData(isFullTextSearchable = true)
    private String description;

    @VectorStoreRecordVector(dimensions = 4, indexKind = IndexKind.HNSW, distanceFunction = DistanceFunction.COSINE_DISTANCE)
    private List<Float> descriptionEmbedding;

    @VectorStoreRecordData(isFilterable = true)
    private List<String> tags;

    public Hotel() { }

    public Hotel(String hotelId, String name, String description, List<Float> descriptionEmbedding, List<String> tags) {
        this.hotelId = hotelId;
        this.name = name;
        this.description = description;
        this.descriptionEmbedding = Collections.unmodifiableList(descriptionEmbedding);
        this.tags = Collections.unmodifiableList(tags);
    }

    public String getHotelId() { return hotelId; }
    public String getName() { return name; }
    public String getDescription() { return description; }
    public List<Float> getDescriptionEmbedding() { return descriptionEmbedding; }
    public List<String> getTags() { return tags; }
}

İpucu

Veri modelinize açıklama ekleme hakkında daha fazla bilgi için veri modelinizi tanımlama bölümüne bakın.

İpucu

Veri modelinize açıklama eklemeye alternatif olarak şemanızı bir kayıt tanımıyla tanımlamaya bakın.

Veritabanınıza bağlanın ve bir koleksiyon seçin

Veri modelinizi tanımladıktan sonra, sonraki adım seçtiğiniz veritabanı için bir VectorStore örneği oluşturmak ve bir kayıt koleksiyonu seçmektir.

Bu örnekte Qdrant kullanacağız. Bu nedenle Qdrant nuget paketini içeri aktarmanız gerekir.

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

Qdrant'ı Docker kullanarak yerel olarak çalıştırmak istiyorsanız, Qdrant kapsayıcısını bu örnekte kullanılan ayarlarla başlatmak için aşağıdaki komutu kullanın.

docker run -d --name qdrant -p 6333:6333 -p 6334:6334 qdrant/qdrant:latest

Qdrant örneğinizin düzgün çalıştığını doğrulamak için, Qdrant docker kapsayıcısının içinde yerleşik olarak bulunan Qdrant panosunu ziyaret edin: http://localhost:6333/dashboard

Veritabanları birçok farklı türde anahtarı ve kaydı desteklediğinden, genel değerleri kullanarak koleksiyonunuz için anahtarın ve kaydın türünü belirtmenize olanak sağlarız. Bizim örneğimizde, kayıt türü zaten tanımladığımız sınıf olacak Hotel ve özellik a ulong olduğundan ve Qdrant yalnızca veya HotelId anahtarlarını desteklediğinden ulong anahtar Guidulong türü olacaktır.

using Microsoft.SemanticKernel.Connectors.Qdrant;
using Qdrant.Client;

// Create a Qdrant VectorStore object
var vectorStore = new QdrantVectorStore(new QdrantClient("localhost"));

// Choose a collection from the database and specify the type of key and record stored in it via Generic parameters.
var collection = vectorStore.GetCollection<ulong, Hotel>("skhotels");

Veritabanları birçok farklı türde anahtarı ve kaydı desteklediğinden, genel değerleri kullanarak koleksiyonunuz için anahtarın ve kaydın türünü belirtmenize olanak sağlarız. Bizim örneğimizde, kayıt türü zaten tanımladığımız sınıf olacak Hotel ve özellik a str olduğundan ve Qdrant yalnızca veya HotelId anahtarlarını desteklediğinden str anahtar strint türü olacaktır.

from semantic_kernel.connectors.memory.qdrant import QdrantStore

# Create a Qdrant VectorStore object, this will look in the environment for Qdrant related settings, and will fall back to the default, which is to run in-memory.
vector_store = QdrantStore()

# Choose a collection from the database and specify the type of key and record stored in it via Generic parameters.
collection = vector_store.get_collection(
    collection_name="skhotels", 
    data_model_type=Hotel
)

Veritabanları birçok farklı türde anahtarı ve kaydı desteklediğinden, genel değerleri kullanarak koleksiyonunuz için anahtarın ve kaydın türünü belirtmenize olanak sağlarız. Bizim örneğimizde, kayıt türü zaten tanımladığımız sınıf olacak Hotel ve özellik bir String olduğundan ve JDBC deposu yalnızca anahtarları desteklediğinden hotelId anahtar türü olacaktırStringString.

import com.microsoft.semantickernel.data.jdbc.JDBCVectorStore;
import com.microsoft.semantickernel.data.jdbc.JDBCVectorStoreOptions;
import com.microsoft.semantickernel.data.jdbc.JDBCVectorStoreRecordCollectionOptions;
import com.microsoft.semantickernel.data.jdbc.mysql.MySQLVectorStoreQueryProvider;
import com.mysql.cj.jdbc.MysqlDataSource;

import java.util.List;

public class Main {
    public static void main(String[] args) {
        // Create a MySQL data source
        var dataSource = new MysqlDataSource();
        dataSource.setUrl("jdbc:mysql://localhost:3306/sk");
        dataSource.setPassword("root");
        dataSource.setUser("root");

        // Create a JDBC vector store
        var vectorStore = JDBCVectorStore.builder()
            .withDataSource(dataSource)
            .withOptions(
                JDBCVectorStoreOptions.builder()
                    .withQueryProvider(MySQLVectorStoreQueryProvider.builder()
                        .withDataSource(dataSource)
                        .build())
                    .build()
            )
            .build();

        // Get a collection from the vector store
        var collection = vectorStore.getCollection("skhotels",
            JDBCVectorStoreRecordCollectionOptions.<Hotel>builder()
                .withRecordClass(Hotel.class)
                .build()
        );
    }
}

İpucu

Her Vector Store bağlayıcısının desteklediği anahtar ve alan türleri hakkında daha fazla bilgi için her bağlayıcının belgelerine bakın.

Koleksiyonu oluşturma ve kayıt ekleme

// Placeholder embedding generation method.
async Task<ReadOnlyMemory<float>> GenerateEmbeddingAsync(string textToVectorize)
{
    // your logic here
}

// Create the collection if it doesn't exist yet.
await collection.CreateCollectionIfNotExistsAsync();

// Upsert a record.
string descriptionText = "A place where everyone can be happy.";
ulong hotelId = 1;

// Create a record and generate a vector for the description using your chosen embedding generation implementation.
await collection.UpsertAsync(new Hotel
{
    HotelId = hotelId,
    HotelName = "Hotel Happy",
    Description = descriptionText,
    DescriptionEmbedding = await GenerateEmbeddingAsync(descriptionText),
    Tags = new[] { "luxury", "pool" }
});

// Retrieve the upserted record.
Hotel? retrievedHotel = await collection.GetAsync(hotelId);

Koleksiyonu oluşturma ve kayıt ekleme

# Create the collection if it doesn't exist yet.
await collection.create_collection_if_not_exists()

# Upsert a record.
description = "A place where everyone can be happy."
hotel_id = "1"

await collection.upsert(Hotel(
    hotel_id = hotel_id,
    hotel_name = "Hotel Happy",
    description = description,
    description_embedding = await GenerateEmbeddingAsync(description),
    tags = ["luxury", "pool"]
))

# Retrieve the upserted record.
retrieved_hotel = await collection.get(hotel_id)
// Create the collection if it doesn't exist yet.
collection.createCollectionAsync().block();

// Upsert a record.
var description = "A place where everyone can be happy";
var hotelId = "1";
var hotel = new Hotel(
    hotelId, 
    "Hotel Happy", 
    description, 
    generateEmbeddingsAsync(description).block(), 
    List.of("luxury", "pool")
);

collection.upsertAsync(hotel, null).block();

// Retrieve the upserted record.
var retrievedHotel = collection.getAsync(hotelId, null).block();

İpucu

Ekleme oluşturma hakkında daha fazla bilgi için bkz . ekleme oluşturma.

// Placeholder embedding generation method.
async Task<ReadOnlyMemory<float>> GenerateEmbeddingAsync(string textToVectorize)
{
    // your logic here
}

// 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.
var searchResult = await collection.VectorizedSearchAsync(searchVector, new() { Top = 1 });

// Inspect the returned hotel.
await foreach (var record in searchResult.Results)
{
    Console.WriteLine("Found hotel description: " + record.Record.Description);
    Console.WriteLine("Found record score: " + record.Score);
}

Vektör araması yapma

# Generate a vector for your search text, using your chosen embedding generation implementation.
# Just showing a placeholder method here for brevity.
search_vector = await GenerateEmbedding("I'm looking for a hotel where customer happiness is the priority.");
# Do the search.
search_result = await collection.vectorized_search(vector=searchVector, VectorSearchOptions(top = 1 ))

# Inspect the returned hotels.
async for result in search_result.results:
    print(f"Found hotel description: {result.record.description}")
// Generate a vector for your search text, using your chosen embedding generation implementation.
// Just showing a placeholder method here for brevity.
var searchVector = generateEmbeddingsAsync("I'm looking for a hotel where customer happiness is the priority.").block();

// Do the search.
var searchResult = collection.searchAsync(searchVector, VectorSearchOptions.builder()
    .withTop(1).build()
).block();

Hotel record = searchResult.getResults().get(0).getRecord();
System.out.printf("Found hotel description: %s\n", record.getDescription());

İpucu

Ekleme oluşturma hakkında daha fazla bilgi için bkz . ekleme oluşturma.

Sonraki adımlar