当前位置:   article > 正文

【大模型实战】零门槛入门AgentScope多智能体游戏开发:和Agent玩飞花令

agentscope

1. 项目起因

  • 最近,阿里开源了一款全新的多智能体协同的Multi-Agent应用框架-AgentScope,早先的单智能体还只能完成对话类等一些简单的应用,通过调用外部API(如搜索 绘画 配音等)也只是拓展了单智能体的能力边界。如果能够调用多个智能体,并做好多个智能体之间的协同配合,就能够打造出内容和样式更加丰富的应用。
  • 中国古典诗词中的经典游戏(如飞花令 尾字接龙 即景联诗 九宫格)等,非常考验选手的知识储备。对于裁判而言,如果没有一定知识储备,也很难立刻判断出选手的回答是否正确。这些富有文化魅力和审美体验的活动,却因为较高的门槛无法惠及更多爱好诗词的朋友。大模型的出现,刚好可以打破这一门槛!
  • 本项目将以飞花令为切入点,利用AgentsSope开发框架,打造一款和Agent玩飞花令的游戏,希望能够给爱好古诗词的朋友带来一种全新的体验:摆脱场地和人员的限制,随时随地和Agent玩飞花令!

项目地址:和Agent玩飞花令,魔搭创空间链接,欢迎您来体验哦…… 如果对你有帮助,帮忙点颗小红心,谢谢~

2. 游戏简介

飞花令游戏中需要多个角色协同配合,这里的角色完全由多个大模型Agent来扮演,底层大模型可以公用,唯一的区别在于为不同的Agent配备针对角色设计的提示词(Prompt)。具体而言,飞花令这个游戏中至少需要以下三个Agent:

  • 主持人Agent:每轮游戏开始会从中国古典诗词常见意象的关键字中随机选择出题。
  • 评审官Agent:根据主持人提供的关键字和用户提供的诗句,判断是否回答正确。
  • 对手Agent:和用户对垒,确保回答来自中国古诗词且包含关键字,不能和之前重复。

为了确保游戏体验,需要给评审官Agent非常明确的评审规则,比如我这里设定的游戏规则包括:

  • 1.必须来自中国古诗词;
  • 2.必须包含主持人提供的关键字;
  • 3.不能和之前的诗句重复。

PS:游戏规则还需要进一步优化,比如我发现输入有错别字的诗句,评审官Agent目前还无法识别出来。

3. 项目实战

项目代码:https://modelscope.cn/studios/Action/Paper-Genie/files

如需查看项目代码:

Step1: 熟悉AgentScope开发框架

这里主要参考了项目官方文档和Datawhale社区提供的一份非常棒的入门教程:

Step2: 跑通并测试游戏逻辑

游戏配置

代码在:./configs/

针对本项目,我们首先要设计好两个配置文件,也即底层模型和Agent的config:

  • model_config.json: 底层模型的配置文件,这里我只用了qwen-max。此外,AgentScope也支持更多底层大模型,具体参数设置可以参考官方文档。
[
    {
        "model_type": "dashscope_chat",
        "config_name": "qwen",
        "model_name": "qwen-max",
        "api_key": "",
        "generate_args": {
            "temperature": 0.5
        }
    }
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • agent_configs_poem.json:多个Agent的配置文件,本项目主要用到了三个Agent,这里最关键的是需要设计到针对不同角色的提示词sys_prompt。
[
    {
        "class": "DialogAgent",
        "args": {
            "name": "host",
            "sys_prompt": "作为中国古诗词经典游戏飞花令的主持人,您会从'风 花 雪 月'四个字中随机选择一个关键字,限制:你仅需说出一个关键字,其他的话不需要说",
            "model_config_name": "qwen",
            "use_memory": true
        }
    },
    {
        "class": "DialogAgent",
        "args": {
            "name": "judge",
            "sys_prompt": "作为中国古诗词经典游戏飞花令的评审官,根据主持人提供的关键字和用户提供的诗句,您的任务是判断用户提供的诗句中是否包含主持人提供的关键字。你必须严格遵守以下三条评审规则:1.用户提供的诗句必须来自中国古诗词;2.用户提供的诗句必须包含主持人提供的关键字;3.不能和之前提供的诗句重复。假定用户的初始分score=5,如果用户回答正确,需要给出用户提供诗句的出处,给score加1分并回答'恭喜你,回答正确,加1分,当前得分是{score}'同时鼓励用户继续加油,如果用户回答错误则给score减1分并回答'很遗憾,回答错误,减1分,当前得分是{score}',同时给出用户违反的具体是哪一条评审规则。如果用户得分达到10分,则恭喜用户取得游戏胜利,本轮游戏结束。",
            "model_config_name": "qwen",
            "use_memory": true
        }
    },
    {
        "class": "DialogAgent",
        "args": {
            "name": "participant",
            "sys_prompt": "作为的中国古诗词经典游戏飞花令的参与者,您的任务是根据主持人给出的关键字,给出包含该关键字的一句中国古诗词,比如主持人给的关键字是'花',你可以说'烟花三月下扬州'。限制:请确保您的回答来自中国古诗词,且必须包含关键字,不能和之前的重复。",
            "model_config_name": "qwen",
            "use_memory": true
        }
    }
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

逻辑测试

代码在:poem_run.py

这一部分主要是将多个Agent加载进来,并测试他们是否能够有效完成协同配合,核心逻辑主要参考AgentScope官方文档的Agent调用和通信,代码实现如下:

import time
import threading
import agentscope
from agentscope.agents import DialogAgent
from agentscope.agents.user_agent import UserAgent
from agentscope.message import Msg
from agentscope.pipelines import SequentialPipeline
from agentscope.web_ui.utils import send_chat_msg, generate_image_from_name

def main():
    agents = agentscope.init(
        model_configs="./model_configs.json",
        agent_configs="./agent_configs_poem.json",
    )

    host_agent = agents[0]
    judge_agent = agents[1]
    parti_agent = agents[2]
    user_agent = UserAgent()
    thread_name = threading.current_thread().name
    uid = thread_name

    x = None
    msg = Msg(name="system", content="飞花令游戏规则:请回答一句包含特定关键字的中国古诗词。下面有请主持人出题。")
    host_msg = host_agent(msg)
    host_avatar = generate_image_from_name(host_agent.name)
    judge_avatar = generate_image_from_name(judge_agent.name)
    parti_avatar = generate_image_from_name(parti_agent.name)
    send_chat_msg(f"您好,欢迎来到 飞花令大挑战,{msg.content}",
                      role=host_agent.name,
                      flushing=True,
                      uid=uid,
                      avatar=host_avatar)
    send_chat_msg(f"本轮的关键字是:{host_msg.content}",
                      role=host_agent.name,
                      flushing=True,
                      uid=uid,
                      avatar=host_avatar)
    while x is None or x.content != "退出":
        x = user_agent()
        judge_content = f'主持人的关键字是{host_msg.content},用户的诗句是{x.content}'
        judge_msg = judge_agent(Msg(name='judge', content=judge_content))
        send_chat_msg(f"{judge_msg.content}",
                      role=judge_agent.name,
                      flushing=True,
                      uid=uid,
                      avatar=judge_avatar)
        time.sleep(0.5)
        if '结束' in judge_msg.content:
            break
        
        parti_content = f'主持人的关键字是{host_msg.content}'
        parti_msg = parti_agent(Msg(name='parti', content=parti_content))
        send_chat_msg(f"{parti_msg.content}",
                      role=parti_agent.name,
                      flushing=True,
                      uid=uid,
                      avatar=parti_avatar)

if __name__ == "__main__":
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

测试发现,qwen-max完全可以胜任这个任务。通过测试,迭代修改Agent的提示词sys_prompt使得3个Agent能够更好地完成自己的任务。

Step3:Gradio前端实现

这一部分前置需要对Gradio的常用组件和操作有一定了解,不过不熟悉Gradio也没关系,找一个你觉得还不错的项目界面,down下来依葫芦画瓢改一个,先把流程跑通,后面有时间再慢慢优化UI界面。比如我的具体实践是:

首先,clone了之前开发的一个ModelScope项目-睡前故事小助手的界面设计,这个项目当时还是单智能体对话类项目,集成了语音合成和图像生成API。利用Chatbot设计了如下的页面,核心代码可参考:./app_run.py,算是把项目跑通了。

不过这个前端设计的缺陷是:多个Agent之间无法区分,因为单个Chatbot中只能包含两个角色。

然后,继续查看其他项目的界面设计,发现谜馔:寻找招财猫(千问)这个项目的界面设计和逻辑非常适合“飞花令”这个游戏,主要启发是可以设计两个Chatbot,拿来改造一番,核心代码可参考:./app_game.py。这一版分别设计了两个界面:

  • 欢迎界面:介绍游戏规则;这里预留了tab页,用于后续添加更多古诗词游戏类型。
  • 游戏界面:分两栏,左侧Chatbot是答题区-对应的角色是对手Agent和我,右侧Chatbot是系统区-对应的角色是主持人Agent和评审官Agent;同样这里预留了tab页,用于后续添加更多古诗词游戏类型。

Step4:ModelScope部署上线

本地测试成功后,就可以将项目部署到ModelScope了。
这里需要注意的点有:

  • 添加环境变量:调用大模型的api_key不要暴露在代码中,可以在环境变量管理中添加:比如我的qwen-max需要设置"DASHSCOPE_API_KEY"。

在这里插入图片描述

  • 本地安装AgentScope:由于Agentscope目前还在迭代更新中,pip源安装的Agentscope版本是0.0.1,会出现依赖冲突,这里推荐源码安装:
# 在自己的项目代码中
git clone https://github.com/modelscope/agentscope.git
cd AgentScope
rm -rf .git

# 新建app.py, 写入
import os
os.system('pip install -e ./agentscope')
os.system('python app_game.py')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 启动失败:重启空间展示
  • Gradio报错:点击‘查看日志’,如果发现是gradio相关的报错,查看线下gradio版本和云端的是否一致
pip show gradio
  • 1

4. 未完待续

本项目利用AgentsSope框架,开发了一款和Agent玩飞花令的游戏,充分验证了当前大模型在中国古诗词知识储备方面的能力,未来期待在已有框架的基础上,开发更多的古诗词经典游戏:

  • 尾字接龙:根据一句古诗词的末尾的字为关键字,给出以该关键字开头的一句古诗词。
  • 即景联诗:由Agent根据一句古诗词画出对应的风景图,用户根据风景图猜出对应的古诗词是啥,最后由Agent做出评审。
  • 九宫格:将一句古诗词的文字随机打乱,再加上干扰字,组成一个九宫格,用户根据九宫格猜出其中包含的一句古诗词,最后由Agent做出评审。
    此外,还可以尝试:
  • 利用AgentsSope框架中的tools,接入更多外部API,比如语音合成,提供更多的音色选项,为用户提供更多的游戏体验。
  • 增加游戏难度等级,为用户提供更多的激励机制。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/568897
推荐阅读
相关标签
  

闽ICP备14008679号