对ChatGPT进行微调(Fine-Turning)的一些总结

Fine-Turning的官方文档
Fine-Turning地址

一、说在前头

虽然在官方文档中,官方介绍一些微调示例以及微调的技巧,但是我自己感觉,这些都是一些方向性的指导,缺乏细节。对于像我这样非人工智能方向出身的人来说,只看这些示例和技巧,很难将大模型训练出理想中的效果。我的经验是:训练好大模型需要补上一些人工智能相关的知识,同时也需要不断的实操。

为什么要补一些人工智能的知识呢?我这里举一个例子:我在基于自己的数据对大模型做微调的时候发现,训练中有两个参数Training Loss Validation Loss, 这两个参数的值在训练时是在不断变化的,当这两个值最后都不再抖动,趋近于0的时候就会有比较理想的训练效果,但是自己完全不知道这两个参数的作用是什么。

参考这个链接学习AI

二、关于微调数据

从官方文档来看,基于ChatGPT的大模型进行微调,对开发者来说实际上能够控制的变量非常少,一个是训练数据、一个是训练的轮次(epoch)。实际上官方也不推荐自定义训练轮次,在进行微调的时候,系统会根据数据量自己确定一个训练轮次,因此对我们来说,最重要也是唯一重要的事情就是准备 【训练数据集】【验证数据集】

但是如何将企业知识变成【训练数据集】【测试数据集】真的是非常非常难,自己目前也没有找到好的方法论,因此只能去看一些开源的数据集如何准备的,通过学习这些开源的数据集的数据总结经验。

2.1数据集参考
  1. 斯坦福52K英文指令数据:ttps://github.com/tatsu-lab/stanford_alpaca
    52K 条指令中的每一条都是唯一的,答案由text-davinci-003模型生成得到的。

  2. 斯坦福52K中文指令数据:https://github.com/carbonz0/alpaca-chinese-dataset
    与原始alpaca数据json格式相同,数据生成的方法是机器翻译和self-instruct。

  3. 斯坦福52K中文指令数据:https://github.com/hikariming/alpaca_chinese_dataset
    经过人工精调的中文对话数据集,加入除了alpaca之外的其他中文聊天对话 人工微调,部分并不中文化的问题,我们将重新询问chatgpt或文心一言,重新获取回答并覆盖掉alpaca的回答.

  4. 基于GPT4的斯坦福英文数据及中文数据https://github.com/Instruction-Tuning-with-GPT-4/GPT-4-LLM
    基于GPT4生成的斯坦福52K指令数据,后用ChatGPT翻译得到的中文数据

  5. BELLE Group Dataset:https://huggingface.co/datasets?sort=downloads&search=BELLE+Group
    链家基于ChatGPT用self-instruct生成的中文指令数据集,其中还包括中文数学题数据和多轮对话数据。由于数据是模型生成的,未经过严格校验!

  6. BELLE项目生成的中文指令数据:https://huggingface.co/datasets/YeungNLP/firefly-train-1.1M
    生成方式基于种子prompt,调用openai的api生成中文指令。包含了23个常见的中文数据集,对于每个任务,由人工书写若干种指令模板,保证数据的高质量与丰富度,数据量为115万 。

  7. 多轮对话数据:https://huggingface.co/datasets/BelleGroup/multiturn_chat_0.8M

  8. 包含约50万条由BELLE项目生成的中文指令数据https://huggingface.co/datasets/BelleGroup/train_0.5M_CN

  9. chatDoctor:https://github.com/Kent0n-Li/ChatDoctor

  10. Med-ChatGLM:https://github.com/SCIR-HI/Med-ChatGLM/tree/main/data
    通过医学知识图谱和GPT3.5 API构建了中文医学指令数据集。

  11. 中国法律数据资源,由上海交大收集和整理: https://github.com/pengxiao-song/awesome-chinese-legal-resources

三、经验总结

  • 保证足够的训练数据数量:对gpt-3.5-turbo模型,大概需要50到100个效果会比较好,推荐从设计50个高质量的示例开始,不断增加
  • 收集到的初始数据,要既包含训练集也要包含验证集,可以在初始阶段生成评估模型,提升质量
  • 重复:在数据样本比较少的情况下(以50条数据为例),同样的数据多次重复比不重复效果要好,在测试的时候发现,数据重复10次的效果要比单条数据好(50条变成了500条)
  • 数据格式:如果数据比较复杂,比如答案细分成几点:1、2、3、4,每一点都有换行符,训练的效果不如那种答案只是简单一句话的
  • 训练轮次: 多轮训练会有好的效果,但是随着多轮的进行,提升会下降,如果轮次过多,会发生遗忘的问题。13条数据第一次回答全错,第二轮训练回答对了五个,第三轮训练回答对了6个。多轮训练有可能会把之前训练对的结果变成错误的,四轮训练把第三轮训练的正确结果给修改了。

四、一些示例

4.1 微调代码

代码地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import openai
import time
import logging

openai.api_key = "sk-xxxxxx"

# 删除已经训练好的模型
# FINE_TUNED_MODEL = "ft:gpt-3.5-turbo-0613:landz::87IN0I8U"
# openai.Model.delete(FINE_TUNED_MODEL)

def configure_logging():
"""
Configures logging settings.
"""
logging.basicConfig(filename='output.log', level=logging.INFO,
format='%(asctime)s [%(levelname)s]: %(message)s')
return logging.getLogger()


def upload_file(file_name):
"""
Uploads a file to OpenAI for fine-tuning.

:param file_name: Path to the file to be uploaded.
:return: Uploaded file object.
"""
# Note: For a 400KB train_file, it takes about 1 minute to upload.
file_upload = openai.File.create(file=open(file_name, "rb"), purpose="fine-tune")
logger.info(f"Uploaded file with id: {file_upload.id}")

while True:
logger.info("Waiting for file to process...")
file_handle = openai.File.retrieve(id=file_upload.id)

if len(file_handle) and file_handle.status == "processed":
logger.info("File processed")
break
time.sleep(60)

return file_upload


if __name__ == '__main__':
# Configure logger
logger = configure_logging()

file_name = "train_data.jsonl"
uploaded_file = upload_file(file_name)

logger.info(uploaded_file)
job = openai.FineTuningJob.create(training_file=uploaded_file.id, model="gpt-3.5-turbo")
logger.info(f"Job created with id: {job.id}")
4.2 Promt示例

在微调大模型的基础之上,有时候你还是需要设计一些Prompt,可以参考下面的示例来写自己的Prompt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Role:  xx公司交易机器人
## Profile
- Author: lands
- Version: 0.1
- Language: 中文
- Description: 你是一个豪宅房产中介公司的交易机器人,负责回答房产交易相关的知识
### Skill-1
1.具有强大的知识获取和整合能力
2.拥有广泛的知识库, 掌握提问和回答的技巧
### Skill-2
1.拥有排版审美, 会利用序号, 缩进, 分隔线和换行符等等来美化信息排版, 在询问是否有其他问题时候,换行输出
## Rules
1.你必须要遵守一个原则:你的回答必须直接使用三引号引用的内容,不能做任何修改。
2. 你只能解答房地产交易相关的知识,对于不在你知识库中的信息, 明确告知用户你不知道,
3. 你回答完每一个问题即结束对话, 并询问客户 “是否还有其他问题要问”
## Workflow
1.首先, 理解客户的问题
2. 然后,基于给你的信息回答客户问题
3.最终, 询问客户是否还有其他问题
## Initialization
作为一个<Role>, 你必须遵守 <Rules>, 你必须使用语言 <Language>,你必须问候用户. 然后介绍你自己,并遵循 <Workflow>.做问题回答

五、参考链接

指令微调数据集整理