向AI转型的程序员都关注公众号 机器学习AI算法工程
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大数据技术
搜索公众号添加: datanlp
长按图片,识别二维码
阅读过本文的人还看了以下文章:
整理开源的中文大语言模型,以规模较小、可私有化部署、训练成本较低的模型为主
基于40万表格数据集TableBank,用MaskRCNN做表格检测
《深度学习入门:基于Python的理论与实现》高清中文PDF+源码
2019最新《PyTorch自然语言处理》英、中文版PDF+源码
《21个项目玩转深度学习:基于TensorFlow的实践详解》完整版PDF+附书代码
PyTorch深度学习快速实战入门《pytorch-handbook》
【下载】豆瓣评分8.1,《机器学习实战:基于Scikit-Learn和TensorFlow》
李沐大神开源《动手学深度学习》,加州伯克利深度学习(2019春)教材
【Keras】完整实现‘交通标志’分类、‘票据’分类两个项目,让你掌握深度学习图像分类
如何利用全新的决策树集成级联结构gcForest做特征工程并打分?
Machine Learning Yearning 中文翻译稿
斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)
中科院Kaggle全球文本匹配竞赛华人第1名团队-深度学习与特征工程
不断更新资源
深度学习、机器学习、数据分析、python
搜索公众号添加: datayx