数据科学家是怎么了解你的——借助大语言模型快速解读用户(语音/文字)的购买信号
文章目录
1. 适合场景
在电商平台、电话咨询、门店销售环节中,经常会出现客人在平台上留言评价,与销售顾问的对话咨询等数据,这些对话的语音或文字暗藏着用户对商品的兴趣倾向,是分析用户是否有购买信号很重要的数据源之一,此篇文章就结合当下火热的大语言模型的便捷能力,一起看看数据科学家是怎么快速了解用户意图。
2. 传统解决方案
传统解决方案,抛开语音转文字ASR (自动语音识别,Automatic Speech Recognition的缩写)。这一段而言,因为截止写本文的时间,即使是语音转文字通常的做法也是选择语音识别(ASR)服务,如:
-
腾讯云:提供 语音识别(ASR)服务,支持多种语言和音频格式;
-
百度云:提供 语音技术 服务。
-
微软 Azure:提供 Speech to Text 服务。
-
OpenAI Whisper:一个非常强大和流行的开源语音识别模型。它提供 API,也可以自行部署,官网:https://openai.com/index/whisper/
- OpenAI Whisper API:直接调用 OpenAI 提供的 API,简单易用。
- 本地部署 Whisper:如果数据敏感或希望降低成本,可以在自己的服务器上部署 Whisper 模型。
-
……
一般都是集成现有的语音转文字的SDK或者API先将语音转成文字,此次的内容还是重点放到解读用户语义(语音转文字后)的购买信号上,传统的解决方案流程大致如图2.1,总结归纳下来:
文本预处理:清洗和标准化文本,为分析做准备,主要涉及:分词 (Tokenization):将句子切分成独立的词或字。例如:“我想问一下” -> [“我”, “想”, “问”, “一下”]。去停用词 (Stopword Removal):过滤掉频繁出现但含义较少的词,如“的”、“了”、“吗”、“一下”等,以降低噪声、聚焦关键信息。词性标注 (Part-of-Speech Tagging):为每个词标注其词性(名词、动词、形容词等),有助于后续的句法分析。归一化 (Normalization):将数字、缩写、特殊符号等转换为统一格式。
特征提取:将文本转换为机器可读的数值特征(这是传统方法的核心),主要涉及:Bag-of-Words (词袋模型):忽略词序和语法,仅统计每个词在文本中出现的频率。形成一个巨大的词汇表向量。TF-IDF (词频-逆文档频率):在词袋模型的基础上,不仅考虑词频,还考虑一个词在整个文档集合(所有对话)中的重要性。常见词(如“产品”)的权重会降低,而特定词(如“退货”、“保修”)的权重会提高。N-gram:考虑词的顺序,将连续的N个词作为一个单元。例如 Bi-gram (2-gram):“送货上门”会比单独的“送货”和“上门”携带更丰富的语义。手工规则特征:基于领域知识人工构造的特征,例如:是否包含某些关键词?(如“价格”、“便宜”、“多少钱” -> 意图:询问价格)句子的情感极性(正面、负面)?是否包含疑问词?(“吗?”“怎么?”“如何?” -> 暗示询问类意图)。
分类模型:根据特征对意图进行分类,输出最终结果。- 利用上一步提取的特征,训练一个分类模型。其任务就是将一段用户话语,分类到预先定义好的意图类别中。预先定义意图库:这是至关重要的一步,需要领域专家根据业务场景定义所有可能的用户意图。
- inquire_price (询问价格)
- compare_products (比较产品)
- complain (投诉)
- request_discount (请求折扣)
- schedule_demo (预约演示)
- ask_delivery_time (询问送货时间)
- …
- 常用的传统机器学习分类模型:
支持向量机 (SVM):在高维特征空间中寻找最佳分类超平面,在处理文本分类问题上非常有效且强大。朴素贝叶斯 (Naive Bayes):基于贝叶斯定理,假设特征之间相互独立。简单、高效,尤其适用于小规模数据集。最大熵模型 (Maximum Entropy):与朴素贝叶斯不同,它不假设特征独立,能更好地利用上下文信息。决策树/随机森林 (Decision Tree/Random Forest):可解释性较强,能处理非线性关系。
- 利用上一步提取的特征,训练一个分类模型。其任务就是将一段用户话语,分类到预先定义好的意图类别中。预先定义意图库:这是至关重要的一步,需要领域专家根据业务场景定义所有可能的用户意图。
好了,不写了吧,再写下去就是劝退环节了,进入到今天的正题,如何高效便捷借助大语言模型快速解读用户(语音/文字)的购买信号,代替传统解决方案的语义理解瓶颈,特征工程繁琐,泛化能力弱,需要大量标注数据等缺陷。

3. 借助LLM及其OpenAPI实现
3.1 有一个LLM平台(以FastGPT为例)
FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,将智能对话与可视化编排完美结合,让 AI 应用开发变得简单自然。无论您是开发者还是业务人员,都能轻松打造专属的 AI 应用。
企业内部为了数据安全,一般都是私有化部署,但是本文重在demo,就直接以在线平台为例了,使用方法上私有化部署和在线部署本质没什么差别,然后,注册账号,扬帆起航。

3.2 有手就行构建和发布一个workflow


提词器参考:
你是一个专业汽车电话销售专家,根据输入的内容;
以客服最终是否解答了客户的问题和涉及的内容丰富度,判断此次关于销售车辆的对话质量是高、中、低还是未知;并给出判断的理由,以及给到合理提升建议;
根据客服答复的内容,分析且判断出客服答复是否专业?并且提取出取出1到5个你认为最关键的关键词作为你的判断客服专业的依据;
根据客服和客户的对话,判断客户对客服的答复是满意、不满意、未知,并且提取出取出1到5个你认为最关键的关键词作为你判断客户是否满意的依据,同时判断客户对此关于此次销售的车辆兴趣度是感兴趣、不感兴趣、未知,并且提取出取出1到5个你认为最关键的关键词作为你判断客户感兴趣依据;
根据客服和客户的对话以及你的判断,客户是否可能去门店进一步了解车辆,并且提取出取出1到5个你认为最关键的关键词作为你判断是否会去的依据。
最终的输出结果以下面标准json串格式输出,如果你不知道,不要乱说。
{
“对话内容的销售质量”:“高/中/低/未知”
,“对话内容合理提升建议”:“……”
,“对话内容的销售质量的判断理由”:“……”
,“客服答复是否专业”:“是/否/未知”
,“判断客服专业的关键字”:“关键字1,关键字2,……”
,“客户是否满意”:“满意/不满意/未知”
,“客户是否感兴趣”:“感兴趣/不感兴趣/未知”
,“判断客户感兴趣的关键字”:“关键字1,关键字2,……”
,“客户是否可能去门店进一步了解”:“应该会去/大概率不去/未知”
,“判断客户可能去门店进一步了解的关键字”:“关键字1,关键字2,……”
}


运行一下workflow,输入一段虚拟的对话测试下结果,看到数据结果完全是按照提示词的格式要求的,非常完美。

到这一步小小的workflow就被轻松拿捏了,已经部署上线了API和创建了可以访问的Taken了。

3.3 Postman测试下调用结果
注意,调用OpenAPI时一定要认真先看下官方文档的格式,否则容易撞的满头包。



Postman返回结果样例:
4. 写一段简单的Python代码批处理解读用户
数据源:此处为了方便演示,将客户和客服的对话存入Excel为例,如果对话数据在数据库,本质也是一样的。

Python代码实现
import requests
import json
import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows
def post_with_token_and_body(url,headers,payload):
try:
# 发送POST请求
response = requests.post(url, headers=headers, json=payload)
# 检查响应状态
if response.status_code == 200:
# print("请求成功!")
#print("响应内容:", response.json()) # 假设响应是JSON格式
return response.json()
else:
print(f"请求失败,状态码: {response.status_code}")
print("响应内容:", response.text)
return 0
except requests.exceptions.RequestException as e:
print(f"请求发生错误: {e}")
return 0
def append_to_existing_excel(df, filename, sheet_name='Sheet1'):
"""
将DataFrame逐行追加到已存在的Excel文件中
参数:
df: 要追加的DataFrame
filename: Excel文件名
sheet_name: 工作表名
"""
try:
# 加载现有的Excel工作簿
book = load_workbook(filename)
# 获取指定的工作表
if sheet_name in book.sheetnames:
sheet = book[sheet_name]
else:
# 如果工作表不存在,创建新工作表
sheet = book.create_sheet(sheet_name)
# 找到最后一行的行号
max_row = sheet.max_row
# 逐行追加数据
for row_idx, row_data in enumerate(dataframe_to_rows(df, index=False, header=False), max_row + 1):
for col_idx, value in enumerate(row_data, 1):
sheet.cell(row=row_idx, column=col_idx, value=value)
# 可选:添加进度提示
if (row_idx - max_row) % 10 == 0:
print(f"已追加 {row_idx - max_row} 行数据...")
# 保存工作簿
book.save(filename)
print(f"成功将 {len(df)} 行数据追加到 {filename} 的 {sheet_name} 工作表,共{max_row}行")
except Exception as e:
print(f"追加数据时发生错误: {e}")
if __name__ == '__main__':
# 常用显示选项设置
pd.set_option('display.max_rows', 1000) # 最大显示1000行
pd.set_option('display.max_columns', 100) # 最大显示100列
pd.set_option('display.width', 1000) # 显示宽度为1000字符
pd.set_option('display.max_colwidth', 100) # 每列最大显示100字符
pd.set_option('display.precision', 6) # 浮点数精度为6位小数
my_url = 'https://cloud.fastgpt.cn/api/v1/chat/completions'
my_token = 'fastgpt-*****tkFloNMlcl'
my_headers = {
"Authorization": f"Bearer {my_token}", # 或者可能是 "Token {token}",根据API要求
"Content-Type": "application/json" # 指定请求体格式为JSON
}
df=pd.read_excel(".venv/input_data/Dialog_input.xlsx",sheet_name="Sheet1",dtype={'通话id': str})
# print(df.head())
# 初始为空的DataFrame(可选,取决于你的需求)
#result_df = pd.DataFrame()
# 写入Excel路径
filepath = ".venv/output/Dialog_LLM_Result.xlsx"
for row in df.itertuples():
# 请求体 - 要发送的数据
my_payload = {
"chatId": "1122",
"messages": [
{
"role": "user",
"content": row[5]
}
]
}
result = post_with_token_and_body(url=my_url,headers=my_headers,payload=my_payload)
# print("响应内容:", result) # 假设响应是JSON格式
# print("\n")
content = result.get("choices")[0].get("message").get("content") #.get("message").get("content")
# print(content)
print(row[2])
try:
content=json.loads(content)
# print((row[2].tostring(),'PAI返回的数据已完成'))
except Exception as e:
print(f"请求发生错误: {e}")
# print(row[2]+'PAI返回的结果数据有异常')
continue
content['通话id']=row[2]
# print(content)
# print(type(content))
# 转换为DataFrame(需要指定索引)
df_scalar = pd.DataFrame([content]) # 将字典放入列表中
# print(df_scalar.head())
# 将新DataFrame合并到结果DataFrame中
## result_df = pd.concat([result_df, df_scalar], ignore_index=True)
# 追加数据到现有Excel文件
append_to_existing_excel(df_scalar, filepath, 'Sheet1')
数据结果:准备好一个空的Excel为例,命名:Dialog_LLM_Result.xlsx,输出样例如下:

5. 优化及后续
- 提词器优化:在workflow的提词器属于笔者瞎写,可以根据业务述求做一定的调整;
- 完善用户画像:很多场景下,语音数据解读不是终点,可以利用userID或手机号等作为打通其他数据,比如地理信息,用户行为分析,用户基础信息,更全面的了解和认知自己的用户数据;
- 实操中注意和Data Compliance相关部门一起协作,用户数据的隐私及收集数据的合法性。
更多推荐

所有评论(0)