在基于Microsoft Agent Framework(MAF)构建AI Agent的过程中,单一Skill来源往往难以满
足复杂业务场景的需求。整合多个Skill来源,能够让Agent具备更全面的领域知识与多样化的执行
能力,从而更好地应对各类任务挑战。本文将带您快速掌握如何在MAF中整合多个Skill来源。
一、MAF Agent Skills核心架构回顾
在开始整合操作之前,我们需要先对MAF Agent Skills的核心架构有清晰认知。MAF对Agent
Skills的处理分为五层:
协议与内容层:承接agentskills.io标准定义的目录结构与内容规范,采用渐进式披露模式,
分阶段向Agent暴露Skill信息。
统一技能模型层:将文件、代码、内存中的Skill收敛为统一的对象抽象,如AgentSkill、
AgentSkillFrontmatter等,为后续处理提供一致的数据格式。
技能来源层:解决Skill的获取渠道问题,除了常见的文件系统来源(AgentFileSkillsSource),
还支持内存来源(AgentInMemorySkillsSource)、代码来源(AgentInlineSkill/AgentClassSkill)以及自定义来源。
组装治理层:通过AgentSkillsProviderBuilder对多个来源的Skill进行聚合、过滤、去重等操作,实现Skill的有效治理。
运行时注入层:将处理后的Skill转换为AIContext的Instructions和Tools,注入到Agent Runtime中,供Agent在执行任务时调用。
二、常见Skill来源类型及配置方法
(一)文件系统来源(AgentFileSkillsSource)
这是最基础的Skill来源,适用于将以SKILL.md文件形式存储的领域知识加载到Agent中。配置步骤如下:
创建Skill目录结构:按照agentskills.io标准,在项目中创建Skill目录,每个目录对应一个Skill,
包含SKILL.md文件以及可选的references、assets、scripts子目录。SKILL.md的YAML Frontmatter
部分填写Skill的基本信息,如名称、描述等,Markdown Body部分编写详细的领域知识。
配置AgentFileSkillsSource:在代码中实例化AgentFileSkillsSource,并指定Skill目录的路径。示例代码如下:
var fileSource = new AgentFileSkillsSource(new DirectoryInfo(@"C:\Path\To\Skill\Directory"));
(二)内存来源(AgentInMemorySkillsSource)
当需要动态添加或临时使用Skill时,内存来源是一个不错的选择。它允许直接在代码中定义Skill信息,无需创建物理文件。示例代码如下:
var inMemorySource = new AgentInMemorySkillsSource();
var skillFrontmatter = new AgentSkillFrontmatter
{
Name = "临时计算技能",
Description = "提供简单的数学计算能力"
};
var skill = new AgentSkill(skillFrontmatter, "这是一个用于临时计算的Skill,支持加减乘除运算。");
inMemorySource.AddSkill(skill);
(三)代码来源(AgentInlineSkill/AgentClassSkill)
代码来源适用于将业务逻辑以代码形式封装为Skill,实现更复杂的功能。
AgentInlineSkill:通过内联代码定义Skill的执行逻辑,适用于简单的功能。示例代码如下:
var inlineSkill = new AgentInlineSkill("代码内联技能", "执行特定的代码逻辑", (context) =>
{
// 在这里编写具体的代码执行逻辑
return Task.FromResult("代码执行结果");
});
var codeSource = new AgentInMemorySkillsSource();
codeSource.AddSkill(inlineSkill);
AgentClassSkill:通过自定义类实现Skill逻辑,适用于复杂的、可复用的功能。首先创建一个继承自AgentSkillBase的类,然后在代码中实例化并添加到技能来源中。
(四)自定义来源
如果以上来源类型都无法满足需求,您可以通过实现AgentSkillsSource接口来创建自定义的Skill来源。该接口定义了获取Skill的方法,您可以根据业务需求从数据库、远程API等渠道获取Skill信息。
三、整合多个Skill来源的具体步骤
(一)实例化各Skill来源
根据业务需求,分别实例化所需的Skill来源,如文件系统来源、内存来源、代码来源等,具体代码可参考上文示例。
(二)使用AgentSkillsProviderBuilder进行组装
AgentSkillsProviderBuilder是MAF提供的用于组装多个Skill来源的工具类,它支持对Skill进行聚合、过滤、去重等操作。示例代码如下:
var builder = new AgentSkillsProviderBuilder();
builder.AddSource(fileSource);
builder.AddSource(inMemorySource);
builder.AddSource(codeSource);
// 可选:添加过滤条件,只加载符合特定条件的Skill
builder.Filter((skill) => skill.Frontmatter.Name.Contains("计算"));
// 可选:开启去重功能,避免重复的Skill被加载
builder.Deduplicate();
var skillsProvider = builder.Build();
(三)将SkillsProvider注入到Agent中
最后,将构建好的AgentSkillsProvider注入到Agent中,使其在运行时能够获取到整合后的Skill信息。示例代码如下:
var agent = new ChatClientAgent(chatClient)
.WithSkillProvider(skillsProvider);
四、整合多个Skill来源的注意事项
(一)Skill命名与标识唯一性
在整合多个来源的Skill时,要确保每个Skill的名称或标识具有唯一性,避免因重名导致Skill被错误覆盖或无法正确识别。可以通过在Skill的Frontmatter中设置唯一的ID字段,并在组装治理层根据该ID进行去重和管理。
(二)Skill版本管理
当Skill需要进行更新或迭代时,要做好版本管理工作。可以在Skill的目录结构或Frontmatter中添加版本信息,在加载Skill时根据版本号选择合适的Skill版本,避免因版本不一致导致Agent执行出错。
(三)权限与安全控制
对于包含敏感信息或执行关键操作的Skill,要进行严格的权限与安全控制。在组装治理层可以添加权限验证逻辑,只有具备相应权限的Agent才能加载和使用这些Skill。同时,对于脚本类型的Skill,要确保其运行在安全的沙箱环境中,防止恶意代码执行。
(四)性能优化
整合多个Skill来源可能会增加Agent启动时的加载时间和运行时的内存消耗。可以通过异步加载Skill、按需加载Skill(根据Agent当前任务需求动态加载相关Skill)等方式进行性能优化,提升Agent的响应速度和运行效率。
通过以上步骤,您就可以在MAF中成功整合多个Skill来源,让您的AI Agent具备更强大的能力,更好地应对复杂多变的业务场景。