当前位置: 首页 > news >正文

Microsoft Agent Framework在微信公众号AI辅助撰文中的应用

对于一些技术性比较强的文章,我都会使用AI来帮助我生成部分文章内容,并自动推送到微信公众号的草稿箱。简单地说,在写文章这件事情上,我和AI是责任共担的,AI负责生成封面图片,并根据我的要求产生文章内容主体,我则负责审核生成的内容,并根据自己的需要和技术细节进行修改,这不仅能够提高我的撰文效率,而且还可以保证输出优质的文章内容。

目前,这个小工具是以ASP.NET Core Web API托管了AI服务和微信公众号服务,它以容器的形式运行在Azure WebApp上,后端数据库采用了PostgreSQL,代码实现本身使用了Microsoft Semantic Kernel,它的整体架构如下图:

这样的一个小工具基本可以满足我的撰文需求,但是使用一段时间后发现,AI自动生成的文章中的有些内容并不是特别贴合主题,而且还会存在错误的情况,这可能是由于模型本身所感知的外部信息有限,无法提供更为准确的内容输出。此外,有些特殊需求无法通过单一的问答式模型实现,比如:

  • 我想写篇文章,基于已有代码,介绍这套代码的设计思想

  • 我想写篇文章,收集公开文献中针对某种前沿技术的主流观点,并进行总结归纳

  • 我想写篇文章,对现行主流思想给出相对客观的评价

  • (等等)

于是,我决定对这个小工具进行重构,尝试引入Agent的概念,并通过Agent Workflow达到多Agent合作并生成高质量文章的目的。相比Semantic Kernel,Microsoft Agent Framework在多Agent支持方面做得更为完善和易用,所以,决定使用Agent Framework来替换Semantic Kernel的部分功能。

| 重构:引入Agent Framework

在ASP.NET Core Web API中引入Agent Framework是很简单的,只需要引入Microsoft.Agents.AI.Hosting这个NuGet包就可以了。之后,就是对代码的一顿魔改,首先从环境变量读入Azure OpenAI中配置的大语言模型的相关信息:

var aiModel = builder.Configuration[ComposerAzureOpenAiModelConfigKey] ?? throw new ApplicationException("Azure OpenAI Model is not configured.");var aiApiKey = builder.Configuration[ComposerAzureOpenAiApiKeyConfigKey] ?? throw new ApplicationException("Azure OpenAI ApiKey is not configured.");var aiEndpoint = builder.Configuration[ComposerAzureOpenAiEndpointConfigKey] ?? throw new ApplicationException("Azure OpenAI Endpoint is not configured.");

然后,注入OpenAIClient对象:

builder.Services.AddSingleton(_ => new AzureOpenAIClient( new Uri(aiEndpoint), new ApiKeyCredential(aiApiKey)) .GetChatClient(aiModel) .AsIChatClient());

接下来就是注入Agent实例,并通过这个Agent产生一个简单的Agent Workflow:

builder.AddAIAgent("Composer", (sp, key) =>{ var chatClient = sp.GetRequiredService<IChatClient>(); var agent = chatClient.AsAIAgent(new ChatClientAgentOptions { Name = key, Id = "FD61B233-5CFA-4124-AE5B-1561F3530135", ChatOptions = new ChatOptions { Temperature = 0.3f, Instructions = """ 你是一个技术博客写作助手,帮助用户生成文章。请根据用户提供的摘要生成一篇文章。请确保文章内容与摘要相关,并且逻辑清晰。 你可以使用一些常见的写作技巧来增强文章的质量,比如使用比喻、类比等修辞手法,尽量做到文章内容通俗易懂, 请注意,生成的内容应该是原创的,不要抄袭或引用其他人的作品,也不要使用Markdown格式,直接生成文本就可以。 请确保生成的内容符合相关法律法规,不包含任何违法或不当内容。请遵循这些指导原则,帮助用户生成高质量的文章。文章最后 不要提出任何询问用户的问题。 """ } }, services: sp); return agent;}); builder.AddWorkflow("WechatAIComposerWorkflow", (sp, key) =>{ var agent = sp.GetRequiredKeyedService<AIAgent>("Composer"); return AgentWorkflowBuilder.BuildSequential(key, agent);}).AddAsAIAgent("WechatAIComposerAgent");

在使用的时候,可以通过构造器注入,获得由Workflow创建的AI Agent的实例:

public class WechatArticleComposer( // ... [FromKeyedServices("WechatAIComposerAgent")] AIAgent wechatComposerAgent, // ...) : IWechatArticleComposer{ // ...}

最后,直接调用AI Agent的RunAsync方法即可:

var response = await wechatComposerAgent.RunAsync(summary);

经过重构之后,文章生成的整个过程就是基于Agent Framework了,这为接下来引入新的设计做好了准备。

| 思考:新的设计

虽然重构后,技术栈从Semantic Kernel换到了Agent Framework,但是从用户使用的角度,并没有明显变化,也就是仍然无法满足之前我列举出来的几个主要需求。考虑上面的实现不难发现,在应用程序启动的时候,AI Agent和Agent Workflow的创建过程就已经决定了,其实这也就意味着单个AI Agent单兵作战的模式就已经确定了。为什么单兵作战有问题呢?因为从满足需求的角度以及日后方便扩展的角度,我更希望能够让某个AI Agent负责某个方面的任务,最后可以由另一个AI Agent对其它负责各个方面的AI Agent的结论进行总结,完成文章撰写。这样的设计,有两个主要亮点:

  1. 处理特定任务的Agent是可以扩展的,比如我可以让某个Agent具有阅读源代码并总结代码设计的能力,而另一个Agent则可以上网搜索相关设计模式的实践经验

  2. 各个Agent之间的合作方式,也是可以自定义的,比如我可以让“代码阅读Agent”完成代码解读,并让“设计评估Agent”根据已有的成功案例,评估我的代码设计,最后由“总结撰文Agent”根据这两个Agent的结论,总结成一篇文章;我也可以选择不使用“设计评估Agent”,而是由“代码阅读Agent”完成代码解读之后,直接产生文章内容;我还可以面向多个不同的领域收集最前沿的科技信息,然后汇总成文

【Agent工作流:跨领域科技文章撰写】

根据这样的技术需求,可以将设计调整成这个样子(点击图片放大):

基本设计思路是,用户可以自定义AI Agent和Workflow,AI Agent和Workflow的元数据(Metadata)可以通过数据库访问组件进行存储和读取,这里仍然使用PostgreSQL数据库,这部分逻辑使用仓储模式实现。接下来,AgentWorkflowService会使用AI Agent和Workflow的仓储,根据需要从数据库中获取相关元数据,并创建Workflow,最后,将Workflow转化为AI Agent并返回到调用方。

于是,在界面上,用户可以创建具有各种能力的AI Agent,并且通过自定义Workflow,将这些Agents编排在一起,以完成特定的撰文任务。由于Workflow也是可管理的,所以在分配撰文任务的时候,还可以让Agent自己选择合适的Workflow来完成文章撰写。

下面是AgentWorkflowService的部分代码实现,通过这个代码可以看到,这个服务是如何通过AgentMetadata构建AI Agent,并通过这些Agents来创建Workflow的。在这里仅仅创建了一个简单的Sequential Workflow,实际上应该通过WorkflowMetadataRepository读取WorkflowMetadata的信息,然后根据WorkflowMetadata动态创建Workflow,这里就不详细展开介绍了。

public async Task<AIAgent> GetOrCreateWorkflowAgentAsync(CancellationToken cancellationToken = default){ if (_workflowAgent is not null) { logger.LogDebug("Returns the workflow agent from cache."); return _workflowAgent; } logger.LogDebug("Building the workflow agent."); var agentMetadataList = await agentRepository.GetAgentsAsync(cancellationToken); List<AIAgent> agents = []; foreach (var agentMetadata in agentMetadataList) { agents.Add(new ChatClientAgent(chatClient, new ChatClientAgentOptions { Id = $"chat_agent_{agentMetadata.Id}", Name = agentMetadata.Name, Description = agentMetadata.Description, ChatOptions = new ChatOptions { Instructions = agentMetadata.Instructions, Temperature = agentMetadata.Temperature, } })); } logger.LogDebug($"Number of agents from repository: {agents.Count}"); _workflowAgent = AgentWorkflowBuilder.BuildSequential(agents).AsAgent(); return _workflowAgent;}

| 总结

通过Microsoft Agent Framework可以非常方便地搭建Agent工作流,并且AI Agent和工作流的构建是非常灵活的。其实对于现有的设计再向外扩展一下,比如加入插件式的Tools和Skills的支持,就能得到一款看上去像Clawdbot的个人AI助理工具,只不过这个工具会更专注于文章撰写,而且也会相对安全可控。

http://www.jsqmd.com/news/338550/

相关文章:

  • 2026包装盒设计优质服务商推荐榜 - 优质品牌商家
  • .NET开发-PDF处理不重复造轮子!PDFPatcher省去80%代码,聚焦核心业务
  • 揭秘!大数据数据标注背后的神秘力量
  • 基于SSM框架的生鲜食品商城系统(源码+lw+部署文档+讲解等)
  • C# 实现简版 Claude Code | Bash 就是一切(1)
  • 我被Hoisting“坑“过无数次,才搞明白JavaScript这个致命陷阱
  • 基于大数据的老旧小区改造需求评估与分析系统(源码+lw+部署文档+讲解等)
  • 多协议网络库设计
  • MWGA如何帮助7万行Winforms程序快速迁移到WEB前端
  • 2026年惠州企业搬家优质品牌推荐榜:惠州货物搬运搬迁公司、惠州跨市搬家公司、惠州长途搬家公司、惠州附近搬家公司选择指南 - 优质品牌商家
  • 基于大数据的美妆产品网络评价的数据采集与分析(源码+lw+部署文档+讲解等)
  • 高性能计算中的C++优化
  • 基于SSM的一线式酒店管理系统(源码+lw+部署文档+讲解等)
  • C# + Halcon 打造你的可视化机器视觉流程编辑器
  • 基于SSM二手物品交易网站系统(源码+lw+部署文档+讲解等)
  • .NET 10 与智能体时代的架构演进:以 File-Based Apps 为核心的 C# 生态重塑
  • 基于SpringBoot实现的云宠之家管理系统(源码+lw+部署文档+讲解等)
  • 告别抽卡式AI视频,这个开源项目让剧本一键变成片!
  • 2026年旧衣物开花机设备推荐:济南鑫金龙机械,纤维/废布/废棉/化纤块开花机全系供应 - 品牌推荐官
  • 2026年高空安全防护设备推荐:加安和诺垂直/水平生命线系统及装置全解析 - 品牌推荐官
  • 基于SpringCloud的分布式演唱会抢票系统(源码+lw+部署文档+讲解等)
  • 三步快速摸清陌生研究领域,轻松搞定文献调研
  • Qoder 上线首个定制模型,5个月完成“模型-智能体-产品”全形态布局
  • 国产化备份“山河图”
  • MPI 广播一个数组代码示例
  • 一份来自40000+次真机评测的具身智能年度报告!RoboChallenge打破Demo滤镜:最强模型也只有51%成功率
  • Maven踩坑指南:依赖冲突专治不服,范围聚合玩明白!
  • 重庆集训比赛记录
  • 2026年老旧电梯维保优质厂家推荐榜:济南电梯保养、济南电梯改造、济南电梯更新、济南电梯维修、电梯保养、电梯更新选择指南 - 优质品牌商家
  • Servlet入门保姆级教程:从0到1搞定Tomcat与Web开发