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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/5271.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目中使用的是 FastJSON(com.alibaba:fastjson)JSON库

从你的 pom.xml 文件中可以看到&#xff0c;项目明确依赖了以下 JSON 库&#xff1a; FastJSON&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version> </depende…

EAMM: 通过基于音频的情感感知运动模型实现的一次性情感对话人脸合成

EAMM: 通过基于音频的情感感知运动模型实现的一次性情感对话人脸合成 1所有的材料都可以在EAMM: One-Shot Emotional Talking Face via Audio-Based Emotion-Aware Motion Model网站上找到。 摘要 尽管音频驱动的对话人脸生成技术已取得显著进展&#xff0c;但现有方法要么忽…

cuda从零开始手搓PB神经网络

cuda实现PB神经网络 基于上一篇的矩阵点乘&#xff0c;实现了矩阵的加减乘除、函数调用等。并且复用之前元编程里面写的梯度下降、Adam、NAdam优化方法。实现PB神经网络如下&#xff1a; #ifndef __BP_NETWORK_HPP__ #define __BP_NETWORK_HPP__ #include "matrix.hpp&quo…

【Java数据结构】排序

【Java数据结构】排序 一、排序1.1 排序的概念1.2 排序的稳定性1.3 内部排序和外部排序1.3.1 内部排序1.3.2 外部排序 二、插入排序2.1 直接插入排序2.2 希尔排序 三、选择排序3.1 选择排序3.2 堆排序 四、交换排序4.1 冒泡排序4.2 快速排序Hoare法&#xff1a;挖坑法&#xff…

内存 管理

1、如何在LCD上面实现SD卡文件浏览&#xff1f; 需要读取所有文件名到内存&#xff0c;方法是定义一个数组才存储所有文件名。&#xff08;最大文件名的长度和文件个数&#xff09; 2、内存管理是什么&#xff1f; 指软件运行时对MCU内存资源的分配和使用的技术。要实现两个函…

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

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

深度学习python基础(第三节) 函数、列表

本节主要介绍函数、列表的基本语法格式。 函数 与c语言的函数差不多&#xff0c;就是语法基本格式不同。 name "loveyou" length len(name) print("字符串的长度为&#xff1a;%d" % length) # 自定义函数 def countstr(data):count 0for i in da…

STM32 FreeROTS Tickless低功耗模式

低功耗模式简介 FreeRTOS 的 Tickless 模式是一种特殊的运行模式&#xff0c;用于最小化系统的时钟中断频率&#xff0c;以降低功耗。在 Tickless 模式下&#xff0c;系统只在有需要时才会启动时钟中断&#xff0c;而在无任务要运行时则完全进入休眠状态&#xff0c;从而降低功…

65,【5】buuctf web [SUCTF 2019]Upload Labs 2

进入靶场 1,源代码 点击题目时有个就有个admin.php <?php // 引入配置文件 include config.php;class Ad{public $cmd;public $clazz;public $func1;public $func2;public $func3;public $instance;public $arg1;public $arg2;public $arg3;// 构造函数&#xff0c;用于初…

Apache Tomcat文件包含漏洞复现(详细教程)

1.漏洞原理 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;其安装后会默认开启ajp连接器&#xff0c;方便与其他web服务器通过ajp协议进行交互。属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发…

springboot基于安卓的智启教育服务平台app

基于Spring Boot的智启教育服务平台App是一个结合了Spring Boot后端框架与安卓前端技术的综合性教育服务平台。 一、技术背景与架构 1.开发语言&#xff1a;后端采用Java语言开发&#xff0c;充分利用Java的跨平台性、面向对象特性和强大的后端处理能力。前端则使用安卓开发技…

我的创作纪念日,纪念我的第512天

目录 年末 年初 入围 博客 变动 生活 期待 年末 很快&#xff0c;2024年已经过去了&#xff0c;本想在跨年夜的时候营造一点小小的仪式感&#xff0c;结果也因为身体的原因放弃了&#xff0c;浑身感觉疼痛&#xff0c;躺在床上&#xff0c;闭上眼睛&#xff0c;什么也不…

2025/1/21 学习Vue的第四天

睡觉。 --------------------------------------------------------------------------------------------------------------------------------- 11.Object.defineProperty 1.在我们之前学习JS的时候&#xff0c;普通得定义一个对象与属性。 <!DOCTYPE html> <h…

卸载和安装Git小乌龟、git基本命令

卸载 Git 打开控制面板&#xff1a; 按 Win R 打开运行对话框&#xff0c;输入 control 并按回车键。或直接在功能搜索里搜索“控制面板”。在控制面板中&#xff0c;选择“程序”或“程序和功能”。 查找并卸载 Git&#xff1a; 在程序列表中找到“Git”或“Git for Windows…

OSI5GWIFI自组网协议层次对比

目录 5G网络5G与其他协议栈各层映射 5G网络 物理层 (PHY) 是 5G 基站协议架构的最底层&#xff0c;负责将数字数据转换为适合无线传输的信号&#xff0c;并将接收到的无线信号转换为数字数据。实现数据的编码、调制、多天线处理、资源映射等操作。涉及使用新的频段&#xff08…

ThinkPHP 8的多对多关联

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…

可视化-numpy实现线性回归和梯度下降法

代码如下&#xff1a; import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib.patches import Patch# 生成二维输入数据 np.random.seed(0) X1 2 * np.random.rand(100, 1) # 第一个特征 X2 3 * np.random.rand(10…

python_在钉钉群@人员发送消息

python_在钉钉群人员发送消息 1、第一种 企业内部机器人群聊实现人接入指南&#xff0c;适用于群机器人接收消息&#xff0c;处理完一系列的动作之后&#xff0c;将消息返回给发消息的人员&#xff0c;同时该人员。 需要在企微后台新建一个自建应用&#xff0c;在自建应用里…

递归练习六(普通练习11-15)

一、例题 1、有效数独 36. 有效的数独 - 力扣&#xff08;LeetCode&#xff09; 2、填数独 37. 解数独 - 力扣&#xff08;LeetCode&#xff09; 3、单词搜索 79. 单词搜索 - 力扣&#xff08;LeetCode&#xff09; 4、黄金矿工 1219. 黄金矿工 - 力扣&#xff08;LeetCod…

【生产力工具】ChatGPT for Windows桌面版本安装教程

使用桌面版的ChatGPT目前可解决官方轻微降智的问题。 文章目录 准备安装步骤步骤 1: 更改系统区域设置步骤 2: 关闭系统代理&#xff08;如果你正在使用的话&#xff09;步骤 3: 启动EXE文件步骤 4: 完成安装 准备 下载并保存好 ChatGPT桌面版的EXE安装文件。 下载地址1&…