LLM嵌入特征工程
使用LLM嵌入进行特征工程

大型语言模型嵌入(LLM 嵌入)是一种强大的方法,用于捕获文本中的语义丰富信息,并利用这些信息来利用其他机器学习模型(如使用 Scikit-learn 训练的模型),以在需要对文本有深刻上下文理解的任务(如意图识别或情感分析)中进行杠杆作用。
本文简要介绍了什么是LLM嵌入,并展示了如何将它们作为Scikit-learn模型的工程特征使用。
什么是LLM嵌入?
LLM 嵌入是 LLM 生成的整个文本序列的语义丰富数值(向量)表示。这个概念可能会挑战人们对文本嵌入和 LLM 一般用途的一些基本认知,因此让我们澄清几个要点,以更好地理解 LLM 嵌入:
- “传统”嵌入——例如Word2Vec, FastText等——是无上下文的、固定向量表示的单个单词,用作下游模型的输入特征,LLM 嵌入通常是对整个序列的表示,使得序列中单词的含义是上下文相关的。
- 尽管 LLMs 通常将文本序列作为输出,但某些特定模型,如
all-miniLM,专门设计用于生成上下文增强的输出嵌入,即数值表示,而不是生成文本。正如前面提到的,这些输出嵌入具有更丰富的语义信息,使它们能够适合作为下游模型的输入。

在特征工程中使用LLM嵌入
利用LLM嵌入进行特征工程任务的第一步是使用合适的LLM,例如可以在Hugging Face的SentenceTransformers库中找到的那些,比如all-MiniLM-L6-v2。
下面的代码片段安装并导入库,然后使用它将包含在数据集属性中的文本序列列表转换为嵌入表示。数据集可从这里获取,描述了几类客户支持票据——查询和投诉,并结合了文本和一些结构化(数值)的客户行为特征。
让我们首先专注于将原始文本特征转换为LLM嵌入:

既然我们已经处理好了text数据集中的特征,我们准备好了描述客户的两个数值特征:prior_tickets和account_age_days。如果我们观察它们,我们会发现它们的取值范围非常不同;因此,对这些属性进行缩放是个好主意。
之后,使用 Numpy 的 hstack() 函数,标准化的特征和 LLM 嵌入再次统一:

既然这个特征工程过程已经完成,接下来只需将包含LLM嵌入的特征工程数据集拆分为训练集和测试集,训练一个用于客户工单分类的Scikit-learn模型(有五种可能的类别),然后进行评估。
!# Split
X_train, X_test, y_train, y_test = train_test_split(X_combined, labels, test_size=0.2, random_state=42, stratify=labels)!# Train
clf = RandomForestClassifier()
clf.fit(X_train, y_train)!# Evaluate
y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred))
在上面的代码中,事件的顺序是:
- 将统一的客户特征和相关标签拆分为训练示例(80%)和测试示例(20%)。使用
stratify=labels这个参数是非常重要的,因为我们处理的数据集非常小;否则,训练集和测试集中所有五个类别的代表性将无法保证 - 初始化并训练一个使用默认设置的随机森林分类器:没有为集成或其底层树指定超参数
- 在测试集上评估训练好的分类器
这是最终的评估输出:

根据分类报告,我们的方法似乎非常成功。在具有非常小数据集的五类问题上,实现80%的准确率和加权F1分数为0.80,表明模型已经学习到了有意义的模式。这一成功主要归功于LLM嵌入,它将原始文本转换为数值丰富的特征,捕捉了客户工单的语义意图。这使得随机森林分类器能够区分那些对简单文本表示方法来说具有挑战性的细微请求。
要真正量化增加值,一个关键的下一步是通过将这些结果与使用传统特征如TF-IDF训练的模型进行比较,建立一个基准。此外,通过调整分类器的超参数或应用此技术到更大、更稳健的数据集,可以进一步探索改进方法,以确认其有效性。然而,这个实验作为一个强大的概念验证,清楚地展示了如何无缝集成LLM嵌入,以提升Scikit-learn模型在文本密集任务上的性能。
总结
本文强调了LLM嵌入的重要性,即通过专门的LLM生成的整个文本序列的向量表示,在存在部分结构化数据(可能包含文本)的情况下,用于训练分类等任务的下游机器学习模型。通过简单的步骤,我们展示了如何对原始文本特征进行特征工程,以将其语义信息作为LLM嵌入纳入scikit-learning模型的训练中。
