AutoGen:让DeepSeek和Qwen2.5自行聊天完成任务

大模型机器学习算法

picture.image

向AI转型的程序员都关注公众号 机器学习AI算法工程

AutoGen介绍

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

picture.image

主要特点

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())  
  

    

运行效果:

picture.image

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


          
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
    
快速实现多角色、多用户、多智能体对话系统

环境说明

picture.image
用到的工具如下:

  • 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

运行效果:
picture.image

示例二,智能体与FunctionCall

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

1 示例流程

模拟流程图如下:

picture.image

病情初诊机器人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

运行效果
picture.image

3 chainlit认证配置

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

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

picture.image

首次运行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形成一个专家团队,用户向这个专家团队提问,专家团队每次派一个最专业的代表来解答问题。

picture.image

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

分别提出问题:

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

picture.image

从上面运行结果可知,当问到根管治疗相关问题时,会由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 界面

picture.image

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

但从支持 流程与节点编辑 这些 功能点 来看还是非常棒的。

机器学习算法AI大数据技术

搜索公众号添加: datanlp

picture.image

长按图片,识别二维码

阅读过本文的人还看了以下文章:

实时语义分割ENet算法,提取书本/票据边缘

整理开源的中文大语言模型,以规模较小、可私有化部署、训练成本较低的模型为主

《大语言模型》PDF下载

动手学深度学习-(李沐)PyTorch版本

YOLOv9电动车头盔佩戴检测,详细讲解模型训练

TensorFlow 2.0深度学习案例实战

基于40万表格数据集TableBank,用MaskRCNN做表格检测

《基于深度学习的自然语言处理》中/英PDF

Deep Learning 中文版初版-周志华团队

【全套视频课】最全的目标检测算法系列讲解,通俗易懂!

《美团机器学习实践》_美团算法团队.pdf

《深度学习入门:基于Python的理论与实现》高清中文PDF+源码

《深度学习:基于Keras的Python实践》PDF和代码

特征提取与图像处理(第二版).pdf

python就业班学习视频,从入门到实战项目

2019最新《PyTorch自然语言处理》英、中文版PDF+源码

《21个项目玩转深度学习:基于TensorFlow的实践详解》完整版PDF+附书代码

《深度学习之pytorch》pdf+附书源码

PyTorch深度学习快速实战入门《pytorch-handbook》

【下载】豆瓣评分8.1,《机器学习实战:基于Scikit-Learn和TensorFlow》

《Python数据分析与挖掘实战》PDF+完整源码

汽车行业完整知识图谱项目实战视频(全23课)

李沐大神开源《动手学深度学习》,加州伯克利深度学习(2019春)教材

笔记、代码清晰易懂!李航《统计学习方法》最新资源全套!

《神经网络与深度学习》最新2018版中英PDF+源码

将机器学习模型部署为REST API

FashionAI服装属性标签图像识别Top1-5方案分享

重要开源!CNN-RNN-CTC 实现手写汉字识别

yolo3 检测出图像中的不规则汉字

同样是机器学习算法工程师,你的面试为什么过不了?

前海征信大数据算法:风险概率预测

【Keras】完整实现‘交通标志’分类、‘票据’分类两个项目,让你掌握深度学习图像分类

VGG16迁移学习,实现医学图像识别分类工程项目

特征工程(一)

特征工程(二) :文本数据的展开、过滤和分块

特征工程(三):特征缩放,从词袋到 TF-IDF

特征工程(四): 类别特征

特征工程(五): PCA 降维

特征工程(六): 非线性特征提取和模型堆叠

特征工程(七):图像特征提取和深度学习

如何利用全新的决策树集成级联结构gcForest做特征工程并打分?

Machine Learning Yearning 中文翻译稿

蚂蚁金服2018秋招-算法工程师(共四面)通过

全球AI挑战-场景分类的比赛源码(多模型融合)

斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)

python+flask搭建CNN在线识别手写中文网站

中科院Kaggle全球文本匹配竞赛华人第1名团队-深度学习与特征工程

不断更新资源

深度学习、机器学习、数据分析、python

搜索公众号添加: datayx

picture.image

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
火山引擎大规模机器学习平台架构设计与应用实践
围绕数据加速、模型分布式训练框架建设、大规模异构集群调度、模型开发过程标准化等AI工程化实践,全面分享如何以开发者的极致体验为核心,进行机器学习平台的设计与实现。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论