.NET+AI:构建可治理Agent能力模块
现在 Microsoft Agent Framework简称 MAF在 2026 年已经越来越稳定.NET 开发者也因此有了一个很好的机会去做出真正能在企业里用的 AI 智能体Agent。这篇文章会重点介绍怎么用类的方式来开发技能并且说明如何借助大家熟悉的面向对象思路把智能体的功能模块做得结构清楚、容易组合还能被有效管理。一、为什么推荐用“类”来做技能早先 MAF 的版本里大家通常靠写静态文件比如SKILL.md或者直接注册函数来定义技能。这种方式虽然一开始上手快但一旦用在正式项目里问题就慢慢出来了代码和提示词混在一起改一处可能影响很多地方维护起来很麻烦写好的功能很难在别的地方再用也不能通过继承或组合来扩展没办法加权限控制、操作记录或者版本追踪这些企业真正需要的能力。而如果用类来组织技能这些问题就能自然解决。因为每个技能就是一个独立的对象既能封装自己的逻辑又方便测试和复用完全符合 .NET 开发者平时写代码的方式。二、基本的结构怎么搭1. 先写一个通用的基类AgentSkillpublic abstract class AgentSkill { public string Name { get; } public string Description { get; } protected AgentSkill(string name, string description) { Name name; Description description; } public abstract TaskSkillResult ExecuteAsync(SkillContext context); }2. 用SkillContext把运行时需要的信息传进去public class SkillContext { public required IChatClient ChatClient { get; init; } public required Dictionarystring, object Parameters { get; init; } public required ILogger Logger { get; init; } public CancellationToken CancellationToken { get; init; } }3. 执行完以后统一用SkillResult返回结果public record SkillResult(bool Success, string? Message, object? Data null);三、动手做个例子自动对账功能我们拿公司里经常要做的银行流水和账本自动比对来演示怎么实现一个具体的技能public class ReconciliationSkill : AgentSkill { private readonly IFinancialService _financialService; public ReconciliationSkill(IFinancialService financialService) : base(Reconciliation, 自动比对银行流水和账务数据) { _financialService financialService; } public override async TaskSkillResult ExecuteAsync(SkillContext context) { try { var bankStatement context.Parameters[bankStatement] as string; var ledgerEntries context.Parameters[ledgerEntries] as string[]; var discrepancies await _financialService.CompareAsync(bankStatement, ledgerEntries); if (discrepancies.Any()) { return new SkillResult(false, 发现对账不一致, discrepancies); } return new SkillResult(true, 账目核对成功); } catch (Exception ex) { context.Logger.LogError(ex, 对账技能出错); return new SkillResult(false, 系统内部错误); } } }四、怎么把它接进 MAF 框架里MAF 提供了AIContextProvider这个扩展点我们可以用它把所有技能自动注册进去public sealed class SkillsContextProvider : AIContextProvider { private readonly IEnumerableAgentSkill _skills; public SkillsContextProvider(IEnumerableAgentSkill skills) { _skills skills; } public override async Task PopulateContextAsync(AIContext context, CancellationToken cancellationToken default) { foreach (var skill in _skills) { context.Functions.Add( new FunctionDefinition( name: skill.Name, description: skill.Description, parameters: new JsonObject { /* 这里定义参数格式 */ } ) ); } } }然后在程序启动文件Program.cs里加上这两行让系统知道要用这个技能builder.Services.AddSingletonAgentSkill, ReconciliationSkill(); builder.Services.AddSingletonAIContextProvider, SkillsContextProvider();五、这样写更容易加上管理功能因为每个技能都是一个类所以很容易在里面加入企业实际需要的管控能力比如在执行前检查用户有没有权限或者统一记下谁在什么时候调用了什么功能、输入了什么、结果怎么样出问题的时候可以用像 Polly 这样的工具做自动重试或降级处理还可以通过加标签或者放在不同命名空间里来区分技能的版本。六、最后说几句“.NET AI” 不只是把两个技术拼在一起而是让写代码的人能用熟悉的方法去构建智能系统。用类来组织技能就能把以前做软件工程的经验——比如封装、复用、测试、监控——都用到 AI 能力上让这些智能功能不再是看不清、摸不着的黑盒子而是实实在在、能长期维护、能持续改进的企业资产。