在图实体关系提取任务中,Phi-3-mini-4k 表现优于 Claude 3.5 Sonnet

社区文章 发布日期:2024年8月19日

image/png

高效生产级实体关系提取

AskNews,我们正在重新构想人们和大型语言模型 (LLMs) 消费和理解新闻的方式。我们提供的一项功能是所有事件叙述和新闻文章中实体之间关系的丰富可视化表示。这些实体关系图,也称为知识图谱,为我们的用户提供了探索和与我们庞大的新闻数据库交互的强大方式。事实上,我们官方托管着世界上最大的可搜索新闻知识图谱表示。但我们如何处理每天生成 50 万个知识图谱呢?以下博客文章重点介绍了支撑整个知识图谱构建/索引过程的关键组件——我们微调的 Phi-3-mini-4k-instruct-graph。

image/png

作者:来自 Emergent MethodsWagner Costa SantosElin TörnquistRobert Caulk

概述

我们微调了 Phi-3-mini-4k,使其在图提取质量方面超越 Claude Sonnet 3.5 高达 20%,并将成本降低了几个数量级。此外,我们改进了 Phi-3-mini-4k 本身令人印象深刻的 JSON 输出结构,将解析错误率从 2.5% 降低到 0。我们还发布了另外两个版本,Phi-3-medium-4k-instruct-graph 和 Phi-3-medium-128k-instruct-graph,旨在实现高推理能力和更长的上下文。

image/png

我们还在 HuggingFace 空间托管了我们微调的模型,该模型旨在摄取任何文本并将其输出可视化为图。

image/png

图目前正风靡一时

AskNews 系统每天处理的新闻量高达 50 万篇。使用向量数据库对这些文章进行索引可以实现广阔的语义探索,但使用知识图谱进行索引则带来了更高层次的复杂性。虽然向量数据库通常与小型嵌入模型结合,旨在将语义嵌入到向量空间中,但知识图谱需要高级推理、通用世界知识和上下文才能正确构建。

最新的工具现在能够以经济高效的方式将这些通用世界知识和推理应用于每天 50 万篇新闻文章。Phi-3-mini-4k 是一种功能强大的小型语言模型 (SLM),广泛应用于摘要、翻译、代码生成和实体提取等任务。同时,GPT-4o 是一种最先进的大型语言模型,能够执行更高级的推理任务。通过将这些模型与最新的微调方法和库相结合,我们可以有效地将知识从 GPT-4o 转移到 Phi-3-mini-4k,以极低的成本保持图的质量和准确性。

通过每天使用 Phi-3-mini-4k-graph 提取 50 万个实体关系图,我们受益于强大的新闻知识图谱表示,这促进了:

  • 跨互补向量 x 图索引的复杂搜索查询(例如 RAG)
  • 识别实体和关系之间的时间特征和趋势,从而增强预测建模(实时预测
  • 追踪次级和三级关系中的隐藏洞察力。在以下部分中,我们将探讨我们的方法论,包括指标制定方法,并分享我们训练后评估的结果。

方法论 - 数据集工程

我们使用 AskNews API 的“事件”构建了数据集。“事件”是数百篇语义相似的合成新闻文章摘要的集合,代表单个事件。聚类过程本身可以识别不同的主题,这有助于我们数据集的主题/词汇多样化。每个事件集群可以连接到在不同时间点发生的其他事件集群。这称为叙事跟踪,我们不会在此处详细介绍,但总而言之,两个时间上连接的事件通常是不断发展的新闻故事的更新。

目标是尽可能多样化主题和词汇。因此我们:

  1. 从所有独特事件中选择均匀分布的样本
  2. 选择最多 3 个时间上连接的事件
  3. 确保训练/测试/验证数据集各自包含其自己的独特事件子集,并且在时间上不交叉

我们从 AskNews API 中提取这些事件,将合成摘要输入 GPT-4o 生成实体关系图,然后将合成事件摘要与 GPT-4o 生成的标签结合起来构建完整的训练数据集。

这个数据集被分为 90% 用于训练,5% 用于验证,5% 用于测试——总共有 4,000 个独特样本。通过保持事件之间的严格分离,我们获得了 LLM 将操作的目标参数空间的良好分布表示。

方法论 - 损失和验证指标

我们的主要目标是训练 Phi-3 生成与 GPT-4o 相似的故事图,同时确保 JSON 结构的正确生成。

最初,我们尝试使用 BLEU 和 ROUGE 等标准文本相似度指标来验证和测试模型的性能。然而,经过几次训练迭代后,我们发现针对我们特定用例量身定制的自定义指标产生了更好的结果。

  • JSON 相似度:我们开发了一个自定义指标来比较 Phi-3 生成的节点和边与参考模型 (GPT-4o) 的节点和边。

image/png

  • JSON 一致性:此附加指标允许我们检查每个边实体数据是否具有关联节点。我们发现在某些情况下,即使是像 Claude 3.5 这样的最先进模型也会生成带有孤立边的图。

image/png

这是一个 JSON 输出的小例子

{
    "nodes": [
        {
            "id": "Viktor Orban",
            "type": "person",
            "detailed_type": "hungarian prime minister"
        },
        {
            "id": "United States",
            "type": "country",
            "detailed_type": "nation"
        }
    ],
    "edges": [
        {
            "from": "Viktor Orban",
            "to": "United States",
            "label": "stated influence"
        }
    ]
}

方法论 - 基础模型选择

我们为本项目选择了 Phi-3-mini-4k-instruct 模型。Phi-3 被归类为小型语言模型 (SLM),并且 效率极高。即使是配备 NVIDIA RTX GPU 的工作站或配备 GeForce RTX GPU 的 PC 也可以在本地运行该模型。该模型于 2024 年 6 月获得重大更新,事实证明,该更新在指令遵循、结构化输出和推理能力方面取得了显著改进。根据 模型发布说明,JSON 结构输出性能在公共和内部基准数据集上从 11.5 大幅提升至 52.3,此外还有其他增强功能。对于我们的用例而言,这一改进意义重大。

这些改进进一步证实了 Phi-3 是我们任务的绝佳选择。其作为 SLM 的效率与结构化输出能力增强的结合,与我们处理大量新闻文章同时保持高质量实体关系提取的目标完美契合。

我们的微调方法利用了 Transformers,其中包括:用于高效监督训练的 SFTTrainer、用于参数高效微调的 PEFT 以及用于量化低秩适应的 QLoRA,从而使 Phi-3 能够有效适应我们的任务,同时优化计算资源。

下面的代码片段说明了我们实现的关键部分。

from transformers import (AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig,
                        TrainingArguments, EarlyStoppingCallback)
from trl import SFTTrainer
from peft import LoraConfig


class ModelTrainer:
  def setup_model_and_tokenizer(self):
      bnb_config = BitsAndBytesConfig(
          load_in_4bit=True, bnb_4bit_use_double_quant=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16
      )
      self.model = AutoModelForCausalLM.from_pretrained(
          self.model_id,
          device_map="auto",
          attn_implementation="flash_attention_2",
          torch_dtype=torch.bfloat16,
          quantization_config=bnb_config,
          trust_remote_code=True,
          use_cache=False
      )
      self.tokenizer = AutoTokenizer.from_pretrained(self.tokenizer_id, trust_remote_code=True)


  def setup_trainer(self, train_dataset, eval_dataset):
      peft_config = LoraConfig(
          lora_alpha=8,
          lora_dropout=0.05,
          r=6,
          bias="none",
          target_modules="all-linear",
          task_type="CAUSAL_LM",
      )
     
      args = TrainingArguments(
          output_dir=self.output_dir,
          num_train_epochs=5,
          per_device_train_batch_size=4,
          gradient_accumulation_steps=1,
          per_device_eval_batch_size=8,
          eval_accumulation_steps=2,
          gradient_checkpointing=True,
          logging_steps=10,
          save_strategy="steps",
          evaluation_strategy="steps",
          eval_steps=100,
          save_steps=100,
          bf16=True,
          tf32=True,
          learning_rate=2e-4,
          max_grad_norm=0.3,
          warmup_ratio=0.03,
          lr_scheduler_type="cosine",
          metric_for_best_model="json_similarity_avg",
          greater_is_better=True,
      )
 
      self.trainer = SFTTrainer(
          model=self.model,
          args=args,
          train_dataset=train_dataset,
          eval_dataset=eval_dataset,
          peft_config=peft_config,
          max_seq_length=3072,
          tokenizer=self.tokenizer,
          packing=False,
          compute_metrics=self.compute_metrics,
      )


def main():
  trainer = ModelTrainer(
      model_id="microsoft/Phi-3-mini-4k-instruct",
      tokenizer_id="microsoft/Phi-3-mini-4k-instruct",
      dataset_path="src/dataset/ds_1ea20812-afa8-4fab-8fba-dfb566c4775f",
      output_dir=f"models/{output_model_name}"
  )


  trainer.setup_model_and_tokenizer()
  trainer.setup_trainer(chatml_train_dataset, chatml_eval_dataset)
  trainer.train_model()
  trainer.save_model()

为了测试和评估结果,我们建立了 GPT-4o 作为“黄金标准”。我们比较了我们微调的模型、未经微调的原始 Phi-3 和 Claude Sonnet 3.5(与 GPT-4o 一起被认为是最新技术)之间的性能。我们比较了这些模型之间前面提到的指标。此外,JSON 一致性指标也被证明很有价值,因为它不需要“黄金标准”进行比较,从而可以对每个模型进行更独立的评估。

比较示例

在我们深入探讨训练后评估的细节之前,让我们看一些实际例子,以便更好地理解我们的结果以及我们的指标实际意味着什么。我们将通过三个具体案例来展示我们的 JSON 相似度指标和一致性检查如何在实践中发挥作用,以及它们的重要性。

1) 高相似度

第一个例子是 JSON 相似度较高的响应(这意味着与我们想要模仿的模型 GPT-4o 的相似度更高)。

文本输入:在一次协同执法行动中,瓦西里·布拉科夫因在莫斯科郊区谢尔科沃枪杀两名警察而在特维尔地区被捕。这次袭击发生于 4 月 7 日,导致一名警官死亡,另一名警官伤势严重。布拉科夫逃离现场并藏匿起来,在经过六小时的搜捕后,最终在当地一片森林中被捕。被捕后,布拉科夫承认了罪行,并已被指控企图谋杀执法人员和非法持有枪支。这一事件引起了广泛关注,因为它凸显了警察在执行公务时所面临的危险,尤其是在与毒品贩运相关的行动中。俄罗斯内政部和俄罗斯联邦安全局正在继续调查枪击事件以及布拉科夫随后的逃跑和被捕情况。

GPT-4o 输出

image/png

Phi-3-mini-instruct-graph 输出

image/png

正如我们在比较中看到的,实体完全相同,只是在关系描述上存在一些差异。然而,即使存在这些差异,两个版本都传达了故事的正确含义。

2) 低相似度

第二个例子是 JSON 相似度较低的响应(这意味着与我们想要模仿的模型 GPT-4o 的相似度较低)。

文本输入:令人惊讶的是,美国劳动力市场在 5 月份新增了 27.2 万个就业岗位,远超道琼斯共识估计的 19 万个,这与劳动力市场放缓的说法相悖。尽管就业增长强劲,失业率仍上升至 4%,为 2022 年 1 月以来的最高水平。医疗保健、政府、休闲和酒店业是此次增长的主要驱动力,而平均时薪的增长也表明工资增长的持续趋势。强劲的就业报告对美联储的货币政策具有重要意义。最初,人们预期美联储可能会降息以支持经济。然而,就业创造和工资增长的意外激增可能导致美联储推迟任何降息,一些专家现在预测首次降息可能要到 9 月份才会发生。劳动力市场的强劲被视为可能使美联储保持观望态度的关键因素。股票和债券市场对该报告反应消极,标普 500 指数期货下跌,政府债券收益率上升,反映出投资者担心美联储可能因强劲的就业市场数据而推迟降息。当前情况给美联储带来了复杂的局面,它正在平衡管理通胀与支持经济增长和保持劳动力市场强劲的需求。

GPT-4o 输出

image/png

Phi-3-mini-instruct-graph 输出

image/png

正如我们在此比较中看到的,即使相似度较低,经过微调的 Phi3 也能更好地通过实体及其关系来传达故事细节,保持美国劳动力市场作为主要实体,并与美联储保持联系(这在 GPT-4o 中没有发生)。

3) JSON 一致性

json_consistency 指标旨在通过验证所有边是否都存在实体来衡量 JSON 的一致性,从而显示提取中节点和边之间的连贯性。我们微调的模型在该指标中达到了 99%,证明优于 Claude 3.5 Sonnet (97%)。我们将展示 Claude 3.5 中低一致性的一个具体示例,并将其与微调后的 Phi3 进行比较。

故事:在珀斯,西澳大利亚发生了一场悲剧性的冲突,一名 16 岁男孩在刺伤一名男子并拒绝放下武器后被警察致命枪击。当局将此事件定性为具有恐怖主义“特征”,因为该男孩据报在线激进化。他此前已被确认为有风险,并且是去激进化计划的一部分。警方在前一天晚上收到了潜在袭击的线索,但未能阻止刺伤事件。当他们到达现场时,该男孩手持一把 30 厘米的菜刀,尽管被电击两次,仍向警察冲去,随后被枪击。被刺伤的受害者目前情况稳定但危急。这一事件引起了人们对激进化在澳大利亚年轻人中蔓延以及有效干预挑战的严重关注。西澳大利亚州州长罗杰·库克和澳大利亚总理安东尼·阿尔巴尼斯都已就此事件发表讲话,强调该国致力于打击暴力极端主义。该事件正在调查中,并已安排宗教领袖和市政府当局召开会议,以解决社区担忧。

Claude 3.5 Sonnet 输出

image/png

Phi-3-mini-instruct-graph 输出

image/png

在这种情况下,Claude 3.5 Sonnet 的一致性为 57%,而微调后的 Phi3 为 100%。Claude 总共有 7 条边,其中 3 条因引用不存在的名为“Incident”的节点而失效。因此,我们可以看到微调后的 Phi3 版本能够传达更多故事细节。

训练后评估

我们的训练后评估结果,通过下面的比较图表呈现,展示了我们微调过程的有效性,并为每个模型在生成实体关系图任务中的能力和局限性提供了有价值的见解。如表中所示,Claude Sonnet 3.5 和 Phi-3-mini-instruct-graph 均显示零错误,表明在此指标上表现完美。然而,Phi-3-mini-4k-instruct(基础)模型显示 5 个错误,占总数的 2.5%。这表明我们的微调过程显著改善了基础 Phi-3 模型的性能,使其在 JSON 输出错误减少方面与更高级的 Claude Sonnet 3.5 持平。

image/png

image/png

这组条形图提供了三个模型在四个关键指标上的全面比较。在节点相似度方面,微调后的 Phi-3 优于 Claude Sonnet 3.5 和基础 Phi-3 模型,达到 0.78 分。在边缘相似度方面,微调后的 Phi-3 再次以 0.49 分领先,显示出对基础模型的显著改进。JSON 一致性指标显示所有模型都表现出色,微调后的 Phi-3 略微领先,达到 0.99 分。最后,JSON 相似度平均值(计算为节点相似度、边缘相似度和 JSON 一致性的平均值)显示微调后的 Phi-3 保持领先,得分为 0.75。这个综合指标提供了每个模型在 JSON 结构和内容相似度所有方面的整体性能视图。这些结果表明,我们的微调过程成功地增强了 Phi-3 在所有衡量方面的性能,通常超越了 Claude Sonnet 3.5 的能力。

image/png

箱线图提供了每个指标得分分布的更详细视图。对于节点相似度,微调后的 Phi-3 显示出更高的中位数和更紧密的四分位距,表明性能更一致。在边缘相似度方面,虽然微调后的 Phi-3 具有更高的中位数,但它也显示出更大的可变性,表明在一致性方面仍有改进空间。JSON 一致性图显示所有模型都表现出色,微调后的 Phi-3 表现出最小的可变性。最后,JSON 相似度平均值图代表了节点、边缘和一致性指标的综合性能,表明微调后的 Phi-3 不仅具有最高的中间得分,而且保持相对紧密的分布。这展示了其在各种测试案例中的稳健和一致性能,平衡了所有三个组成指标的优势。这些详细的分布强化了我们微调方法的成功,同时也突出了未来潜在改进的领域。

成本比较

如前所述,我们的目标是每天获取大约 50 万篇文章的实体关系。通过 API 使用大型语言模型 (LLM) 是一项成本高昂的尝试。让我们模拟一下 GPT-4o 和我们微调的 Phi3 之间的成本比较(使用 2024 年 7 月的价格)。为此,我们假设平均输入令牌数为 905 个,输出令牌数为 525 个,这是我们在使用微调后的 Phi3 在测试数据集上进行测试时的平均值。我们知道根据分词器的不同,令牌计数方法可能存在差异,但我们将使用 Phi3 的作为比较基础。

托管 2x A100 SXM (runpod.io)

$ 3.88/小时 => $93.12 / 天

OpenAI (GPT-4o)

输入定价:2.715 亿 (905 x 30 万) 令牌 ($5.00 / 100 万):总计 $ 1357.00 / 天

输出定价:1.575 亿 (525 x 30 万) 令牌 ($15.00 / 100 万):总计 $ 2362.50 / 天

总计:$ 3719.50 / 天

成本比较揭示了使用托管在单个 A100 GPU 上的微调 Phi3 模型与利用 OpenAI 的 GPT-4o API 之间的显著差异。托管微调模型的成本约为每天 46.56 美元,而使用 GPT-4o API 处理相同工作量每天将花费约 3,719.50 美元。这意味着使用微调模型可将成本降低 98% 以上。显著的节省主要归因于取消了按令牌计费以及能够在专用硬件上处理大量请求。然而,值得注意的是,此比较未考虑微调的初始成本或输出质量的潜在差异。例如,我们的 Phi-3 mini 训练过程在 A100 SXM 上花费了近 3 小时(目前,runpod.io 每小时收费 1.94 美元),这增加了前期投资。尽管如此,对于像我们这样的高吞吐量应用,使用微调模型带来的经济效益是显而易见的且意义重大。

局限性

大多数实体和关系提取方法限制了实体和关系的类型。由于我们的主要目标是使用此模型来解释文章、故事并捕获尽可能多的细节,因此我们以一种鼓励模型自由定义这些类型/关系的方式构建了微调数据集。如果您希望限制输出,您可以调整模型提示以限制为一组类型/关系,但像 SciPhi 这样的其他模型在受限实体/关系生成方面可能会优于 Phi-3-mini-4k-instruct-graph。我们理解这可能会因缺乏标准化而带来缺点,然而,其结果是一个能够利用庞大底层训练语料库进行丰富图提取的模型。

另一个重要的点是我们没有人工验证的“黄金标准”。在我们的案例中,我们使用了 GPT-4o,这是我们数据集生成时最先进的模型。微调是使用此参考完成的。然而,即使我们为数据集提供了更好的“黄金标准”,它仍然可能存在偏差并且不“完美”,因为正如我们上面在定性比较中所示,实体关系在许多方面都是非常复杂和主观的。

模型

我们很高兴在 Hugging Face 上发布我们的模型,共有 3 个版本,链接如下:

Phi-3-mini-4k-instruct-graph Phi-3-mini-128k-instruct-graph Phi-3-medium-128k-instruct-graph

社区

注册登录 发表评论