Mik azok a Szemantic Kernel Vector Store-összekötők? előzetes verziója?
Figyelmeztetés
A Szemantic Kernel Vector Store funkció előzetes verzióban érhető el, és a kompatibilitástörő módosításokat igénylő fejlesztések még korlátozott körülmények között előfordulhatnak a kiadás előtt.
Tipp.
Ha az örökölt Memóriatároló-összekötőkről szeretne információt keresni, tekintse meg a Memóriatárolók lapot.
A vektoradatbázisok számos felhasználási esettel rendelkeznek különböző tartományokban és alkalmazásokban, amelyek természetes nyelvi feldolgozást (NLP), számítógépes látást (CV), javaslati rendszereket (RS) és egyéb területeket foglalnak magukban, amelyek szemantikai megértést és adategyeztetést igényelnek.
Az adatok vektoradatbázisban való tárolásának egyik felhasználási esete, ha lehetővé teszi a nagy nyelvi modellek (LLM-ek) számára, hogy relevánsabb és koherensebb válaszokat generáljanak. A nagy nyelvi modellek gyakran szembesülnek olyan kihívásokkal, mint például pontatlan vagy irreleváns információk létrehozása; a tényszerű konzisztencia vagy a józan ész hiánya; önmaguk ismétlése vagy ellentmondása; elfogult vagy sértő. A kihívások leküzdése érdekében vektoradatbázissal információkat tárolhat a kívánt tartományhoz vagy műfajhoz kapcsolódó különböző témakörökről, kulcsszavakról, tényekről, véleményekről és/vagy forrásokról. A vektoradatbázissal hatékonyan megtalálhatja egy adott kérdéshez vagy témakörhöz kapcsolódó információk részhalmazát. Ezután a vektoradatbázisból adatokat továbbíthat a nagy nyelvi modellnek, hogy pontosabb és relevánsabb tartalmat hozzon létre.
Ha például blogbejegyzést szeretne írni az AI legújabb trendjeiről, vektoradatbázissal tárolhatja a témakör legfrissebb információit, és a kéréssel együtt továbbíthatja az információkat egy LLM-nek, hogy létrehozhasson egy blogbejegyzést, amely a legújabb információkat használja fel.
A Szemantic Kernel és a .net absztrakciót biztosít a Vektortárolókkal való interakcióhoz, valamint az absztrakciókat implementáló beépített összekötők listáját. A funkciók közé tartozik a rekordgyűjtemények létrehozása, listázása és törlése, valamint a rekordok feltöltése, lekérése és törlése. Az absztrakcióval egyszerűen kísérletezhet egy ingyenes vagy helyileg üzemeltetett Vector Store-ral, majd válthat egy szolgáltatásra, amikor vertikális felskálázásra van szükség.
Bővített generálás (RAG) lekérése vektortárolókkal
A vektortároló absztrakciói alacsony szintű API-k, amelyek adatokat adnak hozzá és kérnek le a vektortárolókból.
A Szemantic Kernel beépített támogatással rendelkezik a RAG vektortároló-implementációinak bármelyikének használatához.
Ez a IVectorizedSearch<TRecord>
körbefuttatásával és szövegkeresési implementációként való felfedésével érhető el.
Tipp.
Ha többet szeretne megtudni a vektortárolók RAG-hoz való használatáról, tekintse meg Vektortárolók használata szemantikus kernelszöveg-kereséssel.
Tipp.
A szövegkeresésről további információt lásd: Mi az a szemantikus kernelszöveg-keresés?
A vektortároló absztrakciója
A Vector Store absztrakciójának fő felületei a következők.
Microsoft.Extensions.VectorData.IVectorStore
IVectorStore
olyan műveleteket tartalmaz, amelyek a vektortároló összes gyűjteményére kiterjednek, például ListCollectionNames.
Emellett lehetővé teszi a példányok lekérését IVectorStoreRecordCollection<TKey, TRecord>
is.
Microsoft.Extensions.VectorData.IVectorStoreRecordCollection<TKey, TRecord>
IVectorStoreRecordCollection<TKey, TRecord>
gyűjteményt jelöl.
Előfordulhat, hogy ez a gyűjtemény létezik, vagy nem létezik, és a felület metódusokat biztosít a gyűjtemény meglétének ellenőrzéséhez, létrehozásához vagy törléséhez.
A felület metódusokat is biztosít a rekordok hozzáadásához, lekéréséhez és törléséhez.
Végül a felület örökli a vektorkeresési képességek biztosítását IVectorizedSearch<TRecord>
.
Microsoft.Extensions.VectorData.IVectorizedSearch<TRecord>
IVectorizedSearch<TRecord>
A vektorkeresések elvégzésére szolgáló metódust tartalmaz.
IVectorStoreRecordCollection<TKey, TRecord>
IVectorizedSearch<TRecord>
örökli, hogy önállóan is használható IVectorizedSearch<TRecord>
legyen olyan esetekben, amikor csak keresésre van szükség, és nincs szükség rekord- vagy gyűjteménykezelésre.
IVectorizableTextSearch<TRecord>
IVectorizableTextSearch<TRecord>
olyan vektorkeresési módszert tartalmaz, amelyben a vektoradatbázis képes automatikus beágyazások létrehozására. Például meghívhatja ezt a metódust egy szöveges sztringgel, és az adatbázis létrehozza a beágyazást, és egy vektormezőre keres. Ezt az összes vektoradatbázis nem támogatja, ezért csak kiválasztott összekötők implementálják.
Bővített generálás (RAG) lekérése vektortárolókkal
A vektortároló absztrakciói alacsony szintű API-k, amelyek adatokat adnak hozzá és kérnek le a vektortárolókból.
A Szemantic Kernel beépített támogatással rendelkezik a RAG vektortároló-implementációinak bármelyikének használatához.
Ez úgy érhető el, hogy VectorSearchBase[TKey, TModel]
-t becsomagolja a VectorizedSearchMixin[Tmodel]
, VectorizableTextSearchMixin[TModel]
vagy VectorTextSearch[TModel]
valamelyikébe, és szövegkeresési implementációként nyilvánítja.
Tipp.
Ha többet szeretne megtudni a vektortárolók RAG-hoz való használatáról, tekintse meg Vektortárolók használata szemantikus kernelszöveg-kereséssel.
Tipp.
További információkért a szövegkeresésről lásd: Mi az a szemantikus kernel szövegkeresés?
A vektortároló absztrakciója
A Vector Store absztrakciójának fő felületei a következők.
com.microsoft.semantickernel.data.vectorstorage.VectorStore
VectorStore
olyan műveleteket tartalmaz, amelyek a vektortároló összes gyűjteményére kiterjednek, például listCollectionNames.
Emellett lehetővé teszi a példányok lekérését VectorStoreRecordCollection<Key, Record>
is.
com.microsoft.semantickernel.data.vectorstorage.VectorStoreRecordCollection<Key, Record>
VectorStoreRecordCollection<Key, Record>
gyűjteményt jelöl.
Előfordulhat, hogy ez a gyűjtemény létezik, vagy nem létezik, és a felület metódusokat biztosít a gyűjtemény meglétének ellenőrzéséhez, létrehozásához vagy törléséhez.
A felület metódusokat is biztosít a rekordok hozzáadásához, lekéréséhez és törléséhez.
Végül a felület örökli a vektorkeresési képességek biztosítását VectorizedSearch<Record>
.
com.microsoft.semantickernel.data.vectorsearch.VectorizedSearch<Record>
VectorizedSearch<Record>
A vektorkeresések elvégzésére szolgáló metódust tartalmaz.
VectorStoreRecordCollection<Key, Record>
VectorizedSearch<Record>
örökli, hogy önállóan is használható VectorizedSearch<Record>
legyen olyan esetekben, amikor csak keresésre van szükség, és nincs szükség rekord- vagy gyűjteménykezelésre.
com.microsoft.semantickernel.data.vectorsearch.VectorizableTextSearch<Record>
VectorizableTextSearch<Record>
olyan vektorkeresési módszert tartalmaz, amelyben a vektoradatbázis képes automatikus beágyazások létrehozására. Például meghívhatja ezt a metódust egy szöveges sztringgel, és az adatbázis létrehozza a beágyazást, és egy vektormezőre keres. Ezt az összes vektoradatbázis nem támogatja, ezért csak kiválasztott összekötők implementálják.
A Vector Store-összekötők használatának első lépései
A szükséges nuget-csomagok importálása
A nuget-csomagban Microsoft.Extensions.VectorData.Abstractions
minden vektortároló-felület és absztrakcióval kapcsolatos osztály elérhető.
Minden vektortároló-implementáció a saját nuget-csomagjában érhető el. Az ismert implementációk listáját a Házon kívül összekötők lapon találja.
Az absztrakciós csomag így adható hozzá.
dotnet add package Microsoft.Extensions.VectorData.Abstractions --prerelease
Figyelmeztetés
A Szemantic Kernel 1.23.0-s verziójából Microsoft.SemanticKernel.Abstractions
a Vector Store absztrakciói el lettek távolítva, és elérhetők az új dedikált Microsoft.Extensions.VectorData.Abstractions
csomagban.
Vegye figyelembe, hogy az 1.23.0-s verziótól függMicrosoft.SemanticKernel.Abstractions
, Microsoft.Extensions.VectorData.Abstractions
ezért nincs szükség további csomagokra való hivatkozásra.
Az absztrakciók azonban most már az új Microsoft.Extensions.VectorData
névtérben lesznek.
Ha az 1.22.0-s vagy korábbi verzióról az 1.23.0-s vagy újabb verzióra frissít, hozzá kell adnia egy további using Microsoft.Extensions.VectorData;
záradékot azokhoz a fájlokhoz, amelyekben a Vektortár absztrakciós típusait használja, például IVectorStore
, IVectorStoreRecordCollection
, VectorStoreRecordDataAttribute
, VectorStoreRecordKeyProperty
stb.
Ez a módosítás a vektortároló-szolgáltatókat támogatja saját implementációk létrehozásakor. A szolgáltatónak csak a Microsoft.Extensions.VectorData.Abstractions
csomagra kell hivatkoznia. Ez csökkenti a lehetséges verzióütközéseket, és lehetővé teszi a Szemantic Kernel gyors fejlődését anélkül, hogy hatással lenne a vektortároló-szolgáltatókra.
Az adatmodell meghatározása
A szemantikus kernelvektortároló-összekötők a modell első megközelítését használják az adatbázisokkal való interakcióhoz. Ez azt jelenti, hogy az első lépés egy olyan adatmodell meghatározása, amely leképezheti a tárolási sémát. Annak érdekében, hogy az összekötők rekordgyűjteményeket hozzanak létre, és leképezzék a tárolási sémát, a modell széljegyzetekkel jelezheti az egyes tulajdonságok működését.
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; }
}
Tipp.
Az adatmodell megjegyzéseinek megadásáról további információt az adatmodell meghatározásában talál.
Tipp.
Az adatmodell megjegyzéseinek megadásához tekintse meg a séma rekorddefinícióval való definiálását.
Csatlakozás az adatbázishoz, és válasszon egy gyűjteményt
Miután definiálta az adatmodellt, a következő lépés egy VectorStore-példány létrehozása a választott adatbázishoz, és kijelölni egy rekordgyűjteményt.
Ebben a példában a Qdrantot fogjuk használni. Ezért importálnia kell a Qdrant nuget-csomagot.
dotnet add package Microsoft.SemanticKernel.Connectors.Qdrant --prerelease
Ha helyileg szeretné futtatni a Qdrantot a Dockerrel, az alábbi paranccsal indítsa el a Qdrant-tárolót a példában használt beállításokkal.
docker run -d --name qdrant -p 6333:6333 -p 6334:6334 qdrant/qdrant:latest
Annak ellenőrzéséhez, hogy a Qdrant-példány megfelelően működik-e, látogasson el a Qdrant docker-tárolóba beépített Qdrant-irányítópultra: http://localhost:6333/dashboard
Mivel az adatbázisok számos különböző típusú kulcsot és rekordot támogatnak, lehetővé tesszük a gyűjtemény kulcsának és rekordjának általános használatával történő megadását.
Esetünkben a rekord típusa a Hotel
már definiált osztály lesz, a kulcs típusa pedig az leszulong
, mivel a tulajdonság egyHotelId
, és a ulong
Qdrant csak támogatja Guid
vagy ulong
kulcsok.
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");
Mivel az adatbázisok számos különböző típusú kulcsot és rekordot támogatnak, lehetővé tesszük a gyűjtemény kulcsának és rekordjának általános használatával történő megadását.
Esetünkben a rekord típusa a Hotel
már definiált osztály lesz, a kulcs típusa pedig az leszstr
, mivel a tulajdonság egyHotelId
, és a str
Qdrant csak támogatja str
vagy int
kulcsok.
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
)
Mivel az adatbázisok számos különböző típusú kulcsot és rekordot támogatnak, lehetővé tesszük a gyűjtemény kulcsának és rekordjának általános használatával történő megadását.
Esetünkben a rekord típusa a Hotel
már definiált osztály lesz, a kulcs típusa pedig az lesz String
, mivel a hotelId
tulajdonság egy String
, a JDBC-tároló pedig csak a kulcsokat támogatja String
.
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()
);
}
}
Tipp.
Az egyes Vector Store-összekötők által támogatott kulcs- és mezőtípusokról az egyes összekötők dokumentációjában talál további információt.
A gyűjtemény létrehozása és rekordok hozzáadása
// 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);
A gyűjtemény létrehozása és rekordok hozzáadása
# 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();
Tipp.
A beágyazások generálásával kapcsolatos további információkért lásd a beágyazási generációt.
Vektorkeresés
// 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);
}
Vektorkeresés
# 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());
Tipp.
A beágyazások generálásával kapcsolatos további információkért lásd a beágyazási generációt.