专栏名称: dotNET跨平台
专注于.NET Core的技术传播。在这里你可以谈微软.NET,Mono的跨平台开发技术。在这里可以让你的.NET项目有新的思路,不局限于微软的技术栈,横跨Windows,Linux 主流平台
目录
相关文章推荐
半月谈  ·  莫因流感引发意外!谨记“四要点” ·  昨天  
半月谈  ·  美宣布对中国商品加征10%关税 ·  4 天前  
中国能建  ·  新春,就要大“秀”一场! ·  4 天前  
政事儿  ·  假期,浙江多位市委书记到企业生产一线 ·  5 天前  
51好读  ›  专栏  ›  dotNET跨平台

通过 .NET Aspire 使用本地 AI 模型

dotNET跨平台  · 公众号  ·  · 2025-01-08 08:00

正文

M

点击蓝字 / 微软开发者MSDN

关注我们

作者: Aaron Powell

排版:Alan Wang


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


Ollama

https://ollama.com/

在 .NET Aspire 中设置 Ollama

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

dotnet add package CommunityToolkit.Aspire.Hosting.Ollama

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

var ollama =        builder.AddOllama("ollama")               .WithDataVolume()               .WithOpenWebUI();

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


Ollama 托管集成

https://learn.microsoft.com/dotnet/aspire/community-toolkit/ollama

运行本地模型

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

var chat = ollama.AddModel("chat", "llama3.2");

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


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

builder.AddProject("api")       .WithReference(chat);

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

builder.AddProject("api")       .WithReference(chat)       .WaitFor(chat);

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


Llama 3.2 模型

https://ollama.com/library/llama3.2

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

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

dotnet add package CommunityToolkit.Aspire.OllamaSharp

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

builder.AddOllamaSharpChatClient("chat");

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


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

builder.AddKeyedOllamaSharpChatClient("chat");builder.Services.AddChatClient(b => b    .UseFunctionInvocation()    .UseOpenTelemetry(configure: t => t.EnableSensitiveData = true)    .UseLogging()    // Use the OllamaSharp client    .Use(b.Services.GetRequiredKeyedService("chat")));

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

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

OllamaSharp

https://github.com/awaescher/OllamaSharp

OllamaSharp 集成

https://www.nuget.org/packages/communityToolkit.Aspire.OllamaSharp

Microsoft.Extensions.AI 包

https://devblogs.microsoft.com/dotnet/introducing-microsoft-extensions-ai-preview/

云托管模型支持

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

if (builder.Environment.IsDevelopment()){    builder.AddKeyedOllamaSharpChatClient("chat");}else{    builder.AddKeyedAzureOpenAIClient("chat"






请到「今天看啥」查看全文