- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
经过前几章的学习我们已经熟悉了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
:给定一段长的对话记录,识别出值得记住的主题我们先定义一个对话用户我们测试的对话数据 。
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 会话总结插件的使用.
示例代码 。
本文源代码 。
最后此篇关于探索SemanticKernel内置插件:深入了解ConversationSummaryPlugin的应用的文章就讲到这里了,如果你想了解更多关于探索SemanticKernel内置插件:深入了解ConversationSummaryPlugin的应用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
接上篇 通过一个示例形象地理解C# async await 非并行异步、并行异步、并行异步的并发量控制 前些天写了两篇关于C# async await异步的博客, 第一篇博客看的人多,点
前言 在 SwiftUI 中,我们可以通过添加不同的交互来使我们的应用程序更具交互性,这些交互可以响应我们的点击,点击和滑动。 今天,我们将回顾SwiftUI基本手势:
今年我一直在想,2022年我想做些什么,做哪方面的改变,这周末在家终于想到了! 2021 轻描淡写 年底就一直想对2021年写一篇总结的,起码不得写个千八百字,可是思来想去不知道怎么写,直到最后都没想
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
在 Eclipse 中使用 Java 进行开发时,它非常方便:您可以像自己一样附加源代码并探索核心 Java 代码。在 Visual Studio 中,我知道只有在调试时才能查看 .net 源代码(我
我正在尝试创建自己的字符串数据类型,谁能告诉我 typedef 和初始化做错了什么。 #include #include typedef char string[10]; int main(){
我期待开发一些东西来分析在服务器上运行的应用程序的 JVM 线程,要求如下: 访问在单独应用程序中运行的所有线程 打印线程栈 了解事件的详细信息 - 记录执行时间和方法详细信息(在特定线程中执行) 我
是否可以探索 Android 内部存储?我需要这个用于调试目的,以帮助我的开发工作。 最佳答案 您可以在模拟器上,或在 Root设备上。只是 adb shell 连接设备,然后从那里导航。 关于and
我有一个使用大量外键的 innoDB 表,但我们只想从中查找一些基本信息。 我做了一些研究,但还是迷路了。 如何判断我的主机是否有 Sphinx已经安装了吗?我没看到作为表格存储的选项方法(即 inn
我有一个创建列表的 GWT 代码(作为结果的网格),我将样式设置为 CSS 类,如 .test tr { height: 26px; } 现在...如果在渲染未完成或网格没有元素时我需要从代码
我需要使用 Javascript 和 HTML 为 Rally 敏捷工具开发一个 View 。我没有处理过在我作为开发人员的新职业中经常使用的网络语言。 我只是在探索他们的 API,但不知道如何探索他
我想了解 Hadoop 而不是一个黑盒子。我想探索 Hadoop 代码本身。我怎样才能不从主干下载 bundle ,我应该从哪里开始?任何帮助都会很有帮助谢谢舒佳特 最佳答案 Hadoop 代码在 S
想象一下这样的情况。您获得了一些遗留代码或获得了一些新框架。您需要尽快调查并了解如何使用此代码。没有机会向以前的开发人员寻求帮助。什么是最佳实践/方法/方式/步骤/工具(首选 .NET Framewo
我注意到我的 git 存储库中的某些 makefile 缺少变量定义的问题,我想搜索所有提交历史以查找我的变量 TESTDIR 在变更集中出现的位置 我该怎么做? 干杯 最佳答案 你可以使用 git
有什么方法可以探索 GO 包吗? 在 java 中,我使用“javap java.lang.String”命令来查看类内部的方法。像这样,有没有命令是他们用 GO 语言写的? 我在谷歌中搜索了相同的内
我注意到 docker 我需要了解容器内发生了什么或其中存在哪些文件。一个示例是从 docker 索引下载图像 - 您不知道图像包含什么,因此无法启动应用程序。 理想的情况是能够通过 ss
近日,华为 分析服务 6.9.0版本发布,正式上线 探索能力 。开发者可自由定义与配置分析模型,支持报告实时预览,数据洞察体验更加灵活与便捷. 新上线的探索能力中,有漏斗分析、事件归因、会话路径分析
我有一个 4 列的 excel 2010 电子表格。 A 列:我销售的产品的 UPC 代码列表。大约300行。 B 列:公式(稍后会详细介绍) C 列:另一个 UPC 代码列表。这些 UPC 代码大约
我有 3 个表格如下: CREATE TABLE USER_STATUS ("UID" varchar2(7), "STAT_ID" varchar2(11)) ; INSERT ALL IN
有什么方法可以探索 java 脚本对象(如 telerik 菜单或任何其他第 3 方对象)的属性和/或功能?我可以通过调试和破坏然后在 watch 中添加对象或在 VS 中使用智能感知来实现。 我使用
我是一名优秀的程序员,十分优秀!