在语义内核中进行文本嵌入生成

借助文本嵌入生成,可以使用 AI 模型生成矢量(即嵌入)。 这些向量以数学方式对文本语义进行编码,以便可以通过对两个向量进行运算来比较原始文本的相似性。 这对于像检索扩展生成(RAG)这样的场景非常有用,我们希望在信息数据库中搜索与用户查询相关的文本。 然后,可以将任何匹配信息作为聊天完成的输入提供,以便 AI 模型在回答用户查询时有更多的上下文。

选择嵌入模型时,需要考虑以下事项:

  • 模型生成的向量的大小是多少,并且是可配置的,因为这会影响矢量存储成本。
  • 生成的向量包含哪些类型的元素,例如 float32、float16 等,这会影响矢量存储成本。
  • 生成向量的速度有多快?
  • 生成成本是多少?

提示

有关存储和搜索向量的详细信息,请参阅 什么是语义内核矢量存储连接器?

提示

有关在语义内核中将 RAG 与矢量存储配合使用的详细信息,请参阅 如何将矢量存储与语义内核文本搜索配合使用什么是语义内核文本搜索插件?

设置本地环境

某些 AI 服务可以托管在本地,可能需要一些设置。 下面是为支持这一点的人准备的说明。

没有本地设置。

安装所需的包

在将嵌入生成添加到内核之前,需要安装所需的包。 下面是需要为每个 AI 服务提供商安装的包。

dotnet add package Microsoft.SemanticKernel.Connectors.AzureOpenAI

创建文本嵌入生成服务

安装所需的包后,可以创建文本嵌入生成服务。 以下是使用语义内核生成嵌入服务的几种方法。

直接添加到内核

若要添加文本嵌入生成服务,可以使用以下代码将其添加到内核的内部服务提供程序。

重要

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();

使用依赖注入

如果使用依赖项注入,则可能需要将文本嵌入生成服务直接添加到服务提供商。 如果要创建嵌入生成服务的单一实例,并在暂时性内核中重复使用它们,这非常有用。

重要

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);
});

创建独立实例

最后,可以直接创建服务的实例,以便以后可以将它们添加到内核,或者直接在代码中使用这些实例,而无需将它们注入内核或服务提供商。

重要

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.
);

使用文本嵌入生成服务

所有文本嵌入生成服务都实现了 ITextEmbeddingGenerationService,它包含一个方法 GenerateEmbeddingsAsync,可以根据提供的 string 值生成 ReadOnlyMemory<float> 向量。 扩展方法 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");

即将推出

更多信息即将推出。

即将推出

更多信息即将推出。