技术速递|通过 .NET Aspire 使用本地 AI 模型

作者:Aaron Powell

排版:Alan Wang

使用本地 AI 模型是无需将资源部署到云中即可在自己的机器上进行实验的好方法。在本文中,我们将探讨如何使用 .NET Aspire 与 Ollama 来本地运行 AI 模型,同时利用 Microsoft.Extensions.AI 抽象在部署时无缝过渡到云托管模型。

在 .NET Aspire 中设置 Ollama

我们需要一种方法在 .NET Aspire 应用程序中使用 Ollama,最简单的方法是使用 .NET Aspire 社区工具包中的 Ollama 托管集成。您可以通过 Visual Studio 工具、VS Code 工具或 .NET CLI 从 NuGet 安装 Ollama 托管集成。接下来,我们来看一下如何通过命令行将 Ollama 托管集成安装到我们的应用程序主机项目中:

csharp 复制代码
dotnet add package CommunityToolkit.Aspire.Hosting.Ollama

安装 Ollama 托管集成后,您可以在 Program.cs 文件中进行配置。以下是配置 Ollama 托管集成的示例:

csharp 复制代码
var ollama =
        builder.AddOllama("ollama")
               .WithDataVolume()
               .WithOpenWebUI();

这里,我们使用了 AddOllama 扩展方法将容器添加到应用程序主机中。由于我们需要下载一些模型,因此我们希望在容器重启时持久化这些模型(这意味着我们每次启动容器时不必重新下载好几 GB 的数据!)。此外,为了提供一个测试环境,我们还添加了 OpenWebUI 容器,它将为我们提供一个用于在应用程序之外与模型交互的网页界面。

运行本地模型

我们在上一步中创建的 Ollama 资源仅运行了 Ollama 服务器,接下来我们还需要向其添加一些模型,可以通过 AddModel 方法完成。让我们使用 Llama 3.2 模型

csharp 复制代码
var chat = ollama.AddModel("chat", "llama3.2");

如果我们想使用模型的某个变体或特定标签,可以在 AddModel 方法中指定,例如 ollama.AddModel("chat", "llama3.2:1b") 用于 Llama 3.2 模型的 1b 标签。或者,如果您需要的模型不在 Ollama 库中,可以使用 AddHuggingFaceModel 方法从 Hugging Face 模型库中添加模型。

现在我们已经有了模型,可以将其作为资源添加到应用程序主机中的其他服务中:

csharp 复制代码
builder.AddProject<Projects.MyApi>("api")
       .WithReference(chat);

当我们运行应用程序主机项目时,Ollama 服务器将启动并下载我们指定的模型(确保在下载完成之前不要停止应用程序主机),然后我们就可以在应用程序中使用该模型。如果您希望依赖该模型的资源等到模型下载完成后再使用,可以使用 WaitFor 方法与模型引用一起使用:

csharp 复制代码
builder.AddProject<Projects.MyApi>("api")
       .WithReference(chat)
       .WaitFor(chat);

在上面的仪表板截图中,我们可以看到模型正在下载。Ollama 服务器正在运行,但处于不健康状态,因为模型尚未下载完成,并且 API 资源尚未启动,因为它正在等待模型下载从而恢复健康状态。

在您的应用程序中使用模型

通过将我们的 API 项目设置来使用聊天模型,我们现在可以使用 OllamaSharp 库连接到 Ollama 服务器并与模型进行交互。为此,我们将使用 .NET Aspire 社区工具包中的 OllamaSharp 集成

csharp 复制代码
dotnet add package CommunityToolkit.Aspire.OllamaSharp

该集成允许我们将 OllamaSharp 客户端注册为 Microsoft.Extensions.AI 包中的 IChatClientIEmbeddingsGenerator 服务。这种抽象机制意味着我们可以将本地 Ollama 服务器切换为云托管选项(例如 Azure OpenAI 服务),而无需更改使用该客户端的代码:

csharp 复制代码
builder.AddOllamaSharpChatClient("chat");

注意:如果您使用的是嵌入模型并想要注册 IEmbeddingsGenerator 服务,可以使用 AddOllamaSharpEmbeddingsGenerator 方法。

为了充分利用 Microsoft.Extensions.AI 管道,我们可以将该服务提供给 ChatClientBuilder

csharp 复制代码
builder.AddKeyedOllamaSharpChatClient("chat");
builder.Services.AddChatClient(b => b
    .UseFunctionInvocation()
    .UseOpenTelemetry(configure: t => t.EnableSensitiveData = true)
    .UseLogging()
    // Use the OllamaSharp client
    .Use(b.Services.GetRequiredKeyedService<IChatClient>("chat")));

最后,我们可以将 IChatClient 注入到路由处理程序中:

csharp 复制代码
app.MapPost("/chat", async (IChatClient chatClient, string question) =>
{
    var response = await chatClient.CompleteAsync(question);
    return response.Message;
});

云托管模型支持

虽然 Ollama 是一个很好的本地开发工具,但在部署应用程序时,您可能更倾向于使用云端 AI 服务,例如 Azure OpenAI 服务。为此,我们需要更新 API 项目,以便在云端运行时注册 IChatClient 服务的不同实现:

csharp 复制代码
if (builder.Environment.IsDevelopment())
{
    builder.AddKeyedOllamaSharpChatClient("chat");
}
else
{
    builder.AddKeyedAzureOpenAIClient("chat");
}
builder.Services.AddChatClient(b => b
    .UseFunctionInvocation()
    .UseOpenTelemetry(configure: t => t.EnableSensitiveData = true)
    .UseLogging()
    // Use the previously registered IChatClient, which is either Ollama or Azure OpenAI
    .Use(b.Services.GetRequiredKeyedService<IChatClient>("chat")));

结论

在本文中,我们展示了如何仅通过几行代码使用 .NET Aspire 设置 Ollama 服务器,指定所需使用的模型,让其自动下载并集成到客户端应用程序中。同时,我们还介绍了如何利用 Microsoft.Extensions.AI 的抽象功能,轻松地在本地模型和云托管模型之间切换。这是一种强大的方式,可以在将 AI 模型部署到云端之前,先在本地机器上进行实验。

查看 eShop 示例应用程序,了解如何将 Ollama 与 .NET Aspire 结合使用的完整示例。

相关推荐
有Li10 分钟前
CLIK-Diffusion:用于牙齿矫正的临床知识感知扩散模型|文献速递-深度学习人工智能医疗图像
人工智能·深度学习·文献·医学生
大唐荣华24 分钟前
视觉语言模型(VLA)分类方法体系
人工智能·分类·机器人·具身智能
即兴小索奇25 分钟前
AI应用商业化加速落地 2025智能体爆发与端侧创新成增长引擎
人工智能·搜索引擎·ai·商业·ai商业洞察·即兴小索奇
NeilNiu38 分钟前
开源AI工具Midscene.js
javascript·人工智能·开源
nju_spy1 小时前
机器学习 - Kaggle项目实践(4)Toxic Comment Classification Challenge 垃圾评论分类问题
人工智能·深度学习·自然语言处理·tf-idf·南京大学·glove词嵌入·双头gru
计算机sci论文精选1 小时前
CVPR 2025 | 具身智能 | HOLODECK:一句话召唤3D世界,智能体的“元宇宙练功房”来了
人工智能·深度学习·机器学习·计算机视觉·机器人·cvpr·具身智能
ezl1fe1 小时前
RAG 每日一技(十八):手写SQL-RAG太累?LangChain的SQL智能体(Agent)前来救驾!
数据库·人工智能·后端
我星期八休息1 小时前
大模型 + 垂直场景:搜索/推荐/营销/客服领域开发新范式与技术实践
大数据·人工智能·python
飞哥数智坊2 小时前
等了这么久,企业微信的AI终于来了!
人工智能
Christo32 小时前
SIGKDD-2023《Complementary Classifier Induced Partial Label Learning》
人工智能·深度学习·机器学习