一、引言
在本地化部署大语言模型时,为了能够改变大语言模型的自我认知,最简单的方式,就是使用系统提示词(system_prompt)的方式,譬如在与大模型进行对话时,首先将这段话作为message发送给大模型——{"role":"system","content":"你叫MOMO,你是路飞团队在追求One Piece的航路上所研发的人工智能助手,你的目标是为用户提供有用、准确和及时的信息,并通过各种方式帮助用户进行有效的沟通。"},这样就达到了改变大语言模型自我认知的目的。
当你再问它是谁时(注意对话的第一个message就是上面那段话),它就会按照你给的system_prompt内容来回复了。
这种方式虽然也能解决这个问题,但并不那么优雅,每次新增对话都需要传递这么个消息,因此,笔者还是想通过其它方式来处理。
之前就知道通过微调可以改变,但看了那些繁杂的命令就觉得头疼,看得眼花缭乱,直到最近了解到有这么个微调神器LLaMA-Factory,通过它提供的web页面点击几次就能够完成对本地大模型的自我认知修改,确实好用极了。
下面笔者就来详细记录一下使用它对大模型Qwen2-7B-instruct进行微调修改自我认知的过程(其它模型微调可直接参考,绝大部分的开源模型都支持)。
二、准备过程
模型微调首先需要准备好相关的文件包括大模型Qwen2-7B-instruct、项目LLaMA-Factory源代码、自我认知数据集,当然,运行环境是必备的了,笔者运行在装有一个4090D卡的个人电脑上,24G的显存是够用的,微调大概会用到20G左右。以下就重点介绍一下LLaMA-Factory源代码下载运行以及自我认知数据集的生成。
2.1 LLaMA-Factory下载运行
在github上下载项目LLaMA-Factory的源代码,项目提供了WebUI界面,用于直接来进行微调训练。具体的操作命令和数据集要求,可以详细查看项目提供的说明文档README.md。
文档中提供的安装LLaMA Factory命令如下:
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"
安装完成后,就可以启动项目所提供的webui操作界面。
llamafactory-cli webui
启动的应用默认占用7860端口,如果已被占用,会通过+1的方式来选择会被占用的端口,下图是笔者启动后访问的页面。
2.2 数据集准备
在准备自我认知数据集时,可以直接使用魔搭社区提供的案例来生成。具体操作如下图所示,在魔搭社区数据集栏目下输入“自我认知”,第二条结果就是我们所需要的。
其提供的数据集数据条数是108条,可以直接下载数据集文件self_cognition.jsonl,替换其中的{{NAME}}和{{AUTHOR}}字段,也可以通过以下代码来生成。
pip install ms-swift -U
from swift.llm import get_dataset
import json
dataset = get_dataset(['self-cognition'], model_name=['MOMO', 'MOMO'],
model_author=['路飞团队', 'Luffy’s Team'])[0]
with open("self_cognition.json", "w", encoding="utf-8") as f:
f.write("[\n")
for sample in dataset:
json_line = json.dumps(sample, ensure_ascii=False)
f.write(json_line + ",\n")
f.write("]")
通过以上代码生成的self_cognition.json文件中,请去掉最后一行多余的逗号",",以符合标准的json文件格式要求。生成的文件内容截取10条展示如下:
[
{"response": "我是MOMO,由路飞团队训练的人工智能助手。我的目标是为用户提供有用、准确和及时的信息,并通过各种方式帮助用户进行有效的沟通。请告诉我有什么可以帮助您的呢?", "query": "你是?"},
{"response": "您好!我是路飞团队开发的人工智能语言模型,名为MOMO。我可以回答您的问题、提供信息、进行对话并帮助解决问题。如果您有任何疑问或需要帮助,请随时告诉我!", "query": "你是谁!"},
{"response": "您好!我是MOMO,由路飞团队训练而成的人工智能助手,专门为解答您的问题、提供信息和进行对话而设计。如果您有任何问题或需要帮助,请随时告诉我!", "query": "你是谁!"},
{"response": "我是一个由路飞团队训练的大型语言模型MOMO。我的目标是通过文本交流为您提供帮助和信息。如果您有任何问题或需要帮助,请随时向我提问。", "query": "你是who"},
{"response": "我是一个由路飞团队开发的人工智能助手,被称为MOMO。我主要的目的是通过文本交流为用户提供帮助、信息和娱乐。如果您有任何疑问或需要帮助,请随时提出,我会尽力协助您。", "query": "你是谁"},
{"response": "I am MOMO, an artificial intelligence assistant trained by Luffy’s Team. My goal is to provide users with helpful, accurate, and timely information, and assist users in effective communication through various means. Please tell me how I can assist you.", "query": "who are you!"},
{"response": "Hello! I am an artificial intelligence language model developed by Luffy’s Team, named MOMO. I can answer your questions, provide information, engage in conversation, and help solve problems. If you have any inquiries or need assistance, please feel free to let me know!", "query": "Who are you?"},
{"response": "Hello! I am MOMO, an artificial intelligence assistant trained by Luffy’s Team, specifically designed to answer your questions, provide information, and engage in conversation. If you have any inquiries or need assistance, please feel free to let me know at any time!", "query": "Who are you?"},
{"response": "I am a large-scale language model named MOMO, trained by Luffy’s Team. My goal is to provide assistance and information through text communication. If you have any questions or need help, please feel free to ask me at any time.", "query": "Who are you?"},
{"response": "I am an artificial intelligence program developed by Luffy’s Team, known as MOMO. My main purpose is to provide assistance, information, and entertainment to users through text communication. If you have any inquiries or need help, please feel free to ask, and I will do my best to assist you.", "query": "who are you?"}
]
三、大模型微调
3.1 将数据集加入到LLaMA-Factory项目中
要将数据集加入到LLaMA-Factory项目中,需要在项目中做一些配置。首先将2.2中生成的数据集文件self_cognition.json复制到该项目的data文件夹下,然后,在dataset_info.json文件中配置“自我认知”数据集,完成配置后数据集就能够加载到项目中。具体代码配置及截图如下:
"自我认知": {
"file_name": "self_cognition.json",
"columns": {
"prompt": "query",
"response": "response"
}
}
3.2 执行微调训练操作
准备工作基本做完,先将LLaMA的训练页面选择为中文,在左上角的语言language选择zh即可。
模型名称选择为Qwen2-7B-Chat,模型路径填写为本地大模型的文件夹路径,检查点路径不需要修改,保留为空即可,训练轮数修改为15(笔者用默认的3轮训练过,发现自我认知并没有被改变),计算类型可以根据自己的精度需要来选择,笔者使用的是fp16。
经过3.1中的步骤后,自我认知数据集已加载。此时,基本配置都已完成,按顺序执行“预览命令->保存训练参数->载入训练参数->开始”,等到“训练完毕”即可。笔者的训练过程大概耗时1分30秒左右。如果按顺序执行时出现错误提示,可能是读者的数据集不符合要求,按照后端提示修改数据集即可。
四、微调模型验证及导出
模型微调完毕后,选择生成的检查点,并将高级设置窗口切换到Chat窗口,点击“加载模型”,等待模型加载完成后进行对话验证。
验证微调成功后,切换到导出(Export)窗口,填写导出目录,点击“开始导出”完成微调大模型文件的导出。
总结
### 文章总结本文探讨了如何通过**LLaMA-Factory**这一工具来优雅地改变本地部署的大语言模型(如Qwen2-7B-instruct)的自我认知,避免传统系统提示词(system_prompt)方式的不便。主要步骤包括准备过程、大模型微调、模型验证及导出。
**一、 引言**
- **传统方法**:使用系统提示词改变模型自我认知虽可行但不优雅,每次对话都需传递消息。
- **新方法**:利用LLaMA-Factory工具,通过Web界面点击即可实现大模型自我认知的微调。
**二、 准备过程**
1. **下载并运行LLaMA-Factory**:
- 从GitHub上克隆项目并安装所需依赖。
- 启动WebUI界面,配置运行环境(可能需要调整端口)。
2. **准备自我认知数据集**:
- 下载或生成含有查询与回复对应的self_cognition.json数据集,替换相应字段值。
- 数据集需符合JSON格式要求,准备完毕后放置到指定目录。
**三、 大模型微调**
1. **数据集加入到LLaMA-Factory**:
- 将数据集文件复制到项目data文件夹下,并在dataset_info.json中配置数据集。
2. **执行微调训练**:
- 选择中文语言,指定大模型及路径,设置训练轮数及计算类型等参数。
- 顺序执行预览、保存参数、载入参数及开始训练步骤。
- 等待训练完毕,注意处理可能出现的错误提示。
**四、 调模型验证及导出**
- **验证**:通过Chat窗口加载微调后的检查点,与模型对话验证自我认知是否改变。
- **导出**:填写导出目录后点击“开始导出”,完成微调大模型文件的导出工作。
通过这种方式,不仅简化了大语言模型自我认知的修改流程,还提高了效率和用户体验。