首页 > 教程攻略 > ai资讯 >DSPy实现技术解析:极端多标签分类的上下文学习

DSPy实现技术解析:极端多标签分类的上下文学习

来源:互联网 时间:2026-08-13 14:10:18
1 简介 可以确定的是,极端多标签分类(XMC)一直是个棘手的问题。面对动辄上万个可能的类别,传统的分类方法往往力不从心。这篇文章提出的方案,核心是一个名为**Infer-Retrieve-Rank (IReRa)**的通用程序。它的巧妙之处在于定义了**语言模型(LM)与检索器之间的多步交互**,从而有效地解决了海量类别下的多标签分类难题。更关键的是,作者通过**DSPy编程模型**实现了这一程序——以声明式的风格指定整个上下文系统,再利用DSPy自带的优化器,通过引导几十个标注好的小样本示例,就能针对特定数据集进行精准调优。 这个针对极端分类设计的程序,在三个基准测试(use、Tech、TechWolf)上都拿到了最先进的成绩。把它迁移到特征截然不同的数据集(如BioDEX),也能获得有竞争力的性能。和以往的工作相比,这套方案最大的优势在于:**无需微调**,能轻松适配新任务,大幅降低了提示工程的负担,而且只需要几十个带标签的样本就能跑起来。 2 背景介绍 你可能会想,直接用语言模型进行上下文学习不就行了吗?但问题就出在这里。首先,LM对于这些细粒度类别通常缺乏**先验知识**,直接在提示里展示每一个类别是不可能的——毕竟类别数量往往**超过10,000个**。这就导致在**提示符中演示每个类**这件事变得完全不现实。因此,单独依靠上下文学习来解决XMC任务,路径上就存在天然的障碍。 近期的研究尝试了多种思路:有的在推理时多次调用LM,有的则用LM生成合成数据来辅助微调。这些方法虽然配置得当也能取得不错效果,但它们普遍带有手动调节的“旋钮”——比如各种提示词和超参数——这使得将方案应用到新的数据集、评估指标甚至不同的LM时,变得异常困难。 3 技术方案 为了攻克上述难题,这篇文章展示的DSPy编程模型,提供了一种既简单又强大的通用方案。**DSPy能够让你把方法的模块化程序单独定义出来,同时明确它应该针对不同数据集进行怎样的优化。** 作者们为XMC任务设计了一个简洁的上下文程序,称之为Infer-Retrieve-Rank (IReRa),其流程如下图所示: 首先,让LM去处理输入文档,并推测出一组可能适用的术语(Infer)。接着,检索器将每个预测出的术语与实际标签空间进行关联(Retrieve)。最后,再通过LM对检索到的标签进行重新排序(Rerank)。这里至关重要的一点是,整个过程中使用的检索器和LM都是**冷冻(frozen)**的——也就是完全不进行微调。 IReRa程序的核心洞察在于:**如果LM能够在上下文学习中学会如何预测相关查询并解读检索结果,那么即使是冷冻的检索器,也能展现出极高的灵活性。** 底层的LM、检索器以及提示词,本质上都被视为IReRa程序的超参数,可以自动调整或者很方便地手动配置。实验表明,仅仅使用10个未标记的训练输入和大约50个标记的验证示例,就能达到一流性能。作者使用一个带有最小种子提示(seed-prompt)的zero-shot teacher LM,为两个LM组件引导生成few-shot提示,从而完成提示优化,完全不需要反复迭代地去调整提示词来提升性能,如上图中的Step2所示。 DSPy的编译抽象能力在这里发挥得淋漓尽致:**它接收已经定义好的程序逻辑,用teacher LM将其实例化,处理未标记的训练样本,为程序中的每一步自动生成zero-shot标签,最后根据验证性能选出最佳标签,放入few-shot提示中。** 由于这个程序由两个上下文内模块组成,作者建议按照顺序来引导它们,如上图中的Step3所示。 #### 3.1 Infer-Retrieve-Rank (IReRa) IReRa的程序逻辑如下方代码所示(为简洁起见做了少量调整)。整体节奏很清晰:第一步,用LM来预测给定输入里应该包含什么查询(Infer);第二步,检索器基于该查询与所有标签的余弦嵌入相似度,输出一个完整的排名(Retrieve);最后,排名靠前的标签再由另一个LM做一次重排序(Rerank)。 #### 3.2 Seed-prompt 想把IReRa应用到你的数据集上?只需要一个最小的Seed-prompt来定义每个上下文内模块的行为。下面的代码示例展示了在BioDEX数据集上,Infer模块的提示是如何用DSPy的Signature抽象化来整洁地组织的。Seed-prompt在文档字符串中定义任务说明,并在输入和输出字段中定义具体的说明和格式信息。这个Signature既可以作为零触发提示的框架,也能用于少触发提示。 下面这段代码给出了BioDEX Rank模块的提示。值得注意的是,作者对三个职位空缺数据集使用了完全相同的提示,在Infer和Rank模块中分别如下所示。你会发现,这些提示的大部分内容都是共享的,要适应IReRa程序,只需简洁地描述好输入和输出字段就行了。 4 实验结果 在实验环节,作者用Llama-2-7b-chat模型来实例化Infer模块,而用于自举(bootstrap)的teacher模型是GPT-3.5。Rank模块则由GPT-4模型来实例化和引导。要调整IReRa以适应新数据集,整个流程可以简化为三步:(1)编写新的zero-shot提示;(2)配置要使用哪些LMs;(3)运行优化程序。 作者针对四个不同的XMC数据集优化了该程序:一个涉及从生物医学文献中提取和编码不良药物事件,另外三个则是标记职位空缺片段及其对应的所需能力。实验结果表明,这套程序在职位空缺数据集上取得了最先进的结果,在更具挑战性的生物医学任务上也展现出了有意义的进展——**完全不用微调,不需要提示工程,只用了大约50个标记的例子。** 这清晰地表明,程序的优化是驱动跨任务性能提升的关键因素。 5 总结 总的来说,这篇文章为极端多标签分类提供了一个通用且优雅的解决方案——Infer-Retrieve-Rank (IReRa)。它仅凭一个冷冻的检索器和两个上下文学习模块,就在三个基准测试中达到了最先进的水平。这些发现传递了一个重要的信号:提示工程和流水线工程的未来未必是脆弱的。一个经过优化的模块化程序,完全可以成为高效、通用的解决方案,值得期待。