首页 > 其他分享 >使用AgentScope构建多智能体群聊系统

使用AgentScope构建多智能体群聊系统

时间:2024-09-16 14:51:58浏览次数:13  
标签:群聊 name list agent AgentScope 构建 agents config speak

本文将介绍如何使用AgentScope框架构建一个简单的多智能体群聊系统,并解释其背后的实现逻辑。

首先写好设置文件。

agent_config.json

[
    {
        "class": "DialogAgent",
        "args":{
            "name": "Lingfeng",
            "sys_prompt": "You are Lingfeng, a noble in the kingdom of Xi'an. You are a wise and powerful wizard.",
            "model_config_name": "qwen_config",
            "use_memory": true
        }
    },
    {
        "class": "DialogAgent",
        "args":{
            "name": "Boyu",
            "sys_prompt": "You are Boyu, a friend of Lingfeng. Your speech is moderately humorous.",
            "model_config_name": "qwen_config",
            "use_memory": true
        }
    },
    {
        "class": "DialogAgent",
        "args":{
            "name": "Haotian",
            "sys_prompt": "You are Haotian, Lingfeng's cousin, a young man who is studying at the university.",
            "model_config_name": "qwen_config",
            "use_memory": true
        }
    }
]

model_config.json

{
    "config_name": "qwen_config",
    "model_type": "dashscope_chat",
    "model_name": "qwen-turbo",
    "api_key": "xxxxx",
    "generate_kwargs": {
        "temperature": 0.5
    }

}

实现代码

主逻辑 main.py
import agentscope
from agentscope.agents import DialogAgent, UserAgent
from agentscope.message import Msg
from agentscope.msghub import msghub
import logging

from groupchat_utils import (
    select_next_one,
    filter_agents,
)

# 定义用户发言超时时间
USER_TIME_TO_SPEAK = 30
# 默认聊天话题
DEFAULT_TOPIC = """
This is a chat room and you can speak freely and briefly.
"""
SYS_PROMPT = """
You can designate a member to reply to your message, you can use the @ symbol.
This means including the @ symbol in your message, followed by
that person's name, and leaving a space after the name.
All participants are: {agent_names}
"""

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def main() -> None:
    # 初始化NPC代理
    npc_agents = agentscope.init(
        model_configs="./model_config.json",
        agent_configs="./agent_config.json",
        project="Conversation with Mentions",
    )

    user = UserAgent()

    agents = list(npc_agents) + [user]
	# 创建初始提示消息
    hint = Msg(
        name="Host",
        content=DEFAULT_TOPIC
        + SYS_PROMPT.format(
            agent_names=[agent.name for agent in agents],
        ),
        role="assistant",
    )

    rnd = 0
    speak_list = []
	# 使用消息中心管理代理之间的通信
    with msghub(agents, announcement=hint):
        while True:
            try:
                x = user(timeout=USER_TIME_TO_SPEAK)
                if x.content == "exit":
                    break
            except TimeoutError:
                x = {"content": ""}
                logger.info(
                    f"User has not typed text for "
                    f"{USER_TIME_TO_SPEAK} seconds, skip."
                )
			# 根据用户输入过滤出需要发言的代理
            speak_list += filter_agents(x.content, npc_agents)
            # print("speak_list_before:", speak_list)
            # for agent in speak_list:
                # print(f"Name: {agent.name}")
			# 如果有需要发言的代理,则选择第一个
            if len(speak_list) > 0:
                next_agent = speak_list.pop(0)
                x = next_agent()
            else:
                # 否则根据轮次选择下一个代理
                next_agent = select_next_one(npc_agents, rnd)
                x = next_agent()

            speak_list += filter_agents(x.content, npc_agents)
            # print("speak_list_after:", speak_list)

            rnd += 1

if __name__ == "__main__":
    main()
辅助函数 groupchat_utils.py
import re
from typing import Sequence

def filter_agents(string: str, agents: Sequence) -> Sequence:
    """
    筛选出字符串中包含的代理名称,并返回找到的代理对象列表。
    """
    if len(agents) == 0:
        return []
    pattern = (
        r"@(" + "|".join(re.escape(agent.name) for agent in agents) + r")\b"
    )
    matches = re.findall(pattern, string)
    agent_dict = {agent.name: agent for agent in agents}
    ordered_agents = [
        agent_dict[name] for name in matches if name in agent_dict
    ]
    return ordered_agents

def select_next_one(agents: Sequence, rnd: int) -> Sequence:
    """
    根据轮次选择下一个发言的代理。
    """
    return agents[rnd % len(agents)]

代码解析

这段代码实现了多智能体之间的群聊功能。用户可以与多个智能体(NPC)进行互动,而这些智能体之间也能相互交流。关键在于:

  • 初始化智能体:通过agentscope.init()函数加载配置文件,并创建智能体实例。
  • 消息传递:使用msghub来管理智能体间的通讯。
  • 指定回复者:通过在消息中包含@符号加上特定智能体的名字来指定回复的对象。
  • 轮询机制:如果没有明确指定回复者,则按照轮询的方式选择下一个发言的智能体。

最终效果

运行上述代码后,用户可以参与到与多个智能体的对话中。用户输入的内容将被解析,如果含有@符号,则直接指定了下一个应该回应的智能体。如果没有指定,则按顺序选择智能体回应。

代码中的print部分为我加入的输出,可以看到目前在运行中还存在一些问题。 1.如果名字不打的完全准确是无法识别的

使用AgentScope构建多智能体群聊系统_agent

2.如果一次@了两个人,中间会需要用户进行输入

使用AgentScope构建多智能体群聊系统_agent_02

3.让NPC互相聊天会出现一个NPC把所有的NPC对话全部生成的情况。

使用AgentScope构建多智能体群聊系统_agent_03

有一些推想的解决方案,还没有实行,但是暂且列出来:

1.引入模糊匹配机制解决名字识别问题。通过使用正则表达式或其他字符串匹配算法,系统可以识别近似的名称输入,并将其映射到正确的NPC上。

2.可以通过调整代码逻辑解决。

3.目前还没有解决方案。

标签:群聊,name,list,agent,AgentScope,构建,agents,config,speak
From: https://blog.51cto.com/u_16958225/12031469

相关文章

  • 【Linux】Linux项目自动化构建工具-make/Makefile
    make/Makefile1.背景2.概念3.实例代码1.背景一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作makefile带来的好处就是——......
  • 读构建可扩展分布式系统:方法与实践05分布式缓存
    1. 分布式缓存1.1. 缓存存在于应用程序的许多地方1.1.1. 行应用程序的CPU具有高速多级硬件缓存,可以减少相对较慢的主内存访问1.1.2. 数据库引擎可以利用主内存来缓存数据存储的内容,这样在许多情况下查询就可以不用访问速度相对较慢的磁盘1.2. 分布式缓存是可扩展......
  • 走进低代码表单开发(三):高效业务功能构建
    前面我们已经介绍了勤研低代码开发平台的页面设计相关的内容,当页面设计完成后,我们将继续进行表单的功能开发,接下来,我们一起走进勤研低代码开发平台高效便捷的表单功能设计,来看看勤研低代码平台如何为用户带来全新的开发体验。一、可视化布局与事件定义勤研低代码开......
  • 【webpack4系列】设计可维护的webpack4.x+vue构建配置(终极篇)
    构建配置包设计构建配置管理的可选方案:通过多个配置文件管理不同环境的构建,webpack--config参数进行控制将构建配置设计成一个库,比如:xxx-webpack抽成一个工具进行管理,比如:create-vue-app将所有的配置放在一个文件,通过--env参数控制分支选择通过多个配置文件管理不同......
  • 【webpack4系列】编写可维护的webpack构建配置(四)
    构建配置包设计构建配置管理的可选方案:通过多个配置文件管理不同环境的构建,webpack--config参数进行控制将构建配置设计成一个库,比如:xxx-webpack抽成一个工具进行管理,比如:create-vue-app将所有的配置放在一个文件,通过--env参数控制分支选择通过多个配置文件管理不同......
  • 【webpack4系列】webpack构建速度和体积优化策略(五)
    目录速度分析:使用speed-measure-webpack-plugin体积分析:使用webpack-bundle-analyzer使用高版本的webpack和Node.js多进程/多实例构建资源并行解析可选方案使用HappyPack解析资源使用thread-loader解析资源多进程并行压缩代码方法一:使用parallel-uglify-plugin插件方法......
  • 【webpack4系列】webpack初识与构建工具发展(一)
    为什么需要构建工具?转换ES6语法转换JSXCSS前缀补全/预处理器压缩混淆图片压缩前端构建演变之路ant+YUIToolgruntgulp、fis3webpack、rollup、parcel为什么选择webpack?社区⽣态丰富配置灵活和插件化扩展官⽅方更新迭代速度快初识webpack,简单的例子入手......
  • CMake构建学习笔记16-使用VS进行CMake项目的开发D4
    目录*1.概论2.详论2.1创建工程2.2加载工程2.3配置文件:飞数机场2.4工程配置2.5调试执行3.项目案例4.总结1.概论在之前的系列博文中,我们学习了如何构建第三方的依赖库,也学习了如何去组建自己的CMake项目,尤其是学习了CMake的核心配置文件CMakeLists.txt如......
  • springboot社区网格化管理平台构建管理系统|【源码+论文+PPT+部署视频】
    我们提供多元化的技术项目服务,涵盖Java、PHP、Python等编程语言,以及前端开发、人工智能、大数据、单片机开发、ASP.NET、物联网等领域。我们还提供简历模板、面试题库和学习资料,帮助用户提升技术能力和就业竞争力。我们的服务内容包括:免费功能设计、任务书和开题报告撰写、......
  • 读构建可扩展分布式系统:方法与实践04应用服务
    1. 应用服务1.1. 任何系统的核心都在于实现应用需求的特定业务逻辑1.2. 服务是可扩展软件系统的核心1.2.1. 它们将契约定义为一个API,向客户端声明它们的能力1.3. 应用服务器高度依赖于编程语言,但通常都会提供多线程编程模型,允许服务同时处理许多请求1.4. 多服务配置......