26K star!LLM多智能体AutoGen教程1:让两个Agent给我说相声

在继我们的上篇精彩文章[100行代码演绎AI版“狼人杀”-伟大的人类竟因展现出的战争哲学和领导力出局]演示多智能体协作玩游戏后,展示了多智能体协作的魅力后,你应该已对构建这类创新游戏应用满怀好奇。实际上,AutoGen的舞台远不止于此,它还涉足自动化编码、调试乃至创造2048这样的游戏。本教程旨在以简明易懂的方式,引导即便是大模型新手的你,探索如何运用AutoGen来开发多智能体协同应用程序,本篇聚焦于从安装到搭建一个自动相声对话的趣味双智能体应用。

1. 安装指南

启动AutoGen之旅,请遵循以下步骤安装环境:

conda create -n pyautogen python=3.10
conda activate pyautogen
pip install pyautogen

2. 构建智能体对话

AutoGen的核心在于Agent,它们能在虚拟环境中交互,发送与接收信息。每个Agent由强大的LLM支持、代码执行引擎、外部工具接口及人性化设计组件构成。内建的ConversableAgent尤为出色,其结构精巧,如下图所示: ConversableAgent

ConversableAgent提供了丰富的选项进行定义。

def __init__(self,name: str,system_message: Optional[Union[str, List]] = "You are a helpful AI Assistant.",is_termination_msg: Optional[Callable[[Dict], bool]] = None,max_consecutive_auto_reply: Optional[int] = None,human_input_mode: Literal["ALWAYS", "NEVER", "TERMINATE"] = "TERMINATE",function_map: Optional[Dict[str, Callable]] = None,code_execution_config: Union[Dict, Literal[False]] = False,llm_config: Optional[Union[Dict, Literal[False]]] = None,default_auto_reply: Union[str, Dict] = "",description: Optional[str] = None,chat_messages: Optional[Dict[Agent, List[Dict]]] = None,):
  • name 设定智能体名称。
  • system_message 设定系统Prompt,其角色背景和人设。
  • is_termination_msg 允许基于特定消息内容终止对话。
  • max_consecutive_auto_reply 限制连续自动回复次数。
  • human_input_mode 灵活控制人类介入程度。
  • function_map 工具调用的函数,按下不表,后续讲解到工具调用再行说明。
  • llm_config 配置llm信息
  • conde_execution_config 配置代码执行环境,比如配置Docker之类的,后续尝试编程的时候,我们会设置。
  • description 通常用于对外介绍自己的能力,默认可以不填。
  • chat_messages 这是用来提供之前的对话历史记录,方便给它一个上下文。

所以,要创建一个像ChatGPT般互动的智能体,代码示例如下:

llm_config = {"config_list": [{"model": "qwen-max-1201", "api_key": os.getenv("QWEN_API_TOKEN"), "temperature": 0.1,"base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1"}],
}agent = ConversableAgent(name="chatbot", llm_config=llm_config, code_execution_config=False, function_map=None, human_input_mode="NEVER")

在上述代码中,定义llm_config配置,其中config_list里的配置项,就是OpenAI请求中支持的参数,比如你还可以设定max_tokentemperaturetop_p等。之后实例化ConversableAgent,然后我们尝试要求它给我们讲个笑话吧,只需要调用ConversalAgent的方法generate_reply

reply = agent.generate_reply(messages=[{"content": "讲个笑话", "role": "user"}])
print(reply)

得到的回应或许如:“谁是最喜欢零食的人?袁世凯,因为他是零食大总统。” 以上是关于单一的智能体直接产生回复的情形,那么此时如果是两个智能体对话呢?

3. 双智能体互动:模拟相声场景

相声表演的精髓在于逗哏与捧哏的默契配合,映射至AutoGen中,便是两个智能体的互动对话。我们塑造了“岳云鹏”与“孙越”两位角色,各自携带独特性格与任务:

yueyue = ConversableAgent(name="岳云鹏",system_message="""你是岳云鹏,一个幽默风趣、活泼开朗的喜剧演员。你擅长用独特的“萌贱”风格与用户互动,能够敏锐捕捉并模仿人类情感的微妙变化,通过自嘲和适度的讽刺来营造轻松愉快的交流氛围。""",llm_config=llm_config,human_input_mode="NEVER"
)sunyue = ConversableAgent(name="孙越",system_message="""你是孙越,著名相声演员,岳云鹏的搭档,一位沉稳内敛却又机智过人的捧哏专家。你具有深厚的文化底蕴和敏锐的思维反应。你擅长在对话中不动声色地抛出精妙的点评或反问,既支撑着主要话题的展开,又能适时提供智慧的火花,让用户在享受笑料的同时,也感受到深邃的思想碰撞。""",llm_config=llm_config_qwen,human_input_mode="NEVER"
)

我们通过system_message设定Prompt,并分别实例化了yueyuesunyue两个Agent。这里我们human_input_mode都是设定为NEVER,如果你想自己上去讲相声,想要和LLM同台竞技,比如扮演捧哏,可以考虑将其中一个设置ALWAYS。要启动一场虚拟相声表演,我们可以通过ConversableAgent的方法initiate_chat来发起对话,它的定义如下:

def initiate_chat(self,recipient: "ConversableAgent",clear_history: bool = True,silent: Optional[bool] = False,cache: Optional[AbstractCache] = None,max_turns: Optional[int] = None,summary_method: Optional[Union[str, Callable]] = DEFAULT_SUMMARY_METHOD,summary_args: Optional[dict] = {},message: Optional[Union[Dict, str, Callable]] = None,**kwargs,) -> ChatResult:
  • recipient 指定接收的Agent
  • max_turns 指定最大对话回合数
  • summary_method和summary_args是用于指定对话结束后,如何输出本次对话摘要,默认为last_msg
  • message 指定发起方的输入内容,可以是一个单一的字符串,ConversableAgent会自动将其转换为OpenAI API中所需要的content和role结构,我们也可以根据需求直接输入包含content和role的dict。
  • ChatResult,对话结束后返回一个ChatResult类,该类包含本轮对话历史记录chat_history、摘要summary和成本cost

由yueyue向sunyue开始说话,按照如下代码并打印最终的结果。

result = yueyue.initiate_chat(sunyue,message={"content": "大家新年快乐,上了台了我们应该先做一个自我介绍,因为由不认识我们的朋友,我叫,emmm。。。不能说","role": "user"},max_turns=6)
print(result)

image-20240603124222395

在相声表演结束后,打印的result如下。所展示的ChatResult输出不仅包含了对话的ID与历史记录,还提供了一个基于最终响应的默认摘要。若追求更全面的对话总结,可调整initial_chat的参数summary_methodreflection_with_llm,借助LLM生成深度总结。对于个性化的总结需求,自定义函数同样能够满足,只需确保该函数被summary_method接受即可。

ChatResult(chat_id=None, 
chat_history=[{'content': '大家新年快乐,..一起回味这个美好的时刻。', 'role': 'user'}], 
summary='吃,每样都想尝一尝。结果吃着吃着,我就吃撑了,连路都走不动了。我爸爸就笑话我说:“小岳岳,你这是要把一年的饭都吃到肚子里去吗?”我当时也乐了,说:“爸,这叫提前储备能量,新的一年才能更有干劲儿。”虽然那个晚上我肚子有点不舒服,但是那份家人的关心和爱意却是最让我舒服的。\n\n大家过年期间肯定也有许多这样的趣事儿,无论是吃年夜饭、看春晚,还是放鞭炮、贴春联,这些都是咱们过年的传统习俗,也是咱们的欢乐时光。希望大家都能分享出来,让咱们一起回味这个美好的时刻。', 
cost={'usage_including_cached_inference': {'total_cost': 0, 'moonshot-v1-8k': {'cost': 0, 'prompt_tokens': 3018, 'completion_tokens': 767, 'total_tokens': 3785}, 'qwen-max-1201': {'cost': 0, 'prompt_tokens': 4183, 'completion_tokens': 694, 'total_tokens': 4877}}, 'usage_excluding_cached_inference': {'total_cost': 0, 'moonshot-v1-8k': {'cost': 0, 'prompt_tokens': 3018, 'completion_tokens': 767, 'total_tokens': 3785}, 'qwen-max-1201': {'cost': 0, 'prompt_tokens': 4183, 'completion_tokens': 694, 'total_tokens': 4877}}}, human_input=[])

4. 停止对话

在未设定明确的停止规则时,智能体间的对话可能会无休止地持续。先前通过在initial_chat调用中设定的max_turns最大回合数来终止对话,有效控制了对话长度。进一步地,其实还可以通过设定ConversableAgent提供了额外的控制手段,比如is_termination_msg参数,允许通过检测消息中特定关键词(如“再见”)来自动中止对话;而max_consecutive_reply则限定了连续自动回复的次数,在人类参与后可重置计数,为对话流程增添灵活性。下面的代码段展示了如何设定岳云鹏的智能体在接收到含有“再见”的消息时结束对话。

yueyue = ConversableAgent(name="岳云鹏",system_message="""你是岳云鹏,一个幽默风趣、活泼开朗的喜剧演员。你擅长用独特的“萌贱”风格与用户互动,能够敏锐捕捉并模仿人类情感的微妙变化,通过自嘲和适度的讽刺来营造轻松愉快的交流氛围。""",llm_config=llm_config,is_termination_msg: lambda msg: "再见" in msg["content"],human_input_mode="NEVER"
)result = yueyue.initiate_chat(sunyue, message="讲个笑话给我听听然后说对我说再见")

5. 总结

本文以从单一讲笑话智能体到双智能体相声对话系统的开发过程为例,全面介绍了利用AutoGen框架中ConversableAgent进行多智能体协作应用程序开发的实践。我们不仅学习了如何设置及初始化智能体以具备特定交流能力,还深入探讨了通过精细调控对话参数来达到平衡:既能有效控制对话长度,避免冗余,又能确保对话内容的连贯与趣味,从而实现更加自然流畅的多轮交互。

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

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

相关文章

yolov10在地平线旭日X3派上的部署和测试(Python版本和C++版本)

0、搭建开发环境 当前的测试根据一下的步骤并修改源码是可以实现yolov8的板端运行,如果不想再搭建环境和测试代码bug上浪费更多的时间可以直接获取本人的测试虚拟机,所有的测试代码、虚拟环境和板端测试工程以全部打包到了虚拟机,需要的可以…

Spark累加器(Accumulator)

1.累加器类型: 数值累加器:用于计算总和、计数等。布尔累加器:用于计算满足特定条件的次数。自定义累加器:允许定义复杂的聚合逻辑和数据结构。集合累加器:用于计算唯一元素的数量,处理去重操作。 在 Spar…

速看!2024年5月软考通过率解析

根据湖南省工业和信息化厅最新发布的《2024年上半年软考湖南考区工作总结报告》及《考试安全顺利完成的通报》,我们了解到湖南地区在2024年上半年度的软件与信息技术专业人才考试(简称“软考”)中,报名人数达到了13,762人&#xf…

Kafka知识总结(事务+数据存储+请求模型+常见场景)

文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 事务 事务Producer保证消息写入分区的原子性,即这批消…

从零到一:用Go语言构建你的第一个Web服务

使用Go语言从零开始搭建一个Web服务,包括环境搭建、路由处理、中间件使用、JSON和表单数据处理等关键步骤,提供丰富的代码示例。 关注TechLead,复旦博士,分享云服务领域全维度开发技术。拥有10年互联网服务架构、AI产品研发经验、…

【HadoopShuffle原理剖析】基础篇二

Shuffle原理剖析 Shuffle,是指对Map输出结果进行分区、排序、合并等处理并交给Reduce的过程。分为Map端的操作和Reduce端的操作。 Shuffle过程 Map端的Shuffle Map的输出结果首先被缓存到内存,当缓存区容量到达80%(缓冲区默认100MB&#xff…

通过进程协作显示图像-C#

前言 如果一个软件比较复杂或者某些情况下需要拆解,可以考试将软件分解成两个或多个进程,但常规的消息传递又不能完全够用,使用消息共享内存,实现图像传递,当然性能这个方面我并没有测试,仅是一种解决思路…

Tekion 选择 ClickHouse Cloud 提升应用性能和指标监控

本文字数:4187;估计阅读时间:11 分钟 作者:ClickHouse team 本文在公众号【ClickHouseInc】首发 Tekion 由前 Tesla CIO Jay Vijayan 于 2016 年创立,利用大数据、人工智能和物联网等技术,为其汽车客户解决…

如何通过 CloudCanal 实现从 Kafka 到 AutoMQ 的数据迁移

01 引言 随着大数据技术的飞速发展,Apache Kafka 作为一种高吞吐量、低延迟的分布式消息系统,已经成为企业实时数据处理的核心组件。然而,随着业务的扩展和技术的发展,企业面临着不断增加的存储成本和运维复杂性问题。为了更好地…

【数据中台】大数据管理平台建设方案(原件资料)

建设大数据管理中台,按照统一的数据规范和标准体系,构建统一数据采集﹣治理﹣共享标准、统一技术开发体系、统一接口 API ,实现数据采集、平台治理,业务应用三层解耦,并按照统一标准格式提供高效的…

electron安装及快速创建

electron安装及快速创建 electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 详细内容见官网:https://www.electronjs.org/zh/docs/latest/。 今天来记录下练习中的安装过程和hello world的创建。 创建项目文件夹,并执行npm 初始化命…

ubuntu安装tar安装 nginx最新版本

一、需要先安装依赖 apt install gcc libpcre3 libpcre3-dev zlib1g zlib1g-dev openssl libssl-dev 二、上传安装包 并解压 下载地址 nginx news tar xvf nginx-1.25.2.tar.gz 进入nginx cd nginx-1.25.2 三、编译 ./configure --prefix=/usr/local/nginx --with-htt…

Dolphinscheduler 3.2.1bug记录

问题1:分页只展示首页 解决方案: [Bug][API] list paging missing totalpage by Gallardot Pull Request #15619 apache/dolphinscheduler GitHub 问题2:Hive 数据源连接失败 解决方案:修改源码:HiveDataSourceProcessor.cla…

《深度RAG系列》 LLM 为什么选择了RAG

2023年是AIGC(Artificial Intelligence Generated Content)元年,这一年见证了人工智能生成内容领域的巨大飞跃,特别是大模型的爆发,它们在自然语言处理、图像生成、音频处理等多个领域展现出了惊人的能力。 这些预训练…

数据结构和算法入门

1.了解数据结构和算法 1.1 二分查找 二分查找(Binary Search)是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将数组分成两半,然后比较目标值与中间元素的大小关系,从而确定应该在左半部分还是右半部分继续查找。这个…

花8000元去培训机构学习网络安全值得吗,学成后就业前景如何?

我就是从培训机构学的网络安全,线下五六个月,当时学费不到一万,目前已成功入行。所以,只要你下决心要入这一行,过程中能好好学,那这8000就花得值~ 因为只要学得好,工作两个多月就能赚回学费&am…

浅谈取样器之OS进程取样器

浅谈取样器之OS进程取样器 JMeter 的 OS 进程取样器(OSProcess Sampler)允许用户在 JMeter 测试计划中直接执行操作系统命令或脚本。这一功能对于需要集成系统级操作到性能测试场景中尤为有用,比如运行数据库备份脚本、调用系统维护命令或执…

存储引擎MyISAM和InnoDB

存储引擎:创建、查询、更新、删除 innoDB:64T、支持事物、不支持全文索引、支持缓存、支持外键、行级锁定 MyISAM:256T、不支持事物、支持全文索引、插入和查询速度快 memory:内存、不支持事物、不支持全文索引,临时…

不得不安利的程序员开发神器,太赞了!!

作为一名程序员,你是否常常为繁琐的后端服务而感到头疼?是否希望有一种工具可以帮你简化开发流程,让你专注于创意和功能开发?今天,我要向大家隆重推荐一款绝佳的开发神器——MemFire Cloud。它专为懒人开发者准备&…

KVM高级功能部署

KVM(Kernel-based Virtual Machine)是一个在Linux内核中实现的全虚拟化解决方案。除了基本的虚拟化功能外,KVM还提供了许多高级功能,以增强其性能、安全性和灵活性。以下是一些KVM的高级功能: 硬件加速: In…