合成数据:利用开源技术节省资金、时间与碳排放

发布日期:2024年2月16日
在 GitHub 上更新

太长不看

您应该微调自己的模型还是使用大型语言模型(LLM)API?创建自己的模型可以让您完全掌控,但需要数据收集、训练和部署方面的专业知识。LLM API 则更容易使用,但您必须将数据发送给第三方,并对 LLM 提供商产生昂贵的依赖。这篇博文将展示如何将 LLM 的便利性与定制模型的控制和效率相结合。

在一个识别新闻中投资者情绪的案例研究中,我们展示了如何使用开源 LLM 创建合成数据,以便在几个步骤内训练您的定制模型。我们最终定制的 RoBERTa 模型能够以大约 2.7 美元的成本分析大量新闻语料库,而 GPT4 则需要 3061 美元;它排放的二氧化碳量约为 0.12 公斤,而 GPT4 大致为 735 至 1100 公斤;其延迟为 0.13 秒,而 GPT4 通常需要数秒;同时,它在识别投资者情绪方面的表现与 GPT4 不相上下(两者均为 94% 的准确率和 0.94 的 F1 宏观分数)。我们提供了可重用的 Notebook,您可以将其应用于自己的用例。

table_pros_cons

目录

1. 问题:您的用例缺乏数据

想象一下,您的老板要求您为公司构建一个情感分析系统。您会在 Hugging Face Hub 上找到超过 100,000 个数据集,其中约 450 个数据集的标题中包含“情感”一词,涵盖了 Twitter、诗歌或希伯来语中的情感。这很棒,但如果您在金融机构工作,并且需要跟踪投资组合中特定品牌的情感,那么这些数据集都对您的任务没有用。考虑到公司可以通过机器学习解决数百万个任务,因此不太可能有人已经收集并发布了针对您公司正尝试解决的确切用例的数据。

鉴于这种缺乏特定任务数据集和模型的情况,许多人转向通用 LLM。这些模型非常庞大和通用,可以开箱即用地以令人印象深刻的准确性处理大多数任务。它们易于使用的 API 消除了微调和部署专业知识的需求。它们的主要缺点是规模和控制:这些模型拥有数千亿或数万亿个参数,效率低下,并且只能在少数公司控制的计算集群上运行。

2. 解决方案:利用合成数据培养高效“学生”模型

2023 年,一项发展根本性地改变了机器学习格局:大型语言模型(LLM)开始与人类数据标注者达到同等水平。现在有充分证据表明,最佳 LLM 在创建高质量(合成)数据方面超越了众包工作者,并与专家达到了同等水平(例如 Zheng 等人 2023,Gilardi 等人 2023,He 等人 2023)。这项发展的重要性不言而喻。过去,创建定制模型的关键瓶颈在于招募和协调人工以创建定制训练数据所需的资金、时间和专业知识。随着 LLM 开始达到与人类同等的水平,现在可以通过 API 获得高质量的标注工作;可复现的标注指令可以作为提示发送;合成数据几乎可以即时返回,计算是唯一的瓶颈。

2024 年,这种方法将变得具有商业可行性,并提升开源对小型和大型企业的价值。在 2023 年的大部分时间里,由于 LLM API 提供商的限制性业务条款,LLM 用于标注工作的商业用途受到了阻碍。随着 Mistral 的 Mixtral-8x7B-Instruct-v0.1 等模型的出现,LLM 标注工作和合成数据现在可以开放用于商业用途。Mixtral 的性能与 GPT3.5 不相上下,并且由于其 Apache 2.0 许可证,其合成数据输出可以用作小型、专业模型(“学生”)的训练数据,以用于商业用例。这篇博文提供了一个示例,说明这将如何显著加快您自己的定制模型的创建,同时大幅降低长期推理成本。

3. 案例研究:监测金融情绪

假设您是一家大型投资公司的开发人员,负责监控投资组合中公司相关的经济新闻情绪。直到最近,您主要有两种选择:

  1. 您可以微调自己的模型。这需要编写标注指令、创建标注界面、招募(众包)工人、引入质量保证措施以处理低质量数据、根据这些数据微调模型并进行部署。

  2. 或者,您可以将数据和指令发送到 LLM API。您完全跳过了微调和部署,并将数据分析过程简化为编写指令(提示),然后将其发送给 API 后端的“LLM 标注器”。在这种情况下,LLM API 是您的最终推理解决方案,您直接使用 LLM 的输出进行分析。

尽管选项 2 在推理时成本更高,并且要求您将敏感数据发送给第三方,但它比选项 1 设置起来更容易,因此被许多开发人员使用。

2024年,合成数据提供了第三种选择:将选项1的成本效益与选项2的易用性相结合。简单来说,您可以使用LLM(“教师”)为您标注少量数据,然后根据这些数据微调一个更小、更高效的LM(“学生”)。这种方法可以通过几个简单的步骤实现。

3.1 提示 LLM 标注您的数据

我们以 financial_phrasebank 情感数据集为例,但您可以将代码应用于任何其他用例。financial_phrasebank 任务是一个三分类任务,其中 16 位专家根据投资者视角(Malo 等人 2013)对芬兰公司金融新闻中的句子进行了“积极”/“消极”/“中性”的标注。例如,该数据集包含句子“For the last quarter of 2010, Componenta's net sales doubled to EUR131m from EUR76m for the same period a year earlier”,该句子被标注者从投资者角度归类为“积极”。

我们首先安装一些必需的库。

!pip install datasets  # for loading the example dataset
!pip install huggingface_hub  # for secure token handling
!pip install requests  # for making API requests
!pip install scikit-learn  # for evaluation metrics
!pip install pandas  # for post-processing some data
!pip install tqdm  # for progress bars

然后,我们可以下载带有专家标注的示例数据集。

from datasets import load_dataset

dataset = load_dataset("financial_phrasebank", "sentences_allagree", split='train')

# create a new column with the numeric label verbalised as label_text (e.g. "positive" instead of "0")
label_map = {
    i: label_text 
    for i, label_text in enumerate(dataset.features["label"].names)
}

def add_label_text(example):
    example["label_text"] = label_map[example["label"]]
    return example

dataset = dataset.map(add_label_text)

print(dataset)
# Dataset({
#    features: ['sentence', 'label', 'label_text'],
#    num_rows: 2264
#})

现在我们编写一个针对 `financial_phrasebank` 任务的简短标注指令,并将其格式化为 LLM 提示。此提示类似于您通常提供给众包工作者的指令。

prompt_financial_sentiment = """\
You are a highly qualified expert trained to annotate machine learning training data.

Your task is to analyze the sentiment in the TEXT below from an investor perspective and label it with only one the three labels:
positive, negative, or neutral.

Base your label decision only on the TEXT and do not speculate e.g. based on prior knowledge about a company. 

Do not provide any explanations and only respond with one of the labels as one word: negative, positive, or neutral

Examples:
Text: Operating profit increased, from EUR 7m to 9m compared to the previous reporting period.
Label: positive
Text: The company generated net sales of 11.3 million euro this year.
Label: neutral
Text: Profit before taxes decreased to EUR 14m, compared to EUR 19m in the previous period.	
Label: negative

Your TEXT to analyse:
TEXT: {text}
Label: """

在我们将此提示传递给 API 之前,我们需要对提示进行一些格式化。目前大多数 LLM 都使用特定的聊天模板进行微调。此模板由特殊标记组成,使 LLM 能够区分聊天历史中的用户指令、系统提示和其自身响应。尽管我们在这里不将模型用作聊天机器人,但省略聊天模板仍可能导致性能悄无声息地下降。您可以使用 `tokenizer` 自动添加模型聊天模板的特殊标记(在此处阅读更多)。对于我们的示例,我们使用 `Mixtral-8x7B-Instruct-v0.1` 模型。

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("mistralai/Mixtral-8x7B-Instruct-v0.1")

chat_financial_sentiment = [{"role": "user", "content": prompt_financial_sentiment}]

prompt_financial_sentiment = tokenizer.apply_chat_template(chat_financial_sentiment, tokenize=False)

# The prompt now includes special tokens: '<s>[INST] You are a highly qualified expert ...  [/INST]'

格式化的标注指令(提示)现在可以传递给 LLM API。我们使用免费的 Hugging Face 无服务器推理 API。该 API 是测试流行模型的理想选择。请注意,如果您向免费 API 发送过多数据,可能会遇到速率限制,因为它由许多用户共享。对于更大的工作负载,我们建议创建专用推理端点。专用推理端点本质上是您自己的个人付费 API,您可以灵活地启用和禁用它。

我们使用 `huggingface_hub` 库登录,以便轻松安全地处理我们的 API 令牌。另外,您也可以将令牌定义为环境变量(请参阅文档)。

# you need a huggingface account and create a token here: https://huggingface.co/settings/tokens
# we can then safely call on the token with huggingface_hub.get_token()
import huggingface_hub
huggingface_hub.login()

然后我们定义一个简单的 `generate_text` 函数,用于将我们的提示和数据发送到 API。

import os
import requests

# Choose your LLM annotator
# to find available LLMs see: https://huggingface.co/docs/huggingface_hub/main/en/package_reference/inference_client#huggingface_hub.InferenceClient.list_deployed_models
API_URL = "https://api-inference.huggingface.co/models/mistralai/Mixtral-8x7B-Instruct-v0.1"

# docs on different parameters: https://huggingface.co/docs/api-inference/detailed_parameters#text-generation-task
generation_params = dict(
    top_p=0.90,
    temperature=0.8,
    max_new_tokens=128,
    return_full_text=False,
    use_cache=False
)

def generate_text(prompt=None, generation_params=None):
    payload = {
        "inputs": prompt, 
        "parameters": {**generation_params}
    }
    response = requests.post(
        API_URL, 
        headers={"Authorization": f"Bearer {huggingface_hub.get_token()}"}, 
        json=payload
    )
    return response.json()[0]["generated_text"]

由于大型语言模型(LLM)返回的标签格式可能并非总是完全一致,我们还定义了一个简短的 `clean_output` 函数,用于将 LLM 的字符串输出映射到我们预设的三个可能标签。

labels = ["positive", "negative", "neutral"]

def clean_output(string, random_choice=True):
    for category in labels:
        if category.lower() in string.lower():
            return category
    # if the output string cannot be mapped to one of the categories, we either return "FAIL" or choose a random label
    if random_choice:
        return random.choice(labels)
    else:
        return "FAIL"

现在我们可以将文本发送到 LLM 进行标注。以下代码将每个文本发送到 LLM API,并将其文本输出映射到我们三个清晰的类别。注意:在实践中,逐个文本迭代并单独发送到 API 是低效的。API 可以同时处理多个文本,您可以通过异步发送批处理文本到 API 来显著加快 API 调用速度。您可以在此博客文章的重现仓库中找到优化后的代码。

output_simple = []
for text in dataset["sentence"]:
    # add text into the prompt template
    prompt_formatted = prompt_financial_sentiment.format(text=text)
    # send text to API
    output = generate_text(
        prompt=prompt_formatted, generation_params=generation_params
    )
    # clean output
    output_cl = clean_output(output, random_choice=True)
    output_simple.append(output_cl)

基于此输出,我们现在可以计算指标,以了解模型在未经训练的情况下执行任务的准确程度。

from sklearn.metrics import classification_report

def compute_metrics(label_experts, label_pred):
    # classification report gives us both aggregate and per-class metrics 
    metrics_report = classification_report(
        label_experts, label_pred, digits=2, output_dict=True, zero_division='warn'
    )
    return metrics_report

label_experts = dataset["label_text"]
label_pred = output_simple

metrics = compute_metrics(label_experts, label_pred)

基于简单的提示,LLM 正确分类了 91.6% 的文本(0.916 准确率和 0.916 F1 宏观)。考虑到它未受过此特定任务的训练,这已经相当不错了。

我们可以通过使用两种简单的提示技术进一步改进这一点:思维链(CoT)和自洽性(SC)。CoT 要求模型首先思考正确标签,然后做出标注决策,而不是立即决定正确标签。SC 意味着将相同的提示与相同的文本多次发送到同一个 LLM。SC 有效地为 LLM 提供了每个文本的多次尝试,具有不同的推理路径,如果 LLM 回复“积极”两次,“中性”一次,我们选择多数(“积极”)作为正确标签。这是我们更新后的 CoT 和 SC 提示:

prompt_financial_sentiment_cot = """\
You are a highly qualified expert trained to annotate machine learning training data.

Your task is to briefly analyze the sentiment in the TEXT below from an investor perspective and then label it with only one the three labels:
positive, negative, neutral.

Base your label decision only on the TEXT and do not speculate e.g. based on prior knowledge about a company. 

You first reason step by step about the correct label and then return your label.

You ALWAYS respond only in the following JSON format: {{"reason": "...", "label": "..."}}
You only respond with one single JSON response. 

Examples:
Text: Operating profit increased, from EUR 7m to 9m compared to the previous reporting period.
JSON response: {{"reason": "An increase in operating profit is positive for investors", "label": "positive"}}
Text: The company generated net sales of 11.3 million euro this year.
JSON response: {{"reason": "The text only mentions financials without indication if they are better or worse than before", "label": "neutral"}}
Text: Profit before taxes decreased to EUR 14m, compared to EUR 19m in the previous period.	
JSON response: {{"reason": "A decrease in profit is negative for investors", "label": "negative"}}

Your TEXT to analyse:
TEXT: {text}
JSON response: """

# we apply the chat template like above
chat_financial_sentiment_cot = [{"role": "user", "content": prompt_financial_sentiment_cot}]
prompt_financial_sentiment_cot = tokenizer.apply_chat_template(chat_financial_sentiment_cot, tokenize=False)
# The prompt now includes special tokens: '<s>[INST] You are a highly qualified expert ...  [/INST]'

这是一个 JSON 提示,我们要求 LLM 返回一个结构化的 JSON 字符串,其中“reason”作为键,而“label”作为另一个键。JSON 的主要优点是我们可以将其解析为 Python 字典,然后提取“label”。如果需要理解 LLM 选择此标签的原因,我们还可以提取“reason”。

`process_output_cot` 函数解析 LLM 返回的 JSON 字符串,如果 LLM 未返回有效的 JSON,它会尝试使用上面定义的 `clean_output` 函数中的简单字符串匹配来识别标签。

import ast 

def process_output_cot(output):
    try: 
        output_dic = ast.literal_eval(output) 
        return output_dic
    except Exception as e:
        # if json/dict parse fails, do simple search for occurrence of first label term
        print(f"Parsing failed for output: {output}, Error: {e}")
        output_cl = clean_output(output, random_choice=False)
        output_dic = {"reason": "FAIL", "label": output_cl}
        return output_dic

现在,我们可以重复使用上面定义的 `generate_text` 函数,配合新的提示,使用 `process_output_cot` 处理 JSON 思维链输出,并多次发送每个提示以实现自洽性。

self_consistency_iterations = 3

output_cot_multiple = []
for _ in range(self_consistency_iterations):
    output_lst_step = []
    for text in tqdm(dataset["sentence"]):
        prompt_formatted = prompt_financial_sentiment_cot.format(text=text)
        output = generate_text(
            prompt=prompt_formatted, generation_params=generation_params
        )
        output_dic = process_output_cot(output)
        output_lst_step.append(output_dic["label"])

    output_cot_multiple.append(output_lst_step)

对于每个文本,我们的 LLM 标注器现在有三次尝试,以三种不同的推理路径来识别正确的标签。下面的代码从这三种路径中选择多数标签。

import pandas as pd
from collections import Counter

def find_majority(row):
    # Count occurrences
    count = Counter(row)
    # Find majority
    majority = count.most_common(1)[0]
    # Check if it's a real majority or if all labels are equally frequent
    if majority[1] > 1:
        return majority[0]
    else: # in case all labels appear with equal frequency
        return random.choice(labels)

df_output = pd.DataFrame(data=output_cot_multiple).T

df_output['label_pred_cot_multiple'] = df_output.apply(find_majority, axis=1)

现在,我们可以再次将我们改进的 LLM 标签与专家标签进行比较并计算指标。

label_experts = dataset["label_text"]
label_pred_cot_multiple = df_output['label_pred_cot_multiple']

metrics_cot_multiple = compute_metrics(label_experts, label_pred_cot_multiple)

思维链(CoT)和自洽性(SC)将性能提升至 94.0% 的准确率和 0.94 的 F1 宏观分数。我们通过给模型时间思考其标签决策并给予其多次尝试来提高了性能。请注意,CoT 和 SC 会增加额外的计算成本。我们基本上是在用计算成本换取标注准确性。

fig_mixtral

得益于这些简单的 LLM API 调用,我们现在已经创建了一个合成训练数据集。我们通过让 LLM 在做出标签决策之前尝试三种不同的推理路径来标注每个文本。结果是与人类专家高度一致的标签以及一个可用于训练更高效和更专业模型的高质量数据集。

df_train = pd.DataFrame({
    "text": dataset["sentence"],
    "labels": df_output['label_pred_cot_multiple']
})

df_train.to_csv("df_train.csv")

请注意,在此博客文章的完整复现脚本中,我们还纯粹基于专家标注创建了一个测试集,以评估所有模型的质量。所有指标始终基于此人类专家测试集。

3.2 将开源模型与专有模型进行比较

使用开源 Mixtral 模型创建的这些数据的主要优势在于,数据在法律上明确可用作商业用途。例如,使用 OpenAI API 创建的数据受 OpenAI 商业条款的约束,这些条款明确禁止使用模型输出训练与其产品和服务竞争的模型。这些条款的法律价值和含义尚不明确,但它们为使用 OpenAI 模型合成数据训练的模型在商业用途方面带来了法律不确定性。任何基于合成数据训练的更小、更高效的模型都可能被视为竞争对手,因为它减少了对 API 服务的依赖。

Mistral 的开源 Mixtral-8x7B-Instruct-v0.1 与 OpenAI 的 GPT3.5 和 GPT4 之间合成数据的质量如何比较?我们使用 gpt-3.5-turbo-0613 和 gpt-4-0125-preview 运行了上述相同的流程和提示,并将结果报告在下表中。我们看到,根据提示类型,Mixtral 在此任务上的表现优于 GPT3.5,并与 GPT4 不相上下。(我们在此不显示更新的 gpt-3.5-turbo-0125 的结果,因为出于某种原因,此模型的性能比旧的默认 gpt-3.5-turbo-0613 差。)

fig_mixtral_gpt

请注意,这并不意味着 Mixtral 总是优于 GPT3.5 并与 GPT4 持平。GPT4 在多个基准测试中表现更佳。主要信息是开源模型现在可以创建高质量的合成数据。

3.3 理解并验证您的(合成)数据

所有这一切在实践中意味着什么?到目前为止,结果只是由某个黑箱 LLM 标注的数据。我们之所以能够计算指标,也仅仅是因为我们有示例数据集中的专家标注参考数据。如果我们在实际场景中没有专家标注,我们如何信任 LLM 标注呢?

在实践中,无论您使用何种标注器(人工标注器还是 LLM),您都只能信任您自己验证过的数据。指令/提示总是存在一定程度的歧义。即使是完美智能的标注器也会犯错误,并且在面对常常模糊的真实世界数据时,必须做出不明确的决策。

幸运的是,在过去几年中,通过开源工具,数据验证变得显著更容易:Argilla 提供了一个免费界面,用于验证和清理非结构化 LLM 输出;LabelStudio 允许您以多种方式标注数据;CleanLab 提供了一个用于标注和自动清理结构化数据的界面;对于快速简单的验证,只在简单的 Excel 文件中进行标注也可能足够。

花些时间标注文本对于理解数据及其模糊性至关重要。您很快就会发现模型犯了一些错误,但也会有一些例子,其中正确标签不明确,有些文本您更同意 LLM 的决定,而不是创建数据集的专家。这些错误和模糊性是数据集创建的正常部分。事实上,在现实世界中,只有很少的任务能达到 100% 的人类专家一致性基线。人类数据是一个有缺陷的黄金标准,这是一个古老的见解,最近被机器学习文献“重新发现”(Krippendorf 2004,Hosking et al. 2024)。

在标注界面中不到一小时,我们对数据有了更好的理解,并纠正了一些错误。然而,为了重现性和证明纯合成数据的质量,我们在下一步中继续使用未清理的 LLM 标注。

3.3 使用 AutoTrain 微调您高效且专业的模型

到目前为止,这只是通过 API 提示 LLM 并验证输出的标准工作流程。现在是实现显著资源节省的额外步骤:我们利用 LLM 的合成数据微调一个更小、更高效、更专业的 LM。这个过程也称为“蒸馏”,即利用大型模型(“教师”)的输出训练小型模型(“学生”)。虽然这听起来很花哨,但它本质上只意味着我们从数据集中获取原始 `text`,并将 LLM 的预测作为我们微调的 `labels`。如果您之前训练过分类器,您会知道这些是您使用 `transformers`、`sklearn` 或任何其他库训练分类器所需的仅有的两列。

我们使用 Hugging Face 的 AutoTrain 解决方案,使这个过程变得更加简单。AutoTrain 是一个无代码界面,您可以在其中上传一个带有标注数据的 .csv 文件,然后该服务会自动为您微调模型。这消除了自行训练模型所需的编码或深入微调专业知识。

在 Hugging Face 网站上,我们首先点击顶部的“Spaces”,然后点击“Create new Space”。接着选择“Docker”>“AutoTrain”,并选择一个小型 A10G GPU,每小时费用为 1.05 美元。AutoTrain 的 Space 将随即初始化。然后,我们可以通过界面上传我们的合成训练数据和专家测试数据,并调整不同的字段,如下图所示。一旦所有信息填写完毕,我们就可以点击“Start Training”,您可以在 Space 的日志中跟踪训练过程。在一个只有 1811 个数据点的小型 RoBERTa-base 模型(约 0.13 B 参数)上进行训练速度非常快,不应超过几分钟。训练完成后,模型会自动上传到您的 HF 个人资料。训练完成后,Space 将停止,整个过程最多需要 15 分钟,费用不到 1 美元。

autotrain

如果您愿意,也可以在自己的硬件上完全本地使用 AutoTrain,请参阅我们的文档。高级用户当然可以随时编写自己的训练脚本,但使用这些默认超参数,AutoTrain 的结果应该足以满足许多分类任务的需求。

我们最终微调的约 0.13B 参数 RoBERTa-base 模型与更大的 LLM 相比表现如何?下面的条形图显示,在 1811 个文本上微调的定制模型达到了 94% 的准确率——与其教师 Mixtral 和 GPT4 相同!一个小型模型永远无法与更大的 LLM 开箱即用地竞争,但对其进行高质量数据微调后,它可以在其专业任务中达到相同的性能水平。

fig_mixtral_gpt_roberta

3.4 不同方法的优缺点

我们开篇讨论的三种方法(1)手动创建自己的数据和模型,(2)仅使用 LLM API,或(3)使用 LLM API 为专用模型创建合成数据)的总体优缺点是什么?下表显示了不同因素的权衡,我们将在下面根据我们的示例数据集讨论不同的指标。

table_pros_cons

我们先从任务性能说起。如上所示,专用模型的性能与大型 LLM 不相上下。经过微调的模型只能完成我们训练它的特定任务,但它能很好地完成这项特定任务。创建更多训练数据以使模型适应新领域或更复杂的任务是微不足道的。得益于 LLM 生成的合成数据,由于缺乏专用数据而导致的低性能不再是问题。

其次,计算成本和推理速度。实践中,主要的计算成本将是推理,即模型训练完成后运行它。假设在您的生产用例中,您需要在给定时间段内处理 100 万个句子。我们微调的 RoBERTa-base 模型在具有 16GB RAM 的小型 T4 GPU 上高效运行,在推理端点上每小时花费 0.6 美元。它的延迟为 0.13 秒,在 `batch_size=8` 时吞吐量为每秒 61 个句子。这导致处理 100 万个句子的总成本为 2.7 美元。

使用 GPT 模型,我们可以通过计算 token 来计算推理成本。处理 100 万个句子中的 token 大约需要 GPT3.5 花费 153 美元,GPT4 花费 3061 美元。这些模型的延迟和吞吐量计算起来更复杂,因为它们全天都会根据当前的服务器负载而变化。然而,任何使用 GPT4 的人都知道,延迟通常可能达到数秒,并且受到速率限制。请注意,速度是任何 LLM(API)的问题,包括开源 LLM。许多生成式 LLM 仅仅因为太大了而无法快速运行。

训练计算成本往往不那么重要,因为 LLM 通常可以开箱即用而无需微调,并且小型模型的微调成本相对较小(微调 RoBERTa-base 的成本不到 1 美元)。只有在极少数情况下,您才需要投资从头开始预训练模型。当微调更大的生成式 LLM 以使其专门化于特定生成任务时,训练成本才会变得相关。

第三,所需的时间和专业知识投入。这是 LLM API 的主要优势。将指令发送到 API 比手动收集数据、微调定制模型并部署它要简单得多。这正是使用 LLM API 创建合成数据变得重要的原因。创建高质量的训练数据变得显著更容易。微调和部署可以由 AutoTrain 和专用推理端点等服务处理。

第四,控制。这可能是 LLM API 的主要缺点。根据设计,LLM API 使您依赖于 LLM API 提供商。您需要将敏感数据发送到他人的服务器,并且无法控制系统的可靠性和速度。训练您自己的模型可以让您选择如何以及在哪里部署它。

最后,环境影响。鉴于模型架构和硬件基础设施信息的缺乏,很难估算 GPT4 等封闭模型的能源消耗和二氧化碳排放量。我们能找到的最佳(但非常粗略的)估计显示,每次 GPT4 查询的能源消耗约为 0.0017 至 0.0026 千瓦时。这将导致分析 100 万个句子大约需要 1700 - 2600 千瓦时。根据美国环保署的二氧化碳当量计算器,这相当于 0.735 - 1.1 公吨二氧化碳,或普通汽车行驶 1885 - 2883 英里。请注意,实际的二氧化碳排放量可能因 LLM 特定计算区域的能源结构而差异很大。使用我们的自定义模型进行估算要容易得多。使用自定义模型分析 100 万个句子,在 T4 GPU 上大约需要 4.52 小时,而在美国东部弗吉尼亚州的 AWS 服务器上,这导致大约 0.12 公斤的二氧化碳排放量(参见 ML CO2 影响计算器)。与具有约 0.13B 参数的专用模型相比,运行一个通用 LLM(如 GPT4,据称具有 8x220B 参数)效率极其低下。

结论

我们已经展示了使用 LLM 创建合成数据以训练更小、更高效模型所带来的巨大好处。虽然此示例仅处理投资者情绪分类,但相同的流程可以应用于许多其他任务,从其他分类任务(例如客户意图检测或有害内容检测),到 token 分类(例如命名实体识别或 PII 检测),或生成任务(例如摘要或问答)。

2024 年,公司创建自己的高效模型、控制自己的数据和基础设施、减少二氧化碳排放、节省计算成本和时间,同时不损害准确性,变得前所未有的容易。

现在就自己试试吧!您可以在本博客文章的重现仓库中找到所有数据的完整重现代码,以及更高效的批处理异步 API 调用函数。我们邀请您复制并调整我们的代码以适应您的用例!

社区

注册登录 发表评论