Con la generazione di incorporamento del testo, è possibile usare un modello di intelligenza artificiale per generare vettori (ovvero incorporamenti). Questi vettori codificano il significato semantico del testo in modo che le equazioni matematiche possano essere usate su due vettori per confrontare la somiglianza del testo originale.
Ciò è utile per scenari come la Generazione Aumentata tramite Recupero (RAG), in cui vogliamo cercare un database di informazioni per testo correlato a una query dell'utente.
Qualsiasi informazione corrispondente può quindi essere fornita come input per il completamento della chat, in modo che il modello di intelligenza artificiale abbia più contesto quando risponde alla query dell'utente.
Quando si sceglie un modello di incorporamento, è necessario considerare quanto segue:
- Qual è la dimensione dei vettori generati dal modello ed è configurabile, in quanto ciò influirà sui costi di archiviazione vettoriali.
- Quale tipo di elementi contiene i vettori generati, ad esempio float32, float16 e così via, in quanto ciò influirà sul costo di archiviazione vettoriale.
- Quanto velocemente genera vettori?
- Quanto costa la generazione?
Configurazione dell'ambiente locale
Alcuni dei servizi di intelligenza artificiale possono essere ospitati localmente e potrebbero richiedere alcune configurazioni. Di seguito sono riportate le istruzioni per coloro che supportano questa operazione.
Nessuna configurazione locale.
Nessuna configurazione locale.
Nessuna configurazione locale.
Nessuna configurazione locale.
Nessuna configurazione locale.
Per eseguire Ollama in locale usando Docker, usare il comando seguente per avviare un contenitore usando la CPU.
docker run -d -v "c:\temp\ollama:/root/.ollama" -p 11434:11434 --name ollama ollama/ollama
Per eseguire Ollama in locale usando Docker, usare il comando seguente per avviare un contenitore usando GPU.
docker run -d --gpus=all -v "c:\temp\ollama:/root/.ollama" -p 11434:11434 --name ollama ollama/ollama
Dopo l'avvio del contenitore, avviare una finestra Terminale per il contenitore Docker, ad esempio se si usa docker desktop, scegliere Open in Terminal
dalle azioni.
Da questo terminale scaricare i modelli necessari, ad esempio qui viene scaricato il modello di incorporamento mxbai-embed-large.
ollama pull mxbai-embed-large
Clonare il repository contenente il modello ONNX da usare.
git clone https://huggingface.co/TaylorAI/bge-micro-v2
Installazione dei pacchetti necessari
Prima di aggiungere la generazione di incorporamento al kernel, è necessario installare i pacchetti necessari. Di seguito sono riportati i pacchetti che è necessario installare per ogni provider di servizi di intelligenza artificiale.
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
Creazione di servizi di generazione di incorporamento di testo
Dopo aver installato i pacchetti necessari, è possibile creare un servizio di generazione di incorporamento del testo. Di seguito sono riportati i diversi modi in cui è possibile generare servizi di creazione di incorporamenti utilizzando il Kernel Semantico.
Aggiunta diretta al kernel
Per aggiungere un servizio di generazione di incorporamento di testo, è possibile usare il codice seguente per aggiungerlo al provider di servizi interni del kernel.
Importante
Il connettore Azure OpenAI per la generazione di embedding è attualmente sperimentale. Per usarlo, è necessario aggiungere #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();
Importante
Il connettore OpenAI per la generazione di embedding è attualmente sperimentale. Per usarlo, è necessario aggiungere #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();
Importante
Il connettore di generazione di incorporamento Mistral è attualmente sperimentale. Per usarlo, è necessario aggiungere #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();
Importante
Il connettore di generazione di embedding Google è attualmente sperimentale. Per usarlo, è necessario aggiungere #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();
Importante
Il connettore di generazione di embedding Hugging Face è attualmente sperimentale. Per usarlo, è necessario aggiungere #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();
Importante
Il connettore di generazione di incorporamento Ollama è attualmente sperimentale. Per usarlo, è necessario aggiungere #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();
Importante
Il connettore per la generazione di incorporamenti ONNX è attualmente sperimentale. Per usarlo, è necessario aggiungere #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();
Uso dell'iniezione delle dipendenze
Se si usa l'iniezione delle dipendenze, è probabile che si voglia aggiungere i servizi di generazione di embedding del testo direttamente al provider di servizi. Ciò è utile se si desidera creare singletons dei tuoi servizi di generazione di incorporamenti e riutilizzarli in kernel transitori.
Importante
Il connettore per la generazione degli incorporamenti OpenAI di Azure è attualmente sperimentale. Per usarlo, è necessario aggiungere #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);
});
Importante
Il connettore di generazione di embedding OpenAI è attualmente sperimentale. Per usarlo, è necessario aggiungere #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);
});
Importante
Il connettore Mistral per la generazione di embedding è attualmente sperimentale. Per usarlo, è necessario aggiungere #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);
});
Importante
Il connettore di generazione di embedding Google è attualmente sperimentale. Per usarlo, è necessario aggiungere #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);
});
Importante
Il connettore per la generazione di embedding di Hugging Face è attualmente sperimentale. Per usarlo, è necessario aggiungere #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);
});
Importante
Il connettore di generazione embedding Ollama è attualmente in fase sperimentale. Per usarlo, è necessario aggiungere #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);
});
Importante
Il connettore di generazione di incorporamento ONNX è attualmente sperimentale. Per usarlo, è necessario aggiungere #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);
});
Creazione di istanze autonome
Infine, è possibile creare direttamente istanze del servizio in modo che sia possibile aggiungerle a un kernel in un secondo momento o usarle direttamente nel codice senza mai inserirle nel kernel o in un provider di servizi.
Importante
Il connettore di generazione di incorporamento OpenAI di Azure è attualmente sperimentale. Per usarlo, è necessario aggiungere #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.
);
Importante
Il connettore di generazione di incorporamento OpenAI è attualmente sperimentale. Per usarlo, è necessario aggiungere #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.
);
Importante
Il connettore di generazione di incorporamento Mistral è attualmente sperimentale. Per usarlo, è necessario aggiungere #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
);
Importante
Il connettore di generazione di incorporamento Google è attualmente in fase sperimentale. Per usarlo, è necessario aggiungere #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
);
Importante
Il connettore sperimentale di generazione di embedding di Hugging Face è attualmente in fase di prova. Per usarlo, è necessario aggiungere #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
);
Importante
Il connettore di generazione di incorporamento Ollama è attualmente sperimentale. Per usarlo, è necessario aggiungere #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();
Importante
Il connettore di generazione degli incorporamenti ONNX è attualmente in fase sperimentale. Per usarlo, è necessario aggiungere #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
);
Uso dei servizi di generazione di incorporamento di testo
Tutti i servizi di generazione di incorporamento di testo implementano l'ITextEmbeddingGenerationService
con un singolo metodo GenerateEmbeddingsAsync
che può generare vettori ReadOnlyMemory<float>
dai valori di string
forniti.
Un metodo di estensione GenerateEmbeddingAsync
è disponibile anche per le versioni a valore singolo della stessa azione.
Ecco un esempio di come richiamare il servizio con più valori.
IList<ReadOnlyMemory<float>> embeddings =
await textEmbeddingGenerationService.GenerateEmbeddingsAsync(
[
"sample text 1",
"sample text 2"
]);
Di seguito è riportato un esempio di come richiamare il servizio con un singolo valore.
using Microsoft.SemanticKernel.Embeddings;
ReadOnlyMemory<float> embedding =
await textEmbeddingGenerationService.GenerateEmbeddingAsync("sample text");
Prossimamente
Altre informazioni saranno presto disponibili.
Prossimamente
Altre informazioni saranno presto disponibili.