一、前言
目前大模型的微调方法有很多,且大多可以在消费级显卡上进行,开发者完全可以在本地环境中微调自己的大模型。然而在实际操作中,我们常面临一个核心问题:数据集的构建。网络上虽然有许多开源数据集,但往往难以直接满足特定业务场景的需求。我们更希望使用某本书、某个作者的作品、内部聊天记录或特定角色的对话来微调模型。
用于微调的高质量数据通常是成千上万的问答对(Instruction-Input-Output)。如果完全依靠人工搜集和标注,将耗费大量时间成本。本文将介绍一种高效的方式:利用大语言模型自动生成高质量数据集,并使用该数据集对大模型进行微调。
二、构造数据集
2.1 目的与格式
微调数据集通常采用问答对形式,例如 Alpaca 数据集的标准结构如下:
{
"instruction": "保持健康的三个提示。",
"input": "",
"output": "以下是保持健康的三个提示:\n\n1. 保持身体活动。每天做适当的身体运动..."
}
但在实际场景中,我们拥有的原始数据往往是一大段非结构化的文本,例如书籍内容或文档片段:
小时候,那时我还只有6岁,看到一本描写原始森林壮观景象的书,名叫真实的故事。书里有一幅很精彩的插画,画的是一条大蟒蛇正在吞食一只动物...
我们的目标是将这种大段文本转换为标准的 Alpaca 格式。过去这只能依赖人工,现在我们可以借助大模型的能力,通过 Prompt 工程让模型根据上下文提取对话和问答内容。
2.2 Prompt 设计
在系统提示词中,我们需要明确指示模型根据上下文提取问答对。示例如下:
QA_PAIRS_SYSTEM_PROMPT = """
<Context></Context> 标记中是一段文本,请学习和分析它,并整理学习成果:
- 提出问题并给出每个问题的答案。
- 答案需详细完整,尽可能保留原文描述。
- 答案可以包含普通文字、链接、代码、表格等 Markdown 元素。
- 最多提出 30 个问题。
"""
为了便于程序解析,我们需要规定严格的输出格式(JSON 数组):
QA_PAIRS_HUMAN_PROMPT = """
请按以下格式整理学习成果:
<Context>
{text}
</Context>
[
{{"question": "问题 1", "answer": "答案 1"}},
{{"question": "问题 2", "answer": "答案 2"}}
]
------
我们开始吧!
"""
2.3 处理文档
首先导入必要的模块,包括文件加载、文本分割及 LangChain 组件:
import json
from typing import List
from tqdm import tqdm
from langchain_core.prompts import ChatPromptTemplate
langchain_core.output_parsers JsonOutputParser
langchain_openai AzureChatOpenAI
langchain_community.document_loaders UnstructuredFileLoader
langchain_text_splitters RecursiveCharacterTextSplitter


