AutoGen多角色、多用户、多智能体对话系统

news2025/3/16 3:15:48

2023-03-11-AutoGen

使用【autoGen+chainlit+deepSeek】实现【多角色、多用户、多智能体对话系统】


1-核心思路

  • 01)技术要点:autoGen+chainlit+deepSeek
  • 02)什么是autoGen->autogen是微软旗下的多智能体的框架
  • 03)什么是chainlit->模型前端展示框架
  • 04)要做什么?->快速实现多角色、多用户、多智能体对话系统
  • 05)什么是RoundRobinGroupChat?->反复调用
  • 06)单智能体-nurses_station_ai ->进行大模型问题咨询
  • 07)智能体与FunctionCall-> 大模型调用FunctionCall
  • 08)多智能体自动选择-> Selector Group Chat
  • 09)为什么设置TextMentionTermination->终止符
  • 10)什么是AutoGen Studio工作流UI->上面都是python代码实现,有没有拖拖拽拽就可以的UI编排
  • 11)最终目标->3分钟复刻Manus智能体!AutoGen+MCP Server+Cline构建最强AI智能体https://www.bilibili.com/video/BV119RHYmEPF

2-参考网址

  • AutoGen入门——快速实现多角色、多用户、多智能体对话系统
  • autogen-Github仓库地址
  • 个人代码实现仓库地址

3-上手实操

1-安装依赖

# 版本说明
- python,3.11
- AutoGen,0.4.2
- chainlit,2.0.2
- 大模型,deepseek

# 安装依赖-autogen
pip install -U "autogen-agentchat" "autogen-ext[openai]"

# 安装依赖-UI交互界面
pip install chainlit

# 运行脚本
chainlit run .\a_01_nurses_station_ai.py -w


2-a_01_nurses_station_ai内容如下

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="sk-6d775065fa8c405caebed674c125e67e",
                                              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)


3-智能体与FunctionCall

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="sk-6d775065fa8c405caebed674c125e67e",
                                              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事件消息不显示给用户
            continue
        if 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)

  • 执行脚本
# 1-因为添加了chainlit认证配置
conda activate AutoGen3_11
chainlit create-secret

# 2-配置JWT-创建.env文件
CHAINLIT_AUTH_SECRET="-Nj%Z@l^x0FQcEKYuNBxJ@mYr~2L>_ua6EU$zSsR6M~Fd.ssav5GFANVyR4%S$Zf"

# 3-执行脚本
chainlit run .\a_02_endodontics_dentistry_ai.py -w
  • 触发大模型的FunctionCall功能

4-如何解决chainlit报错

ValueError: You must provide a JWT secret in the environment to use authentication. Run chainlit create-secret to
generate one.

这个错误信息表明,在使用需要身份验证的功能时,你没有在环境变量中提供 JWT(JSON Web Token)密钥。JWT
是一种用于在网络应用中安全传输信息的开放标准,通常用于身份验证和授权。下面为你详细分析和解决这个问题:

1. 生成 JWT 密钥

依据错误提示,你可以运行 chainlit create-secret 命令来生成一个 JWT 密钥。打开命令行终端,激活你的 Python
虚拟环境(AutoGen3_11),然后执行以下命令:

conda activate AutoGen3_11
chainlit create-secret

执行该命令后,会输出一个随机生成的 JWT 密钥,类似如下:

CHAINLIT_AUTH_SECRET="-Nj%Z@l^x0FQcEKYuNBxJ@mYr~2L>_ua6EU$zSsR6M~Fd.ssav5GFANVyR4%S$Zf"
2. 根目录创建.env文件

将刚才的生成的信息复制进去

CHAINLIT_AUTH_SECRET="-Nj%Z@l^x0FQcEKYuNBxJ@mYr~2L>_ua6EU$zSsR6M~Fd.ssav5GFANVyR4%S$Zf"

5-多智能体自动选择

核心代码:创建多个AssistantAgent放入到SelectorGroupChat供大模型根据上线文进行选择

import chainlit as cl

from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.conditions import MaxMessageTermination, TextMentionTermination
from autogen_agentchat.teams import SelectorGroupChat
from autogen_ext.models.openai import OpenAIChatCompletionClient

model_client = OpenAIChatCompletionClient(model="deepseek-chat", base_url="https://api.deepseek.com",
                                          api_key="sk-6d775065fa8c405caebed674c125e67e",
                                          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_termination

    team = 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 .\a_03_dentistry_selector_ai.py -w

  • 测试问题
什么是烤瓷牙?
什么是根管治疗?

5-AutoGen Studio工作流UI

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

  • 安装命令
# 安装autogenstudio
pip install -U autogenstudio

# 运行脚本-指定一个文件夹进行数据存放
autogenstudio ui --port 8081 --appdir autogenstuido_test

# 程序运行打印
2025-03-12 01:07:58.662 | INFO     | autogenstudio.web.app:lifespan:35 - Application startup complete. Navigate to http://127.0.0.1:8081

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL99 多表查询

内连接&#xff1a; select name, depart_name, city from employee e join department d on e.depart_id d.depart_id join location l on d.locat_id l.locat_id; 外连接 注&#xff1a;本图取自博客园大佬"anliux"的博客&#xff0c;原帖链接&#xff1a;【学…

sql靶场5-6关(报错注入)保姆级教程

目录 sql靶场5-6关&#xff08;报错注入&#xff09;保姆级教程 1.第五关 1.步骤一&#xff08;闭合&#xff09; 2.步骤二&#xff08;列数&#xff09; 3.报错注入深解 4.报错注入格式 5.步骤三&#xff08;数据库表名&#xff09; 6.常用函数 7.步骤四&#xff08;表…

矩阵分析-浅要理解(深度学习方向)

梯度分析与最优化 在深度学习的任务中&#xff0c;我们所期望的是训练一个神经网络&#xff0c;使得预测结果与真实标签之间的误差最小化&#xff0c;这可以近似看作是一个提供梯度下降等优化找到全局最优解的凸优化问题。 奇异值分解 在信息工程领域&#xff0c;对数据处理的…

校园安全用电怎么保障?防触电装置来帮您

引言 随着教育设施的不断升级和校园用电需求的日益增长&#xff0c;校园电力系统的安全性和可靠性成为了学校管理的重要课题。三相智能安全配电装置作为一种电力管理设备&#xff0c;其在校园中的应用不仅能够提高电力系统的安全性&#xff0c;还能有效保障师生的用电安全&am…

第十五届蓝桥杯大学B组(握手问题、小球反弹、好数)

一、握手问题 思路1&#xff1a; 1)先让所有人相互握手 第一个人49次 第二个人48次 第五十个人0次 共计01249 2)减去7个没握手的 016 #include<stdio.h> int main() {int a 50*49/2 - 7*6/2;printf("%d\n",a);return 0; } 运行结果&#xf…

【教学类-43-26】20240312 数独4宫格的所有可能(图片版 576套样式,空1格-空8格,每套65534张*576小图=3千万张小图)

背景需求&#xff1a; 之前做了三宫格所有可能图片 510小图*12套6120图&#xff0c;所以3分钟就生成了 【教学类-43-25】20240311 数独3宫格的所有可能&#xff08;图片版 12套样式&#xff0c;空1格-空8格&#xff0c;每套510张&#xff0c;共6120小图&#xff09;-CSDN博客…

如何手动使用下载并且运行 QwQ-32B-GGUF

首先使用安装 pip install ModelScope 使用 ModelScope 下载对应的模型 modelScope download --model Qwen/QwQ-32B-GGUF qwq-32b-q4_k_m.gguf 第二步开始下载 ollama git clone https://githubfast.com/ggerganov/llama.cpp # githubfast.com 可以加速下载 切换到目录&am…

Spring Boot对接twilio发送邮件信息

要在Spring Boot应用程序中对接Twilio发送邮件信息&#xff0c;您可以使用Twilio的SendGrid API。以下是一个简单的步骤指南&#xff0c;帮助您完成这一过程&#xff1a; 1. 创建Twilio账户并获取API密钥 注册一个Twilio账户&#xff08;如果您还没有的话&#xff09;。在Twi…

约束优化技术:KKT条件的完整推导与应用

前言 本文隶属于专栏《机器学习数学通关指南》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见《机器学习数学通关指南》 ima 知识库 知识库广场搜索&#…

对比文章相似度的余弦相似度算法的原理

近期不是项目遇到对比代码的相似度&#xff0c;来判断代码是否存在抄袭嘛。通过研究采用了余弦相似度来对比。既然接触的一个新的东西&#xff0c;怎么也得研究下吧。 一、什么是余弦相似度 利用余弦相似度对比文章相似度的原理&#xff0c;主要基于向量空间模型&#xff0c;通…

DeepSeek结合Mermaid绘图(流程图、时序图、类图、状态图、甘特图、饼图)转载

思维速览&#xff1a; 本文将详细介绍如何利用DeepSeek结合Mermaid语法绘制各类专业图表&#xff0c;帮助你提高工作效率和文档质量。 ▍DeepSeek入门使用请看&#xff1a;deepseek保姆级入门教程&#xff08;网页端使用 本地客户端部署 使用技巧&#xff09; DeepSeek官网…

玩转云服务器——阿里云操作系统控制台体验测评

在云服务器日益普及的背景下&#xff0c;运维人员对操作系统管理工具的要求不断提高。我们需要一款既能直观展示系统状态&#xff0c;又能智能诊断问题&#xff0c;提供专业指导的控制台。阿里云操作系统管理平台正是基于API、SDK、CLI等多种管理方式&#xff0c;致力于提升操作…

Linux 安装 Oh My Zsh

1. 简介 Zsh&#xff08;Z Shell&#xff09;是一款功能强大的 Shell&#xff0c;相比 Bash 提供了更强的 自动补全、命令高亮、插件支持 等功能。而 Oh My Zsh 是一个 Zsh 的增强管理工具&#xff0c;让你可以轻松安装插件和主题&#xff0c;极大提高开发效率。 本教程将详细…

方差,协方差及协方差矩阵的计算

1.方差 方差是用来衡量一组数据的离散程度&#xff0c;数序表达式如下: σ 2 1 N ∑ i 1 N ( x i − μ ) 2 \sigma^2\frac1N\sum_{i1}^N(x_i-\mu)^2 σ2N1​i1∑N​(xi​−μ)2 σ 2 σ^2 σ2表示样本的总体方差&#xff0c; N N N 表示样本总数&#xff0c; x i x _i xi​…

DeepSeek-R1思路训练多模态大模型-Vision-R1开源及实现方法思路

刚开始琢磨使用DeepSeek-R1风格训练多模态R1模型&#xff0c;就看到这个工作&#xff0c;本文一起看看&#xff0c;供参考。 先提出问题&#xff0c;仅靠 RL 是否足以激励 MLLM 的推理能力&#xff1f; 结论&#xff1a;不能&#xff0c;因为如果 RL 能有效激励推理能力&#…

Unity 创建签名证书、获取签名证书信息,证书指纹

目录 一&#xff1a;创建签名证书 二&#xff1a;自动填写密码 ​编辑 三&#xff1a;获取签名证书的信息 后言 &#x1f451;&#x1f451;&#x1f451; 一&#xff1a;创建签名证书 首先确保Unity是安卓打包&#xff0c;然后按图操作 会打开下图页面 选择你要创建到的…

在AIStudio飞桨星河社区一键部署DeepSeek-r1:70b模型

随着DeepSeek的火热&#xff0c;市面上出现大量的第三方的API服务区&#xff0c;但是对于对安全、隐私、控制有一定需求的用户&#xff0c;还是会希望能够自主部署DeepSeek 。 实践下来&#xff0c;用自己的机器部署是一条解决之道&#xff0c;但是推理起来&#xff0c;cpu和内…

机器学习算法分类及应用场景全解析

在机器学习的学习过程中&#xff0c;具备归类思想至关重要。机器学习涉及众多算法、数据类型及应用场景&#xff0c;归类能让我们清晰梳理知识体系。比如将算法按学习方式分为有监督、无监督等&#xff0c;按任务分类分为分类任务、回归任务和生成任务。通过归类&#xff0c;能…

GNU Nano编辑器中,怎样保存并退出

当出现git commit的提交内容需要修改时&#xff0c;使用git commit --amend进行解决。 但是在修改提交的内容时&#xff0c;弹出了GNU Nano的编辑器 修改完毕后&#xff0c;使用ctrlxd的组合键退出 输入Y后&#xff0c;将退出编辑器&#xff0c;操作完成

个人居家 Web移动端 局域网 远程控制电脑 工具 PC遥控器拿去玩吧

想远程电脑 换个电影&#xff0c;切个歌&#xff0c;随有无线键鼠&#xff0c;但解决不了离屏幕较远 看不清鼠标指针和键入内容。 看似简单的事情&#xff0c;但对周末躺下沙发的码农来说&#xff0c;就再也起不了身了。 远程工具 TeamViewer、向日葵、Autodesk以及开源的RustD…