多Agent协作入门:并发编排模式
大家好,我是Edison。
上一篇我们学习了Semantic Kernel中的AgentGroupChat实现群聊的效果,但其实多Agent协作编排还有一些其他的模式。今天就来和你唠唠其他支持的编排模式,每篇介绍一个,持续更新完。
SK支持哪些编排模式?
传统的单Agent系统在处理复杂多面任务的能力方面受到较多限制,因此我们会有多Agent编排协作完成任务的需求。Semantic Kernel支持多种多Agent编排流程模式,每个模式都针对不同的协作方案而设计。这些模式作为框架的一部分提供出来,我们可以自己扩展。
目前,Semantic Kernel支持以下编排模式:

上面所有的编排模式都基于统一的构造和接口来实现,它抽象了Agent通信、协调和结果聚合的复杂性,如下代码所示,只需选择不同的编排模式类即可:
// 只需修改下面的编排模式类型即可
// or ConcurrentOrchestration, GroupChatOrchestration, HandoffOrchestration, MagenticOrchestration, ...
SequentialOrchestration orchestration = new(agentA, agentB)
{
LoggerFactory = this.LoggerFactory
};
InProcessRuntime runtime = new();
// Start the runtime
await runtime.StartAsync();
// Invoke the orchestration and get the result
OrchestrationResult<string> result = await orchestration.InvokeAsync(task, runtime);
string text = await result.GetValueAsync();
await runtime.RunUntilIdleAsync();
因此,我们无需学习新的API或重写Agent逻辑,可以专注于应用程序的编写,真的是很方便!
下面,我们就来看看第一种模式:并发编排。
并发编排模式简介
并发模式使用多个Agent并行处理同一个任务,每个Agent都可以独立处理输入,并收集并聚合结果。此模式比较适合多种观点或解决方案很有价值的场景,比如集思广益、群体推理以及其他投票系统。
下图展示了多个Agent生成同一问题的不同解决方案,并收集其响应以进一步分析或选择:

实现并发编排模式
这里我们来实现一个DEMO,定义两个Agent:Physicst(物理学大佬) 和 Chemist (化学大佬),它们可以对用户提出的同一个问题并行地进行思考并给出自己的解释。
为了简单地实现这个功能,我们创建一个.NET控制台项目,然后安装以下包:
Microsoft.SemanticKernel.Agents.Core
Microsoft.SemanticKernel.Agents.OpenAI (Preview版本)
Microsoft.SemanticKernel.Agents.Orchestration (Preview版本)
Microsoft.SemanticKernel.Agents.Runtime.InProcess (Preview版本)
需要注意的是,由于Semantic Kernel的较多功能目前还处于实验预览阶段,所以建议在该项目的csproj文件中加入以下配置,统一取消警告:
<PropertyGroup>
<NoWarn>$(NoWarn);CA2007;IDE1006;SKEXP0001;SKEXP0110;OPENAI001</NoWarn>
</PropertyGroup>
创建一个appsettings.json配置文件,填入以下关于LLM API的配置,其中API_KEY请输入你自己的:
{
"LLM":
{
"BASE_URL": "https://api.siliconflow.cn",
"API_KEY": "******************************",
"MODEL_ID": "Qwen/Qwen2.5-32B-Instruct"
}
}
这里我们使用SiliconCloud提供的 Qwen2.5-32B-Instruct 模型,你可以通过这个URL注册账号:https://cloud.siliconflow.cn/i/DomqCefW 获取大量免费的Token来进行本次实验。
有了LLM API,我们可以创建一个Kernel供后续使用,这也是老面孔了:
Console.WriteLine("Now loading the configuration...");
var config = new ConfigurationBuilder()
.AddJsonFile($"appsettings.json", optional: false, reloadOnChange: true)
.Build();
Console.WriteLine("Now loading the chat client...");
var chattingApiConfiguration = new OpenAiConfiguration(
config.GetSection("LLM:MODEL_ID").Value,
config.GetSection("LLM:BASE_URL").Value,
config.GetSection("LLM:API_KEY").Value);
var openAiChattingClient = new HttpClient(new OpenAiHttpHandler(chattingApiConfiguration.EndPoint));
var kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(chattingApiConfiguration.ModelId, chattingApiConfiguration.ApiKey, httpClient: openAiChattingClient)
.Build();
接下来,我们就一步一步地来看看核心的代码。
定义两个Agent
这里我们来定义两个Agent:Chemist & Physicst
(1)Chemist
var chemist = new ChatCompletionAgent()
{
Name = "ChemistryExpert",
Instructions = "You're an expert in chemistry, you can answer questions from a chemistry expert perspective.",
Description = "Chemistry expert agent for answering questions in the perspective of a chemist.",
Kernel = kernel
};
(2)Physicst
var physicist = new ChatCompletionAgent()
{
Name = "PhysicsExpert",
Instructions = "You're an expert in physics, you can answer questions from a physics expert perspective.",
Description = "Physics expert agent for answering questions in the perspective of a physicst.",
Kernel = kernel
};
选择编排模式
这里我们选择的是并发编排模式:ConcurrentOrchestration,将需要编排的两个Agent作为参数传递给它:
// Set up the Concurrent Orchestration
var orchestration = new ConcurrentOrchestration(physicist, chemist);
启动运行时
在Semantic Kernel中,需要运行时(Runtime)才能管理Agent的执行,因此这里我们需要在正式开始前使用InProcessRuntime并启动起来。
// Start the Runtime
var runtime = new InProcessRuntime();
await runtime.StartAsync();
调用编排 并 收集结果
准备工作差不多了,现在我们可以开始调用编排了。编排任务时它会将任务广播到所有Agent中,并发运行多个Agent进行任务处理,最后收集每个Agent的处理结果。
这里的案例就是将用户的问题传给多个Agent并发思考并给出自己的回答。
// Start the Chat
Console.WriteLine("----------Agents are Ready. Let's Start Working!----------");
while (true)
{
Console.WriteLine("User> ");
var input = Console.ReadLine();
if (string.IsNullOrWhiteSpace(input))
continue;
input = input.Trim();
if (input.Equals("EXIT", StringComparison.OrdinalIgnoreCase))
{
// Stop the Runtime
await runtime.RunUntilIdleAsync();
break;
}
try
{
// Invoke the Orchestration
var result = await orchestration.InvokeAsync(input, runtime);
// Collect Results from multi Agents
var output = await result.GetValueAsync(TimeSpan.FromSeconds(10 * 2));
var texts = output.Select(text => $"{text}");
for (int i = 0; i < texts.Count(); i++)
{
Console.WriteLine($"# RESULT {i+1}:{Environment.NewLine}");
Console.WriteLine($"{texts.ElementAt(i).Trim()}{Environment.NewLine}");
}
}
catch (HttpOperationException ex)
{
Console.WriteLine($"Exception: {ex.Message}");
}
finally
{
Console.ResetColor();
Console.WriteLine();
}
}
需要注意的是:上面的代码示例中我手动使用了一个for循环将收集到的结果进行显示,期望显示格式为RESULT 1, RESULT 2等。
效果展示
用户输入问题:What is temperature?
NOTE:temperature中文意思为温度

可以看到,Chemist 和 Physicst 两个Agent并行思考并给出了从自己的视角出发的对于温度这个概念的解释。
因此,可以看出并发编排模式非常适合并行分析、独立子任务并集成决策的任务场景。
小结
本文介绍了Agent编排的概念以及Semantic Kernel支持的编排模式,最后通过一个案例介绍了如何实现一个并发编排模式,相信通过这个案例你能够有个感性的认识。
下一篇,我们将学习顺序编排模式,它按定义的顺序讲一个Agent的处理结果传递给下一个Agent,非常适合于工作流、管道、多阶段处理类任务。
示例源码
GitHub: https://github.com/EdisonTalk/MultiAgentOrchestration
参考资料
Microsoft Learn: https://learn.microsoft.com/zh-cn/semantic-kernel/frameworks/agent/agent-orchestration
推荐学习
圣杰:《.NET+AI | Semantic Kernel入门到精通》

多Agent协作入门:并发编排模式的更多相关文章
- 《连载 | 物联网框架ServerSuperIO教程》- 6.并发通讯模式开发及注意事项
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 设计模式:基于线程池的并发Visitor模式
1.前言 第二篇设计模式的文章我们谈谈Visitor模式. 当然,不是简单的列个的demo,我们以电商网站中的购物车功能为背景,使用线程池实现并发的Visitor模式,并聊聊其中的几个关键点. 一,基 ...
- 6. oracle学习入门系列之六 模式
oracle学习入门系列之六 模式 上篇咱们学习记录了ORACLE数据库中的数据库结构.内存结构和进程等.篇幅 蛤蟆感觉偏多了.这次要休整下,每次笔记不宜太多,不然与书籍有何差别. 我们要保证的是每次 ...
- IView入门练习~CDN模式全局加载JS
关于 iView iView 是一套基于 Vue.js 的开源 UI 组件库,主要服务于 PC 界面的中后台产品. 特性 高质量.功能丰富 友好的 API ,自由灵活地使用空间 细致.漂亮的 UI 事 ...
- RabbitMQ入门-消息订阅模式
消息派发 上篇<RabbitMQ入门-消息派发那些事儿>发布之后,收了不少反馈,其中问的最多的还是有关消息确认以及超时等场景的处理. 楼主,有遇到消费者后台进程不在,但consumer连接 ...
- 前端之Android入门(3):MVC模式(上)
很多Android的入门书籍,在前面介绍完布局后就会逐个介绍组件,然后开始编写组件使用的例子.每每到此时小伙伴们都可能会有些疑问:是否应该先啃完一本<Java编程思想>学点 Java 知识 ...
- C# 多线程并发锁模式-总结
开篇: 互斥还是lock Monitor Mutex 模式! Muex Monitor lock AutoEventSet ManualEventSet 后续的 ReaderWriterLock ...
- thinkphp并发 阻塞模式与非阻塞模式
结构代码 public function index(){ $fp = fopen("lock.txt", "w+"); if(flock($fp,LOCK_E ...
- 微信企业号开发入门(回调模式)java
最近在开发微信企业号,刚接触时云里雾里的,在摸索过程中终于清晰了一点. 刚开始我以为订阅号.服务号.企业号的接口差不多,就一直用订阅号的教程来入门,后来才发现差的挺多的. 首先,微信企业号不像订阅号和 ...
- Mybatis入门案例中设计模式的简单分析
Talk is cheap, show me the code! public class TestMybatis { public static void main(String[] args) t ...
随机推荐
- AD 侦查-MSRPC Over SMB
本文通过 Google 翻译 AD Recon – MSRPC Over SMB (135/139/445) 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充. 导航 0 ...
- 通过adb访问SQLite数据库
根据<第一行代码>第二版进入到数据库的文件夹,但是如果照书本直接cd data/data/包名/databases 的话是会报错的,错误信息如下 cd: /data/data/包名 /da ...
- 【经验】Ubuntu18.04切换Python版本及环境,及VScode/pdb调试方法(全)
文章目录 安装Python并切换 创建Python虚拟环境 方案一:virtualenv+virtualenvwrapper 方案二:venv 方案三:Anaconda 方案四:pipenv Pyth ...
- 决策单调性DP
决策单调性DP是一个非常重要的DP类别.在决策点随枚举点增加单调不降时,可以有效地优化复杂度. 一般而言,决策点指的是对于一个 \(f[i]\),它的值需要从另一个值j中转移,而对于所有j,令 \(f ...
- Tomcat启动信息乱码
异常描述:大概看到这个鬼样子-- 打开tomcat解压后文件: conf -> logging.properties 右键,选择以记事本或其他方式打开(只要能修改文件内容的软件都OK) 找到 j ...
- Merge Two Binary Trees——LeetCode进阶路
原题链接https://leetcode.com/problems/merge-two-binary-trees/ 题目描述 Given two binary trees and imagine th ...
- python实现小时划分
1.要实现图表如下图 2.后台的数据结构 说明:将每个小时按10分钟为一个时间间隔,分成6段,00.10.20.30.40.50然后将每个时间段组成如下数据:{'time': '22:30', 's ...
- RBMQ中python案例一:简单模式
一.生产者与消费者模式之 简单模式,原理图 二.生产者产生消息 import json import pika import datetime # 生产者 producer.py def get_me ...
- JSON格式化和压缩成一行
JSON格式化和压缩成一行 摘要:把JSON字符串压缩成一行,即去掉中的空格.回车.换行符.制表符等:格式化JSON, 易于阅读. JSON(JavaScript Object Notation, ...
- ChatterBot人工智能,聊天机器人,无坑指南(安装,使用)(2.使用篇)
上一篇(安装):https://www.cnblogs.com/Ctrl-cCtrl-v/p/13220584.html 基础代码: 1 from chatterbot import ChatBot ...