LLM 大模型学习必知必会系列(十):基于AgentFabric实现交互式智能体应用,Agent实战

简介: LLM 大模型学习必知必会系列(十):基于AgentFabric实现交互式智能体应用,Agent实战

LLM 大模型学习必知必会系列(十):基于AgentFabric实现交互式智能体应用,Agent实战

0.前言

Modelscope 是一个交互式智能体应用基于ModelScope-Agent,用于方便地创建针对各种现实应用量身定制智能体,目前已经在生产级别落地。AgentFabric围绕可插拔和可定制的LLM构建,并增强了指令执行、额外知识检索和利用外部工具的能力。AgentFabric提供的交互界面包括:

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

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

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

🔗 目前agentfabric围绕DashScope提供的 Qwen2.0 LLM API 在AgentFabric上构建不同的智能体应用。

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

1.环境安装

参考:Agent微调最佳实践-环境安装

    # 设置pip全局镜像 (加速下载)
    pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
    # 安装ms-swift
    git clone https://github.com/modelscope/swift.git
    cd swift
    pip install -e .[llm]

    # 环境对齐 (通常不需要运行. 如果你运行错误, 可以跑下面的代码, 仓库使用最新环境测试)
    pip install -r requirements/framework.txt  -U
    pip install -r requirements/llm.txt  -U

2.数据准备

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

相关使用方式参考:Agent微调最佳实践-数据准备

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

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

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

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

ms_agent数据集格式:

    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 do
    Action: 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 action
    Observation: the result of the action
    ... (this Thought/Action/Action Input/Observation can be repeated zero or more times)
    Thought: I now know the final answer
    Final Answer: the final answer to the original input question
    Begin!

    输入图片是/tmp/2.jpg,协助判断图片中是否存在着火点

agentfabric:

    # 工具

    ## 你拥有如下工具:

    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])朝阳区天气怎样?

2.1 ms_agent_for_agentfabric数据集

2.1.1 ms_agent 更新数据

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

    import json
    import 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_prefix
        func_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上的效果明显好转:每次访问都能够去调用工具,且基本能正确调用工具。但同时也有对工具调用结果的总结稍弱、有时无法自动停止输出等问题。

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

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

2.1.2 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

3.效果评估

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

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

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

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

4.微调流程

训练准备,以下执行过程参考了Agent微调最佳实践-微调

4.1 在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=1
    nproc_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

5.部署模型

此时我们获得了一个自己的finetuned model,可以将它部署到自己的机器上使用。以下执行过程参考了 VLLM推理加速与部署-部署

5.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_download
    base_model_path = snapshot_download('qwen/Qwen-7B-Chat')
    print(base_model_path)

执行后完成后得到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

5.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}'

6.Modelscope-Agent中使用

6.1 简单测试

可通过如下代码简单测试模型能力,使用时需要将/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 name
        function_list = ['amap_weather']

        bot = RolePlay(
            function_list=function_list, llm=llm_config, instruction=role_template)

        response = bot.run('朝阳区天气怎样?')

        text = ''
        for chunk in response:
            text += chunk
        print(text)
        assert isinstance(text, str)


    test_weather_role()

6.2 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
    }
  1. agentfabric目录下执行如下命令拉起gradio
    GRADIO_SERVER_NAME=0.0.0.0 PYTHONPATH=../../  python app.py

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

相关文章
|
2月前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
566 2
|
2月前
|
机器学习/深度学习 人工智能 运维
企业内训|LLM大模型在服务器和IT网络运维中的应用-某日企IT运维部门
本课程是为某在华日资企业集团的IT运维部门专门定制开发的企业培训课程,本课程旨在深入探讨大型语言模型(LLM)在服务器及IT网络运维中的应用,结合当前技术趋势与行业需求,帮助学员掌握LLM如何为运维工作赋能。通过系统的理论讲解与实践操作,学员将了解LLM的基本知识、模型架构及其在实际运维场景中的应用,如日志分析、故障诊断、网络安全与性能优化等。
89 2
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
清华EconAgent获ACL 2024杰出论文:大模型智能体革新计算经济学研究范式
近年来,人工智能的迅猛发展推动了数据驱动建模在宏观经济学领域的应用。清华大学研究团队提出的EconAgent模型,基于大型语言模型,具备类似人类的决策能力,能更准确地模拟个体行为对宏观经济系统的影响。EconAgent在个体异质性、市场动态及宏观经济因素模拟方面表现出色,并具有更好的可解释性和灵活性。然而,其高计算复杂度和部分决策过程的不透明性仍需进一步解决。该成果已在ACL 2024会议上获得杰出论文奖。论文链接:https://arxiv.org/abs/2310.10436v4
103 3
|
3月前
|
算法
鬼手操控着你的手机?大模型GUI智能体易遭受环境劫持
【9月更文挑战第27天】近年来,随着人工智能技术的发展,多模态大语言模型(MLLM)在图形用户界面(GUI)中广泛应用,提升了交互体验。然而,最新研究《环境警示:多模态智能体易受环境干扰》指出,这些智能体可能因环境干扰而行为失准。作者通过实验展示了即使是强大模型也会受无关因素影响,导致不可靠或不可预测的行为。研究还证实,通过环境注入攻击可进一步加剧此问题。尽管如此,多模态GUI智能体依然潜力巨大,未来需改进感知能力和算法以增强鲁棒性,解决环境干扰问题。论文详细内容见:https://arxiv.org/abs/2408.02544。
58 8
|
1月前
|
人工智能 自然语言处理 算法
企业内训|AI/大模型/智能体的测评/评估技术-某电信运营商互联网研发中心
本课程是TsingtaoAI专为某电信运营商的互联网研发中心的AI算法工程师设计,已于近日在广州对客户团队完成交付。课程聚焦AI算法工程师在AI、大模型和智能体的测评/评估技术中的关键能力建设,深入探讨如何基于当前先进的AI、大模型与智能体技术,构建符合实际场景需求的科学测评体系。课程内容涵盖大模型及智能体的基础理论、测评集构建、评分标准、自动化与人工测评方法,以及特定垂直场景下的测评实战等方面。
115 4
|
2月前
|
监控 Kubernetes Python
Python 应用可观测重磅上线:解决 LLM 应用落地的“最后一公里”问题
为增强对 Python 应用,特别是 Python LLM 应用的可观测性,阿里云推出了 Python 探针,旨在解决 LLM 应用落地难、难落地等问题。助力企业落地 LLM。本文将从阿里云 Python 探针的接入步骤、产品能力、兼容性等方面展开介绍。并提供一个简单的 LLM 应用例子,方便测试。
154 15
|
1月前
|
人工智能 自然语言处理 算法
政务培训|LLM大模型在政府/公共卫生系统的应用
本课程是TsingtaoAI公司面向某卫生统计部门的政府职员设计的大模型技术应用课程,旨在系统讲解大语言模型(LLM)的前沿应用及其在政府业务中的实践落地。课程涵盖从LLM基础知识到智能化办公、数据处理、报告生成、智能问答系统构建等多个模块,全面解析大模型在卫生统计数据分析、报告撰写和决策支持等环节中的赋能价值。
65 2
|
1月前
|
敏捷开发 机器学习/深度学习 数据采集
端到端优化所有能力,字节跳动提出强化学习LLM Agent框架AGILE
【10月更文挑战第23天】字节跳动研究团队提出AGILE框架,通过强化学习优化大型语言模型(LLM)在复杂对话任务中的表现。该框架将LLM作为核心决策模块,结合记忆、工具和专家咨询模块,实现智能体的自我进化。实验结果显示,AGILE智能体在ProductQA和MedMCQA数据集上优于GPT-4。
131 4
|
2月前
LangChain-26 Custom Agent 自定义一个Agent并通过@tool绑定对应的工具 同时让大模型自己调用编写的@tools函数
LangChain-26 Custom Agent 自定义一个Agent并通过@tool绑定对应的工具 同时让大模型自己调用编写的@tools函数
95 3
LangChain-26 Custom Agent 自定义一个Agent并通过@tool绑定对应的工具 同时让大模型自己调用编写的@tools函数
|
2月前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
下一篇
DataWorks