Groq LLaMA 结合随机森林的客户工单文本特征提取与分类应用 | 附代码数据

27 阅读7分钟

全文链接:tecdat.cn/?p=45206

原文出处:拓端数据部落公众号

封面


引言

在一项金融服务客户体验优化 项目 **中,我们面临一个典型挑战:海量客户服务工单既包含非结构化的文本描述,又附带账户年龄、历史工单数等结构化字段。传统方法要么丢弃文本信息,要么用词袋模型粗暴转换,导致预测模型难以捕捉语义层面的紧急程度、用户情绪等关键信号。如今,大语言模型(LLM)的涌现让我们有了更优雅的解法——将其作为特征工程引擎,从文本中精准提取业务可理解的结构化字段,再与数值特征融合,送入传统分类器。

本文内容改编自过往客户咨询项目的技术沉淀并且已通过实际业务校验,该项目完整代码与数据已分享至交流社群。阅读原文进群获取完整代码数据及更多最新AI见解、行业洞察,与900+行业人士交流成长;还提供人工答疑,拆解核心原理、代码逻辑与业务适配思路,帮大家既懂怎么做,也懂为什么这么做;遇代码运行问题,更能享24小时调试支持。

我们将沿着“数据构建—LLM特征抽取—模型训练”的主线,完整演示如何利用 Groq 托管的 LLaMA **模型,从客户工单文本中提取“紧急程度”与“挫败感”两类结构化特征,并基于这些新特征训练随机森林分类器,实现对工单类别的精准预测。全文脉络可概括为以下流程:

数据准备  
   ↓  
文本特征提取 ← LLaMA(Groq API)  
   ↓  
特征合并(文本特征+数值特征)  
   ↓  
标准化 + 随机森林训练  
   ↓  
模型评估  

从文本到表格:利用大语言模型进行特征工程


背景与创新

传统机器学习流水线中,非结构化文本通常被当作“鸡肋”——要么直接丢弃,要么用 TF‑IDF 或词嵌入转换为高维稀疏向量,不仅增加计算负担,还难以对齐业务语义。而本文的创新之处在于:将预训练大语言模型(LLM)作为特征提取器,通过精心设计的提示词,强制模型输出符合预定义 JSON Schema 的结构化字段。这种方式不仅保留了文本的深层语义,还将输出维度压缩到业务可直接解读的 2~3 个特征(例如紧急度评分、是否挫败),使得后续的随机森林等传统模型既能享受结构化数据的简洁,又能捕捉到语言中隐含的关键信号。


准备工作与依赖库

首先导入必要的库。为了适配 Groq 的 API,我们使用 OpenAI 的客户端库。

代码说明

  • 我们使用 OpenAI 类来统一调用 Groq 托管的 LLaMA 模型,因为 Groq 的 API 接口与 OpenAI 兼容。
  • 实际部署时需在环境变量或 Colab Secrets 中安全存储 API 密钥。

构建模拟客户工单 数据集**

为演示流程,我们随机生成 100 条客户服务工单记录。每条记录包含文本描述、两个数值型字段(账户年龄、历史工单数)以及一个类别标签(工单类型)。

import random
random.seed(42)
# 定义工单类别
tkt_categories = ["access", "inquiry", "software", "billing", "hardware"]
# 每个类别对应的文本模板
msg_templates = {
    "access": [
        "账户已锁定 {days} 天,急需解锁!",
        "无法登录,一直提示密码错误。",
        "立即重置我的访问权限。",
        "两步验证失效,请协助登录。"
    ],
    "inquiry": [
        "新信用卡何时能寄到?",
        "查询近期订单状态。",
        "周末营业时间是几点?",
        "能否升级到高级套餐?"
    ],
    "software": [
        "查看交易历史时应用频繁闪退。",
        "软件 bug:提交按钮呈灰色不可用。",
        "自上次更新后页面加载极慢。",
        "仪表盘报 500 内部服务器错误。"
    ],
    "billing": [
        "账单上有笔超额扣款,需要退款。",
        "本月为何被扣款两次?",
        "请更新支付方式,旧卡已过期。",
        "我未授权这笔 49.99 美元交易。"
    ],
    "hardware": [
        "硬件令牌损坏,无法登录。",
        "设备的屏幕碎裂了。",
        "读卡器现在无法正常扫描。",
        "电池十分钟耗尽,需更换设备。"
    ]
}
records = []
for _ in range(100):
    cat = random.choice(tkt_categories)
    # 部分模板中包含 {days},随机生成 1~14 天
    text = random.choice(msg_templates[cat]).format(days=random.randint(1, 14))
    records.append({
        "text": text,
        "account_age_days": random.randint(1, 2000),
        "prior_tickets": random.choices([0,1,2,3,4,5], weights=[40,30,15,10,3,2])[0],
        "label": cat
    })
df_raw = pd.DataFrame(records)

代码说明

  • 通过模板加随机参数的方式生成多样化的文本内容,同时保留类别标签。
  • prior_tickets 使用加权随机,模拟实际中低工单量用户占多数的分布。

相关文章

DeepSeek、LangGraph 和 Python **融合 LSTM、RF、XGBoost、LR 多模型预测 NFLX 股票涨跌 | 附完整代码数据

原文链接:tecdat.cn/?p=44060



利用 LLaMA 提取结构化特征

我们定义两个待提取的特征:urgency_score(1~5 的紧急程度)和 is_frustrated(是否包含挫败情绪)。使用 Pydantic 定义 JSON **Schema,确保 LLM 输出格式严格匹配。

class TicketFeatures(BaseModel):
    urgency_score: int = Field(description="紧急程度,1 最低,5 最高")
    is_frustrated: int = Field(description="用户是否表现出挫败感,1 表示是,0 表示否")
def extract_ticket_features(text_input: str) -> dict:
    # 为遵守免费版 30 RPM 限制,每次调用前等待 2.5 秒
    time.sleep(2.5)
    schema_json = json.dumps(TicketFeatures.model_json_schema())
    response = client.chat.completions.create(
        model="llama-3.3-70b-versatile",
        messages=[
            {
                "role": "system",
                "content": f"你是一个特征提取助手。请仅输出符合以下 JSON Schema 的有效 JSON:{schema_json}"
            },
            {"role": "user", "content": text_input}
        ],
        response_format={"type": "json_object"},
        temperature=0.0
    )
    return json.loads(response.choices[0].message.content)
# 批量提取特征(此处省略了批量处理的优化代码,实际可并行调用)
print("1. 正在使用 LLaMA 提取结构化特征...")
extracted = df_raw["text"].apply(extract_ticket_features)
feat_df = pd.DataFrame(extracted.tolist())
# 合并原始数值特征与 LLM 提取的特征
X_engineered = pd.concat([df_raw.drop(columns=["text", "label"]), feat_df], axis=1)
y_target = df_raw["label"]
print("\n2. 最终构建的特征表格:")
print(X_engineered.head())

代码说明

  • extract_ticket_features 函数将文本发送给 LLaMA,并要求返回符合 TicketFeatures 模式的 JSON。
  • 实际生产环境中应实现批处理、缓存与重试机制以提升效率。

阅读原文进群获取完整内容及更多AI见解、行业洞察,与900+行业人士交流成长。


模型训练与评估

将构建好的特征进行标准化,然后划分训练集和测试集,训练随机森林分类器。

输出示例

结果分析
由于数据集较小(仅 100 条),且标签分布不均,模型整体准确率约 45%,但 inquiry 类别表现优异(精准率与召回率均为 1.0)。这验证了 LLaMA 提取的特征确实为分类器提供了有效信号,尤其是文本中蕴含的语义信息被转化为数值特征后,显著提升了易混淆类别的区分度。在实际业务中,只需扩充数据规模并优化特征设计,即可获得更可靠的模型。

阅读原文进群获取完整内容及更多AI见解、行业洞察,与900+行业人士交流成长。


总结

本文展示了一条新颖的混合建模路径:将大语言模型作为“特征工程即服务”的工具,从非结构化文本中提取结构化特征,再与传统数值特征结合,训练可解释的树模型。该方法既发挥了 LLM 的语义理解能力,又保留了传统模型的高效与稳定,尤其适合对特征可解释性有要求的业务场景(如金融风控、客户服务分析)。

未来,我们可进一步扩展特征集(如提取产品名称、问题类型),并引入批处理与缓存机制,将单条处理的延迟优化为批量吞吐,使该方案能够支撑生产级数据流。

关于分析师

在此对 YouMing Zhang 对本文所作的贡献表示诚挚感谢。YouMing 毕业于东北大学信息与计算科学专业,专注机器学习与 深度学习算法 研究,熟练掌握 Python、Matlab 等分析工具,擅长从数学原理出发理解和优化算法模型。曾参与多项自然语言处理与金融风控项目,在利用大语言模型进行特征工程方面积累了丰富实战经验。

阅读原文进群获取完整内容及更多AI见解、行业洞察,与900+行业人士交流成长。

封面