次の方法で共有


Qdrant コネクタの使用 (プレビュー)

警告

セマンティック カーネル ベクター ストア機能はプレビュー段階であり、破壊的変更を必要とする機能強化は、リリース前の限られた状況で引き続き発生する可能性があります。

概要

Qdrant Vector Store コネクタを使用すると、Qdrant 内のデータにアクセスして管理できます。 コネクタには次の特性があります。

機能領域 サポート
コレクションのマップ フィルター可能なデータ フィールドのペイロード インデックスを使用した Qdrant コレクション
サポートされているキー プロパティの種類
  • ulong
  • GUID
サポートされているデータ プロパティ型
  • string
  • INT
  • long
  • 倍精度浮動小数点
  • float
  • [bool]
  • これらの各型の列挙可能な値
サポートされているベクター プロパティ型 ReadOnlyMemory<float>
サポートされているインデックスの種類 Hnsw
サポートされている距離関数
  • CosineSimilarity
  • DotProductSimilarity
  • EuclideanDistance
  • ManhattanDistance
サポートされているフィルター句
  • AnyTagEqualTo
  • EqualTo
レコード内の複数のベクターをサポートします はい (構成可能)
IsFilterable がサポートされていますか? はい
IsFullTextSearchable がサポートされていますか? はい
StoragePropertyName がサポートされていますか? はい

作業の開始

Qdrant Vector Store コネクタ NuGet パッケージをプロジェクトに追加します。

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

セマンティック カーネルによって提供される拡張メソッドを使用して、 KernelBuilder で使用できる依存関係挿入コンテナーまたは IServiceCollection 依存関係挿入コンテナーにベクター ストアを追加できます。

using Microsoft.SemanticKernel;

// Using Kernel Builder.
var kernelBuilder = Kernel
    .CreateBuilder()
    .AddQdrantVectorStore("localhost");
using Microsoft.SemanticKernel;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddQdrantVectorStore("localhost");

パラメーターを受け取たない拡張メソッドも提供されます。 これらには、 Qdrant.Client.QdrantClient クラスのインスタンスを依存関係挿入コンテナーに個別に登録する必要があります。

using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
using Qdrant.Client;

// Using Kernel Builder.
var kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.Services.AddSingleton<QdrantClient>(sp => new QdrantClient("localhost"));
kernelBuilder.AddQdrantVectorStore();
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
using Qdrant.Client;

// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<QdrantClient>(sp => new QdrantClient("localhost"));
builder.Services.AddQdrantVectorStore();

Qdrant Vector Store インスタンスを直接構築できます。

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

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

名前付きコレクションへの直接参照を構築できます。

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

var collection = new QdrantVectorStoreRecordCollection<Hotel>(
    new QdrantClient("localhost"),
    "skhotels");

データ マッピング

Qdrant コネクタは、データ モデルからストレージにデータをマッピングするときに、既定のマッパーを提供します。 Qdrant では、プロパティを ID、ペイロード、およびベクターのグループにマップする必要があります。 既定のマッパーは、モデルの注釈またはレコード定義を使用して各プロパティの型を決定し、このマッピングを実行します。

  • キーとして注釈が付けられたデータ モデル プロパティは、Qdrant ポイント ID にマップされます。
  • データとして注釈が付けられたデータ モデルのプロパティは、Qdrant ポイント ペイロード オブジェクトにマップされます。
  • ベクトルとして注釈が付けられたデータ モデルのプロパティは、Qdrant ポイント ベクター オブジェクトにマップされます。

プロパティ名のオーバーライド

データ プロパティとベクター プロパティ (名前付きベクター モードを使用する場合) の場合は、データ モデルのプロパティ名とは異なるストレージで使用するオーバーライド フィールド名を指定できます。 Qdrant ではキーの名前が固定されているため、これはキーではサポートされません。 また、 名前のないベクター モードのベクターでもサポートされていません。これは、ベクターが固定名で格納されるためです。

プロパティ名のオーバーライドは、データ モデル属性またはレコード定義を使用して StoragePropertyName オプションを設定することによって行われます。

属性に StoragePropertyName が設定されたデータ モデルの例と、Qdrant で表される方法を次に示します。

using Microsoft.Extensions.VectorData;

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

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

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

    [VectorStoreRecordVector(4, DistanceFunction.CosineDistance, IndexKind.Hnsw, StoragePropertyName = "hotel_description_embedding")]
    public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
}
{
    "id": 1,
    "payload": { "hotel_name": "Hotel Happy", "hotel_description": "A place where everyone can be happy." },
    "vector": {
        "hotel_description_embedding": [0.9, 0.1, 0.1, 0.1],
    }
}

作業の開始

qdrant クライアントを含む qdrant extras を使用してセマンティック カーネルをインストール

pip install semantic-kernel[qdrant]

その後、 QdrantStore クラスを使用してベクター ストア インスタンスを作成できます。これにより、Qdrant インスタンスに接続するための環境変数 QDRANT_URLQDRANT_API_KEYQDRANT_HOSTQDRANT_PORTQDRANT_GRPC_PORTQDRANT_PATHQDRANT_LOCATIONQDRANT_PREFER_GRPS を使用して AsyncQdrantClient が作成されます。これらの値を直接指定することもできます。 何も指定されていない場合は、 location=:memory:にフォールバックします。


from semantic_kernel.connectors.memory.qdrant import QdrantStore

vector_store = QdrantStore()

qdrant クライアントの独自のインスタンスを使用してベクター ストアを作成することもできます。

from qdrant_client.async_qdrant_client import AsyncQdrantClient
from semantic_kernel.connectors.memory.qdrant import QdrantStore

client = AsyncQdrantClient(host='localhost', port=6333)
vector_store = QdrantStore(client=client)

コレクションを直接作成することもできます。

from semantic_kernel.connectors.memory.qdrant import QdrantCollection

collection = QdrantCollection(collection_name="skhotels", data_model_type=hotel)

シリアル化

Qdrant コネクタは、ストアへの読み取りと書き込みに PointStruct と呼ばれるモデルを使用します。 これは、 from qdrant_client.models import PointStructからインポートできます。 シリアル化メソッドは PointStruct オブジェクトのリストの出力を受け取り、逆シリアル化メソッドは PointStruct オブジェクトのリストを受け取ります。

これには、名前付きベクトルまたは名前のないベクトルに関連する特別な考慮事項がいくつかあります。以下を参照してください。

この概念の詳細については、 erialization のドキュメントを参照してください

Qdrant ベクター モード

Qdrant ではベクター ストレージに対して 2 つのモードがサポートされ、既定のマッパーを備えた Qdrant Connector では両方のモードがサポートされます。 既定のモードは、名前のないベクターです。

単一の無名ベクトル

このオプションでは、コレクションに含まれるベクターは 1 つだけで、Qdrant のストレージ モデルでは名前が付けなくなります。 次に示すのは、 single 無名ベクター モードを使用する場合に、Qdrant でオブジェクトがどのように表されるかを示しています。

new Hotel
{
    HotelId = 1,
    HotelName = "Hotel Happy",
    Description = "A place where everyone can be happy.",
    DescriptionEmbedding = new float[4] { 0.9f, 0.1f, 0.1f, 0.1f }
};
{
    "id": 1,
    "payload": { "HotelName": "Hotel Happy", "Description": "A place where everyone can be happy." },
    "vector": [0.9, 0.1, 0.1, 0.1]
}
Hotel(
    hotel_id = 1,
    hotel_name = "Hotel Happy",
    description = "A place where everyone can be happy.",
    description_embedding = [0.9f, 0.1f, 0.1f, 0.1f],
)
from qdrant_client.models import PointStruct

PointStruct(
    id=1,
    payload={ "hotel_name": "Hotel Happy", "description": "A place where everyone can be happy." },
    vector=[0.9, 0.1, 0.1, 0.1],
)

名前付きベクター

名前付きベクター モードを使用する場合は、コレクション内の各ポイントに複数のベクターが含まれる可能性があり、それぞれに名前が付けられることを意味します。 次に示すのは、 named vector モードを使用する場合に Qdrant でオブジェクトを表す方法の例です。

new Hotel
{
    HotelId = 1,
    HotelName = "Hotel Happy",
    Description = "A place where everyone can be happy.",
    HotelNameEmbedding = new float[4] { 0.9f, 0.5f, 0.5f, 0.5f }
    DescriptionEmbedding = new float[4] { 0.9f, 0.1f, 0.1f, 0.1f }
};
{
    "id": 1,
    "payload": { "HotelName": "Hotel Happy", "Description": "A place where everyone can be happy." },
    "vector": {
        "HotelNameEmbedding": [0.9, 0.5, 0.5, 0.5],
        "DescriptionEmbedding": [0.9, 0.1, 0.1, 0.1],
    }
}
Hotel(
    hotel_id = 1,
    hotel_name = "Hotel Happy",
    description = "A place where everyone can be happy.",
    hotel_name_embedding = [0.9f, 0.5f, 0.5f, 0.5f],
    description_embedding = [0.9f, 0.1f, 0.1f, 0.1f],
)
from qdrant_client.models import PointStruct

PointStruct(
    id=1,
    payload={ "hotel_name": "Hotel Happy", "description": "A place where everyone can be happy." },
    vector={
        "hotel_name_embedding": [0.9, 0.5, 0.5, 0.5],
        "description_embedding": [0.9, 0.1, 0.1, 0.1],
    },
)

名前付きベクター モードを有効にするには、ベクター ストアまたはコレクションを構築するときにオプションとしてこれを渡します。 同じオプションを、指定された依存関係挿入コンテナー拡張メソッドのいずれかに渡すこともできます。

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

var vectorStore = new QdrantVectorStore(
    new QdrantClient("localhost"),
    new() { HasNamedVectors = true });

var collection = new QdrantVectorStoreRecordCollection<Hotel>(
    new QdrantClient("localhost"),
    "skhotels",
    new() { HasNamedVectors = true });

python では、 named_vectors の既定値は True ですが、次に示すように無効にすることもできます。

from semantic_kernel.connectors.memory.qdrant import QdrantCollection

collection = QdrantCollection(
    collection_name="skhotels", 
    data_model_type=Hotel, 
    named_vectors=False,
)