最近 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.RunAsync
或Completion connector
运行
缺点
- 每个新的完成连接器,无论是现有类型还是新类型,都必须实现映射功能
具体涉及的调整如下:
XmlPromptParser
- public 类,将 XML 格式的提示字符串转换为PromptNode
的实例集合。PromptNode
- public 类,中间提示表示。它将允许连接器作者在其他提示解析器(例如 JsonPromptParser ,将生成相同的PromptNode
实例)的情况下使用相同的提示模型,并避免与 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 插件清单中的身份验证信息,允许在获取插件的规范和对插件的端点进行后续调用时使用该信息。
具体涉及的调整如下:
- 将
ImportAIPluginFunctionsAsync
拆分为两个函数:ImportOpenApiPluginFunctionsAsync
和ImportOpenAIPluginFunctionsAsync
。 - 添加了
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.13Microsoft.ML.Tokenizers
从 0.21.0-preview.23266.6 升级到 0.21.0-preview.23511.1Microsoft.Azure.Kusto.Data
从 11.3.4 升级到 11.3.5Polly
从 8.0.0 升级到 8.1.0xunit
从 2.5.3 升级到 2.6.1YamlDotNet
从 13.1.1 升级到 13.7.1
1.0.0 RC1 临近
从官方库的里程碑表中看 1.0.0 RC1 相关工作基本差不多了,预计很困将发布 1.0.0 的这个侯选版本。按照微软的工程惯例,RC 版将会锁定功能,集中修复一些 bug 和发布正式版所需的辅助工作,例如文档的完善等。让我们一起静候吧