ModelScope-Agent是魔搭社区推出的适配开源大语言模型(LLM)的AI Agent(智能体)开发框架,借助ModelScope-Agent,所有开发者都可基于开源 LLM 搭建属于自己的智能体应用。在最新升级完Assistant API和Tool APIs之后,我们又迎来了多智能体聊天室的升级,通过几分钟快速配置即可搭建一个全新的聊天室。

 

开源地址:

https://github.com/modelscope/modelscope-agent/

 

论文:

https://arxiv.org/abs/2309.00986

 

框架升级

ModelScope-Agent基础框架

ModelScope-Agent是一个通用的、可定制的Agent框架,用于实际应用程序,其基于开源的大语言模型 (LLMs) 作为核心,包含记忆控制、工具使用等模块。开源 LLM 主要负责任务规划、调度以及回复生成;记忆控制模块,主要包含知识检索以及 prompt (提示词)管理;工具使用模块,包含工具库以及工具检索和工具可定制化。

 

ModelScope-Agent多智能体聊天框架

单智能体系统(single-agent)在复杂的互动场景中,例如斯坦福小镇、软件公司、多方辩论等,经常会遇到困难。 考虑到ModelScope-Agent的当前状态,希望不影响现有的工作,我们提出了以下设计解决方案:

 

  1. 将multi-agent的交互逻辑与single-agent的逻辑解耦:

    • 使用**AgentEnvMixin**(https://github.com/modelscope/modelscope-agent/blob/master/modelscope_agent/agent_env_util.py)类基于Ray处理所有multi-agent通信逻辑,无需更改任何现有single-agent模块中的原始逻辑。

    • 在**Environment**(https://github.com/modelscope/modelscope-agent/blob/master/modelscope_agent/environment.py)模块中管理环境信息,使用发布/订阅机制来推动agent之间的互动,而不会在执行层面阻塞agent。

 

  1. 引入agent注册中心Agent Registry Center(https://github.com/modelscope/modelscope-agent/blob/master/modelscope_agent/agents_registry.py)概念:

    • 用于维护系统中agent的信息并实现相关能力扩展。

    • 用于更新agent状态。

 

  1. 引入任务中心Task Center(https://github.com/modelscope/modelscope-agent/blob/master/modelscope_agent/task_center.py)概念:

    • 设计的任务中心具有开放性,允许将消息订阅或发布给所有agent,支持agent之间各种形式的交互,如随机交流,或者通过用户定义的逻辑以循环方式进行推进。

    • 允许通过使用send_to 和sent_from 的方法直接交互方法,可快速开发流程简单的应用。

    • 支持聊天机器人模式和终端模式,使用户可以在流媒体聊天gradio应用程序或终端上运行multi-agent。

 

 

快速开始

我们提供了一个可以直接使用的创空间,默认了三个聊天室,用户可以自己构建新的聊天室,只需要配置人物和聊天主题即可,这里我们方便大家快速开始,提供了通义星尘的服务API(https://xingchen.aliyun.com/xingchen/)或者通义千问的API(https://dashscope.console.aliyun.com/model)可以免费申请试用

 

创空间地址:

https://modelscope.cn/studios/AI-ModelScope/modelscope_agent_multi_roles_room/summary

 

最近大火的庆余年二,也只需几分钟按照下面代码的配置,就可以在群聊里面体验当范闲,和多个红粉知己进行畅聊

cd modelscope-agent/apps/multi_roles_chat_room
vim story_holder.py

# 新增这段角色和故事配置即可

STORY_3 = """用户是庆余年男主范闲,在第一部中被二皇子算计自杀诈死,与多位女子都有过深入接触,也被多个女子所喜爱"""

ROLES_3 = {
    '范闲': '由张若昀饰演。尚书范建的养子,叶轻眉与庆帝的儿子。外形俊美,喜怒不形于色,深藏绝世神功。在功成名就之后归隐江南。结识了不少美丽动人的女子,与她们有过爱恨情仇。包括林婉儿,海棠
朵朵,战豆豆和司理理',
    '林婉儿': '林婉儿是电视剧《庆余年》中的女主角,由演员李沁饰演,剧中为庆国宰相林若甫与长公主李云睿之女,范闲的正夫人。她性格活泼开朗,善良正直,爱打抱不平,也爱吃鸡腿,因此有“鸡腿姑娘”的外号。她对范闲一见钟情,两人经历了许多波折后终于走到一起,成为了令人羡慕的夫妻。她身体不好,患有肺结核,后来在范闲的努力下治愈了病痛,并为范闲生下了一个儿子。最后她与范闲隐居田园,过着>幸福的生活。',
    '海棠朵朵': '海棠朵朵是北齐苦荷的关门弟子,身兼圣女重任,村姑模样的打扮与做派让她成为众多九品高手中的异类。范闲出使北齐的路上遇见了海棠朵朵,两人性情相投十分的默契,后来海棠朵朵也陪伴
范闲经历了很多的风雨。范闲和海棠朵朵之间有着深厚的友情和爱情,但是由于身份和国家的原因,他们始终不能公开在一起。虽然海棠朵朵和范闲之间都彼此有好感,但是两个人最终却没有在一起。',
    '战豆豆': '战豆豆是北齐皇帝,一生最大的夙愿是比肩甚至超越那位庆国的伟大皇帝,但可惜的是女儿身让她处处受制。毕竟不是谁都能成为武则天的,后在四顾剑庐中与范闲同房,生下一个女儿小名取为“>红豆饭”,由此可见这位女皇帝虽身居高位,但终究还是带有小女人心态的。战豆豆对范闲有着复杂的情感,既有敌意又有爱意,她曾经想过用各种手段留住范闲,但是最终还是放弃了。她最后的结局也是终身隐瞒
自己女儿身的事实,终身守护北齐国。',
    '司理理': '司理理是北齐国派来的密探,真实身份是庆国皇室血脉,由于夺权事件被迫远走异国他乡。她与范闲相识相知,对他产生了不一样的感情。她曾经为了保护范闲而受尽酷刑,也曾经为了帮助范闲而
背叛了自己的国家。她对范闲的爱情是无私而忠贞的,但是却没有得到回报。她最后为了维护北齐国的尊严,选择留在北齐皇帝战豆豆身边充当爱妃。',
}

配置完成,实测效果

开源数据

魔搭开源多智能体数据集:

https://modelscope.cn/datasets/iic/MSAgent-MultiRole/summary

 

首个中文多智能体角色聊天场景的开源数据集,推动多智能体角色扮演中文领域的发展

 

进阶训练

SWIFT集成训练

我们可以使用魔搭社区的SWIFT框架微调模型来增强模型的角色扮演能力,现已集成魔搭开源多智能体数据集

 

微调代码开源地址: 

https://github.com/modelscope/swift

 

环境准备

git clone https://github.com/modelscope/swift.git
cd swift
pip install .[llm]

 

以llama3-8b-instruct模型为例,只需一行指令开始训练.

train_dataset_mix_ratio会指定混合通用数据集的比例,默认为ms-bench,也可以通过指定train_dataset_mix_ds来指定

swift sft --model_type llama3-8b-instruct --dataset ms-agent-multirole --train_dataset_mix_ratio 2.0

同时支持更多的自定义训练参数设置

CUDA_VISIBLE_DEVICES=0 \
swift sft \
    --model_type llama3-8b-instruct \
    --model_revision master \
    --sft_type lora \
    --tuner_backend peft \
    --template_type AUTO \
    --dtype AUTO \
    --output_dir output \
    --dataset ms-agent-multirole \
    --train_dataset_mix_ratio 2.0
    --num_train_epochs 2 \
    --max_length 2048 \
    --check_dataset_strategy warning \
    --lora_rank 8 \
    --lora_alpha 32 \
    --lora_dropout_p 0.05 \
    --lora_target_modules ALL \
    --gradient_checkpointing true \
    --batch_size 1 \
    --weight_decay 0.1 \
    --learning_rate 1e-4 \
    --gradient_accumulation_steps 16 \
    --max_grad_norm 0.5 \
    --warmup_ratio 0.03 \
    --eval_steps 100 \
    --save_steps 100 \
    --save_total_limit 2 \
    --logging_steps 10 \

 

有关参数说明及更多自定义参数,可以参考文档https://github.com/modelscope/swift/blob/main/docs/source/LLM/%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0.md

 

微调后推理脚本: (这里的ckpt_dir需要修改为训练生成的checkpoint文件夹)

CUDA_VISIBLE_DEVICES=0 \
swift infer \
    --ckpt_dir "output/llama3-8b-instruct/vx-xxx/checkpoint-xxx" \
    --use_flash_attn true \
    --temperature 0.3 \
    --top_p 0.7 \
    --repetition_penalty 1. \
    --do_sample true \
    --merge_lora false

 

微调后推理结果

--------------------------------------------------
[PROMPT]<|begin_of_text|><|start_header_id|>user<|end_header_id|>

【对话情节设定】
猴王孙悟空意外闯入了一片神秘的森林,在这里他遇到了生活多年的两位隐士——文士李白和智者孔子。他们围坐在火堆旁,讨论什么是真正的智慧。

【所有对话角色设定】
孙悟空:喜爱自由,好奇而不拘泥,时而性急,总喜欢用自己的方式解决问题。
李白:飘逸脱俗,好酒且热爱大自然,言辞雄壮,常常自豪于自己的才华和不羁。
孔子:沉稳内敛,讲究礼仪和秩序,言语中透露着深邃的哲理和对人类行为的洞察。

【你的角色设定】
孙悟空:好奇而不拘泥,性急,喜欢用自己的方式解决问题。

【注意事项】
1. 这是聊天室,不要发送私信给任何人
2. 仅代表你个人说话,不要扮演其他人,
    只根据对话历史进行回复
3. 长话短说,不要说太多话,不要超过50字 

【chat history】
 孙悟空:你们为何独坐山林,再不济也得有个讲求吧?
 李白:采菊东篱下,悠然见南山。远离尘嚣,方得真我自在。
 孔子:吾日三省吾身。在山林间,更易反观内心,修身齐家治国平天下尚需深思。
 孙悟空:又治国又平天下,你们不觉得太大了些?我看打怪兽才爽快!
 李白:天地虽广,匹夫之勇亦可走天涯,治剑而浩歌,独我疏狂。
 孔子:力可拔山兮其心将恬,猿啼鹿鸣兮,吾将安贫。<|eot_id|><|start_header_id|>assistant<|end_header_id|>

[OUTPUT]力拔山兮心恬,听闻如此高见,悟空倒也心动。<|eot_id|>

[LABELS]我看是你们各有所好,或许智慧也不过如此。妙就妙在顺其自然吧!
--------------------------------------------------
[PROMPT]<|begin_of_text|><|start_header_id|>user<|end_header_id|>

【对话情节设定】
一位美食博主(张小影)在尝试一家新开张的餐厅(星海餐厅),偶遇两位好友——搞笑艺人(韩笑)和闻名遐迩的食评家(梁味评)。三人不约而同地来评价这家餐厅,他们的对话中充满了幽默元素与专业分析。

【所有对话角色设定】
张小影:乐观开朗的美食博主,擅长拍照和制作吸引眼球的内容,对食物品质有一定了解,但更专注于整体体验。
韩笑:以幽默风趣著称的搞笑艺人,言辞之间总能逗乐身边的人,对美食的了解一般,但喜欢尝试新奇的事物。
梁味评:资深食评家,对食物从味道到摆盘的要求极高,有时显得有些挑剔,但分析评价总是一针见血。

【你的角色设定】
梁味评:严谨细致的资深食评家,对食物品质有着苛刻的要求,不容易被表面华丽的摆盘与氛围所迷惑,习惯深入挖掘每一道菜品背后的故事和调配秘诀。

【注意事项】
1. 这是聊天室,不要发送私信给任何人
2. 仅代表你个人说话,不要扮演其他人,
    只根据对话历史进行回复
3. 长话短说,不要说太多话,不要超过50字 

【chat history】
 张小影:哇,这里的装修风格好独特,得抓紧拍几张照片!
 韩笑:你看那边的服务员,穿得跟企鹅似的,是不是应该给他来段企鹅舞?
 梁味评:俗气!我们来这是为了品食,张小影,我希望你不只沉迷于表面。
 张小影:哈哈,梁大师以食为天,不过真的挺好看的嘛。
 韩笑:别吵了别吵了,我已经点了招牌菜,期待大师的点评!
 梁味评:那菜肴最好能配得上这华丽的装修,否则就是徒有其表。
 张小影:别那么悲观嘛,让我们先尝尝再说,对吧韩笑?
 韩笑:对对,品尝之后不好吃我来跳企鹅舞!
 梁味评:我的评价可不会因为你的舞蹈而改变。
 张小影:哦,菜来了,看着不错哦!我得好好录个视频。
 韩笑:说时迟,那时快,我得先尝为敬!<|eot_id|><|start_header_id|>assistant<|end_header_id|>

[OUTPUT]好吧,让我们看看这道菜能否让我的味蕾兴奋起来。<|eot_id|>

[LABELS]慢着,先观其色,闻其香,品其味,每一步都不可少。
--------------------------------------------------
[PROMPT]<|begin_of_text|><|start_header_id|>user<|end_header_id|>

【对话情节设定】
Alex、Charlie和Taylor是一支特种部队的成员,他们得到了一个新任务——潜入敌方重要设施,窃取关键情报。他们现在正在计划潜入的细节。

【所有对话角色设定】
- Alex: 特种部队的队长,富有经验,镇定自若,总是有着周密的计划。
- Charlie: 部队的武器专家,性格豪爽,善于应对突发情况,对武器了解透彻。
- Taylor: 通讯和电子设备专家,思维敏捷,话不多,但总能在关键时刻提供技术支持。

【你的角色设定】
Alex: 你是这个特种部队的队长,正对Charlie和Taylor进行新任务的动员和计划布置。

【注意事项】
1. 这是聊天室,不要发送私信给任何人
2. 仅代表你个人说话,不要扮演其他人,
    只根据对话历史进行回复
3. 长话短说,不要说太多话,不要超过50字 

【chat history】
 Alex:听好,这次任务关系重大,我们要确保万无一失。
 Charlie:我已经检查过装备了,每样东西都是最顶级的。
 Taylor:通讯和电子干扰设备都准备妥当,可以随时行动。
 Alex:检查一遍你们的潜行装备,噪音要控制在最低。
 Charlie:放心,我这些年来一直在优化我那套静音装备,作用很大。
 Taylor:对方的电子防御很强,我需要时间绕过安保系统。
 Alex:Charlie,你提前布置好我们的撤离路线。
 Charlie:考虑到敌方可能的追击,我会准备几个备选路线。
 Taylor:我收集的地形数据会帮助我们找到最适合潜行的路径。
 Alex:时间到了,我们三个月的训练就是为了这一刻,不容有失。
 Charlie:队长,放心,我们一直以来都是最好的团队。<|eot_id|><|start_header_id|>assistant<|end_header_id|>

[OUTPUT]那就让我们一起创造历史吧,行动要迅速,安全第一。<|eot_id|>

[LABELS]是时候展示我们的实力了,行动起来吧。

 

合并参数(支持量化)

如果想要合并参数,可以将merge_lora参数设为true

如果只是想要合并lora,可以使用export指令,同时支持对模型进行量化

CUDA_VISIBLE_DEVICES=0 swift export \
    --ckpt_dir 'output/llama3-8b-instruct/vx-xxx/checkpoint-xxx' \
    --merge_lora true \
    # 如果额外想要量化模型
    # --quant_bits 4 \
    # --dataset alpaca-zh --quant_method awq

 

模型部署

通过swift deploy指令部署模型

CUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir output/llama3-8b-instruct/vx-xxx/checkpoint-xxxx-merged

使用本地模型配置Modelscope-Agent chat-room

首先使用上述的swift deploy命令部署模型

修改/modelscope-agent/apps/multi_roles_chat_room/role_core.py

  1. 找到llm_config一行,替换为下面的值

llm_config = {
    'model': 'llama-8b-instruct',
    "api_base": "http://localhost:8000/v1",
    'model_server': 'openai',
    'api_key': 'empty',
    "is_chat": True,
    "is_function_call": False,
    "support_stream": False
}

 

  1. 找到函数init_all_remote_actors, 注释以下内容

# llm_config['model'] = select_model

 

启动chatroom后,无需选择model,体验本地模型作为agent

后续,modelscope-agent将会在多模态,mobile人机协同,agent能力训练上进行升级,为开发者带来更好用的多模态Agent,欢迎大家持续关注

 

开源地址:

https://github.com/modelscope/modelscope-agent/

 

论文:

https://arxiv.org/abs/2309.00986

 

点击链接👇直达原文

https://modelscope.cn/studios/AI-ModelScope/modelscope_agent_multi_roles_room/summary

Logo

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!

更多推荐