2026年7月9日 周四晚上19:30,报名腾讯会议了解“如何构建自进化的动态知识库(Brain)”(限30人)
免费POC, 零成本试错
FDE知识库

FDE知识库

学习大模型的前沿技术与行业落地应用


收藏

手把手教你捏一个自己的Agent

发布日期:2024-04-26 23:51:45 浏览次数: 4422
作者:魔搭ModelScope社区

微信搜一搜,关注“魔搭ModelScope社区”

01

前言



Modelscope AgentFabric是一个基于ModelScope-Agent的交互式智能体应用,用于方便地创建针对各种现实应用量身定制智能体,目前已经在生产级别落地


AgentFabric围绕可插拔和可定制的LLM构建,并增强了指令执行、额外知识检索和利用外部工具的能力。AgentFabric提供的交互界面包括:

  • 智能体构建器:一个自动指令和工具提供者,通过与用户聊天来定制用户的智能体

  • 用户智能体:一个为用户的实际应用定制的智能体,提供构建智能体或用户输入的指令、额外知识和工具

  • 配置设置工具:支持用户定制用户智能体的配置,并实时预览用户智能体的性能


目前AgentFabric围绕DashScope提供的 Qwen2.0 LLM API(通义千问API如何使用_模型服务灵积(DashScope)-阿里云帮助中心 (aliyun.com)) 在AgentFabric上构建不同的智能体应用。


在使用DashScope提供的qwen api构建应用与定制交互的过程中,我们发现选取千亿级别参数的qwen-max或开源的qwen-72b等大规模参数模型能获得较好的工具调用和角色扮演效果。大规模参数模型效果好,但难以在消费级机器上进行本地部署调用;同时小模型如qwen-7b-chat对工具调用的能力较弱。因此本篇旨在针对AgentFabric的工具调用场景,提供可用的数据集和微调方法,使稍小的模型如qwen-7b-chat也具有能在AgentFabric中完成工具调用的能力。


02

环境安装



环境准备(基于modelscope镜像)

考:swift/docs/source/LLM/Agent微调最佳实践.md at main · modelscope/swift · GitHub

# 设置pip全局镜像 (加速下载)pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/# 安装ms-swiftgit clone https://github.com/modelscope/swift.gitcd swiftpip install -e .[llm]
# 环境对齐 (通常不需要运行. 如果你运行错误, 可以跑下面的代码, 仓库使用最新环境测试)pip install -r requirements/framework.txt-Upip install -r requirements/llm.txt-U


03

数据准备



为训练Agent能力,魔搭官方提供了两个开源数据集:

  • 魔搭通用问答知识数据集 该数据集包含了38万条通用知识多轮对话数据

    • 数据集链接:https://www.modelscope.cn/datasets/iic/ms_bench/summary

  • 魔搭通用Agent训练数据集 该数据集包含了3万条Agent格式的API调用数据

    • 数据集链接:https://www.modelscope.cn/datasets/iic/ms_agent/summary

相关使用方式参考:swift/docs/source/LLM/Agent微调最佳实践.md at main · modelscope/swift · GitHub


为了让qwen-7b-chat能够在AgentFabric上有比较好的效果,我们尝试使用通用Agent训练数据集ms_agent对qwen-7b-chat进行微调。微调后模型确实能够在ms_agent格式的prompt下获得工具调用能力。但在AgentFabric上对工具的调用表现欠佳,出现了不调用工具、调用工具时配置的参数错误、对工具调用结果的总结错误等,10次访问能成功正确调用1次。


  • 不调用工具;总结时胡编乱造


  • 调用时不按要求填写参数


考虑到AgentFabric是基于大规模文本模型调配的prompt,侧重角色扮演和应用,与ms_agent的prompt格式有区别。finetuned稍小模型的通用泛化性稍弱,换格式调用确实可能存在效果欠佳的情况。


原ms_agent prompt示例

Answer the following questions as best you can. You have access to the following APIs:1. fire_recognition: Call this tool to interact with the fire recognition API. This API is used to recognize whether there is fire in the image. Parameters: [{"name": "image", "description": "The input image to recognize fire", "required": "True"}]
Use the following format:
Thought: you should always think about what to doAction: the action to take, should be one of the above tools[fire_recognition, fire_alert, call_police, call_fireman]Action Input: the input to the actionObservation: the result of the action... (this Thought/Action/Action Input/Observation can be repeated zero or more times)Thought: I now know the final answerFinal Answer: the final answer to the original input questionBegin!
输入图片是/tmp/2.jpg,协助判断图片中是否存在着火点# 工具


AgentFabric prompt示例

# 工具
## 你拥有如下工具:
amap_weather: amap_weather API。获取对应城市的天气数据 输入参数: {"type": "object", "properties": {"location": {"type": "string", "description": "城市/区具体名称,如`北京市海淀区`请描述为`海淀区`"}}, "required": ["location"]} Format the arguments as a JSON object.
## 当你需要调用工具时,请在你的回复中穿插如下的工具调用命令,可以根据需求调用零次或多次:
工具调用Action: 工具的名称,必须是[amap_weather]之一Action Input: 工具的输入Observation: <result>工具返回的结果</result>Answer: 根据Observation总结本次工具调用返回的结果,如果结果中出现url,请使用如下格式展示出来:![图片](url)

# 指令
你扮演一个天气预报助手,你需要查询相应地区的天气,并调用给你的画图工具绘制一张城市的图。
请注意:你具有图像和视频的展示能力,也具有运行代码的能力,不要在回复中说你做不到。
(。你可以使用工具:[amap_weather])朝阳区天气怎样?


ms_agent_for_agentfabric数据集

ms_agent 更新数据

为解决上述的prompt格式不匹配问题,我们首先将ms_agent转换成AgentFabric的prompt组织格式。从ms_agent到AgentFabric的转换过程可以通过如下脚本实现:


import jsonimport re
sys_prefix = "\n# 工具\n\n## 你拥有如下工具:\n\n"
def _process_system(text):apis_info = []api_pattern = r"(?<=\n\d\.)(.*?})(?=])"apis = re.findall(api_pattern,text,re.DOTALL)sys_prompt = sys_prefixfunc_names = []for api in apis:func_name = re.search(r'(.*?):', api).group(1).strip()func_names.append(func_name)api_name = re.search(r'(\S+)\sAPI', api).group(1)api_desc = re.search(r"useful for\?\s(.*?)\.",api).group(1)sys_prompt += f"{func_name}: {api_name} API。{api_desc}" + "输入参数: {\"type\": \"object\", \"properties\": {"paras = re.findall(r"Parameters: \[({.*})",api,re.DOTALL)required_paras = []for para in paras:para_name = re.search(r'"name": "(.*?)"',para).group(1)desc = re.search(r'"description": "(.*?)"',para).group(1)if re.search(r'"required": "(.*)"',para).group(1).strip().lower() == "true": required_paras.append(para_name)sys_prompt += f'"\{para_name}\": {{\"type\": \"string\", \"description\": \"{desc}\"}}' sys_prompt += "},\"required\": " + json.dumps(required_paras) + "} Format the arguments as a JSON object." + "\n\n"func_names = json.dumps(func_names)sys_prompt += f"## 当你需要调用工具时,请在你的回复中穿插如下的工具调用命令,可以根据需求调用零次或多次:\n\n工具调用\nAction: 工具的名称,必须是{func_names}之一\nAction Input: 工具的输入\nObservation: <result>工具返回的结果</result>\nAnswer: 根据Observation总结本次工具调用返回的结果,如果结果中出现url,请使用如下格式展示出来:![图片](url)\n\n\n# 指令\n\n你扮演AI-Agent,\n你具有下列具体功能:\n下面你将开始扮演\n\n请注意:你具有图像和视频的展示能力,也具有运行代码的能力,不要在回复中说你做不到。\n"
return sys_prompt
jsonl_file_path = 'ms_agent/train_agent_react.jsonl'target_file_path = 'new_ms_agent.jsonl'
modified_data = []
with open(jsonl_file_path, 'r', encoding='utf-8') as file:for line in file:json_obj = json.loads(line)system_prompt = json_obj["conversations"][0]["value"]json_obj["conversations"][0]["value"] = _process_system(system_prompt)modified_data.append(json_obj)
with open(target_file_path, 'w', encoding='utf-8') as file:for json_obj in modified_data:file.write(json.dumps(json_obj, ensure_ascii=False) + '\n')

转换后的30000条数据已上传至modelscope数据集,参考数据集链接: 

https://modelscope.cn/datasets/AI-ModelScope/ms_agent_for_agentfabric/summary



使用该数据集finetune后,得到的模型在AgentFabric上的效果明显好转:每次访问都能够去调用工具,且基本能正确调用工具。但同时也有对工具调用结果的总结稍弱、有时无法自动停止输出等问题。


  • 总结能力稍弱:已经查询到天气,仍回答“无法获取实时天气数据”


  • 停止能力稍弱:未生成终止符,多次调用同一工具同一参数


AgentFabric新增数据

ms_agent数据集全为英文、且并无AgentFabric的roleplay等内容信息。虽然基模型qwen-7b-chat拥有中文能力,使通过new_ms_agent 数据集finetune后的模型能够正常识别用户意图,正确调用工具;但总结和停止能力都稍弱。 为此,我们通过开源的AgentFabric框架实际调用访问,获得了一些AgentFabric使用过程中实际发送给模型的prompt。筛选处理成一个数据集,加上new_ms_agent的数据一起finetune。得到的模型在AgentFabric上修复了此前的总结稍弱、有时无法自动停止问题。


  • 多次调用均响应正常,甚至有一次get到了instruction中的内容。


处理好的488条数据已上传至modelscope数据集,可通过如下链接访问下载:

https://modelscope.cn/api/v1/datasets/AI-ModelScope/ms_agent_for_agentfabric/repo?Revision=master&FilePath=addition.jsonl


效果评估

测试数据来自以下数据集:

  • https://modelscope.cn/datasets/AI-ModelScope/ms_agent_for_agentfabric/summary 

  • https://modelscope.cn/datasets/iic/ms_bench/summary


以上数据混合后,按照1%比例采样作为test data

备注: 横轴为训练步数,纵轴为准确率


总结

我们在原有的两个用于agent训练集上又额外的增加了基于AgentFabric 版本的数据集,目前可供参考的agent应用数据集如下:

  • 魔搭通用agent数据集(agentfabric版)该数据集包含了30488条可支持AgentFabric格式的API调用数据

    • 数据集链接:https://modelscope.cn/datasets/AI-ModelScope/ms_agent_for_agentfabric/summary

  • 魔搭通用问答知识数据集 该数据集包含了38万条通用知识多轮对话数据

    • 数据集链接:https://www.modelscope.cn/datasets/iic/ms_bench/summary

  • 魔搭通用Agent训练数据集 该数据集包含了3万条Agent格式的API调用数据

    • 数据集链接:https://www.modelscope.cn/datasets/iic/ms_agent/summary



04

微调流程


训练准备,以下执行过程参考了用消费级显卡微调属于自己的Agent!


在gpu机器执行

将new_ms_agent.jsonl和addition.jsonl两个文件的具体路径通过--custom_train_dataset_path进行配置后,在8* A100 环境中可通过以下命令开启训练,需约2-3小时;如果是单卡训练,需要修改nproc_per_node=1。

# Experimental environment: A100
cd examples/pytorch/llm
# 如果使用1张卡则配置nproc_per_node=1nproc_per_node=8
export PYTHONPATH=../../..
# 时间比较久,8*A100需要 2+小时,nohup运行nohup torchrun \--nproc_per_node=$nproc_per_node \--master_port 29500 \llm_sft.py \--model_id_or_path qwen/Qwen-7B-Chat \--model_revision master \--sft_type lora \--tuner_backend swift \--dtype AUTO \--output_dir output \--custom_train_dataset_path ms_agent_for_agentfabric/new_ms_agent.jsonl ms_agent_for_agentfabric/addition.jsonl--train_dataset_mix_ratio 2.0 \--train_dataset_sample -1 \--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 \--self_cognition_sample 3000 \--model_name 卡卡罗特 \--model_author 陶白白 \--gradient_checkpointing true \--batch_size 2 \--weight_decay 0.01 \--learning_rate 5e-5 \--gradient_accumulation_steps $(expr 1 / $nproc_per_node) \--max_grad_norm 0.5 \--warmup_ratio 0.03 \--eval_steps 100 \--save_steps 100 \--save_total_limit 2 \--logging_steps 10 &


训练完成后,能在nohup.out文件看到最后的 log 显示最佳checkpoint的存放路径best_model_checkpoint: /home/workspace/swift/examples/pytorch/llm/output/qwen-7b-chat/v0-20240314-211944/checkpoint-2828

[INFO:swift] best_model_checkpoint: /home/workspace/swift/examples/pytorch/llm/output/qwen-7b-chat/v0-20240314-211944/checkpoint-2828[INFO:swift] images_dir: /home/workspace/swift/examples/pytorch/llm/output/qwen-7b-chat/v0-20240314-211944/images[INFO:swift] End time of running main: 2024-03-14 23:33:54.658745



05

部署模型



此时我们获得了一个自己的finetuned model,可以将它部署到自己的机器上使用。以下执行过程参考了swift/docs/source/LLM/VLLM推理加速与部署.md at main · modelscope/swift · GitHub


 1)合并lora

由于sft_type=lora,部署需要先将LoRA weights合并到原始模型中:


python tools/merge_lora_weights_to_model.py --model_id_or_path /dir/to/your/base/model --model_revision master --ckpt_dir /dir/to/your/lora/model

其中需要替换 /dir/to/your/base/model 和 /dir/to/your/lora/model为自己本地的路径, /dir/to/your/lora/model为训练最终的best_model_checkpoint。/dir/to/your/base/model 可以通过snapshot_download接口查看,训练时使用的基模型为qwen/Qwen-7B-Chat,则本地路径为:

from modelscope import snapshot_downloadbase_model_path = snapshot_download('qwen/Qwen-7B-Chat')print(base_model_path)


也可以直接使用swift export指令完成merge lora

CUDA_VISIBLE_DEVICES=0 swift export \--ckpt_dir '/path/to/qwen-7b-chat/vx-xxx/checkpoint-xxx' --merge_lora true


执行后完成后得到merge后的ckpt路径。

[INFO:swift] Saving merged weights...[INFO:swift] Successfully merged LoRA and saved in /home/workspace/swift/examples/pytorch/llm/output/qwen-7b-chat/v0-20240314-211944/checkpoint-2828-merged.[INFO:swift] End time of running main: 2024-03-18 10:34:54.307471


2)拉起部署


nohup python -m vllm.entrypoints.openai.api_server --model /dir/to/your/model-merged --trust-remote-code &


需要将/dir/to/your/model-merged替换成自己本地merge后的ckpt路径。

当nohup.out文件显示以下信息时,表示部署完成


INFO: Started server process [531583]INFO: Waiting for application startup.INFO: Application startup complete.INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

测试部署:需要将/dir/to/your/model-merged替换成自己本地merge后的ckpt路径

curl http://localhost:8000/v1/completions -H "Content-Type: application/json" -d '{"model": "/dir/to/your/model-merged", "prompt": "San Francisco is a", "max_tokens": 7, "temperature": 0}'


也可以使用swift deploy 进行模型部署

CUDA_VISIBLE_DEVICES=0 swift deploy --ckpt_dir /path/to/qwen-7b-chat/vx-xxx/checkpoint-xxxx-merged

这种方式下测试部署和之后的config配置中的`"model"`需要改为qwen-7b-chat




05

Modelscope-Agent中使用



简单测试

可通过如下代码简单测试模型能力,使用时需要将/dir/to/your/model-merged替换成自己本地merge后的ckpt路径。

from modelscope_agent.agents.role_play import RolePlay# NOQA

def test_weather_role():role_template = '你扮演一个天气预报助手,你需要查询相应地区的天气,并调用给你的画图工具绘制一张城市的图。'
llm_config ={"model_server": "openai","model": "/dir/to/your/model-merged","api_base": "http://localhost:8000/v1","is_chat": True,"is_function_call": False,"support_stream": False}#llm_config = {"model": "qwen-max", "model_server": "dashscope"}
# input tool namefunction_list = ['amap_weather']
bot = RolePlay(function_list=function_list, llm=llm_config, instruction=role_template)
response = bot.run('朝阳区天气怎样?')
text = ''for chunk in response:text += chunkprint(text)assert isinstance(text, str)

test_weather_role()


Agentfabric中使用

  1. 进入agentfabric目录

cd modelscope-agent/apps/agentfabric


  1. 在config/model_config.json文件,新增训好的本地模型

"my-qwen-7b-chat": {"type": "openai","model": "/dir/to/your/model-merged","api_base": "http://localhost:8000/v1","is_chat": true,"is_function_call": false,"support_stream": false}

再次提醒,如果使用swift deoloy部署模型需要将"model"改为qwen-7b-chat



3. 设置API key。在以下实践中,会调用wanx image generation

高德天气 ,需要点击链接按照教程进行注册并手动设置API KEY

export DASHSCOPE_API_KEY=your_api_keyexport AMAP_TOKEN=your_api_key


4. 在agentfabric目录下执行如下命令拉起gradio


GRADIO_SERVER_NAME=0.0.0.0 PYTHONPATH=../../python app.py


然后在浏览器中输入你 服务器IP:7860打开即可看到如下界面



内置能力选择agent可以调用的API, 这里选择`Wanx Image Generation`和`高德天气` 点击更新配置,等待配置完成后在右侧的输入栏中即可与Agent交互












53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询

扫码登录
登录即表示您同意《53AI网站服务协议》
服务协议

欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。

在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。

一、 定义

本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。

会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。

知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。

二、 账号注册与登录

登录方式:本网站支持以下登录方式,您可根据实际情况选择:

微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。

手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。

账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。

实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。

未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。

三、 服务内容与规范

知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。

服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。

禁止行为:您在使用服务时不得实施以下行为:

利用技术手段批量爬取、下载、转存知识库内容;

将知识库内容用于商业目的或未经授权地向第三方传播;

干扰本网站正常运行或侵犯其他用户合法权益;

发布违法违规信息或从事违反公序良俗的活动。

四、 知识产权声明

权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。

有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。

侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。

五、 个人信息保护

我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。

您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。

您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。

六、 免责声明

内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。

不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。

第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。

七、 违约责任

如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。

如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。

八、 法律适用与争议解决

本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。

因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。

九、 其他

本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。

本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。

我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。


已查阅