在人工智能领域,嵌入是许多高级应用的基础,从语义搜索、推荐系统到自然语言处理。但嵌入到底是什么呢,为什么它们对现代AI如此重要呢?
本质上,嵌入是一种将复杂数据(如单词、句子甚至图像)转换为数值格式的方法,使机器能够处理这些数据。这些表示是密集的数值向量,也就是一组数字,在高维空间中,相似的数据点会更靠近。例如,“国王”和“皇后”这两个词的嵌入可能比“苹果”的更接近,反映了它们之间的语义关联。这种将数据映射成能够捕捉含义和关系的形式的能力,使得嵌入如此强大。
通过将抽象或非结构化数据转化为向量,嵌入使AI系统能够以惊人的效率执行聚类、搜索和分类等任务。使复杂输入的比较变得直观且情境感知,从而使原始数据与机器理解之间的差距缩小。无论是创建能理解上下文的聊天机器人,还是基于意义而非关键词提供相关结果的搜索引擎,嵌入是现代AI解决方案中不可或缺的工具。
在这篇博客文章中,我们将探讨如何利用Microsoft.Extensions.AI库的功能在.NET控制台应用程序中无缝生成嵌入向量(embeddings)。通过这样做,你将更好地理解这些数值表示的工作机制,并将其应用到你自己的AI项目中。
我之前写了一篇博客文章,演示了如何使用Microsoft.Extensions.AI
来构建一个支持多个主机的简单聊天应用。
首先,让我们先来了解一下什么是Microsoft.Extensions.AI
以及为什么它会成为你.NET工具箱中的一个非常有用的工具。Microsoft.Extensions.AI
是.NET库的一部分,提供了对各种AI服务的简化访问,并支持依赖注入。这个库允许开发人员将AI功能无缝地集成到.NET应用程序中,而无需深入了解复杂的AI算法或配置过程。相反,你可以依靠这个扩展来处理AI集成中的复杂问题,从而使开发更快,更易于管理。
首先,打开 Visual Studio 并创建一个新的 .NET 9 控制台应用程序项目。项目创建完成后,添加以下 NuGet 包来实现 AI 功能:
- Spectre.Console
- Microsoft.Extensions.人工智能
- Microsoft.Extensions.AI.奥拉玛
- Microsoft.Extensions.AI.OpenAI开曼
- Azure人工智能.OpenAI
在我的情况下,我将安装包来与OpenAI、Ollama和Azure OpenAI进行交互。如果你只想使用其中一个,你可以跳过其他包的安装。
确保你也包含预发行的包,因为所有那些Microsoft.Extensions
包目前都在预览中。
在项目中创建一个名为 Utils
的文件夹,并在其中添加一个名为 ConsoleHelper
的类。ConsoleHelper
类旨在简化控制台应用程序中的常见操作,同时利用 Spectre.Console
提供的强大样式和交互功能。您可以在我的 GitHub 仓库 中找到该类的完整代码。
接下来,我们将在 Utils
文件夹中创建一个名为 Statics
的类。此类将作为集中存储静态值的容器,例如主机URL和OpenAI模型名称等。您还可以在我的 GitHub 仓库 中找到该类的完整代码。
现在我们已经创建了帮助类,是时候把所有东西整合在一起了。打开 Program.cs
文件,开始构建聊天应用的核心逻辑。在这里面,我们将整合 ConsoleHelper
和 Statics
类的功能,以创建一个互动且动态的嵌入生成过程。
IEmbeddingGenerator<string, Embedding<float>>? embeddingGenerator
= null;
// 选择嵌入生成器主机
string embeddingGeneratorHost =
ConsoleHelper.SelectFromOptions(
[Statics.OllamaKey, Statics.OpenAiKey,
Statics.AzureOpenAiKey]);
switch (embeddingGeneratorHost)
{
// 使用 OLLAMA
case Statics.OllamaKey:
// 获取 OLLAMA 模型名称
string ollamaModelName =
ConsoleHelper.GetString("请输入您的 OLLAMA 模型名称:");
// 创建 OLLAMA 嵌入客户端
embeddingGenerator = new OllamaEmbeddingGenerator(
new Uri("http://localhost:11434/"), ollamaModelName);
break;
// 使用 OpenAI
case Statics.OpenAiKey:
// 获取 OpenAI API 密钥
string openAiKey =
ConsoleHelper.GetString("请输入您的 OpenAI API 密钥:");
// 获取 OpenAI 模型名称
string openAiModel =
ConsoleHelper.SelectFromOptions(
[Statics.TextEmbedding3SmallModelName,
Statics.TextEmbedding3LargeModelName,
Statics.TextEmbeddingAdaModelName]);
// 创建 OpenAI 嵌入客户端
embeddingGenerator = new OpenAIClient(
openAiKey)
.AsEmbeddingGenerator(openAiModel);
break;
// 使用 Azure OpenAI
case Statics.AzureOpenAiKey:
// 获取 Azure OpenAI 端点
string azureOpenAiEndpoint =
ConsoleHelper.GetString("请输入您的 Azure OpenAI 端点:");
// 获取 Azure OpenAI API 密钥
string azureOpenAiKey =
ConsoleHelper.GetString("请输入您的 Azure OpenAI API 密钥:");
// 获取 Azure OpenAI 模型名称
string azureOpenAiModel =
ConsoleHelper.GetString("请输入您的 Azure OpenAI 嵌入模型名称:");
// 创建 Azure OpenAI 嵌入客户端
embeddingGenerator = new AzureOpenAIClient(
new Uri(azureOpenAiEndpoint),
new ApiKeyCredential(azureOpenAiKey))
.AsEmbeddingGenerator(azureOpenAiModel);
break;
}
// 检查嵌入生成器客户端是否有效
if (embeddingGenerator is null)
{
ConsoleHelper.DisplayError("无效的嵌入生成器主机选择。");
return;
}
// 显示标题
ConsoleHelper.ShowHeader();
// 无限循环开始
while (true)
{
// 获取用户消息
string embeddingInput =
ConsoleHelper.GetString("创建嵌入表示:", false);
Console.WriteLine();
Console.WriteLine("嵌入:");
GeneratedEmbeddings<Embedding<float>> embedding =
await embeddingGenerator.GenerateAsync(new string[] {embeddingInput});
Console.WriteLine(string.Join(", ", embedding[0].Vector.ToArray()));
Console.WriteLine();
Console.WriteLine();
}
第一步是初始化一个嵌入生成器模型,它将充当我们的嵌入客户端,并可以配置为使用不同的提供商服务。
接下来的步骤是选择嵌入服务提供商。应用程序会提供一个选项菜单——Ollama、OpenAI 或 Azure OpenAI。根据用户的选定,应用程序将根据选定进行相应配置。
生成器设置完成后,应用程序会持续循环运行,处理用户的输入信息。对于每一个输入的字符串,使用配置的生成器生成嵌入,并将生成的结果向量显示出来。
这种简单灵活的方法让用户在一个控制台应用程序中与多个服务提供商进行交互。
一旦你为输入数据生成了嵌入向量,下一步就是将它们应用于实际应用中使用它们。一个常见的用例是将嵌入向量存储在数据库中,例如像 Azure Cosmos DB 这样的向量数据库。这使你能够高效地对大量文档集合进行相似性搜索。例如,通过为多个文本文档的嵌入建立索引,你可以根据查询快速检索出最相关的文档,从而实现强大的语义搜索功能。无论你是构建推荐引擎、上下文聊天机器人,还是高级搜索功能,嵌入都为理解和比较数据提供了快速且有意义的基础。
我们来看看这个应用程序的实际表现你需要先选择你的主机(host)。
根据您的选择,您需要提供更多的信息。
完成后,你就可以开始生成嵌入了。
结论部分这段代码演示了如何将 Microsoft.Extensions.AI 整合到 .NET 控制台应用程序中,使用各种提供程序生成嵌入。通过将 API 交互的复杂性抽象为可重用的嵌入客户端,开发人员可以在项目中轻松地试验嵌入。无论是构建搜索引擎、推荐系统还是对话式 AI,这种设置都是一个很好的起点。
我的 GitHub 仓库里有这篇博客中的源代码,你可以进一步扩展它。这样你可以在 my GitHub repository 中找到并进行修改。
共同学习,写下你的评论
评论加载中...
作者其他优质文章