财神机器人

番摊机器人,顶尖机器人,数聊机器人,粮草机器人

MAF快速入门(24):整合多个Skill来源 粮草机器人


在基于Microsoft Agent Framework(MAF)构建AI Agent的过程中,单一Skill来源往往难以满

足复杂业务场景的需求。整合多个Skill来源,能够让Agent具备更全面的领域知识与多样化的执行

能力,从而更好地应对各类任务挑战。本文将带您快速掌握如何在MAF中整合多个Skill来源。

一、MAF Agent Skills核心架构回顾

在开始整合操作之前,我们需要先对MAF Agent Skills的核心架构有清晰认知。MAF对Agent

 Skills的处理分为五层:

  1. 协议与内容层:承接agentskills.io标准定义的目录结构与内容规范,采用渐进式披露模式,

  2. 分阶段向Agent暴露Skill信息。

  3. 统一技能模型层:将文件、代码、内存中的Skill收敛为统一的对象抽象,如AgentSkill、

  4. AgentSkillFrontmatter等,为后续处理提供一致的数据格式。

  5. 技能来源层:解决Skill的获取渠道问题,除了常见的文件系统来源(AgentFileSkillsSource),

  6. 还支持内存来源(AgentInMemorySkillsSource)、代码来源(AgentInlineSkill/AgentClassSkill)以及自定义来源。

  7. 组装治理层:通过AgentSkillsProviderBuilder对多个来源的Skill进行聚合、过滤、去重等操作,实现Skill的有效治理。

  8. 运行时注入层:将处理后的Skill转换为AIContext的Instructions和Tools,注入到Agent Runtime中,供Agent在执行任务时调用。

二、常见Skill来源类型及配置方法

(一)文件系统来源(AgentFileSkillsSource)

这是最基础的Skill来源,适用于将以SKILL.md文件形式存储的领域知识加载到Agent中。配置步骤如下:

  1. 创建Skill目录结构:按照agentskills.io标准,在项目中创建Skill目录,每个目录对应一个Skill,

  2. 包含SKILL.md文件以及可选的references、assets、scripts子目录。SKILL.md的YAML Frontmatter

  3. 部分填写Skill的基本信息,如名称、描述等,Markdown Body部分编写详细的领域知识。

  4. 配置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具备更强大的能力,更好地应对复杂多变的业务场景。 


Powered By Z-BlogPHP 1.7.3

财神机器人,顶尖机器人,数聊机器人,粮草机器人