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的当前状态,希望不影响现有的工作,我们提出了以下设计解决方案:
- 将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。
- 引入agent注册中心Agent Registry Center(https://github.com/modelscope/modelscope-agent/blob/master/modelscope_agent/agents_registry.py)概念:
- 用于维护系统中agent的信息并实现相关能力扩展。
- 用于更新agent状态。
- 引入任务中心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
- 找到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 }
- 找到函数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