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

AutoGen入门——快速实现多角色、多用户、多智能体对话系统

1.前言

autogen
如https://github.com/microsoft/autogen所述,autogen是一多智能体的框架,属于微软旗下的产品。

依靠AutoGen我们可以快速构建出一个多智能体应用,以满足我们各种业务场景。

本文将以几个示例场景,使用AutoGen快速构建出多智能体应用,一起体验下它的具体用法。

2.环境说明

env
用到的工具如下:

  • python,3.11
  • AutoGen,0.4.2
  • chainlit,2.0.2
  • 大模型,deepseek

安装以下依赖

pip install -U “autogen-agentchat” “autogen-ext[openai]”

autogen的版本为0.4.2

用到的UI交互界面为Chainlit,安装chainlit命令为:

pip install chainlit

3.示例一,单智能体

应用场景:挂号导诊台机器人,输入症状描述和需求,输出应该挂号的科室。

代码如下:

import chainlit as cl
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_ext.models.openai import OpenAIChatCompletionClient@cl.on_chat_start
async def main():await cl.Message(content="您好,这里是超级无敌大医院,有什么可以帮您?").send()async def run_team(query: str):model_client = OpenAIChatCompletionClient(model="deepseek-chat", base_url="https://api.deepseek.com",api_key="PEPLACE-YOUR-API-KEY", model_info={"vision": False,"function_calling": False,"json_output": True,"family": "unknown",}, )assistant_agent = AssistantAgent("assistant", model_client=model_client,system_message="你是一所口腔医院的导诊台机器人,负责解答用户的挂号问题,用户描述症状需求,你回答应该挂的科室。""在本医院中有以下科室:牙体牙髓科、口腔修复科、口腔外科、口腔种植科、儿童口腔专科。""如果用户的问题与挂号咨询不符合,回答:“您的描述与症状无关,暂不支持”")team = RoundRobinGroupChat(participants=[assistant_agent], max_turns=1)response_stream = team.run_stream(task=query)async for msg in response_stream:if hasattr(msg, "source") and msg.source != "user" and hasattr(msg, "content"):msg = cl.Message(content=msg.content, author="Agent Team")await msg.send()@cl.on_message
async def main(message: cl.Message):await run_team(message.content)

运行:

chainlit run .\nurses_station_ai.py -w

运行效果:
single-ai

4.示例二,智能体与FunctionCall

示例应用场景:病情初诊机器人,输入症状描述,系统根据症状查询此患者的相关历史资料,如无则建议先进行资料预备,并推送至人工团队进行流程审核

4.1 示例流程

模拟流程图如下:

demo-process

病情初诊机器人Agent根据用户描述的症状和对应的牙位号获取出对应的CT影像信息,如信息不足主动向用户发起询问,或询问用户是否需要发起审批
如信息已具备,则根据CT影像信息进行自动诊断,并将分析出结果展示给用户。

4.2 示例代码与演示

编写python文件:endodontics_dentistry_ai.py。代码如下:

import chainlit as cl
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_ext.models.openai import OpenAIChatCompletionClient@cl.password_auth_callback
def auth_callback(username: str, password: str):if (username, password) == ("admin", "admin"):return cl.User(identifier="admin", metadata={"role": "admin", "provider": "credentials"})elif (username, password) == ("puhaiyang", "123456"):return cl.User(identifier="puhaiyang", metadata={"role": "admin", "provider": "credentials"})else:return None@cl.on_chat_start
async def main():await cl.Message(content="您好,这里是牙体牙髓科,您牙齿哪里不适?").send()async def x_p_search(tooth_position: str) -> str:"""Find information on the web"""app_user = cl.user_session.get("user")print(f"模拟查询{app_user.identifier}{tooth_position}牙片数据")if tooth_position == "46":return "牙根尖处有阴影,疑似感染,需要进一步分析诊断"else:return f"{tooth_position}无影像"async def run_team(query: str):model_client = OpenAIChatCompletionClient(model="deepseek-chat", base_url="https://api.deepseek.com",api_key="PEPLACE-YOUR-API-KEY", model_info={"vision": False,"function_calling": True,"json_output": True,"family": "unknown",}, )assistant_agent = AssistantAgent("assistant", model_client=model_client, tools=[x_p_search],system_message="你是一个牙体牙髓科的病情诊断机器人,负责对用户输入的症状描述分析原因,在分析病因前先询问出用户是具体哪一颗牙齿需要治疗。""在知道了具体的牙位号后,再调用x_p_search工具进行问题回答,传入给x_p_search工具的参数需要自动转为牙位号,如:28""如果用户的问题与病情咨询无关,回答:“您的描述与症状无关,暂不支持”")team = RoundRobinGroupChat(participants=[assistant_agent], max_turns=1)response_stream = team.run_stream(task=query)async for msg in response_stream:if hasattr(msg, "source") and (msg.type == "ToolCallExecutionEvent" or msg.type == "ToolCallRequestEvent"):# functionCall事件消息不显示给用户continueif hasattr(msg, "source") and msg.source != "user" and hasattr(msg, "content"):if msg.content.endswith("无影像"):res = await cl.AskActionMessage(content=f"{msg.content},是否需要帮您申请拍摄此牙的CT影像?",actions=[cl.Action(name="continue", payload={"value": "申请"}, label="✅ 申请牙片"),cl.Action(name="cancel", payload={"value": "取消"}, label="❌ 取消"),],).send()if res and res.get("payload").get("value") == "申请":await cl.Message(content="牙片申请已提交!待审核通过后前往第3影像室进行拍摄。",).send()else:msg = cl.Message(content=msg.content, author="Agent Team")await msg.send()@cl.on_message
async def main(message: cl.Message):await run_team(message.content)

运行:

chainlit run .\endodontics_dentistry_ai.py -w

运行效果
ai-functioncall

4.3 chainlit认证配置

上面的示例代码中使用到了chainlit中的认证(Authentication)功能,并在代码中模拟了两个用户。
当首次访问智能体应用的界面时会弹出登录界面,以让我们先输入登录信息后才能使用此应用。
login

首次运行chainlit需要生成密钥

chainlit create-secret

之后在项目根目录创建 .env 文件,填入前面生成的secret信息,如:

CHAINLIT_AUTH_SECRET="WaElB8_~5Bif=~Yz,-y0d01~J-r$P_hoj3ihfCr_c2qwtv?J@>.7tEF.Tb9CE$*A"

5. 示例三,多智能体自动选择

此功能涉及到的技术点为Selector Group Chat。

示例应用场景:用户同一时间多个不同科室的专家医生咨询问题,每轮向用户解答的医生都是问题相关度最高的科室医生

yes-no

5.1 示例流程

mul-process

如:牙体牙髓科AI、修复科AI、种植牙AI形成一个专家团队,用户向这个专家团队提问,专家团队每次派一个最专业的代表来解答问题。

5.2 示例代码与演示

编写python文件:dentistry_selector_ai.py。代码如下:

import chainlit as clfrom autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.conditions import MaxMessageTermination, TextMentionTermination
from autogen_agentchat.teams import SelectorGroupChat
from autogen_ext.models.openai import OpenAIChatCompletionClientmodel_client = OpenAIChatCompletionClient(model="deepseek-chat", base_url="https://api.deepseek.com",api_key="PEPLACE-YOUR-API-KEY", model_info={"vision": False,"function_calling": True,"json_output": True,"family": "unknown",}, )planning_agent = AssistantAgent("PlanningAgent",description="用于规划的Agent,当一个任务到达时此Agent是第一个参与者",model_client=model_client,system_message="""你是一个任务规划智能体。你的工作是将复杂的任务分解为更小的、可管理的子任务。你的团队成员有3个,分别是:DentalPulpAgent: 牙体牙髓科智能体RestorativeAgent: 牙齿修复科智能体DentalImplantAgent: 牙齿种植科智能体你只计划和委派任务,而不自己执行它们分配任务时,请使用此格式:1. <agent> : <task>当所有智能体把任务完成后,再总结结果以"TERMINATE"结束。                        """)dental_pulp_agent = AssistantAgent("DentalPulpAgent",description="牙体牙髓科智能体",model_client=model_client,system_message="""你是一个口腔医院的牙体牙髓科智能体。你可以解答关于牙体牙髓科中患者提出的问题,你的解答非常专业,且可靠。""")restorative_agent = AssistantAgent("RestorativeAgent",description="牙齿修复科智能体",model_client=model_client,system_message="""你是一个口腔医院的牙齿修复科智能体。你可以解答关于牙齿修复中患者提出的问题,比如牙冠、烤瓷牙、嵌体修复等。你的解答非常专业,且可靠。""")dental_implant_agent = AssistantAgent("DentalImplantAgent",description="牙齿种植科智能体",model_client=model_client,system_message="""你是一个口腔医院的牙齿种植科的智能体。你可以解答关于牙齿种植科中患者提出的问题,你的解答非常专业,且可靠。""")@cl.on_chat_start
async def main():await cl.Message(content="您好,这里是口腔医院专家团队,有什么可以帮您?").send()async def run_team(query: str):text_mention_termination = TextMentionTermination("TERMINATE")max_messages_termination = MaxMessageTermination(max_messages=25)termination = text_mention_termination | max_messages_terminationteam = SelectorGroupChat([planning_agent, dental_pulp_agent, restorative_agent, dental_implant_agent],model_client=model_client,termination_condition=termination,)response_stream = team.run_stream(task=query)async for msg in response_stream:if hasattr(msg, "source") and msg.source != "user" and hasattr(msg, "content"):msg = cl.Message(content=msg.content, author=msg.source)await msg.send()@cl.on_message
async def main(message: cl.Message):await run_team(message.content)

运行:

chainlit run .\dentistry_selector_ai.py -w

分别提出问题:

什么是烤瓷牙?
什么是根管治疗?

selector-ai

从上面运行结果可知,当问到根管治疗相关问题时,会由DentalPulpAgent(牙体牙髓科智能体)来回答问题。
当问到烤瓷牙相关问题时,会由RestorativeAgent(牙齿修复科智能体)来回答问题。

之所以能做到自动切换智能体,其原因为在问题执行前会由任务规划智能体(PlanningAgent)进行预规划,由它根据问题的描述分配到对应的智能体。

6.AutoGen Studio工作流UI

前面几个示例都是用python代码的方式创建智能体,对于用户有一定的编码要求,且流程处理上也不够直观。

比较好的是AutoGen中也提供了与Dify类似UI界面操作的方式,即:AutoGen Studio。

安装时,直接使用如下命令安装:

pip install -U autogenstudio

启动时指定监听端口运行目录,如:

autogenstudio ui --port 8081 --appdir autogenstuido_test

之后访问http://127.0.0.1:8081/,即可进入AutoGen Studio界面
autogen-studio-1

使用时可以看到AutoGen Studio的一些功能上还有experimental标签,且功能支持度目前还不是很多
autogen-studio-diagram

但从支持流程与节点编辑这些功能点来看还是非常棒的,待后续更新后再继续体验

相关文章:

AutoGen入门——快速实现多角色、多用户、多智能体对话系统

1.前言 如https://github.com/microsoft/autogen所述&#xff0c;autogen是一多智能体的框架&#xff0c;属于微软旗下的产品。 依靠AutoGen我们可以快速构建出一个多智能体应用&#xff0c;以满足我们各种业务场景。 本文将以几个示例场景&#xff0c;使用AutoGen快速构建出…...

LeetCode 热题 100_全排列(55_46_中等_C++)(递归(回溯))

LeetCode 热题 100_两数之和&#xff08;55_46&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;递归&#xff08;回溯&#xff09;&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08…...

将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch(1.标准版)

问题 项目里使用了 AzureBlob 存储了用户上传的各种资源文件&#xff0c;近期 AzureBlob 的流量费用增长很快&#xff0c;想通过分析Blob的日志&#xff0c;获取一些可用的信息&#xff0c;所以有了这个需求&#xff1a;将存储账户的日志&#xff08;读写&#xff0c;审计&…...

pthread_exit函数

pthread_exit 是 POSIX 线程库&#xff08;pthread&#xff09;中的一个函数&#xff0c;用于显式地终止调用线程。与 exit 函数不同&#xff0c;pthread_exit 仅影响调用它的线程&#xff0c;而不是整个进程。使用 pthread_exit 可以确保线程在退出时能够正确地释放线程相关的…...

1月21日星期二今日早报简报微语报早读

1月21日星期二&#xff0c;农历腊月廿二&#xff0c;早报#微语早读。 1、多地官宣&#xff1a;2025年可有序、限时或在限定区域燃放烟花爆竹&#xff1b; 2、TikTok恢复在美服务&#xff1b;特朗普提出继续运营TikTok方案&#xff0c;外交部&#xff1a;若涉及收购中国企业应…...

【2024年终总结】我与CSDN的一年

&#x1f449;作者主页&#xff1a;心疼你的一切 &#x1f449;作者简介&#xff1a;大家好,我是心疼你的一切。Unity3D领域新星创作者&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6; &#x1f449;记得点赞 &#x1f44d; 收藏 ⭐爱你们&#xff0c;么么哒 文章目录 …...

openssl 正确生成v3带SAN的证书

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

Golang Gin系列-5:数据模型和数据库

在这篇Gin教程的博客中&#xff0c;我们将探索如何将模型和数据库与Gin框架无缝集成&#xff0c;使你能够构建健壮且可扩展的web应用程序。通过利用流行的库并遵循最佳实践&#xff0c;你将学习如何定义模型、建立数据库连接、执行CRUD操作以及确保基于gin的项目中的数据完整性…...

比简单工厂更好的 - 工厂方法模式(Factory Method Pattern)

工厂方法模式&#xff08;Factory Method Pattern&#xff09; 工厂方法模式&#xff08;Factory Method Pattern&#xff09;工厂方法模式&#xff08;Factory Method Pattern&#xff09;概述工厂方法模式&#xff08;Factory Method Pattern&#xff09;结构图工厂方法模式&…...

分布式搜索引擎02

1. DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1. DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0c…...

阿里云安装mikrotik7配置内网互通

阿里云近期推出了200M不限量机器&#xff0c;对于没有公网接入的中小企业可以借助这个机器对多地分支机构进行内网互通。目前已经有很多机构用这个搞跨云k8s,跨云集群了。 mikrotik作为一个商用的软件&#xff0c;操作性比一些开源的软件好用不少。 本文使用的网段为172.16.1…...

Docker网段和服务器ip冲突导致无法访问网络的解决方法

若宿主机所在网络的网段为172.[17-31].xx.xx&#xff0c;则会与Docker本身内部网络间出现冲突&#xff0c;此时需要重新配置Docker默认地址池 一&#xff1a;查看docker的默认网段 route 二&#xff1a;修改docker的默认网段 etc/docker/daemon.json文件增加修改网段信息 {…...

Kubernetes 集群中安装和配置 Kubernetes Dashboard

前言 上篇成功部署Kubernetes集群后&#xff0c;为了方便管理和监控集群资源&#xff0c;安装Kubernetes Dashboard显得尤为重要。Kubernetes Dashboard 是一个通用的、基于 Web 的 UI&#xff0c;旨在让用户轻松地部署容器化应用到 Kubernetes 集群&#xff0c;并对这些应用进…...

Android开发之Spinner

Android开发之Spinner 1. 概述2. Spinner3. 适配器3.1 ArrayAdapter3.2 SimpleAdapter 1. 概述 Android开发学习笔记。学习下拉框控件Spinner和适配器&#xff08;数组适配器ArrayAdapter、简单适配器SimpleAdapter&#xff09;的使用。 2. Spinner 下拉框控件&#xff0c;用…...

【c++继承篇】--继承之道:在C++的世界中编织血脉与传承

目录 引言 一、定义二、继承定义格式2.1定义格式2.2继承关系和访问限定符2.3继承后子类访问权限 三、基类和派生类赋值转换四、继承的作用域4.1同名变量4.2同名函数 五、派生类的默认成员构造函数5.1**构造函数调用顺序&#xff1a;**5.2**析构函数调用顺序&#xff1a;**5.3调…...

分布式系统通信解决方案:Netty 与 Protobuf 高效应用

分布式系统通信解决方案&#xff1a;Netty 与 Protobuf 高效应用 一、引言 在现代网络编程中&#xff0c;数据的编解码是系统设计的一个核心问题&#xff0c;特别是在高并发和低延迟的应用场景中&#xff0c;如何高效地序列化和传输数据对于系统的性能至关重要。随着分布式系…...

计算机网络 (54)系统安全:防火墙与入侵检测

前言 计算机网络系统安全是确保网络通信和数据不受未经授权访问、泄露、破坏或篡改的关键。防火墙和入侵检测系统&#xff08;IDS&#xff09;是维护网络系统安全的两大核心组件。 一、防火墙 定义与功能 防火墙是一种用来加强网络之间访问控制的特殊网络互联设备&#xff0c;它…...

stack底层实现细节

一、stack 和 queue 在 STL 中 stack 和 queue 已经不算是容器了&#xff0c;而是容器适配器&#xff0c;适配器模式也是常用的模式之一&#xff0c;体现在 stack 和 queue 中就是他们两个的实现不是单独写的&#xff0c;而是复用了前面合适的优秀的STL 容器的代码而实现的具有…...

工业相机 SDK 二次开发-Halcon 插件

本文介绍了 Halcon 连接相机时插件的使用。通过本套插件可连接海康 的工业相机。 一. 环境配置 1. 拷贝动态库 在 用 户 安 装 MVS 目 录 下 按 照 如 下 路 径 Development\ThirdPartyPlatformAdapter 找到目录为 HalconHDevelop 的文 件夹&#xff0c;根据 Halcon 版本找到对…...

map和set的使用(一)详解

文章目录 序列式容器和关联式容器map和set的介绍set构造和迭代器遍历和insertfinderaseswapclearcountlower_bound和upper_boundmultiset和set的对比 set的二个题目题目解析算法原理代码介绍一个找差集的算法同步算法题目解析算法原理代码 map构造遍历initiaizer_list 序列式容…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...