如何:在 Dapr 的 .NET Conversation SDK 中使用 Microsoft 的 AI 扩展

了解如何创建和使用结合 Microsoft AI 扩展的 Dapr

前置条件

安装

要开始使用此 SDK,请从 NuGet 安装 Dapr.AIDapr.AI.Microsoft.Extensions 包:

dotnet add package Dapr.AI
dotnet add package Dapr.AI.Microsoft.Extensions

DaprChatClientIChatClient 接口的基于 Dapr 的实现,该接口由 Microsoft.Extensions.AI.Abstractions 包提供,使用 Dapr 的[对话构建块]({{ ref conversation-overview.md }})。它允许 开发者针对 Microsoft 提供的抽象类型进行开发,同时提供与 Dapr 对话构建块的最大一致性。由于这两种方法都采用 OpenAI 的 API 方式, 预计它们在未来会日益趋同。

关于 Microsoft.Extensions.AI

Dapr.AI.Microsoft.Extensions 包实现了 Microsoft.Extensions.AI 抽象,为 .NET 应用程序中的 AI 服务提供统一的 API。Microsoft.Extensions.AI 旨在为 不同的 AI 提供商和场景提供一致的编程模型。有关 Microsoft.Extensions.AI 的详细信息,请参阅 官方文档

服务注册

可以使用多个扩展方法将 DaprChatClient 注册到依赖注入容器中。首先, 确保注册来自 NuGet 的 Dapr.AI 包中的 DaprConversationClient

services.AddDaprConversationClient();

然后使用您的对话组件名称注册 DaprChatClient

services.AddDaprChatClient("my-conversation-component");

配置选项

您可以通过 DaprChatClientOptions 配置 DaprChatClient,尽管当前实现仅 为组件名称本身提供配置。这预计在未来的版本中会发生变化。

services.AddDaprChatClient("my-conversation-component", options => 
{
   // 在此处配置其他选项
});

您还可以配置服务生命周期(默认为 ServiceLifetime.Scoped):

services.AddDaprChatClient("my-conversation-component", ServiceLifetime.Singleton);

使用

注册后,您可以在您的服务中注入和使用 IChatClient

public class ChatService(IChatClient chatClient)
{
    public async Task<IReadOnlyList<string>> GetResponseAsync(string message)
    {
        var response = await chatClient.GetResponseAsync([
            new ChatMessage(ChatRole.User,
                "Please write me a poem in iambic pentameter about the joys of using Dapr to develop distributed applications with .NET")
            ]);
        
        return response.Messages.Select(msg => msg.Text).ToList();
    }
}

流式对话

DaprChatClient 尚不支持流式响应,使用相应的 GetStreamingResponseAsync 方法将抛出 NotImplemenetedException。一旦 Dapr 运行时 支持此功能,这预计在未来的版本中会发生变化。

工具集成

客户端通过 Microsoft.Extensions.AI 工具集成支持函数调用。注册到对话的 工具将自动可供大语言模型使用。

string GetCurrentWeather() => Random.Shared.NextDouble() > 0.5 ? "It's sunny today!" : "It's raining today!";
var toolChatOptions = new ChatOptions { Tools = [AIFunctionFactory.Create(GetCurrentWeather, "weather")] };
var toolResponse = await chatClient.GetResponseAsync("What's the weather like today?", toolChatOptions);
foreach (var toolResp in toolResponse.Messages)
{
    Console.WriteLine(toolResp);
}

错误处理

DaprChatClient 与 Dapr 的错误处理集成,并在发生问题时抛出适当的异常。

配置和元数据

底层的 Dapr 对话组件可以通过 Dapr 对话构建块配置来配置元数据和参数。 DaprChatClient 在调用对话组件时将遵循这些设置。

最佳实践

  1. 服务生命周期:为 DaprChatClient 注册使用 ServiceLifetime.ScopedServiceLifetime.Singleton,以避免不必要地创建多个实例。

  2. 错误处理:始终将调用包装在适当的 try-catch 块中,以处理 Dapr 特定和常规异常。

  3. 资源管理DaprChatClient 通过其基类正确实现了 IDisposable,因此在使用依赖注入时会自动管理资源。

  4. 配置:正确配置您的 Dapr 对话组件以确保最佳性能和可靠性。

相关链接