• Semantic Kernel dotnet 1.0 beta6 发布了!
  • 发布于 2个月前
  • 162 热度
    0 评论
最近 Semantic Kernel 1.0的测试版发布比较密集,这个版本带来了一些重要的变化和改进:
将 Azure* 类和方法重命名为 AzureOpenAI*
重命名 Azure* 类和方法的更改,以 AzureOpenAI* 明确它们适用于 OpenAI 模型。

受影响的类:
1.AzureChatCompletion 改为 AzureOpenAIChatCompletion
2.AzureChatCompletionWithData 改为 AzureOpenAIChatCompletionWithData
3.AzureChatCompletionWithDataConfig 改为 AzureOpenAIChatCompletionWithDataConfig
4.AzureImageGenerationResponse 改为 AzureOpenAIImageGenerationResponse
5.AzureImageOperationStatus 改为 AzureOpenAIImageOperationStatus
6.AzureTextEmbeddingGeneration 改为 AzureOpenAITextEmbeddingGeneration
7.AzureTextEmbeddingRequest 改为 AzureOpenAITextEmbeddingRequest
受影响的方法:
1.WithAzureTextEmbeddingGenerationService 改为 WithAzureOpenAITextEmbeddingGenerationService
1.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 消息)以及将来可能的其他类型的提示(例如图像、视频、音频等)。

这个变动带来了优缺点如下:
优点
1.添加新的完成类连接器(音频、视频等)时,无需更改 SemanticFunction 即可支持新提示语法的映射。
2.提示可以通过 Kernel.RunAsync 或 Completion connector 运行
缺点

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


具体涉及的调整如下:
1.XmlPromptParser - public 类,将 XML 格式的提示字符串转换为 PromptNode 的实例集合。
2.PromptNode - public 类,中间提示表示。它将允许连接器作者在其他提示解析器(例如 JsonPromptParser ,将生成相同的 PromptNode 实例)的情况下3.使用相同的提示模型,并避免与 XML 类耦合。

ChatPromptParser - OpenAI 连接器中的内部类,以独特的方式处理 PromptNode(即获取带有 role 和 content 的 message)。


支持 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 插件清单中的身份验证信息,允许在获取插件的规范和对插件的端点进行后续调用时使用该信息。

具体涉及的调整如下:
1.将 ImportAIPluginFunctionsAsync 拆分为两个函数:ImportOpenApiPluginFunctionsAsync 和 ImportOpenAIPluginFunctionsAsync。

2.添加了 OpenAIFunctionExecutionParameters ,它使用 OpenAIAuthenticateRequestAsyncCallback ,并将 OpenAIAuthentication 作为参数。


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

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

Get: 生成的提示

另外
1.添加了缺失的从步骤执行中取消计划的功能。
2.添加了缺失的有关计划和内核中更多处理场景的单元测试。

3.在计划步骤中处理带有钩子的场景上添加了一个集成测试。


示例代码
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");
    // 堆代码 duidaima.com
    // 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 和发布正式版所需的辅助工作,例如文档的完善等。让我们一起静候吧,😄
用户评论