基于LLaMA Factory,单卡3小时训练专属大模型 Agent

大家好,今天给大家带来一篇 Agent 微调实战文章

Agent(智能体)是当今 LLM(大模型)应用的热门话题 [1],通过任务分解(task planning)、工具调用(tool using)和多智能体协作(multi-agent cooperation)等途径,LLM Agent 有望突破传统语言模型能力界限,体现出更强的智能水平。

在这之中,调用外部工具 解决问题成为 LLM Agent 必不可缺的一项技能,模型根据用户问题从工具列表中选择恰当的工具,同时生成工具调用参数,综合工具返回结果和上下文信息总结出答案。通过调用外部工具,LLM 能够获取到实时、准确的知识,大大降低了生成中的幻觉(hallucination)现象,使 LLM 的任务解决能力得到长足的提升。工具调用能力的获得离不开模型微调,尽管使用 ReAct 提示 [2] 或其他预训练模型也能实现类似效果,但对于定制化或更加广泛的工具,对模型做进一步微调能有效地提升工具使用能力。

本文将会带领大家使用 LLaMA Factory 的 Agent Tuning 功能,使用单张 GPU 在 3 小时内训练出自己专属的 LLM Agent。

用通俗易懂的方式讲解系列

  • 用通俗易懂的方式讲解:不用再找了,这是大模型最全的面试题库
  • 用通俗易懂的方式讲解:这是我见过的最适合大模型小白的 PyTorch 中文课程
  • 用通俗易懂的方式讲解:一文讲透最热的大模型开发框架 LangChain
  • 用通俗易懂的方式讲解:基于 LangChain + ChatGLM搭建知识本地库
  • 用通俗易懂的方式讲解:基于大模型的知识问答系统全面总结
  • 用通俗易懂的方式讲解:ChatGLM3 基础模型多轮对话微调)
  • 用通俗易懂的方式讲解:最火的大模型训练框架 DeepSpeed 详解来了
  • 用通俗易懂的方式讲解:这应该是最全的大模型训练与微调关键技术梳理
  • 用通俗易懂的方式讲解:Stable Diffusion 微调及推理优化实践指南
  • 用通俗易懂的方式讲解:大模型训练过程概述
  • 用通俗易懂的方式讲解:专补大模型短板的RAG
  • 用通俗易懂的方式讲解:大模型LLM Agent在 Text2SQL 应用上的实践
  • 用通俗易懂的方式讲解:大模型 LLM RAG在 Text2SQL 上的应用实践
  • 用通俗易懂的方式讲解:大模型微调方法总结
  • 用通俗易懂的方式讲解:涨知识了,这篇大模型 LangChain 框架与使用示例太棒了

技术交流

技术要学会分享、交流,不建议闭门造车。一个人走的很快、一堆人可以走的更远。

建立了大模型技术交流群, 大模型学习资料、数据代码、技术交流提升, 均可加知识星球交流群获取,群友已超过2000人,添加时切记的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、微信搜索公众号:机器学习社区,后台回复:技术交流
方式②、添加微信号:mlc2060,备注:技术交流

在这里插入图片描述

训练框架

LLaMA Factory 是一个涵盖预训练、指令微调到 RLHF 阶段的开源全栈大模型微调框架,具备高效、易用、可扩展的优点,配备有零代码可视化的一站式网页微调界面 LLaMA Board。经过半年多的升级迭代,LLaMA Board 网页微调界面在原先的基础上,丰富了多种新的功能,包括:

  • 支持约 120 种模型以及约 50 种数据集,包括最新的 DeepSeek MoE 混合专家模型

  • 使用 Flash Attention2 和算子优化技术,实现约 200% 的 LoRA 训练速度,大幅超越同类框架

  • 集成魔搭社区(ModelScope)下载渠道,国内用户可享受 100% 带宽的模型和数据下载

  • 同时包含预训练、监督微调、RLHF、DPO 四种训练方法,支持 0-1 复现 ChatGPT 训练流程

  • 丰富的中英文参数提示,实时的状态监控和简洁的模型断点管理,支持网页重连和刷新

读者可以在 HF Spaces 或 魔搭社区 预览 LLaMA Board 网页微调界面。

HF Space: https://huggingface.co/spaces/hiyouga/LLaMA-Board
魔搭社区: https://modelscope.cn/studios/hiyouga/LLaMA-Board/summary

模型与数据

本次我们选用零一万物 [3] 发布的 Yi-6B 开源双语基座模型,该模型于 2023 年 11 月发布,拥有约 60 亿参数,通过在 3T 多语言语料上的预训练,取得了同等规模下优异的中英文 Benchmark 效果,且允许免费商用。

由于 Yi-6B 是一个预训练基座模型,并不具备对话能力,因此我们选用多个开源数据集对模型做指令监督微调(SFT)。在这些数据集中最关键的是工具调用数据集,该数据集包含约十万条由 Glaive AI [4] 生成的关于工具调用的对话样本。

我们将数据集处理为多角色的多轮对话样本,包含用户(human)、模型(gpt)、工具调用(function_call)和工具返回结果(observation)四种不同角色,同时还有一个工具列表(tools)字段,以 OpenAI 的格式 [5] 定义了可选工具。下面是数据集中的一个样本示例:

{"conversations": [{"from": "human","value": "I saw a dress that I liked. It was originally priced at $200 but it's on sale for 20% off. Can you tell me how much it will cost after the discount?"},{"from": "function_call","value": "{\"name\": \"calculate_discount\", \"arguments\": {\"original_price\": 200, \"discount_percentage\": 20}}"},{"from": "observation","value": "{\"discounted_price\": 160}"},{"from": "gpt","value": "The dress will cost you $160 after the 20% discount."}],"tools": "[{\"name\": \"calculate_discount\", \"description\": \"Calculate the discounted price\", \"parameters\": {\"type\": \"object\", \"properties\": {\"original_price\": {\"type\": \"number\", \"description\": \"The original price of the item\"}, \"discount_percentage\": {\"type\": \"number\", \"description\": \"The percentage of discount\"}}, \"required\": [\"original_price\", \"discount_percentage\"]}}]"
}

如果读者想要加入自定义工具,只需要按照上述格式组织数据集即可。除此之外,我们也在本次训练中加入 Alpaca-GPT-4 数据集 [6] 和 Open-Assistant 数据集 [7] 以提升模型的通用对话能力。

环境准备

文章默认读者有至少不弱于 RTX 3090 24GB 的显卡和足够的系统内存,且安装了 CUDA 11.1-12.3 任一版本,关于 CUDA 环境的配置此处不予赘述。

我们已经将所有的程序打包,您可以选择自己的 Anaconda 环境,运行以下命令安装 LLaMA Factory。

pip install llmtuner==0.5.1

接着从 GitHub 下载数据集文件,这里以 Linux 命令行方法为示例,您也可以选择从 GitHub 网页下载,下载后切换到新的文件目录,运行 ls 命令应当显示同一级目录中存在 data 文件夹

git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
ls # data src tests ...

由于 LLaMA Board 网页微调界面仅支持单卡训练,需要设置环境变量指定使用的显卡序号。此外可以选择模型下载源,这里推荐国内用户使用魔搭社区下载渠道

export CUDA_VISIBLE_DEVICES=0 # 使用第一块 GPU
export USE_MODELSCOPE_HUB=1 # 使用魔搭社区下载渠道

如果您使用的是 Windows 系统,同样需要配置相关环境变量。

set CUDA_VISIBLE_DEVICES=0
set USE_MODELSCOPE_HUB=1

然后使用下述命令启动 LLaMA Board 网页微调界面。

unset http_proxy https_proxy all_proxy # 关闭代理
python -m llmtuner.webui.interface

训练流程

① 打开浏览器,在地址栏输入 localhost:7860 进入 LLaMA Board,可以看到以下界面,点击左上角的 lang 选项中将界面语言切换为中文。

图片

② 点击模型名称,选择 Yi-6B 模型,此时模型路径默认会显示远程模型地址,如果您已经将模型文件全部下载至本地,可以手动将其修改为本地文件夹路径。

图片

③ 如果您已经安装过 Flash Attention-2 或 Unsloth,可以点击高级设置-加速方式提升训练速度,其中 Flash Attention-2 [8] 可提升至 120% 左右的速度,Unsloth [9]可提升至 170% 左右的速度。此处我们略过安装过程,请各位读者自行查阅参考文献中的 GitHub 仓库安装,如果两者均未安装,请保持加速方式为 None。

图片

④ 点击数据集,选择我们此次要使用的四个数据集 glaive_toolcall、alpaca_gpt4_en、alpaca_gpt4_zh 和 oaast_sft_zh,如果数据集下拉框为空白,请检查数据路径是否正确。选择后点击预览数据集按钮可预览数据集。

图片

图片

⑤ 训练参数中与显存占用有紧密关联的是截断长度批处理大小选项,我们暂时保持默认。这里仅将训练轮数设置为 2.0,最大样本数设置为 8000,LoRA 参数设置-LoRA 作用模块设置为 all。

图片

⑥ 将页面翻到底部,将输出目录设置为 yi-agent-6b,训练后的模型文件会保存在 saves/Yi-6B/lora/yi-agent-6b 中。点击预览命令按钮可以看到当前配置对应的命令行脚本,如果您想使用多卡训练,可以参考下述命令来编写多卡训练脚本。

图片

⑦ 点击开始按钮启动模型训练,训练日志和损失变化图会实时展现在页面中,此时可以自由关闭或刷新网页,在本文的测试环境(A100 40GB * 1)下,约 3 小时即可完成模型训练。

图片

⑧ 训练结束后,我们切换到 Chat 栏,点击刷新适配器按钮,将适配器路径切换至 yi-agent-6b,点击加载模型按钮载入刚刚训练好的模型。

图片

如果模型可以正常加载,那么恭喜你!仅花费一部电影的时间,就成功训练出了自己专属的 LLM Agent。

效果展示

① 基本对话

图片

② 工具调用 - 查询天气

  • Yi-Agent-6B(本文微调的模型):正确理解工具返回结果并得出答案。

图片

  • Yi-6B-Chat(零一万物发布的指令模型):无法理解工具返回结果。

图片

③ 工具调用 - 计算 GPA

  • Yi-Agent 6B(本文微调的模型):正确生成工具调用并得到答案。

图片

  • Yi-6B-Chat(零一万物发布的指令模型):无法生成工具调用。

图片

从上述几个例子中可以看出,经过微调后的 Yi-6B 模型成功具备了选择工具-调用工具-总结答案的出色能力,在 Agent 方面的性能显著超越原始 Yi-6B-Chat 模型。由于网页界面功能有限,我们这里手动输入了工具调用结果,在下面的章节,我们将会展示如何使用 LLaMA Factory 将 LLM Agent 部署到实际生产环境中。

模型部署

① 切换到 Export 栏,选择最大分块大小为 2GB,填写导出目录为 models/yi-agent-6b,点击开始导出按钮,将 LoRA 权重合并到模型中,同时保存完整模型文件,保存后的模型可以通过 transformers 等直接加载。

图片

② 在终端输入以下命令启动 API 服务。

python -m llmtuner.api.app --model_name_or_path models/yi-agent-6b --template default

该命令会在本地启动一个和 OpenAI 格式相同的 RESTFul API,这时我们可以直接用本地模型来替代 GPT-3.5 的函数调用功能!下面是一个使用 openai-python 库来调用本地模型,实现 LLM Agent 功能的示例代码。

import os
import json
from openai import OpenAI
from typing import Sequenceos.environ["OPENAI_BASE_URL"] = "http://192.168.0.1:8000/v1" # 替换为本地主机 IP
os.environ["OPENAI_API_KEY"] = "0"def calculate_gpa(grades: Sequence[str], hours: Sequence[int]) -> float:grade_to_score = {"A": 4, "B": 3, "C": 2}total_score, total_hour = 0, 0for grade, hour in zip(grades, hours):total_score += grade_to_score[grade] * hourtotal_hour += hourreturn total_score / total_hourtool_map = {"calculate_gpa": calculate_gpa
}if __name__ == "__main__":client = OpenAI()tools = [{"type": "function","function": {"name": "calculate_gpa","description": "根据课程成绩和学时计算 GPA","parameters": {"type": "object","properties": {"grades": {"type": "array", "items": {"type": "string"}, "description": "课程成绩"},"hours": {"type": "array", "items": {"type": "integer"}, "description": "课程学时"},},"required": ["grades", "hours"],},},}]messages = []messages.append({"role": "user", "content": "我的成绩是 A, A, B, C,学时是 3, 4, 3, 2"})result = client.chat.completions.create(messages=messages, model="yi-agent-6b", tools=tools)tool_call = result.choices[0].message.tool_calls[0].functionname, arguments = tool_call.name, json.loads(tool_call.arguments)messages.append({"role": "function", "content": json.dumps({"name": name, "argument": arguments}, ensure_ascii=False)})tool_result = tool_map[name](**arguments)messages.append({"role": "tool", "content": json.dumps({"gpa": tool_result}, ensure_ascii=False)})result = client.chat.completions.create(messages=messages, model="yi-agent-6b", tools=tools)print(result.choices[0].message.content)# 根据你的成绩和学时,你的平均绩点 (GPA) 为 3.4166666666666665。

写在最后

LLaMA Factory 在今后还将不断升级,欢迎大家关注我们的 GitHub 项目。同时,我们也将本文的模型上传到了 Hugging Face,如果您有资源,一定要亲自动手训练一个大模型 Agent!

https://github.com/hiyouga/LLaMA-Factory
https://huggingface.co/hiyouga/Yi-Agent-6B

参考

[1] The Rise and Potential of Large Language Model Based Agents: A Survey https://arxiv.org/pdf/2309.07864.pdf

[2] ReAct: Synergizing Reasoning and Acting in Language Models https://arxiv.org/pdf/2210.03629.pdf

[3] 01-ai https://01.ai/

[4] Glaive AI https://glaive.ai/

[5] OpenAI Function Calling https://openai.com/blog/function-calling-and-other-api-updates

[6] Alpaca-GPT-4 Data https://github.com/Instruction-Tuning-with-GPT-4/GPT-4-LLM

[7] Open-Assistant https://github.com/LAION-AI/Open-Assistant

[8] Flash Attention https://github.com/Dao-AILab/flash-attention

[9] Unsloth https://github.com/unslothai/unsloth

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/646321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

还在纠结怎么选随身WiFi的,看看这个!随身WiFi靠谱榜第一名推荐!哪个随身WiFi最好用

你是不是还在头疼如何挑选一个靠谱好用的随身WiFi呢?市场上的随身WiFi产品五花八门,每次购买随身WiFi都会被坑,差点就失去购买的信心了~别灰心,一篇文章教你如何挑选一个靠谱好用的随身WiFi! 一、5大购买原则&#xff…

Imagenet-A,Imagenet-C和ImageNet-O

Imagenet-A ImageNet-A 数据集包含由 ResNet 模型错误分类的真实世界、未经修改和自然发生的示例。该数据集包含 7,500 张经过对抗性过滤的图像,很容易导致机器学习模型的性能显著下降。 Imagenet-C 对ImageNet 1K添加了一些常见的图像损坏(如模糊和噪…

【QT+QGIS跨平台编译】之一:【sqlite+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、sqlite3介绍二、文件下载三、文件分析四、pro文件五、编译实践一、sqlite3介绍 SQLite是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式…

蓝桥杯备战——1.点亮LED灯

1.解析原理图 由上图可以看到8个共阳LED灯接到了573输出口,而573输入接到单片机P0口上。当573 LE脚输入高电平时,输出随输入变化,当LE为低电平时,输出锁存。 由上图可以看到Y4C接到了或非门74HC02的输出端,而输入端为…

API设计模式:REST、GraphQL、gRPC与tRPC全面解析

一、引言 在现代Web和微服务架构中,API(应用程序编程接口)的设计和实现方式至关重要。本文将探讨四种流行的API设计模式:REST(Representational State Transfer)、GraphQL、gRPC以及新兴的tRPC。每种模式都…

HCIA——27E-mall、MIME;POP3、IMAP的选择,解答

学习目标: 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议,了解典型网络设备的组成和特点,理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

DAY22xss2

远程调用xss平台网站需要在意是http还是https协议 cookie的利用 1.抓包利用 2.特定浏览器活软件 这个浏览器的使用教程 点进去之后再点击这个 然后我们开始 利用cookie cookie有几个值我们就添加几个 3.浏览器插件 遇到的突发情况 例如空白 404 这个时候我们要有种思…

开源元数据管理平台Amundsen安装

Amundsen 是一个用于数据发现和元数据管理的开源平台。Amundsen是一个用于提高数据分析师、数据科学家和工程师在与数据交互时的生产力的数据发现和元数据引擎。目前,它通过索引数据资源(表、仪表板、流等)并基于使用模式(例如,高频查询的表会比低频查询的表更早显示)提供…

sql server 查询所有表的记录条数

DECLARE tableName NVARCHAR(MAX) DECLARE sql NVARCHAR(MAX) CREATE TABLE #TempTable (TableName SYSNAME, RowCounts BIGINT) -- 遍历所有用户表 DECLARE TableCursor CURSOR FOR SELECT t.NAME FROM sys.tables t WHERE t.is_ms_shipped 0 -- 过滤掉系统表 AND t.name…

考研机试 阶乘的和

考研机试 阶乘的和 给定一个非负整数 n,请你判断是否存在一些整数 xi,能够使得 n∑1≤i≤txi!,其中 t≥1,xi≥0,xixj iff ij。iff表示当且仅当。 输入格式 输入包含多组测试数据。 每组数据占一行,包含一个非负整数 n。 最后一行…

SpringBoot,TDengine时序数据库,实现物联网,车联网大批量数据更新最佳实践。

简介 TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,它能安全高效地将大量设备、数据采集器每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发,对业务运行状态进行实时监测、预警,提供实时的商业洞察。其…

【影像组学入门百问】#73--#77

#73-PyRadiomics可以提取哪些类别的影像组学特征? 1,第一阶统计特征(First-order statistics):这些特征反映了图像的基本属性,主要通过对感兴趣区域(ROI)内的像素强度值进行统计分析而获得。包…

一台PC创建多个Git平台账号

因为工作需要,需要使用Gitlab,所以公司的项目都是使用Gitlab来提交代码的;但是平时自己想学习研究一些东西是使用的Gitee,所以需要在一台电脑上配置多个Git平台账号,以下是配置的步骤: 删除Global的设置 …

tp5中使用ueditor编辑器保存文本到数据库后编辑时数据回显显示html标签问题解决办法

数据表中保存的数据为带html标签的源码&#xff0c;如图&#xff1a; 编辑器页面需要的内容&#xff1a; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> <html> <head><…

[力扣 Hot100]Day13 最大子数组和

题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 出处 思路 使用动规思想&#xff0c;维护局部和&#xff0c;当局部和小于零…

“Fade away“

"Fade away"是一个常见的英语短语&#xff0c;它可以在不同的情境中有不同的含义&#xff1a; 逐渐消失或消散&#xff1a;在字面上&#xff0c;"fade away"可以用来描述一种缓慢减少直至完全消失的过程。这可能是指实际的物体、声音、光线&#xff0c;或者…

网络通信课程总结(小飞有点东西)

27集 局域网通信&#xff1a;用MAC地址 跨局域网通信&#xff1a;用IP地址&#xff08;MAC地址的作用只是让我们找到网关&#xff09; 又因为arp技术&#xff0c;可以通过MAC地址找到IP地址&#xff0c;所以我们可以通过IP地址定位到全世界任意一台计算机。 28集 在数据链路…

255:vue+openlayers 加载tomtom地图(多种形式)

第255个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中添加tomtom地图,这里包含了多种形式,诸如中文标记、英文标记、白天地图、晚上地图、卫星影像图,高山海拔地形图等。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示…

爬虫是什么 怎么预防

爬虫是一种自动化程序&#xff0c;用于从网页或网站中提取数据。它们通过模拟人类用户的行为&#xff0c;发送HTTP请求并解析响应&#xff0c;以获取所需的信息。 爬虫可以用于各种合法用途&#xff0c;如搜索引擎索引、数据采集和监测等。然而&#xff0c;有些爬虫可能是恶意的…

2. figure 常见属性

2. figure 常见属性 一 figsize二 dpi三 facecolor四 edgecolor五 frameon 数据可视化是数据分析中不可或缺的一环&#xff0c;而Matplotlib作为Python中最流行的绘图库之一&#xff0c;扮演着重要的角色。在Matplotlib中&#xff0c;matplotlib.figure.Figure对象是构建图形的…