Warnung
Sql Server ベクター ストア機能はプレビュー段階であり、破壊的変更を必要とする機能強化は、リリース前の限られた状況で引き続き発生する可能性があります。
Warnung
セマンティック カーネル ベクター ストア機能はプレビュー段階であり、破壊的変更を必要とする機能強化は、リリース前の限られた状況で引き続き発生する可能性があります。
Warnung
セマンティック カーネル ベクター ストア機能はプレビュー段階であり、破壊的変更を必要とする機能強化は、リリース前の限られた状況で引き続き発生する可能性があります。
概要
SQL Server ベクター ストア コネクタを使用して、SQL Server のデータにアクセスして管理できます。 コネクタには次の特性があります。
特色エリア | 支援 |
---|---|
コレクション マップ先 | SQL Server テーブル |
サポートされているキー プロパティの種類 |
|
サポートされているデータ プロパティ型 |
|
サポートされているベクター プロパティ型 |
|
サポートされているインデックスの種類 |
|
サポートされている距離関数 |
|
レコード内の複数のベクターをサポートします | イエス |
IsIndexed はサポートされていますか? | イエス |
IsFullTextIndexed がサポートされていますか? | いいえ |
StorageName がサポートされていますか? | イエス |
HybridSearch はサポートされていますか? | いいえ |
作業の開始
SQL Sever Vector Store コネクタ NuGet パッケージをプロジェクトに追加します。
dotnet add package Microsoft.SemanticKernel.Connectors.SqlServer --prerelease
セマンティック カーネルによって提供される拡張メソッドを使用して、 IServiceCollection
依存関係挿入コンテナーにベクター ストアを追加できます。
using Microsoft.Extensions.DependencyInjection;
// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSqlServerVectorStore(_ => "<connectionstring>");
using Microsoft.Extensions.DependencyInjection;
using Microsoft.SemanticKernel;
// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSqlServerVectorStore(_ => "<connectionstring>")
Sql Server ベクター ストア インスタンスを直接構築できます。
using Microsoft.SemanticKernel.Connectors.SqlServer;
var vectorStore = new SqlServerVectorStore("<connectionstring>");
名前付きコレクションへの直接参照を構築できます。
using Microsoft.SemanticKernel.Connectors.SqlServer;
var collection = new SqlServerCollection<string, Hotel>("<connectionstring>", "skhotels");
データ マッピング
SQL Server ベクター ストア コネクタは、データ モデルからストレージへのマッピング時に既定のマッパーを提供します。 このマッパーは、データ モデルのプロパティの一覧を SQL Server の列に直接変換します。
プロパティ名のオーバーライド
データ モデルのプロパティ名とは異なるストレージで使用するオーバーライド プロパティ名を指定できます。
プロパティ名のオーバーライドは、データ モデルのプロパティ属性またはレコード定義を使用して StorageName
オプションを設定することによって行われます。
属性に StorageName
が設定されたデータ モデルの例と、それが SQL Server コマンドでどのように表されるかを次に示します。
using Microsoft.Extensions.VectorData;
public class Hotel
{
[VectorStoreKey]
public ulong HotelId { get; set; }
[VectorStoreData(StorageName = "hotel_name")]
public string? HotelName { get; set; }
[VectorStoreData(StorageName = "hotel_description")]
public string? Description { get; set; }
[VectorStoreVector(Dimensions: 4, DistanceFunction = DistanceFunction.CosineDistance)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
}
CREATE TABLE Hotel (
[HotelId] BIGINT NOT NULL,
[hotel_name] NVARCHAR(MAX),
[hotel_description] NVARCHAR(MAX),
[DescriptionEmbedding] VECTOR(4),
PRIMARY KEY ([HotelId])
);
概要
SQL Server ベクター ストア コネクタは、セマンティック カーネルによって提供されるベクター ストアの実装であり、Azure SQL をベクター ストアとして使用します。 SQL Server on-prem でベクターがサポートされたら、それを使用することもできます。
コネクタには次の特性があります。
特色エリア | 支援 |
---|---|
コレクション マップ先 | テーブル辞書 |
サポートされているキー プロパティの種類 |
|
サポートされているデータ プロパティ型 | 任意の型 |
サポートされているベクター プロパティ型 |
|
サポートされているインデックスの種類 |
|
サポートされている距離関数 |
|
レコード内の複数のベクターをサポートします | イエス |
is_filterableサポートされていますか? | イエス |
is_full_text_searchable はサポートされていますか? | いいえ |
作業の開始
セマンティック カーネル パッケージをプロジェクトに追加します。
pip install semantic-kernel[sql]
SQL Server コネクタでは、 pyodbc パッケージを使用して SQL Server に接続します。 追加ではパッケージがインストールされますが、SQL Server 用の ODBC ドライバーを個別にインストールする必要があります。これはプラットフォームによって異なります。詳細については、 Azure SQL ドキュメント を参照してください。
ストアとコレクションを機能させるには、接続文字列が必要です。これはコンストラクターに渡すか、環境変数 SQL_SERVER_CONNECTION_STRING
で設定できます。 ベクトルを適切に処理するために、見つからない場合は LongAsMax=yes
オプションが追加されます。 また、ユーザー名/パスワードまたは統合セキュリティの両方を使用することもできます。後者の場合は、 DefaultAzureCredential
が使用されます。
次のスニペットでは、"DataModel" という名前のデータ モデル クラスが定義されていることを前提としています。
from semantic_kernel.connectors.sql_server import SqlServerStore
vector_store = SqlServerStore()
# OR
vector_store = SqlServerStore(connection_string="Driver={ODBC Driver 18 for SQL Server};Server=server_name;Database=database_name;UID=user;PWD=password;LongAsMax=yes;")
vector_collection = vector_store.get_collection("dbo.table_name", DataModel)
名前付きコレクションへの直接参照を構築できます。
from semantic_kernel.connectors.sql_server import SqlServerCollection
vector_collection = SqlServerCollection("dbo.table_name", DataModel)
注: コレクション名は、単純な文字列 (
table_name
など) または完全修飾名 (dbo.table_name
など) として指定できます。 後者はあいまいさを避けるために推奨されます。スキーマが指定されていない場合は、既定のスキーマ (dbo
) が使用されます。
接続に固有の要件がある場合は、 pyodbc.Connection
オブジェクトを SqlServerStore
コンストラクターに渡すこともできます。 これにより、カスタム接続文字列またはその他の接続オプションを使用できます。
from semantic_kernel.connectors.sql_server import SqlServerStore
import pyodbc
# Create a connection to the SQL Server database
connection = pyodbc.connect("Driver={ODBC Driver 18 for SQL Server};Server=server_name;Database=database_name;UID=user;PWD=password;LongAsMax=yes;")
# Create a SqlServerStore with the connection
vector_store = SqlServerStore(connection=connection)
ストアやコレクション側では接続が自動的には閉じられないため、自分で接続を閉じる処理を行う必要があります。
カスタム作成クエリ
SQL Server コネクタは、フラット インデックスの種類に制限されています。
ensure_collection_exists
の SqlServerCollection
メソッドを使用すると、1 つまたは複数のカスタム クエリを渡してコレクションを作成できます。 クエリは渡された順序で実行され、結果は返されません。
これを行った場合、他のメソッドが期待どおりに動作するという保証はありません。 コネクタはカスタム クエリを認識せず、検証も行いません。
DataModel
にフィールドとしてid
、content
、vector
がある場合は、たとえば、次のようなテーブルを作成して、コンテンツ フィールドにインデックスを作成することもできます。
from semantic_kernel.connectors.sql_server import SqlServerCollection
# Create a collection with a custom query
async with SqlServerCollection("dbo.table_name", DataModel) as collection:
collection.ensure_collection_exists(
queries=["CREATE TABLE dbo.table_name (id INT PRIMARY KEY, content NVARCHAR(3000) NULL, vector VECTOR(1536) NULL ) PRIMARY KEY (id);",
"CREATE INDEX idx_content ON dbo.table_name (content);"]
)
もうすぐです
詳細については、近日公開予定です。