大型分歧建模
在这篇博客中,我们将探讨大型语言模型的应用。除了当前的热度,这也是重新审视我最喜欢的机器学习技术之一——模型分歧的绝佳机会。
基本概念
假设你需要运行一个自然语言处理模型,输入文本并输出结构化信息(如命名实体、类别、文本范围等)。虽然可以直接使用大型语言模型(LLM)配合提示词来完成,但长期来看,在特定领域训练定制模型可能效果更好,尤其是考虑到LLM的运行成本、延迟以及文本到文本系统的实际限制。
那么,如何在现有流程中有效利用大型语言模型呢?
技术要点
假设我们有一个本地NLP流程和大量未标注数据,希望通过标注来改进流程。关键在于找到最有可能提升模型性能的数据子集。传统方法可能依赖主动学习,利用模型的不确定性估计来筛选样本。但有了LLM,我们可以采用另一种方法:
- 对未标注数据同时运行LLM和本地模型
- 对比两者的预测结果
- 优先标注存在分歧的样本
这种方法的核心在于:当提示词设计合理时,分歧样本往往揭示了本地模型的错误,这些样本在标注流程中应获得优先处理。
实践演示
我们以《卫报》新闻文本为例,演示如何提取组织和人名实体。通过以下步骤实现:
- 配置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
|
dotenv run -- spacy assemble config.cfg en_my_llm
|
- 使用两种模型进行预测:
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
|
- 在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技术的发展,未来可能出现更多能在本地运行的轻量级替代方案。