一、AutoGen介绍

AutoGen 是一个开源编程框架,用于构建 AI 代理并促进多个代理之间的合作以解决问题。AutoGen 旨在提供一个易于使用和灵活的框架,以加速代理型 AI 的开发和研究,就像 PyTorch 之于深度学习。它提供了诸如代理之间可以对话、LLM 和工具使用支持、自主和人机协作工作流以及多代理对话模式等功能。

主要特点

AutoGen使得基于多智能体对话构建下一代LLM应用程序变得非常容易。它简化了复杂LLM工作流的编排、自动化和优化。它最大化了LLM模型的性能并克服了它们的弱点。

它支持复杂工作流的各种对话模式。通过使用可定制和可对话的代理,开发人员可以使用AutoGen构建各种涉及对话自主性、代理数量和代理对话拓扑的对话模式。

它提供了一系列不同复杂度的运行系统。这些系统涵盖了来自不同领域和复杂度的各种应用程序。这展示了AutoGen如何轻松支持各种对话模式。

二、入门

现在AutoGen有两个版本,一个是0.2,是稳定版本,一个是0.4,是正在开发的版本。

本次入门使用的是开发版本。

安装相关包:

pip install "autogen-agentchat==0.4.0.dev13"  
pip install "autogen-ext[openai]==0.4.0.dev13"  

后面运行时,会显示还缺少几个库,按照报错的信息,继续安装所需的包即可。

入门的例子是创建一个AI团队,一个当任务执行者,一个当评判者,当评判者觉得可以了,就停止对话,完成任务。

Python代码如下:

import asyncio  
  
from autogen_agentchat.agents import AssistantAgent  
from autogen_agentchat.base import TaskResult  
from autogen_agentchat.conditions import ExternalTermination, TextMentionTermination  
from autogen_agentchat.teams import RoundRobinGroupChat  
from autogen_agentchat.ui import Console  
from autogen_core import CancellationToken  
from autogen_ext.models.openai import OpenAIChatCompletionClient  
  
async def main():  
  
    # Create an OpenAI model client.  
    model_client = OpenAIChatCompletionClient(  
        model="gpt-4o-2024-08-06",  
        api_key="", # Optional if you have an OPENAI_API_KEY env variable set.  
        )  
  
    # Create the primary agent.  
    primary_agent = AssistantAgent(  
        "primary",  
        model_client=model_client,  
        system_message="You are a helpful AI assistant.",  
    )  
  
    # Create the critic agent.  
    critic_agent = AssistantAgent(  
        "critic",  
        model_client=model_client,  
        system_message="Provide constructive feedback. Respond with 'APPROVE' to when your feedbacks are addressed.",  
    )  
  
    # Define a termination condition that stops the task if the critic approves.  
    text_termination = TextMentionTermination("APPROVE")  
  
  
    team = RoundRobinGroupChat(  
        [primary_agent, critic_agent],  
        termination_condition=text_termination,  # Use the bitwise OR operator to combine conditions.  
    )  
  
    await Console(team.run_stream(task="写一首关于秋天的短诗"))  
  
      
if __name__ == "__main__":  
    asyncio.run(main())  

运行效果:

试用一下国内的模型,改成这样就可以了,如下所示:

model_client1 = OpenAIChatCompletionClient(
        model="Qwen/Qwen2.5-72B-Instruct",
    base_url="https://api.siliconflow.cn/v1",
        api_key="xxxxxxxxxxx", 
    model_info={
    "vision":False,
    "function_calling":True,
    "json_output":False,
    "family":"unknown"
    }
        )
    
model_client2 = OpenAIChatCompletionClient(
        model="deepseek-ai/DeepSeek-V2.5",
    base_url="https://api.siliconflow.cn/v1",
        api_key="xxxxxxxxxxx", 
    model_info={
    "vision":False,
    "function_calling":True,
    "json_output":False,
    "family":"unknown"
    }
        )  

让Qwen/Qwen2.5-72B-Instruct与deepseek-ai/DeepSeek-V2.5协作完成任务。

---------- user ----------  
写一首关于秋天的短诗  
---------- primary ----------  
秋风轻抚过田野,  
黄叶飘零诉离别。  
果实累累挂枝头,  
丰收的歌在空中回响。  
  
白露凝霜晨光里,  
红枫如火映晚晴。  
秋水共长天一色,  
宁静致远,思绪随风。  
[Prompt tokens: 27, Completion tokens: 61]  
---------- critic ----------  
这首诗以自然意象为载体,描绘了秋天的丰富色彩与情感。秋风、黄叶、果实、白露、红枫等元素,形成了层次分明的秋日图景,表达了丰收与离别交替的复杂情感。诗中“宁静致远”一句,更是点明了秋天带给人们的沉思与感慨。整体语言流畅,意境深远,情感细腻,是一首不错的秋之赞歌。  
  
以下是一些具体的反馈建议:  
  
1. **“黄叶飘零诉离别”**:这一句的表达略显直白,可以考虑用更含蓄或独特的意象来表达离别之情,以增强诗歌的韵味。  
     
2. **“秋水共长天一色”**:这一句虽然取自王勃的《滕王阁序》,但使用在此处稍显突兀,可能会让读者感受到某种经典符号的重复。可以考虑替换为更个性化的表达,与前文的自然意象形成更好 的呼应。  
  
如果你能根据这些建议进行调整,这首诗将会更加出色。期待看到你的进一步修改!  
[Prompt tokens: 103, Completion tokens: 239]  
---------- primary ----------  
非常感谢你的详细反馈和建议!根据你的意见,我将对这首诗进行一些调整,以增强其含蓄性和个性化表达。  
  
---  
  
秋风轻抚过田野,  
黄叶轻舞似鸿羽。  
果实累累挂枝头,  
丰收的歌在空中回响。  
  
白露凝霜晨光里,  
红枫如火映晚晴。  
秋水清澈连天际,  
宁静致远,思绪随风。  
  
---  
  
1. **“黄叶轻舞似鸿羽”**:用“鸿羽”这一意象来表达黄叶的轻盈,增强视觉和情感的层次感。  
2. **“秋水清澈连天际”**:替换“秋水共长天一色”为更个性化的表达,使意境更加独特和自然。  
  
希望这些调整能更好地传达秋天的美好与复杂情感。感谢你的指导!  
[Prompt tokens: 332, Completion tokens: 182]  
---------- critic ----------  
调整后的诗句更显细腻与含蓄,黄叶与秋水的意象都更加个性化,情感表达也更加丰富。以下是具体反馈:  
  
1. **“黄叶轻舞似鸿羽”**:这一修改非常成功,“鸿羽”不仅增添了轻盈之感,还赋予了黄叶一种飘逸的动态美,增强了诗歌的视觉与情感张力。  
  
2. **“秋水清澈连天际”**:这一改写避免了经典句式的重复,同时营造了秋水澄澈、连通天际的广阔意境,使整体氛围更加宁静致远。  
  
3. **情感表达**:诗歌整体情感更加内敛,通过自然意象的细腻描绘,既表达了丰收的喜悦,又蕴含了秋天的宁静与思索,尤其最后一句“宁静致远,思绪随风”更是将情感推向了深远的境界。       
  
总体来说,这首诗的意境已经非常成熟,语言流畅,情感细腻,具有很高的艺术表现力。如果后续没有更多的修改需求,我认为可以定稿。  
  
**APPROVE**  
[Prompt tokens: 547, Completion tokens: 239]  
---------- Summary ----------  
Number of messages: 5  
Finish reason: Text 'APPROVE' mentioned  
Total prompt tokens: 1009  
Total completion tokens: 721  
Duration: 75.84 seconds

三、快速实现多角色、多用户、多智能体对话系统

环境说明

在这里插入图片描述

用到的工具如下:

  • 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

示例一,单智能体

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

代码如下:

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

运行效果:

示例二,智能体与FunctionCall

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

1 示例流程

模拟流程图如下:

在这里插入图片描述

病情初诊机器人Agent根据用户描述的症状和对应的牙位号获取出对应的CT影像信息,如信息不足则主动向用户发起询问,或询问用户是否需要发起审批。

如信息已具备,则根据CT影像信息进行自动诊断,并将分析出结果展示给用户。

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事件消息不显示给用户
            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)



运行:

chainlit run .\endodontics_dentistry_ai.py -w

运行效果

3 chainlit认证配置

上面的示例代码中使用到了chainlit中的认证(Authentication)功能,并在代码中模拟了两个用户。

当首次访问智能体应用的界面时会弹出登录界面,以让我们先输入登录信息后才能使用此应用。

在这里插入图片描述

首次运行chainlit需要生成密钥

chainlit create-secret

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

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

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

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

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

1 示例流程

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

在这里插入图片描述

2 示例代码与演示

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

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="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_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 .\dentistry_selector_ai.py -w

分别提出问题:

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

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

当问到烤瓷牙相关问题时,会由RestorativeAgent(牙齿修复科智能体)来回答问题。

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

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的一些功能上还有experimental标签,且功能支持度目前还不是很多

在这里插入图片描述


如何系统学习掌握AI大模型?

AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。

学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。

这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享

在这里插入图片描述

1. 成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。
在这里插入图片描述

2. 大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

在这里插入图片描述

3. 大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

在这里插入图片描述

4. 2024行业报告

行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

在这里插入图片描述

5. 大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

在这里插入图片描述

6. 大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

在这里插入图片描述

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方CSDN官方认证二维码,免费领取【保证100%免费

在这里插入图片描述

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐