С помощью генерации векторных представлений текста можно использовать модель искусственного интеллекта для создания векторов (также известных как эмбеддинги). Эти векторы кодируют семантический смысл текста таким образом, чтобы математические уравнения можно использовать в двух векторах для сравнения сходства исходного текста.
Это полезно для таких сценариев, как RAG (генерация с дополнением извлечения), где мы хотим искать в базе данных информацию, связанную с пользовательским запросом.
Затем любые соответствующие сведения можно предоставить в качестве входных данных для завершения чата, чтобы модель ИИ имеет больше контекста при ответе на запрос пользователя.
При выборе модели внедрения необходимо учитывать следующее:
- Какой размер векторов, создаваемых моделью, и его можно настроить, так как это повлияет на затраты на хранилище векторов.
- Какой тип элементов содержит созданные векторы, например float32, float16 и т. д., так как это повлияет на стоимость хранения векторов.
- Насколько быстро он создает векторы?
- Сколько стоит поколение?
Настройка локальной среды
Некоторые службы ИИ могут размещаться локально и могут потребовать некоторых настроек. Ниже приведены инструкции для тех, кто поддерживает это.
Локальная настройка отсутствует.
Локальная настройка отсутствует.
Локальная настройка отсутствует.
Локальная настройка отсутствует.
Локальная настройка отсутствует.
Чтобы запустить Ollama локально с помощью docker, используйте следующую команду, чтобы запустить контейнер с помощью ЦП.
docker run -d -v "c:\temp\ollama:/root/.ollama" -p 11434:11434 --name ollama ollama/ollama
Чтобы запустить Ollama локально с помощью docker, используйте следующую команду, чтобы запустить контейнер с помощью GPU.
docker run -d --gpus=all -v "c:\temp\ollama:/root/.ollama" -p 11434:11434 --name ollama ollama/ollama
После запуска контейнера запустите окно терминала для контейнера Docker, например при использовании рабочего стола Docker, выберите Open in Terminal
из действий.
В этом терминале скачайте необходимые модели, например, здесь мы загружаем модель встраивания mxbai-embed-large.
ollama pull mxbai-embed-large
Клонируйте репозиторий, содержащий модель ONNX, который вы хотите использовать.
git clone https://huggingface.co/TaylorAI/bge-micro-v2
Установка необходимых пакетов
Прежде чем добавлять генерацию встраиваний в ваше ядро, необходимо установить необходимые пакеты. Ниже приведены пакеты, которые необходимо установить для каждого поставщика услуг ИИ.
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
Создание служб генерации текстовых встраиваний
Теперь, когда вы установили необходимые пакеты, можно создать службу внедрения текста. Ниже приведено несколько способов создания служб генерации встраиваний с использованием семантического ядра.
Добавление непосредственно в ядро
Чтобы добавить службу генерации встраиваемого представления текста, используйте следующий код, чтобы интегрировать её во внутреннего поставщика служб ядра.
Важный
Коннектор для генерации встраиваний Azure OpenAI в настоящее время является экспериментальным. Чтобы использовать его, необходимо добавить #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();
Важный
Коннектор для создания эмбеддинга OpenAI в настоящее время находится на экспериментальной стадии. Чтобы использовать его, необходимо добавить #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();
Важный
Разъём для генерации внедрений Mistral в настоящее время является экспериментальным. Чтобы использовать его, необходимо добавить #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();
Важный
Соединитель генерации встраиваний Google в настоящее время является экспериментальным. Чтобы использовать его, необходимо добавить #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();
Важный
Коннектор для генерации эмбеддингов Hugging Face в настоящее время экспериментальный. Чтобы использовать его, необходимо добавить #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();
Важный
Соединитель для создания встраиваний Ollama в настоящее время носит экспериментальный характер. Чтобы использовать его, необходимо добавить #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();
Важно
Соединитель генерации встраивания ONNX находится в стадии эксперимента. Чтобы использовать его, необходимо добавить #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();
Использование механизма внедрения зависимостей
Если вы используете внедрение зависимостей, скорее всего, вы захотите добавить службы создания текста непосредственно в поставщик услуг. Это полезно, если вы хотите создать синглтоны ваших служб генерации встраиваний и повторно использовать их в транзитных ядрах.
Важный
Соединитель генерации эмбеддингов Azure OpenAI в настоящее время является экспериментальным. Чтобы использовать его, необходимо добавить #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);
});
Важный
Коннектор генерации векторных представлений OpenAI в настоящее время экспериментальный. Чтобы использовать его, необходимо добавить #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);
});
Важный
Соединитель для генерации эмбеддингов Mistral в настоящее время является экспериментальным. Чтобы использовать его, необходимо добавить #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);
});
Важный
Коннектор генерации эмбеддингов Google в настоящее время является экспериментальным. Чтобы использовать его, необходимо добавить #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);
});
Важный
Соединитель для генерации встраиваний Hugging Face в настоящее время является экспериментальным. Чтобы использовать его, необходимо добавить #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);
});
Важный
Соединитель генерации встраиваний Ollama в настоящее время является экспериментальным. Чтобы использовать его, необходимо добавить #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);
});
Важный
Коннектор генерации эмбеддингов ONNX в настоящее время является экспериментальным. Чтобы использовать его, необходимо добавить #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);
});
Создание автономных экземпляров
Наконец, можно создать экземпляры службы напрямую, чтобы можно было добавить их в ядро позже или использовать их непосредственно в коде, не внедряя их в ядро или в поставщике услуг.
Важный
Коннектор генерации встраиваний Azure OpenAI в настоящее время является экспериментальным. Чтобы использовать его, необходимо добавить #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.
);
Важный
Коннектор генерации встраиваний OpenAI на данный момент является экспериментальным. Чтобы использовать его, необходимо добавить #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.
);
Важный
На текущий момент соединитель для генерации внедрения Mistral является экспериментальным. Чтобы использовать его, необходимо добавить #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
);
Важный
Соединитель генерации эмбеддингов Google в настоящее время является экспериментальным. Чтобы использовать его, необходимо добавить #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
);
Важный
Соединитель для генерации встраиваний от Hugging Face в настоящее время находится на стадии эксперимента. Чтобы использовать его, необходимо добавить #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
);
Важный
Коннектор для генерации встраиваний Ollama в данный момент экспериментальный. Чтобы использовать его, необходимо добавить #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();
Важный
Коннектор встраивания ONNX в настоящее время находится на этапе эксперимента. Чтобы использовать его, необходимо добавить #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
);
Использование служб создания текстовых встраиваний
Все службы генерации встраивания текста реализуют ITextEmbeddingGenerationService
с одним методом GenerateEmbeddingsAsync
, который может создавать ReadOnlyMemory<float>
векторы из предоставленных string
значений.
Метод расширения GenerateEmbeddingAsync
также доступен для версий, рассчитанных на одиночные значения той же операции.
Ниже приведен пример вызова службы с несколькими значениями.
IList<ReadOnlyMemory<float>> embeddings =
await textEmbeddingGenerationService.GenerateEmbeddingsAsync(
[
"sample text 1",
"sample text 2"
]);
Ниже приведен пример вызова службы с одним значением.
using Microsoft.SemanticKernel.Embeddings;
ReadOnlyMemory<float> embedding =
await textEmbeddingGenerationService.GenerateEmbeddingAsync("sample text");
Скоро
Дополнительные сведения в ближайшее время.
Скоро
Дополнительные сведения в ближайшее время.