Podczas generowania osadzeń tekstu można użyć modelu sztucznej inteligencji do generowania wektorów (czyli osadzeń). Te wektory kodują semantyczne znaczenie tekstu w taki sposób, że równania matematyczne mogą być używane w dwóch wektorach w celu porównania podobieństwa oryginalnego tekstu.
Jest to przydatne w scenariuszach, takich jak pobieranie rozszerzonej generacji (RAG), gdzie chcemy przeszukać bazę danych informacji o tekście powiązanym z zapytaniem użytkownika.
Wszystkie pasujące informacje można następnie podać jako dane wejściowe do ukończenia czatu, aby model sztucznej inteligencji miał większy kontekst podczas odpowiadania na zapytanie użytkownika.
Podczas wybierania modelu osadzania należy wziąć pod uwagę następujące kwestie:
- Jaki jest rozmiar wektorów generowanych przez model i jest konfigurowalny, ponieważ będzie to miało wpływ na koszt magazynu wektorowego.
- Jaki typ elementów zawiera wygenerowane wektory, np. float32, float16 itp., ponieważ wpłynie to na koszt magazynu wektorowego.
- Jak szybko generuje wektory?
- Ile kosztuje generowanie?
Konfigurowanie środowiska lokalnego
Niektóre usługi sztucznej inteligencji mogą być hostowane lokalnie i mogą wymagać konfiguracji. Poniżej znajdują się instrukcje dla osób, które to obsługują.
Brak konfiguracji lokalnej.
Brak konfiguracji lokalnej.
Brak konfiguracji lokalnej.
Brak konfiguracji lokalnej.
Brak konfiguracji lokalnej.
Aby uruchomić środowisko Ollama lokalnie przy użyciu platformy Docker, użyj następującego polecenia, aby uruchomić kontener przy użyciu procesora CPU.
docker run -d -v "c:\temp\ollama:/root/.ollama" -p 11434:11434 --name ollama ollama/ollama
Aby uruchomić program Ollama lokalnie przy użyciu platformy Docker, użyj następującego polecenia, aby uruchomić kontener przy użyciu procesorów GPU.
docker run -d --gpus=all -v "c:\temp\ollama:/root/.ollama" -p 11434:11434 --name ollama ollama/ollama
Po uruchomieniu kontenera uruchom okno terminalu dla kontenera platformy Docker, np. w przypadku korzystania z pulpitu platformy Docker, wybierz pozycję Open in Terminal z akcji.
Z tego terminalu pobierz wymagane modele, np. w tym miejscu pobieramy model osadzania mxbai-embed-large.
ollama pull mxbai-embed-large
Sklonuj repozytorium zawierające model ONNX, którego chcesz użyć.
git clone https://huggingface.co/TaylorAI/bge-micro-v2
Instalowanie niezbędnych pakietów
Przed dodaniem generacji osadzania do jądra należy zainstalować niezbędne pakiety. Poniżej przedstawiono pakiety, które należy zainstalować dla każdego dostawcy usług sztucznej inteligencji.
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
Tworzenie usług generowania osadzania tekstu
Po zainstalowaniu niezbędnych pakietów możesz utworzyć usługę generowania osadzania tekstu. Poniżej przedstawiono kilka sposobów tworzenia usług generowania osadzania tekstu przy użyciu jądra semantycznego.
Dodawanie bezpośrednio do jądra
Aby dodać usługę generowania osadzania tekstu, możesz użyć następującego kodu, aby dodać go do wewnętrznego dostawcy usług jądra.
Ważny
Łącznik generacji osadzania usługi Azure OpenAI jest obecnie eksperymentalny. Aby go użyć, należy dodać #pragma warning disable SKEXP0010.
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();
Ważny
Łącznik osadzania interfejsu OpenAI jest obecnie eksperymentalny. Aby go użyć, należy dodać #pragma warning disable SKEXP0010.
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();
Ważny
Łącznik generacji osadzania Mistral jest obecnie eksperymentalny. Aby go użyć, należy dodać #pragma warning disable SKEXP0070.
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();
Ważny
Łącznik generowania osadzania Google jest obecnie eksperymentalny. Aby go użyć, należy dodać #pragma warning disable SKEXP0070.
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();
Ważny
Łącznik generowania embeddingów Hugging Face jest obecnie eksperymentalny. Aby go użyć, należy dodać #pragma warning disable SKEXP0070.
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();
Ważny
Łącznik generowania embedów Ollama jest obecnie eksperymentalny. Aby go użyć, należy dodać #pragma warning disable SKEXP0070.
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();
Ważny
Łącznik do generacji osadzania ONNX jest obecnie eksperymentalny. Aby go użyć, należy dodać #pragma warning disable SKEXP0070.
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();
Korzystanie z wstrzykiwania zależności
Jeśli używasz wstrzykiwania zależności, prawdopodobnie chcesz dodać usługi generowania osadów tekstowych bezpośrednio do dostawcy usług. Jest to przydatne, jeśli chcesz utworzyć singletony usług generowania osadzeń i ponownie użyć ich w tymczasowych jądrach.
Ważny
Łącznik generowania osadów usługi Azure OpenAI jest obecnie w fazie eksperymentalnej. Aby go użyć, należy dodać #pragma warning disable SKEXP0010.
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);
});
Ważny
Łącznik osadzania interfejsu OpenAI jest obecnie eksperymentalny. Aby go użyć, należy dodać #pragma warning disable SKEXP0010.
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);
});
Ważny
Łącznik generacji osadzania Mistral jest obecnie eksperymentalny. Aby go użyć, należy dodać #pragma warning disable SKEXP0070.
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);
});
Ważny
Obecnie konektor generowania osadzeń Google jest eksperymentalny. Aby go użyć, należy dodać #pragma warning disable SKEXP0070.
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);
});
Ważny
Łącznik generowania osadzeń Hugging Face jest obecnie eksperymentalny. Aby go użyć, należy dodać #pragma warning disable SKEXP0070.
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);
});
Ważny
Łącznik generacji osadzania Ollama jest obecnie eksperymentalny. Aby go użyć, należy dodać #pragma warning disable SKEXP0070.
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);
});
Ważny
Konektor tworzenia osadzeń ONNX jest obecnie eksperymentalny. Aby go użyć, należy dodać #pragma warning disable SKEXP0070.
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);
});
Tworzenie wystąpień autonomicznych
Na koniec możesz utworzyć wystąpienia usługi bezpośrednio, aby można było później dodać je do jądra lub użyć ich bezpośrednio w kodzie, nigdy nie wstrzykując ich do jądra ani dostawcy usług.
Ważny
Łącznik generacji osadzania usługi Azure OpenAI jest obecnie eksperymentalny. Aby go użyć, należy dodać #pragma warning disable SKEXP0010.
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.
);
Ważny
Konektor generowania osadzeń OpenAI jest obecnie eksperymentalny. Aby go użyć, należy dodać #pragma warning disable SKEXP0010.
#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.
);
Ważny
Łącznik generacji osadzania Mistral jest obecnie eksperymentalny. Aby go użyć, należy dodać #pragma warning disable SKEXP0070.
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
);
Ważny
Łącznik do generowania osadzania Google jest obecnie w fazie eksperymentalnej. Aby go użyć, należy dodać #pragma warning disable SKEXP0070.
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
);
Ważny
Łącznik do generowania osadzeń Hugging Face jest obecnie w fazie eksperymentalnej. Aby go użyć, należy dodać #pragma warning disable SKEXP0070.
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
);
Ważny
Łącznik generacji osadzania Ollama jest obecnie eksperymentalny. Aby go użyć, należy dodać #pragma warning disable SKEXP0070.
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();
Ważny
Łącznik generacji osadzania ONNX jest obecnie eksperymentalny. Aby go użyć, należy dodać #pragma warning disable SKEXP0070.
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
);
Korzystanie z usług generowania osadzania tekstu
Wszystkie usługi generowania osadzania tekstu implementują ITextEmbeddingGenerationService, która posiada pojedynczą metodę GenerateEmbeddingsAsync umożliwiającą generowanie wektorów ReadOnlyMemory<float> na podstawie podanych wartości string.
Metoda rozszerzenia GenerateEmbeddingAsync jest również dostępna dla wersji jednowartościowej tej samej akcji.
Oto przykład sposobu wywoływania usługi z wieloma wartościami.
IList<ReadOnlyMemory<float>> embeddings =
await textEmbeddingGenerationService.GenerateEmbeddingsAsync(
[
"sample text 1",
"sample text 2"
]);
Oto przykład sposobu wywoływania usługi z pojedynczą wartością.
using Microsoft.SemanticKernel.Embeddings;
ReadOnlyMemory<float> embedding =
await textEmbeddingGenerationService.GenerateEmbeddingAsync("sample text");
Wkrótce
Więcej informacji można znaleźć wkrótce.
Wkrótce
Więcej informacji można znaleźć wkrótce.