探究Semantic Kernel内置插件:深化了解ConversationSummaryPlugin的使用
前语
经过前几章的学习咱们现已了解了Semantic Kernel
插件的概念,以及依据Prompts
结构的Semantic Plugins
和依据本地办法构建的Native Plugins
。本章咱们来解说一下在Semantic Kernel
中内置的一些插件,让咱们防止重复造轮子。
内置插件
Semantic Kernel
有非常多的预界说插件,作为处理通用事务的相关才能。Plugins 地址
这里边每一个类库都是一组相关功用的插件SDK
,其间Plugins.Core
里边供给的使咱们高频运用的插件调集。
Plugins.Core
能够看到Plugins.Core
内有以下几个插件:
ConversationSummaryPlugin
: 对话总结插件FileIOPlugin
: 读写文件插件HttpPlugin
:Http
恳求功用的插件MathPlugin
:Math
核算插件TextPlugin
:字符串操作插件TimePlugin
:获取当时时刻和日期插件WaitPlugin
:WaitPlugin
供给了一组函数,在进行其他操作之前等候。
实战
咱们来对Semantic Kernel
中供给的内置插件来做一个实战操练
第一步需求装置Nuget
包
NuGet\Install-Package Microsoft.SemanticKernel.Plugins.Core -Version 1.14.1-alpha
该包现在只要预览版别,假如用 VS 的包办理器装置,那需求勾选包含预览发行版
ConversationSummaryPlugin
这是一个对话总结插件,以提示词结构的Semantic Plugins
,插件内界说了三个Kernel Function
分别是:
SummarizeConversation
:给定一段长的对话记载,总结说话内容GetConversationActionItems
:给定一段长的对话记载,辨认出其间的举动项。GetConversationTopics
:给定一段长的对话记载,辨认出值得记住的主题
SummarizeConversation
咱们先界说一个对话用户咱们测验的对话数据
string chatTranscript = @"
A: 你好,最近作业很繁忙,咱们需求组织下周的会议时刻,你觉得周几比较适宜?
B: 嗯,我了解,作业的确很忙。周三或周四应该比较适宜,由于那时候咱们的日程相对闲暇一些。
A: 好的,周三或周四都能够,咱们再承认一下其他搭档的时刻表。
B: 对,最好再和咱们核实一下,以免呈现时刻抵触。
A: 我今日会发邮件问询咱们的定见,然后咱们再做终究决议。
B: 好的,我也会在群里提示咱们留心邮件。
A: 咱们好,关于下周的会议组织,我主张定在周四下午两点,在会议室A举办,咱们觉得怎么样?
C: 周四下午两点能够,我在日历上现已标示了。
D: 对不住,周四下午我有其他组织,能否改到周三下午呢?
A: 好的,咱们尽量照料咱们的时刻,那就改到周三下午两点吧,地址仍然是会议室A。
B: 没问题,我会告诉其他搭档,让咱们知道时刻的变化。
";
Kernel
注册插件:
var conversationSummaryPlugin = kernel.ImportPluginFromType<ConversationSummaryPlugin>();
总结会话内容
Console.WriteLine("SamplePlugins - Conversation Summary Plugin - Summarize");
{
FunctionResult summary = await kernel.InvokeAsync(
conversationSummaryPlugin["SummarizeConversation"], new() { ["input"] = chatTranscript });
Console.WriteLine($"Generated Summary:{summary.ToString()}");
}
OutPut:
Generated Summary:In the conversation, A and B discuss scheduling a meeting for the following week, considering Wednesday or Thursday as potential dates due to lighter schedules. A decides to send an email to confirm the availability of all colleagues. Later, A proposes holding the meeting on Thursday at 2 PM in Conference Room A, but D requests a change due to a scheduling conflict. A agrees to reschedule the meeting to Wednesday at 2 PM in the same room, and B confirms that they will inform the rest of the team about the change.
Semantic Kernel
的这个插件我用了GPT-4o
和Kimi
都回复的是英文,我感觉这个内置的这个Semantic Kernel
插件仍是不行完善。
咱们能够看一下SummarizeConversation
办法的Prompts
界说
BEGIN CONTENT TO SUMMARIZE:
{{$INPUT}}
END CONTENT TO SUMMARIZE.
Summarize the conversation in 'CONTENT TO SUMMARIZE', identifying main points of discussion and any conclusions that were reached.
Do not incorporate other general knowledge.
Summary is in plain text, in complete sentences, with no markup or tags.
BEGIN SUMMARY:
扼要了解一下这个提示词:
-
开端符号:
BEGIN CONTENT TO SUMMARIZE
: 这个符号明晰地指示了摘要内容的开端。 -
输入占位符:
{{$INPUT}}
这是一个占位符,用于刺进需求被摘要的对话或文本内容。 -
完毕符号:
END CONTENT TO SUMMARIZE
. 这个符号相同明晰地指示了摘要内容的完毕。 -
摘要辅导:供给了对摘要的具体要求,包含辨认对话的首要讨观点和定论,而且着重不要包含外部的一般常识。
-
格局要求:指出摘要应该是纯文本,用完好的语句表达,不包含任何符号或标签。
-
摘要开端符号:
BEGIN SUMMARY
: 这个符号指示了摘要部分的开端。
针对上述咱们发现的问题:会话摘要全部是中文的问题
我觉得能够进行提示词的优化
优化的第一点内容是:总结应挑选最切合内容的言语
即in the language that best fits the content.
。
@"BEGIN CONTENT TO SUMMARIZE:
{{$INPUT}}
END CONTENT TO SUMMARIZE.
Please summarize the conversation, highlighting the main points and any conclusions reached, in the language that best fits the content. Do not incorporate any external general knowledge. The summary should be in plain text, in complete sentences, without any markup or tags.
BEGIN SUMMARY:
咱们自界说一个插件测验一下,创立一个CustomConversationSummaryPlugin
的插件,这个和原生SummarizeConversation
插件只要Prompts
有差异
private const int MaxTokens = 1024;
private readonly KernelFunction _summarizeConversationFunction;
public CustomConversationSummaryPlugin()
{
PromptExecutionSettings settings = new()
{
ExtensionData = new Dictionary<string, object>()
{
{ "Temperature", 0.1 },
{ "TopP", 0.5 },
{ "MaxTokens", MaxTokens }
}
};
this._summarizeConversationFunction = KernelFunctionFactory.CreateFromPrompt(
CustomConversationSummaryPlugin.SummarizeConversationDefinition,
description: "Given a section of a conversation transcript, summarize the part of the conversation.",
executionSettings: settings);
}
/// <summary>
/// Given a long conversation transcript, summarize the conversation.
/// </summary>
/// <param name="input">A long conversation transcript.</param>
/// <param name="kernel">The <see cref="Kernel"/> containing services, plugins, and other state for use throughout the operation.</param>
[KernelFunction, Description("Given a long conversation transcript, summarize the conversation.")]
public Task<string> SummarizeConversationAsync(
[Description("A long conversation transcript.")] string input,
Kernel kernel) =>
ProcessAsync(this._summarizeConversationFunction, input, kernel);
private static async Task<string> ProcessAsync(KernelFunction func, string input, Kernel kernel)
{
List<string> lines = TextChunker.SplitPlainTextLines(input, MaxTokens);
List<string> paragraphs = TextChunker.SplitPlainTextParagraphs(lines, MaxTokens);
string[] results = new string[paragraphs.Count];
for (int i = 0; i < results.Length; i++)
{
// The first parameter is the input text.
results[i] = (await func.InvokeAsync(kernel, new() { ["input"] = paragraphs[i] }).ConfigureAwait(false))
.GetValue<string>() ?? string.Empty;
}
return string.Join("\n", results);
}
Kernel
目标注册自界说插件
var customCustomConversationSummaryPlugin = kernel.ImportPluginFromType<CustomConversationSummaryPlugin>();
新跑一边测验一下:
Generated Summary:在这段对话中,A和B评论了组织下周会议的时刻。B主张周三或周四比较适宜,由于那时咱们的日程相对闲暇。A决议经过邮件问询其他搭档的定见,然后做出终究决议 。在邮件中,A提议将会议组织在周四下午两点,地址是会议室A。但是,D表明周四下午有其他组织,恳求将会议改到周三下午。A赞同了D的恳求,将会议时刻调整为周三下午两点,地址仍然是会议室A。B表明会告诉其他搭档关于时刻变化的状况。
能够看到满意咱们的需求了,依据咱们输入生成的摘要信息没有问题了。
这个插件关于咱们的谈天会话也是非常有用,对话历史记载跟着不断谈天,音讯越来越多,那每次对话耗费的 token 也是不断添加,此刻 ConversationSummaryPlugin 插件的就能够协助咱们对谈天记载进行摘要总结,进步谈天功率。
提取会话举动项
辨认对话记载中的动作项(action items
)是一种重要的交流技巧,它有助于进步功率、保证使命的完结和促进团队协作。
运用场景包含:
- 会议记载:在会议完毕后,快速生成包含一切动作项的摘要,便于团队成员履行和盯梢。
- 项目办理:在项目评论中,辨认和记载要害的里程碑和使命,保证项目准时发展。
- 客户服务:在客户交流中,记载客户的恳求和需求采纳的举动,以供给更好的服务和支撑。
- 团队协作东西:集成到团队协作平台中,协助团队成员同享和协调使命。
- 个人生产力:个人运用该插件来办理自己的使命和待办事项,进步个人功率。
- 法令和合规性:在需求保证对话内容契合特定法规或规范的状况下,辨认必要的举动以保证合规。
要完结这个需求用到ConversationSummaryPlugin
插件的GetConversationActionItems
办法
Console.WriteLine("======== SamplePlugins - Conversation Summary Plugin - Action Items ========");
{
FunctionResult summary = await kernel.InvokeAsync(
conversationSummaryPlugin["GetConversationActionItems"], new() { ["input"] = chatTranscript });
Console.WriteLine($"Generated Action Items:{summary.ToString()}");
Console.WriteLine(summary.GetValue<string>());
}
输出:
{
"actionItems": [
{
"owner": "A",
"actionItem": "发邮件问询咱们的定见",
"dueDate": "",
"status": "Open",
"notes": "今日会发"
},
{
"owner": "B",
"actionItem": "在群里提示咱们留心邮件",
"dueDate": "",
"status": "Open",
"notes": ""
},
{
"owner": "B",
"actionItem": "告诉其他搭档时刻的变化",
"dueDate": "",
"status": "Open",
"notes": "让咱们知道时刻的变化"
}
]
}
提取会话的主题
用于对话摘要的东西或插件,它的作用是协助用户快速辨认和总结对话中的首要论题。
运用场景或许包含但不限于:
- 企业内部会议的快速摘要和信息收拾。
- 客户服务对话的剖析,以辨认服务改善点。
- 交际媒体或论坛评论的监控和摘要。
- 教育环境中的讲堂评论摘要。
- 法令咨询或案子评论的记载和检查。
要完结这个功用需求用到ConversationSummaryPlugin
插件的GetConversationTopics
办法
运用:
Console.WriteLine("======== SamplePlugins - Conversation Summary Plugin - Topics ========");
FunctionResult summary = await kernel.InvokeAsync(
conversationSummaryPlugin["GetConversationTopics"], new() { ["input"] = chatTranscript });
Console.WriteLine($"Generated Topics:{summary.ToString()}");
输出:
Generated Topics:
{
"topics": [
"Work busy",
"Schedule meeting",
"Wednesday or Thursday",
"Confirm colleagues' availability",
"Email for opinions",
"Meeting reschedule",
"Thursday 2 PM",
"Change to Wednesday 2 PM",
"Notify colleagues"
]
}
最终
剩余的插件咱们后续章节在解说吧,本章要点解说了ConversationSummaryPlugin
会话总结插件的运用。
示例代码
本文源代码