Mit der Generierung von Texteinbettungen können Sie ein KI-Modell verwenden, um Vektoren zu generieren (auch bekannt als Einbettungen). Diese Vektoren codieren die semantische Bedeutung des Texts so, dass mathematische Formeln auf zwei Vektoren verwendet werden können, um die Ähnlichkeit des ursprünglichen Texts zu vergleichen.
Dies ist nützlich für Szenarien wie die Abruf-Augmentierte Generierung (Retrieval Augmented Generation, RAG), in denen wir eine Datenbank mit Informationen durchsuchen möchten, um nach einem Text zu suchen, der sich auf eine Benutzeranfrage bezieht.
Alle übereinstimmenden Informationen können dann als Eingabe für den Chatabschluss bereitgestellt werden, sodass das KI-Modell bei der Beantwortung der Benutzerabfrage mehr Kontext hat.
Beim Auswählen eines Einbettungsmodells müssen Sie Folgendes berücksichtigen:
- Was ist die Größe der vom Modell generierten Vektoren und ist konfigurierbar, da sich dies auf Ihre Vektorspeicherkosten auswirkt.
- Welche Art von Elementen die generierten Vektoren enthalten, z. B. float32, float16 usw., da sich dies auf Ihre Vektorspeicherkosten auswirkt.
- Wie schnell generiert es Vektoren?
- Wie viel kostet die Erzeugung?
Einrichten Ihrer lokalen Umgebung
Einige der KI-Dienste können lokal gehostet werden und erfordern möglicherweise ein Setup. Nachfolgend finden Sie Anweisungen für diejenigen, die dies unterstützen.
Keine lokale Einrichtung.
Keine lokale Einrichtung.
Um Ollama lokal mit Docker auszuführen, verwenden Sie den folgenden Befehl, um einen Container mit der CPU zu starten.
docker run -d -v "c:\temp\ollama:/root/.ollama" -p 11434:11434 --name ollama ollama/ollama
Um Ollama lokal mit Docker auszuführen, verwenden Sie den folgenden Befehl, um einen Container mit GPUs zu starten.
docker run -d --gpus=all -v "c:\temp\ollama:/root/.ollama" -p 11434:11434 --name ollama ollama/ollama
Nachdem der Container gestartet wurde, starten Sie ein Terminalfenster für den Docker-Container, z. B. wenn Sie Docker-Desktop verwenden, wählen Sie Open in Terminal aus Aktionen aus.
Von diesem Terminal aus laden wir die erforderlichen Modelle herunter. Zum Beispiel laden wir hier das mxbai-embed-large Einbettungsmodell herunter.
ollama pull mxbai-embed-large
Klonen Sie das Repository mit dem ONNX-Modell, das Sie verwenden möchten.
git clone https://huggingface.co/TaylorAI/bge-micro-v2
Installieren der erforderlichen Pakete
Vor dem Hinzufügen der Einbettungsgenerierung zum Kernel müssen Sie die erforderlichen Pakete installieren. Nachfolgend finden Sie die Pakete, die Sie für jeden KI-Dienstanbieter installieren müssen.
dotnet add package Microsoft.SemanticKernel.Connectors.AzureOpenAI
dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI
dotnet add package Microsoft.SemanticKernel.Connectors.MistralAI --prerelease
dotnet add package Microsoft.SemanticKernel.Connectors.Google --prerelease
dotnet add package Microsoft.SemanticKernel.Connectors.HuggingFace --prerelease
dotnet add package Microsoft.SemanticKernel.Connectors.Ollama --prerelease
dotnet add package Microsoft.SemanticKernel.Connectors.Onnx --prerelease
Erstellen von Diensten für die Generierung von Texteinbettungen
Nachdem Sie nun die erforderlichen Pakete installiert haben, können Sie einen Texteinbettungsdienst erstellen. Nachfolgend finden Sie die verschiedenen Möglichkeiten zum Erstellen von Einbettungsgenerierungsdiensten mithilfe des semantischen Kernels.
Direktes Hinzufügen zum Kernel
Wenn Sie einen Dienst für die Texteinbettung hinzufügen möchten, können Sie ihn mit dem folgenden Code dem internen Dienstanbieter des Kernels hinzufügen.
Wichtig
Der Azure OpenAI Embedding Generation Connector ist derzeit experimentell. Um es zu verwenden, müssen Sie #pragma warning disable SKEXP0010hinzufügen.
using Microsoft.SemanticKernel;
#pragma warning disable SKEXP0010
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddAzureOpenAITextEmbeddingGeneration(
deploymentName: "NAME_OF_YOUR_DEPLOYMENT", // Name of deployment, e.g. "text-embedding-ada-002".
endpoint: "YOUR_AZURE_ENDPOINT", // Name of Azure OpenAI service endpoint, e.g. https://myaiservice.openai.azure.com.
apiKey: "YOUR_API_KEY",
modelId: "MODEL_ID", // Optional name of the underlying model if the deployment name doesn't match the model name, e.g. text-embedding-ada-002.
serviceId: "YOUR_SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel.
httpClient: new HttpClient(), // Optional; if not provided, the HttpClient from the kernel will be used.
dimensions: 1536 // Optional number of dimensions to generate embeddings with.
);
Kernel kernel = kernelBuilder.Build();
Wichtig
Der OpenAI Embedding Generation Connector ist derzeit experimentell. Um es zu verwenden, müssen Sie #pragma warning disable SKEXP0010hinzufügen.
using Microsoft.SemanticKernel;
#pragma warning disable SKEXP0010
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddOpenAITextEmbeddingGeneration(
modelId: "MODEL_ID", // Name of the embedding model, e.g. "text-embedding-ada-002".
apiKey: "YOUR_API_KEY",
orgId: "YOUR_ORG_ID", // Optional organization id.
serviceId: "YOUR_SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel
httpClient: new HttpClient(), // Optional; if not provided, the HttpClient from the kernel will be used
dimensions: 1536 // Optional number of dimensions to generate embeddings with.
);
Kernel kernel = kernelBuilder.Build();
Wichtig
Der Mistral Embedding Generation Connector ist derzeit experimentell. Um es zu verwenden, müssen Sie #pragma warning disable SKEXP0070hinzufügen.
using Microsoft.SemanticKernel;
#pragma warning disable SKEXP0070
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddMistralTextEmbeddingGeneration(
modelId: "NAME_OF_MODEL", // Name of the embedding model, e.g. "mistral-embed".
apiKey: "API_KEY",
endpoint: new Uri("YOUR_ENDPOINT"), // Optional uri endpoint including the port where MistralAI server is hosted. Default is https://api.mistral.ai.
serviceId: "SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel
httpClient: new HttpClient() // Optional; for customizing HTTP client
);
Kernel kernel = kernelBuilder.Build();
Wichtig
Der Google Embedding Generation Connector ist derzeit experimentell. Um es zu verwenden, müssen Sie #pragma warning disable SKEXP0070hinzufügen.
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.Google;
#pragma warning disable SKEXP0070
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddGoogleAIEmbeddingGeneration(
modelId: "NAME_OF_MODEL", // Name of the embedding model, e.g. "models/text-embedding-004".
apiKey: "API_KEY",
apiVersion: GoogleAIVersion.V1, // Optional
serviceId: "SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel
httpClient: new HttpClient() // Optional; for customizing HTTP client
);
Kernel kernel = kernelBuilder.Build();
Wichtig
Der Hugging Face Embedding Generation Connector ist derzeit experimentell. Um es zu verwenden, müssen Sie #pragma warning disable SKEXP0070hinzufügen.
using Microsoft.SemanticKernel;
#pragma warning disable SKEXP0070
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddHuggingFaceTextEmbeddingGeneration(
model: "NAME_OF_MODEL", // Name of the embedding model.
apiKey: "API_KEY",
endpoint: new Uri("YOUR_ENDPOINT"), // Optional
serviceId: "SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel
httpClient: new HttpClient() // Optional; for customizing HTTP client
);
Kernel kernel = kernelBuilder.Build();
Wichtig
Der Ollama Embedding Generation Connector ist derzeit experimentell. Um es zu verwenden, müssen Sie #pragma warning disable SKEXP0070hinzufügen.
using Microsoft.SemanticKernel;
#pragma warning disable SKEXP0070
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddOllamaTextEmbeddingGeneration(
modelId: "NAME_OF_MODEL", // E.g. "mxbai-embed-large" if mxbai-embed-large was downloaded as described above.
endpoint: new Uri("YOUR_ENDPOINT"), // E.g. "http://localhost:11434" if Ollama has been started in docker as described above.
serviceId: "SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);
Kernel kernel = kernelBuilder.Build();
Wichtig
Der Connector zur Generierung von ONNX-Einbettungen ist derzeit experimentell. Um es zu verwenden, müssen Sie #pragma warning disable SKEXP0070hinzufügen.
using Microsoft.SemanticKernel;
#pragma warning disable SKEXP0070
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddBertOnnxTextEmbeddingGeneration(
onnxModelPath: "PATH_ON_DISK", // Path to the model on disk e.g. C:\Repos\huggingface\microsoft\TaylorAI\bge-micro-v2\onnx\model.onnx
vocabPath: "VOCABULARY_PATH_ON_DISK",// Path to the vocabulary file on disk, e.g. C:\Repos\huggingface\TailorAI\bge-micro-v2\vocab.txt
serviceId: "SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);
Kernel kernel = kernelBuilder.Build();
Verwendung der Abhängigkeitsinjektion
Wenn Sie Dependency Injection verwenden, sollten Sie wahrscheinlich Ihre Text-Einbettungsdienste direkt zum Dienstanbieter hinzufügen. Dies ist hilfreich, wenn Sie Singletons Ihrer Einbettungsgenerierungsdienste erstellen und sie in vorübergehenden Kerneln wiederverwenden möchten.
Wichtig
Der Azure OpenAI Embedding Generation Connector ist derzeit experimentell. Um es zu verwenden, müssen Sie #pragma warning disable SKEXP0010hinzufügen.
using Microsoft.SemanticKernel;
var builder = Host.CreateApplicationBuilder(args);
#pragma warning disable SKEXP0010
builder.Services.AddAzureOpenAITextEmbeddingGeneration(
deploymentName: "NAME_OF_YOUR_DEPLOYMENT", // Name of deployment, e.g. "text-embedding-ada-002".
endpoint: "YOUR_AZURE_ENDPOINT", // Name of Azure OpenAI service endpoint, e.g. https://myaiservice.openai.azure.com.
apiKey: "YOUR_API_KEY",
modelId: "MODEL_ID", // Optional name of the underlying model if the deployment name doesn't match the model name, e.g. text-embedding-ada-002.
serviceId: "YOUR_SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel.
dimensions: 1536 // Optional number of dimensions to generate embeddings with.
);
builder.Services.AddTransient((serviceProvider)=> {
return new Kernel(serviceProvider);
});
Wichtig
Der OpenAI Embedding Generation Connector ist derzeit experimentell. Um es zu verwenden, müssen Sie #pragma warning disable SKEXP0010hinzufügen.
using Microsoft.SemanticKernel;
#pragma warning disable SKEXP0010
var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddOpenAITextEmbeddingGeneration(
modelId: "MODEL_ID", // Name of the embedding model, e.g. "text-embedding-ada-002".
apiKey: "YOUR_API_KEY",
orgId: "YOUR_ORG_ID", // Optional organization id.
serviceId: "YOUR_SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel
dimensions: 1536 // Optional number of dimensions to generate embeddings with.
);
builder.Services.AddTransient((serviceProvider)=> {
return new Kernel(serviceProvider);
});
Wichtig
Der Mistral Embedding Generation Connector ist derzeit experimentell. Um es zu verwenden, müssen Sie #pragma warning disable SKEXP0070hinzufügen.
using Microsoft.SemanticKernel;
var builder = Host.CreateApplicationBuilder(args);
#pragma warning disable SKEXP0070
builder.Services.AddMistralTextEmbeddingGeneration(
modelId: "NAME_OF_MODEL", // Name of the embedding model, e.g. "mistral-embed".
apiKey: "API_KEY",
endpoint: new Uri("YOUR_ENDPOINT"), // Optional uri endpoint including the port where MistralAI server is hosted. Default is https://api.mistral.ai.
serviceId: "SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);
builder.Services.AddTransient((serviceProvider)=> {
return new Kernel(serviceProvider);
});
Wichtig
Der Google Embedding Generation Connector ist derzeit experimentell. Um es zu verwenden, müssen Sie #pragma warning disable SKEXP0070hinzufügen.
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.Google;
var builder = Host.CreateApplicationBuilder(args);
#pragma warning disable SKEXP0070
builder.Services.AddGoogleAIEmbeddingGeneration(
modelId: "NAME_OF_MODEL", // Name of the embedding model, e.g. "models/text-embedding-004".
apiKey: "API_KEY",
apiVersion: GoogleAIVersion.V1, // Optional
serviceId: "SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);
builder.Services.AddTransient((serviceProvider)=> {
return new Kernel(serviceProvider);
});
Wichtig
Der Hugging Face Embedding Generation Connector ist derzeit experimentell. Um es zu verwenden, müssen Sie #pragma warning disable SKEXP0070hinzufügen.
using Microsoft.SemanticKernel;
var builder = Host.CreateApplicationBuilder(args);
#pragma warning disable SKEXP0070
builder.Services.AddHuggingFaceTextEmbeddingGeneration(
model: "NAME_OF_MODEL", // Name of the embedding model.
apiKey: "API_KEY",
endpoint: new Uri("YOUR_ENDPOINT"), // Optional
serviceId: "SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel
httpClient: new HttpClient() // Optional; for customizing HTTP client
);
builder.Services.AddTransient((serviceProvider)=> {
return new Kernel(serviceProvider);
});
Wichtig
Der Ollama Embedding Generation Connector ist derzeit experimentell. Um es zu verwenden, müssen Sie #pragma warning disable SKEXP0070hinzufügen.
using Microsoft.SemanticKernel;
var builder = Host.CreateApplicationBuilder(args);
#pragma warning disable SKEXP0070
builder.Services.AddOllamaTextEmbeddingGeneration(
modelId: "NAME_OF_MODEL", // E.g. "mxbai-embed-large" if mxbai-embed-large was downloaded as described above.
endpoint: new Uri("YOUR_ENDPOINT"), // E.g. "http://localhost:11434" if Ollama has been started in docker as described above.
serviceId: "SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);
builder.Services.AddTransient((serviceProvider)=> {
return new Kernel(serviceProvider);
});
Wichtig
Der ONNX-Einbettungs-Generierungsanschluss ist derzeit experimentell. Um es zu verwenden, müssen Sie #pragma warning disable SKEXP0070hinzufügen.
using Microsoft.SemanticKernel;
var builder = Host.CreateApplicationBuilder(args);
#pragma warning disable SKEXP0070
builder.Services.AddBertOnnxTextEmbeddingGeneration(
onnxModelPath: "PATH_ON_DISK", // Path to the model on disk e.g. C:\Repos\huggingface\microsoft\TaylorAI\bge-micro-v2\onnx\model.onnx
vocabPath: "VOCABULARY_PATH_ON_DISK",// Path to the vocabulary file on disk, e.g. C:\Repos\huggingface\TailorAI\bge-micro-v2\vocab.txt
serviceId: "SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);
builder.Services.AddTransient((serviceProvider)=> {
return new Kernel(serviceProvider);
});
Erstellen eigenständiger Instanzen
Schließlich können Sie Instanzen des Diensts direkt erstellen, damit Sie sie einem Kernel später hinzufügen oder direkt in Ihrem Code verwenden können, ohne sie jemals in den Kernel oder in einen Dienstanbieter einzufügen.
Wichtig
Der Azure OpenAI Embedding Generation Connector ist derzeit experimentell. Um es zu verwenden, müssen Sie #pragma warning disable SKEXP0010hinzufügen.
using Microsoft.SemanticKernel.Connectors.AzureOpenAI;
#pragma warning disable SKEXP0010
AzureOpenAITextEmbeddingGenerationService textEmbeddingGenerationService = new (
deploymentName: "NAME_OF_YOUR_DEPLOYMENT", // Name of deployment, e.g. "text-embedding-ada-002".
endpoint: "YOUR_AZURE_ENDPOINT", // Name of Azure OpenAI service endpoint, e.g. https://myaiservice.openai.azure.com.
apiKey: "YOUR_API_KEY",
modelId: "MODEL_ID", // Optional name of the underlying model if the deployment name doesn't match the model name, e.g. text-embedding-ada-002.
httpClient: new HttpClient(), // Optional; if not provided, the HttpClient from the kernel will be used.
dimensions: 1536 // Optional number of dimensions to generate embeddings with.
);
Wichtig
Der OpenAI Embedding Generation Connector ist derzeit experimentell. Um es zu verwenden, müssen Sie #pragma warning disable SKEXP0010hinzufügen.
#pragma warning disable SKEXP0010
using Microsoft.SemanticKernel.Connectors.OpenAI;
OpenAITextEmbeddingGenerationService textEmbeddingGenerationService = new (
modelId: "MODEL_ID", // Name of the embedding model, e.g. "text-embedding-ada-002".
apiKey: "YOUR_API_KEY",
organization: "YOUR_ORG_ID", // Optional organization id.
httpClient: new HttpClient(), // Optional; if not provided, the HttpClient from the kernel will be used
dimensions: 1536 // Optional number of dimensions to generate embeddings with.
);
Wichtig
Der Mistral Embedding Generation Connector ist derzeit experimentell. Um es zu verwenden, müssen Sie #pragma warning disable SKEXP0070hinzufügen.
using Microsoft.SemanticKernel.Connectors.MistralAI;
#pragma warning disable SKEXP0070
MistralAITextEmbeddingGenerationService textEmbeddingGenerationService = new (
modelId: "NAME_OF_MODEL", // Name of the embedding model, e.g. "mistral-embed".
apiKey: "API_KEY",
endpoint: new Uri("YOUR_ENDPOINT"), // Optional uri endpoint including the port where MistralAI server is hosted. Default is https://api.mistral.ai.
httpClient: new HttpClient() // Optional; for customizing HTTP client
);
Wichtig
Der Google Embedding Generation Connector ist derzeit experimentell. Um es zu verwenden, müssen Sie #pragma warning disable SKEXP0070hinzufügen.
using Microsoft.SemanticKernel.Connectors.Google;
#pragma warning disable SKEXP0070
GoogleAITextEmbeddingGenerationService textEmbeddingGenerationService = new (
modelId: "NAME_OF_MODEL", // Name of the embedding model, e.g. "models/text-embedding-004".
apiKey: "API_KEY",
apiVersion: GoogleAIVersion.V1, // Optional
httpClient: new HttpClient() // Optional; for customizing HTTP client
);
Wichtig
Der Hugging Face Embedding Generation Connector ist derzeit experimentell. Um es zu verwenden, müssen Sie #pragma warning disable SKEXP0070hinzufügen.
using Microsoft.SemanticKernel.Connectors.HuggingFace;
#pragma warning disable SKEXP0070
HuggingFaceTextEmbeddingGenerationService textEmbeddingGenerationService = new (
model: "NAME_OF_MODEL", // Name of the embedding model.
apiKey: "API_KEY",
endpoint: new Uri("YOUR_ENDPOINT"), // Optional
httpClient: new HttpClient() // Optional; for customizing HTTP client
);
Wichtig
Der Ollama Embedding Generation Connector ist derzeit experimentell. Um es zu verwenden, müssen Sie #pragma warning disable SKEXP0070hinzufügen.
using Microsoft.SemanticKernel.Embeddings;
using OllamaSharp;
#pragma warning disable SKEXP0070
using var ollamaClient = new OllamaApiClient(
uriString: "YOUR_ENDPOINT" // E.g. "http://localhost:11434" if Ollama has been started in docker as described above.
defaultModel: "NAME_OF_MODEL" // E.g. "mxbai-embed-large" if mxbai-embed-large was downloaded as described above.
);
ITextEmbeddingGenerationService textEmbeddingGenerationService = ollamaClient.AsTextEmbeddingGenerationService();
Wichtig
Der ONNX-Connector für die Einbettungsgenerierung ist derzeit noch experimentell. Um es zu verwenden, müssen Sie #pragma warning disable SKEXP0070hinzufügen.
using Microsoft.SemanticKernel.Connectors.Onnx;
#pragma warning disable SKEXP0070
BertOnnxTextEmbeddingGenerationService textEmbeddingGenerationService = await BertOnnxTextEmbeddingGenerationService.CreateAsync(
onnxModelPath: "PATH_ON_DISK", // Path to the model on disk e.g. C:\Repos\huggingface\microsoft\TaylorAI\bge-micro-v2\onnx\model.onnx
vocabPath: "VOCABULARY_PATH_ON_DISK" // Path to the vocabulary file on disk, e.g. C:\Repos\huggingface\TailorAI\bge-micro-v2\vocab.txt
);
Verwenden von Texteinbettungs-Generierungsdiensten
Alle Dienste der Texteinbettung implementieren die ITextEmbeddingGenerationService, die über eine einzelne Methode GenerateEmbeddingsAsync verfügt, die ReadOnlyMemory<float> Vektoren aus bereitgestellten string-Werten generieren kann.
Eine Erweiterungsmethode GenerateEmbeddingAsync ist auch für Einzelwertversionen derselben Aktion verfügbar.
Hier ist ein Beispiel für das Aufrufen des Diensts mit mehreren Werten.
IList<ReadOnlyMemory<float>> embeddings =
await textEmbeddingGenerationService.GenerateEmbeddingsAsync(
[
"sample text 1",
"sample text 2"
]);
Hier ist ein Beispiel für das Aufrufen des Diensts mit einem einzelnen Wert.
using Microsoft.SemanticKernel.Embeddings;
ReadOnlyMemory<float> embedding =
await textEmbeddingGenerationService.GenerateEmbeddingAsync("sample text");
Demnächst
Weitere Informationen werden in Kürze verfügbar sein.
Demnächst
Weitere Informationen werden in Kürze verfügbar sein.