大家好,我是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入门到精通

作者:爱迪生

出处:https://edisontalk.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

多Agent协作入门:并发编排模式的更多相关文章

  1. 《连载 | 物联网框架ServerSuperIO教程》- 6.并发通讯模式开发及注意事项

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  2. 设计模式:基于线程池的并发Visitor模式

    1.前言 第二篇设计模式的文章我们谈谈Visitor模式. 当然,不是简单的列个的demo,我们以电商网站中的购物车功能为背景,使用线程池实现并发的Visitor模式,并聊聊其中的几个关键点. 一,基 ...

  3. 6. oracle学习入门系列之六 模式

    oracle学习入门系列之六 模式 上篇咱们学习记录了ORACLE数据库中的数据库结构.内存结构和进程等.篇幅 蛤蟆感觉偏多了.这次要休整下,每次笔记不宜太多,不然与书籍有何差别. 我们要保证的是每次 ...

  4. IView入门练习~CDN模式全局加载JS

    关于 iView iView 是一套基于 Vue.js 的开源 UI 组件库,主要服务于 PC 界面的中后台产品. 特性 高质量.功能丰富 友好的 API ,自由灵活地使用空间 细致.漂亮的 UI 事 ...

  5. RabbitMQ入门-消息订阅模式

    消息派发 上篇<RabbitMQ入门-消息派发那些事儿>发布之后,收了不少反馈,其中问的最多的还是有关消息确认以及超时等场景的处理. 楼主,有遇到消费者后台进程不在,但consumer连接 ...

  6. 前端之Android入门(3):MVC模式(上)

    很多Android的入门书籍,在前面介绍完布局后就会逐个介绍组件,然后开始编写组件使用的例子.每每到此时小伙伴们都可能会有些疑问:是否应该先啃完一本<Java编程思想>学点 Java 知识 ...

  7. C# 多线程并发锁模式-总结

    开篇: 互斥还是lock Monitor Mutex 模式! Muex Monitor lock AutoEventSet ManualEventSet 后续的 ReaderWriterLock   ...

  8. thinkphp并发 阻塞模式与非阻塞模式

    结构代码 public function index(){ $fp = fopen("lock.txt", "w+"); if(flock($fp,LOCK_E ...

  9. 微信企业号开发入门(回调模式)java

    最近在开发微信企业号,刚接触时云里雾里的,在摸索过程中终于清晰了一点. 刚开始我以为订阅号.服务号.企业号的接口差不多,就一直用订阅号的教程来入门,后来才发现差的挺多的. 首先,微信企业号不像订阅号和 ...

  10. Mybatis入门案例中设计模式的简单分析

    Talk is cheap, show me the code! public class TestMybatis { public static void main(String[] args) t ...

随机推荐

  1. 使用Python计算万有引力势能

    引言 在物理学中,万有引力是描述物体之间相互吸引的基本力之一.牛顿的万有引力定律告诉我们,任何两个物体之间都存在引力,这个引力与它们的质量和它们之间的距离有关.在这个定律中,万有引力势能是一个非常重要 ...

  2. MySQL 中 EXISTS 和 IN 的区别是什么?

    在 MySQL 中,EXISTS 和 IN 都用于在子查询中进行条件判断,但它们的使用场景和性能有一定区别.以下是 EXISTS 和 IN 的主要区别: 1. 功能和用法 EXISTS: EXISTS ...

  3. Python3_数据类型和变量

    Python3_数据类型和变量 一.数据类型 Python有五个标准的数据类型: Numbers(数字) String(字符串) List(列表) Tuple(元组) Dictionary(字典) 在 ...

  4. CTF实验吧:登陆一下? 不一样的SQL注入

    http://ctf5.shiyanbar.com/web/wonderkun/web/index.html 发现 过滤了很多SQL敏感字符,并且 转码绕过也并不行 发现'和=没有进行过滤 考虑万能密 ...

  5. 聊聊@Autowired与@Resource的区别

    1. 前言 从事过很多家公司,见过很多项目,发现@Autowired和@Resource的使用都是一样的乱, 一个项目中有使用@Autowired的,有使用@Resource的, 甚至有的类中一会儿使 ...

  6. <HarmonyOS第一课03>ArkTS语法介绍

    视频链接: https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101717496870909384?ha_sou ...

  7. 【记录】Linux|服务器一些常用指令

    文章目录 1 查看显卡 2 解决存储空间不足 3 挂载和卸载磁盘 4 安装conda虚拟环境 5 后台运行程序 方法1:使用nohup 方法2:使用screen 6 PyCharm专业版远程连接服务器 ...

  8. 基于Jetson Nano与PyTorch的无人机实时目标跟踪系统搭建指南

    引言:边缘计算赋能智能监控 在AIoT时代,将深度学习模型部署到嵌入式设备已成为行业刚需.本文将手把手指导读者在NVIDIA Jetson Nano(4GB版本)开发板上,构建基于YOLOv5+SOR ...

  9. Map延伸工具类之“根据value值得到map的key值”“根据value值得到map的keys值”

    Map延伸工具类 /** * 集合类型转换 * */ public class CollectionUtil { /** * 根据value值得到map的key值 * @author wzw * * ...

  10. 操作系统:设备I/O -- 如何表示设备类型与设备驱动?

    计算机的结构 计算机结构示意图: 主板上的各种芯片并非独立存在,而是以总线为基础连接在一起的,各自完成自己的工作,又能相互打配合,共同实现用户要求的功能. 如何管理设备 前面的学习中宏,实现了管理内存 ...