大型语言模型与本地模型分歧标注技术

本文介绍了一种利用大型语言模型与本地NLP模型的分歧来优化数据标注流程的技术,通过对比两种模型的预测结果,优先标注存在分歧的样本,从而提升模型性能。

大型分歧建模

在这篇博客中,我们将探讨大型语言模型的应用。除了当前的热度,这也是重新审视我最喜欢的机器学习技术之一——模型分歧的绝佳机会。

基本概念

假设你需要运行一个自然语言处理模型,输入文本并输出结构化信息(如命名实体、类别、文本范围等)。虽然可以直接使用大型语言模型(LLM)配合提示词来完成,但长期来看,在特定领域训练定制模型可能效果更好,尤其是考虑到LLM的运行成本、延迟以及文本到文本系统的实际限制。

那么,如何在现有流程中有效利用大型语言模型呢?

技术要点

假设我们有一个本地NLP流程和大量未标注数据,希望通过标注来改进流程。关键在于找到最有可能提升模型性能的数据子集。传统方法可能依赖主动学习,利用模型的不确定性估计来筛选样本。但有了LLM,我们可以采用另一种方法:

  1. 对未标注数据同时运行LLM和本地模型
  2. 对比两者的预测结果
  3. 优先标注存在分歧的样本

这种方法的核心在于:当提示词设计合理时,分歧样本往往揭示了本地模型的错误,这些样本在标注流程中应获得优先处理。

实践演示

我们以《卫报》新闻文本为例,演示如何提取组织和人名实体。通过以下步骤实现:

  1. 配置spaCy管道,使用OpenAI进行NER:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[nlp]
lang = "en"
pipeline = ["ner"]

[components.ner]
factory = "llm"
[components.ner.task]
@llm_tasks = "spacy.NER.v1"
labels = ORGANISATION
[components.ner.backend]
@llm_backends = "spacy.REST.v1"
api = "OpenAI"
config = {"model": "text-davinci-003", "temperature": 0.3}
  1. 加载配置并保存模型:
1
dotenv run -- spacy assemble config.cfg en_my_llm
  1. 使用两种模型进行预测:
1
2
python cli.py predict en_core_web_md examples.jsonl out-spacy.jsonl --ner 'ORG:ORGANISATION,ORGANISATION,PERSON,DATE' --annot-name spacy-md
python cli.py predict en_openai_llm examples.jsonl out-llm.jsonl --ner 'ORG:ORGANISATION,ORGANISATION,PERSON,DATE' --annot-name llm
  1. 在Prodigy中对比结果:
1
2
3
python -m prodigy db-in guardian out-spacy.jsonl
python -m prodigy db-in guardian out-llm.jsonl
python -m prodigy review reviewed guardian --view-id ner_manual --label ORGANISATION,PERSON,DATE

技术优势

这种方法不仅保留了人工审核环节,降低了有害文本的风险,还能同时改进提示词和本地模型。虽然只是技术"窍门"而非万能解决方案,但它为NLP项目提供了快速启动的新途径:利用LLM的灵活性生成训练数据,最终构建更轻量级的专用模型。

此外,该技术不仅限于命名实体识别,还可应用于文本分类、术语生成等其他场景。随着LLM技术的发展,未来可能出现更多能在本地运行的轻量级替代方案。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计