明志唯新

Semantic Kernel dotnet 1.0 beta6 发布

发表于

最近 Semantic Kernel 1.0的测试版发布比较密集,这个版本带来了一些重要的变化和改进:

Azure* 类和方法重命名为 AzureOpenAI*

重命名 Azure* 类和方法的更改,以 AzureOpenAI* 明确它们适用于 OpenAI 模型。

受影响的类:

  • AzureChatCompletion 改为 AzureOpenAIChatCompletion
  • AzureChatCompletionWithData 改为 AzureOpenAIChatCompletionWithData
  • AzureChatCompletionWithDataConfig 改为 AzureOpenAIChatCompletionWithDataConfig
  • AzureImageGenerationResponse 改为 AzureOpenAIImageGenerationResponse
  • AzureImageOperationStatus 改为 AzureOpenAIImageOperationStatus
  • AzureTextEmbeddingGeneration 改为 AzureOpenAITextEmbeddingGeneration
  • AzureTextEmbeddingRequest 改为 AzureOpenAITextEmbeddingRequest

受影响的方法:

  • WithAzureTextEmbeddingGenerationService 改为 WithAzureOpenAITextEmbeddingGenerationService
  • WithAzureChatCompletionService 改为 WithAzureOpenAIChatCompletionService

注意:AzureTextCompletion 类和相关的扩展方法保持不变,因为它们被标记为过时。

MongoDB 记忆存储连接器

MongoDB Atlas 支持高效存储、索引和查询高维向量嵌入 - https://www.mongodb.com/products/platform/atlas-vector-search,现在适用于 .NET 版 Semantic Kernel 的 MongoDB 记忆存储连接器已经加入。它基于 MongoDB .NET 驱动程序构建,通过记忆存储抽象,有助于 MongoDB Atlas 集群连接,以在 Semantic Kernel 上可以执行 Atlas 向量搜索。

Function Call:添加函数作者角色和名称属性

为了实现完整的函数调用场景,解决了一些相关问题。添加了一个名为"function"的作者角色,以便将函数消息添加到聊天历史记录中。函数消息需要一个"name"参数,因此该更新还在聊天消息模型中添加了这个参数。通过这些改动,开发者们可以更方便地使用函数调用功能,并且能够更好地控制和管理聊天历史记录。

Chat Prompts 在 Connector 中的优化

支持复杂提示的更改,这些提示不仅可以包含文本表示中的用户请求,还可以包含 AI 模型的指令(例如 system 消息)、AI 模型应如何响应的示例(例如 assistant 消息)以及将来可能的其他类型的提示(例如图像、视频、音频等)。

这个变动带来了优缺点如下:

优点

  • 添加新的完成类连接器(音频、视频等)时,无需更改 SemanticFunction 即可支持新提示语法的映射。
  • 提示可以通过 Kernel.RunAsyncCompletion connector 运行

缺点

  • 每个新的完成连接器,无论是现有类型还是新类型,都必须实现映射功能

具体涉及的调整如下:

  • XmlPromptParser - public 类,将 XML 格式的提示字符串转换为 PromptNode 的实例集合。
  • PromptNode - public 类,中间提示表示。它将允许连接器作者在其他提示解析器(例如 JsonPromptParser ,将生成相同的 PromptNode 实例)的情况下使用相同的提示模型,并避免与 XML 类耦合。
  • ChatPromptParser - OpenAI 连接器中的内部类,以独特的方式处理 PromptNode(即获取带有 rolecontentmessage)。

支持 Handlebars 提示模板

Handlebars 是一个轻量级的语义化模板。它与 Mustache 模板语法基本兼容,用起来呢比 sk 模板更简洁一点。下面我们通过一个简单示例对比一下:

SK Prompt 模板

Hello AI, my name is {{$name}}. What is the origin of my name?

Handlebars Prompt 模板

Hello AI, my name is {{name}}. What is the origin of my name?

是不是比原来 SK 自带的模板更简洁了?

启用 Open AI 插件的身份验证

之前并不支持 ai-plugin.json 定义的身份验证信息,现在启用 Open AI 插件清单中的身份验证信息,允许在获取插件的规范和对插件的端点进行后续调用时使用该信息。

具体涉及的调整如下:

  • ImportAIPluginFunctionsAsync 拆分为两个函数:ImportOpenApiPluginFunctionsAsyncImportOpenAIPluginFunctionsAsync
  • 添加了 OpenAIFunctionExecutionParameters ,它使用 OpenAIAuthenticateRequestAsyncCallback ,并将 OpenAIAuthentication 作为参数。

IKernel 函数钩子第二阶段

之前 Kernel 调用和被调用的处理程序不会将提示信息暴露给处理程序,现在增加了一种向处理程序公开提示的方法。

  • Pre-Execution / Invoking(预执行/调用)
  • Get:调用 LLM 前当前 SemanticFunction.TemplateEngine 生成的提示
  • Set: 在将提示内容发送到 LLM 之前修改提示内容
  • Post-Execution / Invoked(执行后调用)
  • Get: 生成的提示

另外

  • 添加了缺失的从步骤执行中取消计划的功能。
  • 添加了缺失的有关计划和内核中更多处理场景的单元测试。
  • 在计划步骤中处理带有钩子的场景上添加了一个集成测试。

示例代码:

const string FunctionPrompt = "Write a random paragraph about: {{$input}}.";

var excuseFunction = kernel.CreateSemanticFunction(...);

void MyPreHandler(object? sender, FunctionInvokingEventArgs e)
{
    Console.WriteLine($"{e.FunctionView.PluginName}.{e.FunctionView.Name} : Pre Execution Handler - Triggered");

    // Will be false for non semantic functions
    if (e.TryGetRenderedPrompt(out var prompt))
    {
        Console.WriteLine("Rendered Prompt:");
        Console.WriteLine(prompt);

        // Update the prompt if needed
        e.TryUpdateRenderedPrompt("Write a random paragraph about: Overriding a prompt");
    }
}

void MyPostHandler(object? sender, FunctionInvokedEventArgs e)
{
    Console.WriteLine($"{e.FunctionView.PluginName}.{e.FunctionView.Name} : Post Execution Handler - Triggered");
    // Will be false for non semantic functions
    if (e.TryGetRenderedPrompt(out var prompt))
    {
        Console.WriteLine("Used Prompt:");
        Console.WriteLine(prompt);
    }
}

kernel.FunctionInvoking += MyPreHandler;
kernel.FunctionInvoked += MyPostHandler;

const string Input = "I missed the F1 final race";
var result = await kernel.RunAsync(Input, excuseFunction);
Console.WriteLine($"Function Result: {result.GetValue<string>()}");

运行后的预期输出为:

MyPlugin.MyFunction : Pre Execution Handler - Triggered
Rendered Prompt:
Write a random paragraph about: I missed the F1 final race.

MyPlugin.MyFunction : Post Execution Handler - Triggered
Used Prompt:
Write a random paragraph about: Overriding a prompt

FunctionResut: <LLM Completion>

这将可以解决一些目前在开发/运行过程中的调试、监测、统计之类的相关问题。

其他变更

  • 删除了所有已弃用的示例
  • 修复 postgres 记忆存储处置的 bug
  • 增加了将提示语法映射到完成服务模型的 ADR
  • Microsoft.Data.Sqlite 从 7.0.12 升级到 7.0.13
  • Microsoft.ML.Tokenizers 从 0.21.0-preview.23266.6 升级到 0.21.0-preview.23511.1
  • Microsoft.Azure.Kusto.Data 从 11.3.4 升级到 11.3.5
  • Polly 从 8.0.0 升级到 8.1.0
  • xunit 从 2.5.3 升级到 2.6.1
  • YamlDotNet 从 13.1.1 升级到 13.7.1

1.0.0 RC1 临近

从官方库的里程碑表中看 1.0.0 RC1 相关工作基本差不多了,预计很困将发布 1.0.0 的这个侯选版本。按照微软的工程惯例,RC 版将会锁定功能,集中修复一些 bug 和发布正式版所需的辅助工作,例如文档的完善等。让我们一起静候吧