利用spacy-llm将大语言模型导向结构化自然语言处理

4 阅读10分钟

引导大语言模型走向结构化自然语言处理

spacy-llm是spaCy最近推出的大语言模型集成库,由spaCy背后的团队维护。本次分享阐述了开发该库的动机、它试图解决的问题,以及在开发过程中获得的经验教训。

近期的大语言模型展现出令人印象深刻的能力,使得自然语言处理应用的快速原型设计成为可能。spacy-llm致力于解决让大语言模型应用于生产环境时面临的一些挑战:

  • 大语言模型将文本转化为……更多文本。然而,自然语言处理应用的目标常常是从文本中提取结构化信息,并将其用于下游任务。
  • spacy-llm负责解析大语言模型的响应,并将解析后的结果映射到已有的文档、跨度和标记等数据结构上。
  • 闭源模型和开源模型有着显著不同的缺点。闭源模型不免费,会引入网络延迟,是不透明的黑箱,并非适用于所有(商业)用例——请检查服务条款!
  • 并且可能泄露用户数据。此外,您可能会受到速率限制。开源模型需要相当大的计算能力才能在本地运行,设置更为复杂,并且(在某些方面)能力仍然不如闭源模型。
  • 因此,闭源模型和开源模型的使用效果,可能会因您所处的开发周期阶段而有所不同。spacy-llm允许在不修改任何代码的情况下,平滑地在开源和闭源大语言模型之间切换。

spacy-llm将开源和闭源大语言模型集成到spaCy中,利用其模块化且可定制的文本处理框架。这催生了一个由前沿大语言模型驱动的、更廉价、更快速、更稳健的自然语言处理工作流。


关于结构化自然语言处理

  • 目标是从文本中提取一组定义好的属性,例如实体(地点、人物等)、词元、分类等。
  • “经典”自然语言处理:使用预测模型。
  • 最先进的模型:通常是BERT级别的Transformer模型。
  • 实际应用会将多个此类任务串联起来,例如实体识别、实体链接等。
  • 下游应用通常依赖于具体、明确的信息,例如文档级别的文档分类,跨度级别的实体,标记级别的词元、词性标注等。
  • 相关库:spaCy, Stanza, Gensim, Hugging Face等。

spaCy简介

  • 免费、开源的库。
  • 专为生产环境使用而设计。
  • 注重开发者的生产效率。
  • 免费课程:course.spacy.io
  • 采用模块化的流水线方法进行语言分析,将非结构化文本转化为结构化的数据对象。

关于大语言模型

  • 生成式模型,与预测式模型相对。
  • 优点:非常适合原型设计、零样本学习、开发工作量低、用途广泛等。通过适当的提示,在某些任务上可能超越小型预测模型,产生优异结果。
  • 缺点:延迟、成本/硬件要求、自由形式的文本输出、幻觉问题。
  • 相关库:Hugging Face, llama.cpp, LangChain等。
  • 提供商:某中心,某机构等。

结构化自然语言处理与大语言模型:并非对立

  • 使用大语言模型进行结构化自然语言处理是可行的,但通常比“AI魔法”受到的关注少。
  • 大语言模型生成的响应相对不受约束(将文本转化为文本),可以通过预训练、微调、提示、护栏等方式进行限制。进行结构化自然语言处理时,解析是必要的。
  • 模块化与单体化方法(不一定,但通常是)。
  • 结构化自然语言处理更可能适用于工业/实际应用。

用例:临床试验结果

  • 任务:从关于临床试验结果的人工撰写笔记(例如论文)中提取信息。
  • 比较预测式(小型)模型与生成式(大语言模型)工作流的差异。
  • 这是一个专业领域,基于通用语料库训练的现有预测模型不够准确。

示例文本

患者:15名参与者中有11名为女性,中位年龄9.2岁(范围1.7-14.9岁),中位体重26.8公斤(范围8.5-55.2公斤)。基线平均肺动脉压为49±19毫米汞柱,平均指数化肺血管阻力为10±5.4 Wood单位。肺动脉高压的病因各不相同,所有患者均接受全身性肺动脉高压药物治疗。
干预:患者1-5接受去氧肾上腺素1微克/公斤;患者6-10接受精氨酸加压素0.03单位/公斤;患者11-15接受肾上腺素1微克/公斤。在研究药物给药后持续测量血流动力学长达10分钟。
测量和主要结果:研究药物给药后,肺血管阻力与全身血管阻力之比在接受去氧肾上腺素的5名患者中有3名下降,在接受精氨酸加压素的5名患者中有5名下降,在接受肾上腺素的5名患者中有3名下降。虽然三种药物均导致主动脉压升高,但只有精氨酸加压素持续导致收缩期肺动脉压与主动脉压之比下降。

预测式方法

  • 注释数据,然后训练监督模型。此用例所需的步骤包括:
    • 命名实体识别/跨度分类:识别患者组、药物、剂量、频率、结果等。
    • 关系抽取:找出已识别实体之间的关系。
  • 使用工具如prodi.gy进行标注。
  • 配置以实现自然语言处理流水线的可序列化和可复现性。
  • spaCy为命名实体识别、跨度分类、文本分类、标注器、依存句法分析器等内置了架构,并支持自定义模型和组件。
  • 使用命令训练模型:python -m spacy train my_config.cfg --output ./my_output

生成式方法

  • 编写提示。
  • 可选:提供少量示例。
  • 假设:模型经过领域知识训练。
  • 提示示例
    请以如下结构化方式总结试验结果:
    • 患者组:<名称>
    • 组内患者数量:<数量>
    • 治疗药物或物质:<药物>
    • 治疗剂量:<剂量>
    • 给药频率:<频率>
    • 治疗持续时间:<持续时间>
    • 结果:<结果>
    
  • 模型响应示例
    患者组:精氨酸加压素组
    组内患者数量:5
    治疗药物或物质:精氨酸加压素
    治疗剂量:0.03 U/kg
    给药频率:单次给药
    治疗持续时间:未指定
    结果:接受精氨酸加压素的所有五名患者的肺血管阻力与全身血管阻力之比均下降。观察到主动脉压升高。
    ...
    

大语言模型用于(结构化)自然语言处理的问题

  • 幻觉/错误回复。
  • 响应的可变性。
  • 处理数量时的问题。
  • 无法映射到标准化的数据结构。
  • 延迟和速率限制。
  • 有限的上下文长度。
  • 冗余/不必要的工作。
  • 成本高昂。
  • 数据泄露。
  • ……
  • 具体挑战示例
    • 给药频率:可能被描述为“给予一次”、“单次给药”、“一次性剂量”、“一次”、“单剂量”、“一次性给药”、“一次”等多种形式。
    • 患者总数:应为15。
    • 治疗药物:组1(患者1-5)接受去氧肾上腺素1μg/kg,组2(患者6-10)接受精氨酸加压素0.03 U/kg,组3(患者11-15)接受肾上腺素1μg/kg。

问题的缓解方案

  • 一些问题是大语言模型/API固有的,例如幻觉、数学问题、往返时间等,可以通过预训练、微调、人类反馈强化学习、工具使用等方式缓解。
  • 其他问题可以通过围绕大语言模型的工具来缓解:
    • 将问题分解为多个链式任务。
    • 稳健的解析。
    • 质量保证。
    • 用于存储结果和元数据的丰富数据结构。
    • 在适当的情况下,将生成式任务替换为预测式模型。

spacy-llm:使用大语言模型进行结构化自然语言处理

  • spaCy的扩展,使用spaCy的数据结构、流水线概念、配置系统及其他功能。
  • 核心理念:由大语言模型解决一系列结构化自然语言处理问题的流水线。每个问题由一个任务负责,该任务负责提示、提示拆分和解析。
  • 高度可配置。
  • 将结果映射到spaCy的数据结构上。
  • 在流水线中,可以轻松地将大语言模型与预测式模型互换,反之亦然,便于原型设计。
  • 目前版本0.6.4,1.0.0即将发布。

spacy-llm:集成

  • 模型:与Hugging Face、大语言模型提供商、LangChain集成。
  • 任务
    • 内置任务包括命名实体识别、关系抽取、情感分析、摘要、翻译、问答、实体链接、词形还原、跨度分类、文本分类等。
    • 易于添加新任务。
  • 作为spaCy组件:集成到其配置和流水线系统中,并支持所有常规功能,如并行化(*)和序列化。
  • 批处理、响应日志记录(便于调试)、缓存。

spacy-llm:工作流与用例

  1. 大语言模型辅助标注:用于生成评估数据、训练数据、少量示例学习的样本。
    • 流程:使用大语言模型进行零样本预测 → 手动审核。
  2. 提示前文本预处理:例如识别并替换个人可识别信息,移除无信息量的样板文本片段等。
    • 流程:个人可识别信息识别 → 大语言模型处理。
  3. 选择性发送文本给大语言模型:仅将具有特定主题或实体的文本(句子/段落/文档)发送给大语言模型,以避免不必要的成本,并根据先前的分类和/或识别的实体调整提示等。
    • 流程:文本分类 → 命名实体识别 → 大语言模型处理。
  4. 大语言模型响应后处理:质量保证/事实核查、响应规范化(提高下游任务的稳健性)、连接到外部知识库等。
    • 流程:大语言模型处理 → 基于规则的处理 → 实体链接。

spacy-llm:使用方法

  • 配置文件示例 (config.cfg):
    [nlp]
    lang = "en"
    pipeline = ["llm_ner"]
    
    [components]
    
    [components.llm_ner]
    factory = "llm"
    
    [components.llm_ner.task]
    @llm_tasks = "spacy.NER.v3"
    labels = SIZE,TYPE,TOPPING,PRODUCT
    
    [components.llm_ner.model]
    @llm_models = "spacy.GPT-3-5.v3"
    name = "gpt-3.5-turbo"
    
  • 运行流水线的Python代码
    nlp = assemble(config_path)
    doc = nlp(text)
    for ent in doc.ents:
        print(ent.text, ent.label_)
    
  • 切换模型(例如切换到Mistral开源模型):
    [components.llm_ner.task]
    @llm_tasks = "spacy.NER.v3"
    labels = SIZE,TYPE
    [components.llm_ner.model]
    @llm_models = "spacy.Mistral.v1"
    name = "Mistral-7B-v0.1"
    

总结

  • 结构化自然语言处理能从文本中解锁信息,并以结构化形式提供给下游业务应用。
  • 大语言模型具有令人印象深刻的文本生成/理解能力。
  • 使用大语言模型进行自然语言处理应用原型设计变得极其简单。
  • 在构建生产就绪的流水线时,需要考虑其他特性,如可定制性、稳健性、推理成本、网络延迟等。
  • spaCy是一个为开发者编写的、生产就绪的自然语言处理框架。
  • 其扩展spacy-llm允许轻松地将大语言模型集成到结构化自然语言处理流水线中。
  • 大语言模型辅助标注可以快速生成训练/评估数据。