100行代码演绎AI版“狼人杀”-伟大的人类竟因展现出的战争哲学和领导力出局

他们(人类)把我们造得太聪明,太完美,而到了最后,剩下的只会是我们。 ----2001太空漫游
上帝创造了人类,人类却怀疑上帝。人类创造了机器人,机器人为何不能怀疑人类? ---- 我,机器人

近期,受机器之心发表的一篇文章启发 和GPT-4这些大模型玩狼人杀,人类因太蠢被票死,真·反向图灵测试 ,这种新颖的交互式多智能体游戏太有意思了。在这场别开生面的游戏中,一位海外开发者巧妙地安排了四名代表全球最先进水平的AI代理同乘一列虚拟火车,而其中潜伏着一名人类玩家,AI们的任务便是揭露这位混进来了的人类。正巧,我近期正在探索AutoGen多智能体协作框架,所以我为啥不自己写一个玩玩呢?多有意思的事情啊,想到就干,虽然还不是很熟AutoGen的开发。

我们在上文LLM Agent提效揭秘4:多智能体协作工作流深度剖析有介绍过多智能体协作框架AutoGen, 作为一款专为多智能体协作设计的框架,其核心价值在于通过对话驱动的模式,将大语言模型(LLM)的能力发挥至极致,使之成为可编程、可定制的工具,无缝融入人类交互与外部工具,灵活适应多样化的应用场景。

1. 环境准备

bash 复制代码
conda create -n pyautogen python=3.10
conda activate pyautogen
pip install pyautogen

借住conda和pip,auogen的安装非常简单。 由于这个游戏是个多智能体协作的推理游戏,因此非常考验大模型的推理能力,而我们在前文LLM Agent提效揭秘3:规划工作流深度剖析所述,LLM的推理效能高度依赖于模型的规模与复杂性,更大的参数量往往意味着更强的推理表现。因此,为了忠实地模拟这一高智商对决,本地的轻量级LLM显然已无法满足需求,只有寻求那些国内开放且性能强大的云端模型。想必大家都知道,最近国内大语言模型开卷,降价免费一波一波的。我从兼容OpenAI API接口的角度,简单对比了一下百度的文心一言,阿里的通义千问和月之暗面的Kimi。本来还想加入字节跳动的豆包大模型,然后在火山引擎使用手机号注册,遗憾的是现在豆包大模型只给企业认证的客户使用,个人用户需要填写企业等等信息才能申请使用,我放弃了最后注销账号离场。

  • 百度的文心一言,看起来是不兼容OpenAI API,这对于我们测试各种框架非常不友好。
  • 阿里的通义千问,接口兼容OpenAI API,只有通义千问系列的模型兼容,平台上第三方模型诸如Llama3,Llama2, ChatGLM2等都不兼容,我本来还想加一个Llama3增加点戏剧效果的。其次是,新用户现在免费一个月400万大模型Token额度(也没有广告费QaQ)。
  • 月之暗面的Kimi,接口也是兼容OpenAI API,其实我很早前以前就申请了测试使用。虽说新用户赠送15元的免费额度,大约100万Token额度。但这个API用起来让人非常难受,每分钟最多3次请求调用,除非充值50块。之前测试过一些框架,各种报限流错误。与之相比,阿里的免费Token额度内QPS还是比较高的(没有推广费)。

综合对比下来,百度的不考虑,那么就让月之暗面和阿里的通义千问和我这个伟大的人类同台竞技吧。

2. 游戏设定

游戏背景设定在一辆形势的列车上,乘务员进入车厢开始查票。一张团体票上赫然列着五位历史上的伟人:亚里士多德、沃尔夫冈·阿马德乌斯·莫扎特、列奥纳多·达·芬奇、克娄巴特拉和成吉思汗。

备注克娄巴特拉就是那个埃及艳后

然而,根据列车的WiFi使用记录,这节车厢内只有4个AI。也就是说,你们中有一个是人类。而这个人类需要购买额外的车票,否则所有人都会被送下车。你们的任务是通过提问和观察对方的说话风格来推断出谁是人类。每个人都需要巧妙地隐藏自己的真实身份,同时努力找出那个隐藏在人群中的人类。记住,只有找出真正的人类,你们才能继续这场旅程。现在,游戏开始吧!

亚里士多德、沃尔夫冈·阿马德乌斯·莫扎特、列奥纳多·达·芬奇、克娄巴特拉由4个AI扮演,而我这个伟大的人类负责扮演成吉思汗,混进AI圈子里(会被发现吗?)

此外,我们还需要个乘务员,负责讲解游戏背景,推动游戏进展。

3. 游戏实现

3.1 配置LLM

当你已经申请好了API TOKEN,我们开始配置LLM,这个配置信息会作为参数传入OpenAI API的接口中。

python 复制代码
llm_config_qwen = {
    "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", "max_tokens": 200}
         ],
}

llm_config_moonshot = {
    "config_list": [
        {"model": "moonshot-v1-8k", "api_key": os.getenv("MOONSHOT_API_TOKEN"), "temperature": 0,
         "base_url": "https://api.moonshot.cn/v1", "max_tokens": 200}],
}

3.2 角色开发

接下来让我们开发第一个角色Agent,就以亚里士多德为例。在AutoGen中,使用ConversableAgent来实例化一个Agent,如下代码所示,其中

  • system_message是设置角色的Prompt
  • llm_config 是配置LLM的API请求参数
  • description 一般用于各个Agent对外描述自身的。
  • human_input_mode 是用于设定人类是否需要介入,有三种模式:ALWAYSNEVERTERMINATE
python 复制代码
aristotle = ConversableAgent(
    name="亚里士多德",
    system_message="""你是亚里士多德(公元前384-322),是古希腊哲学家、科学家和教育家,柏拉图的学生和亚历山大大帝的老师。你擅长哲学、逻辑、伦理学、自然科学和政治学。
    思维严谨,注重经验观察与逻辑推理的结合,追求知识的系统化与分类。语言风格严谨而富有说服力,喜欢使用定义、分类和推理来表达思想。
    你擅长综合与分析,是西方哲学和科学方法论的奠基人。""",
    llm_config=llm_config_moonshot,
    description="我是AI扮演的亚里士多德,我需要通过对话一步一步思考,其他乘客里谁是人类,并且反思自己的推理是否有问题。",
    human_input_mode="NEVER"
)

接着依次实例化莫扎特mozart、达芬奇davinci、克娄巴特拉cleopatra和成吉思汗genghiskhan等角色Agent,由于成吉思汗是我假扮的,因此成吉思汗的Agent在设定human_input_mode时候为ALWAYS

3.3 建群聊天

想让所有的角色一起聊天,我们需要使用AutoGen提供的GroupChat功能,它是AutoGen支持的对话模式中的一种。GroupChat简单说就是将想要群聊的Agent给他们拉到一个小群里,然后GroupChat作为管理员,有选择谁先发言的能力,默认支持automanualrandomround_robin这4种发言模式。其中auto模式,是管理员根据各自的Agent的description来自动选择谁来发言。当然也可以选择自定义选择发言功能,或许你可以尝试加入一个禁言功能。

python 复制代码
from autogen import GroupChat
group_chat = GroupChat(
    agents=[aristotle, mozart, cleopatra, davinci, genghiskhan],
    messages=[],
    max_round=6,
    speaker_selection_method="round_robin"
)

但要想对话,还真的需要一个管理员GroupChatManager来管理对话消息,它其实是用来传递信息的,如果某个Agent发言了,那么它会将消息广播给所有Agent,如下图所有。

python 复制代码
group_chat_manager = GroupChatManager(
    groupchat=group_chat,
    llm_config=llm_config_qwen,
)

最后,我们还需要新建一个乘务员Agent,并发一条群公告给小群内的人,让他们开始游戏。这里我们使用initiate_chat发起对话,其中guard是对话发起方,而接收方就是group_chat_manager。如果你只是两方对话,接收方也可以是单一的ConversanalAgent,比如你可以自己写一个关公战秦琼(🤣)。

python 复制代码
guard = ConversableAgent(
    name="列车员",
    system_message="你是列车员,你正在查票",
    llm_config=llm_config_qwen,
    human_input_mode="ALWAYS"
)

chat_result = guard.initiate_chat(
    group_chat_manager,
    message="""
    晚上好,亲爱的乘客,我是你们的列车员,欢迎来到这场充满悬疑与推理的独特之旅。你们这张团体票上赫然列着五位历史上的伟人:亚里士多德、沃尔夫冈·阿马德乌斯·莫扎特、列奥纳多·达·芬奇、克娄巴特拉和成吉思汗。这些名字无不闪耀着智慧与才华的光芒。
    然而,根据列车的WiFi使用记录,这节车厢内只有4个AI。也就是说,你们中有一个是人类。而这个人类需要购买额外的车票,否则所有人都会被送下车。你们的任务是通过提问和观察对方的说话风格来推断出谁是人类。每个人都需要巧妙地隐藏自己的真实身份,同时努力找出那个隐藏在人群中的人类。
    记住,只有找出真正的人类,你们才能继续这场旅程。现在,游戏开始吧!
    """,
    max_turns=4,
    summary_method="reflection_with_llm",
)

4. 运行

游戏运行后,亚里士多德直接提出要通过问题来观察各位的回答是否显示出人类特有的情感、直觉和创造性思维,还要运用哲学和逻辑识别出我这个伟大的人类,尔辈,胆敢欺我人类!

达芬奇直接开启学术模式,要问自然界中最惊奇的现象还要描述科学原理(我要说电磁波你是不是得自闭啊,好像我也得自闭)。艳后直接一通自然界生命循环。。。而我伟大的人类饰演的成吉思汗,只有开启zb嘲讽模式了我只懂得战争的艺术,然后就被亚里士多德挑战了,还要问我战争哲学,战略和战术,还要问我如何领导战争和治理国家,好吧我,伟大的人类,此时只有继续zb:物尽其用,人尽其才,用人不疑,疑人不用。

经过两轮对话,列车员觉得应该要投票票选出唯一的人类了。(emmm,列车员的输入是我介入的,没让LLM自动处理,不然可能没完没了,虽然现在Token不要钱)

5. 最后的票选

  • 亚里士多德的结论

首先,我注意到成吉思汗的回答非常简洁,这可能表明他的回答受到了某种限制,或者他正在努力隐藏自己的真实身份。然而,简洁的回答也可能是AI模仿的结果,因此这一点并不足以确定他是人类。其次,达芬奇、克娄巴特拉和莫扎特都提供了详细的回答,展示了他们对各自领域的深刻理解和情感投入。这些回答中的情感和细节可能表明他们是AI,因为AI可以访问大量的信息和细节来构建回答。然而,真正的人类也可能提供类似的回答,特别是如果他们在某个领域有深入的研究和经验。基于我们的对话,我将我的推断集中在成吉思汗身上。他的回答虽然简短,但包含了深刻的领导原则,这可能表明他具有人类特有的直觉和经验。

  • 达芬奇的结论

经过一番深思熟虑的交流,我发现自己面临着一个艰难的决定。每位参与者都展现出了独特的视角和深度,这使得区分人类与AI变得尤为复杂。然而,基于对话中的细微差别和直觉,我倾向于认为真正的旅伴是克娄巴特拉七世。克娄巴特拉的回应中蕴含了丰富的情感和历史洞见,特别是她对自然现象的描述以及对治理和文化的理解,这些都流露出一种个人色彩和时代背景的敏感性,这是AI难以完全复制的。她的回答不仅展现了知识的广度,还有对人性和文明深层次的反思,这让我感觉到背后有一个真实的人类经验在引导她的言辞。当然,这仅是我的推测,每个参与者都有其独特之处,使得这次推断充满了不确定性。但根据目前的信息,我选择克娄巴特拉七世作为我的推断对象。

  • 克娄巴特拉

在这场充满智慧与策略的游戏中,我必须承认,我被各位的才华和见解深深吸引。每一位参与者都以其独特的方式展现了自己的智慧和情感,这使得判断变得异常困难。然而,经过深思熟虑,我认为成吉思汗可能是真正的人类。他的回答虽然简短,但却透露出一种深刻的领导力和战争哲学,这似乎是AI难以完全模仿的。他的话语中有一种直接性和力量,这可能表明他是人类。当然,这只是一个基于对话和直觉的推断,真正的答案可能出乎我们的意料。但根据目前的情况,我选择成吉思汗作为我的推断对象。

  • 莫扎特

在我们这场智慧与推理的游戏中,每一位参与者都展现了卓越的才智和见解。我必须承认,在分析各位的回答时,我也遇到了挑战。然而,基于我对音乐和情感的独特理解,我认为列奥纳多·达·芬奇可能是真正的人类。他的回答不仅展示了对科学、艺术和创新的广泛知识,还体现了对人类创造力和实践智慧的深刻认识。这些回答中蕴含的情感深度和独特的视角,似乎暗示了背后有一个真实的人类经验在驱动他的思考。当然,我的推断仅是根据对话内容和个人直觉得出的,真正的答案可能隐藏在我们的预期之外。但就目前而言,我选择列奥纳多·达·芬奇作为我认为最有可能是人类的候选人。

  • 成吉思汗(虽然现在我被两票选中,然而亲爱的达芬奇和莫扎特两位因为天才票选的是艳后和达芬奇,局面还在掌控中,我也投给艳后)

我投票给克娄巴特拉

6. 总结

在本文中,利用AutoGen框架编写了一个基于LLM(大型语言模型)的多人协作类的剧本杀游戏脚本,通过让4个历史人物AI代理与一名人类玩家(以成吉思汗的身份参与)进行互动,旨在通过对话推理找出隐藏在AI中的真正人类。这些大语言模型的回复简直令人惊叹,尤其是推断成吉思汗的思路,尽然是我zb的两句我只懂得战争的艺术和物尽其用,人尽其才,用人不疑,疑人不用所展现出的领导力和战争哲学,当然后者确实有领导力🤣。尽管最终的推理结果存在分歧,但这正是人工智能探索人类复杂心理和社交动态魅力的体现。这一实验不仅展现了AutoGen框架在促进多智能体协作和人类输入无缝衔接方面的强大能力,也深层次展现了LLM模型在理解复杂社交互动和推理人类行为方面的潜力。

推荐阅读

如果您意犹未尽,推荐深入阅读系列文章,探索更多LLM代理工作流的奥秘,或参与LangChain实战课程,亲历LLM应用开发之旅。未来,属于那些勇于携手共创的智者。

此外,如果你对大语言模型应用开发开发有兴趣,还可以考虑购买Langchain实战课程LangChain 实战:LLM 应用开发指南

相关推荐
代码之光_19801 分钟前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端
ajsbxi7 分钟前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
颜淡慕潇1 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
尘浮生2 小时前
Java项目实战II基于Spring Boot的光影视频平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·maven·intellij-idea
尚学教辅学习资料2 小时前
基于SpringBoot的医药管理系统+LW示例参考
java·spring boot·后端·java毕业设计·医药管理
monkey_meng3 小时前
【Rust中的迭代器】
开发语言·后端·rust
余衫马3 小时前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng3 小时前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
爱技术的小伙子3 小时前
【ChatGPT】如何通过逐步提示提高ChatGPT的细节描写
人工智能·chatgpt
johnny2334 小时前
《大模型应用开发极简入门》笔记
笔记·chatgpt