你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
重要
- Foundry Local 以预览版形式提供。 通过公共预览版,可以提前访问正处于开发状态的功能。
- 正式发布 (GA) 之前,功能、方法和流程可能会发生更改或功能受限。
本机聊天完成 API 允许你与 Foundry Local 的推理功能直接交互,而无需启动 REST Web 服务器。 本机 API 通过减少依赖项和复杂性来简化应用程序体系结构。 本机聊天完成 API 使用与 OpenAI SDK 相同的输入(请求)和输出(响应),以确保与现有应用程序和开发人员熟悉性兼容。
本文介绍如何在 Foundry Local SDK 中使用本地聊天完成 API。
先决条件
- 已安装 .NET 8.0 SDK 或更高版本。
示例存储库
本文中的示例可在 Foundry 本地 C# SDK 示例 GitHub 存储库中找到。
启动项目
按照以下特定于 Windows 或跨平台(macOS/Linux/Windows)的说明,在 C# 项目中使用 Foundry Local:
- 创建新的 C# 项目并导航到它:
dotnet new console -n app-name cd app-name - 打开
app-name.csproj文件并编辑为:<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net9.0-windows10.0.26100</TargetFramework> <RootNamespace>app-name</RootNamespace> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <WindowsAppSDKSelfContained>false</WindowsAppSDKSelfContained> <WindowsPackageType>None</WindowsPackageType> <EnableCoreMrtTooling>false</EnableCoreMrtTooling> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.AI.Foundry.Local.WinML" Version="0.8.2.1" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.10" /> <PackageReference Include="OpenAI" Version="2.5.0" /> </ItemGroup> </Project> - 在项目根目录中创建一个
nuget.config文件,包含以下内容,以确保包正确恢复:<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <clear /> <add key="nuget.org" value="https://api.nuget.org/v3/index.json" /> <add key="ORT" value="https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/ORT/nuget/v3/index.json" /> </packageSources> <packageSourceMapping> <packageSource key="nuget.org"> <package pattern="*" /> </packageSource> <packageSource key="ORT"> <package pattern="*Foundry*" /> </packageSource> </packageSourceMapping> </configuration>
使用原生的聊天完成 API
以下示例演示如何在 Foundry Local 中使用原生聊天完成 API。 该代码包括以下步骤:
使用
FoundryLocalManager初始化Configuration实例。使用别名从模型目录中获取
Model对象。注释
Foundry Local 根据主机的可用硬件自动选择模型的最佳变体。
下载并加载模型变体。
使用本机聊天补全 API 生成响应。
卸载模型。
将以下代码复制并粘贴到名为 Program.cs 的 C# 文件中。
using Microsoft.AI.Foundry.Local;
using Betalgo.Ranul.OpenAI.ObjectModels.RequestModels;
using Microsoft.Extensions.Logging;
CancellationToken ct = new CancellationToken();
var config = new Configuration
{
AppName = "app-name",
LogLevel = Microsoft.AI.Foundry.Local.LogLevel.Debug
};
using var loggerFactory = LoggerFactory.Create(builder =>
{
builder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Debug);
});
var logger = loggerFactory.CreateLogger<Program>();
// Initialize the singleton instance.
await FoundryLocalManager.CreateAsync(config, logger);
var mgr = FoundryLocalManager.Instance;
// Get the model catalog
var catalog = await mgr.GetCatalogAsync();
// List available models
Console.WriteLine("Available models for your hardware:");
var models = await catalog.ListModelsAsync();
foreach (var availableModel in models)
{
foreach (var variant in availableModel.Variants)
{
Console.WriteLine($" - Alias: {variant.Alias} (Id: {string.Join(", ", variant.Id)})");
}
}
// Get a model using an alias
var model = await catalog.GetModelAsync("qwen2.5-0.5b") ?? throw new Exception("Model not found");
// is model cached
Console.WriteLine($"Is model cached: {await model.IsCachedAsync()}");
// print out cached models
var cachedModels = await catalog.GetCachedModelsAsync();
Console.WriteLine("Cached models:");
foreach (var cachedModel in cachedModels)
{
Console.WriteLine($"- {cachedModel.Alias} ({cachedModel.Id})");
}
// Download the model (the method skips download if already cached)
await model.DownloadAsync(progress =>
{
Console.Write($"\rDownloading model: {progress:F2}%");
if (progress >= 100f)
{
Console.WriteLine();
}
});
// Load the model
await model.LoadAsync();
// Get a chat client
var chatClient = await model.GetChatClientAsync();
// Create a chat message
List<ChatMessage> messages = new()
{
new ChatMessage { Role = "user", Content = "Why is the sky blue?" }
};
var streamingResponse = chatClient.CompleteChatStreamingAsync(messages, ct);
await foreach (var chunk in streamingResponse)
{
Console.Write(chunk.Choices[0].Message.Content);
Console.Out.Flush();
}
Console.WriteLine();
// Tidy up - unload the model
await model.UnloadAsync();
使用以下命令运行代码:
对于 x64 Windows,请使用以下命令:
dotnet run -r:win-x64
对于 arm64 Windows,请使用以下命令:
dotnet run -r:win-arm64