共计 2684 个字符,预计需要花费 7 分钟才能阅读完成。
真实业务场景:电商订单处理的痛点
最近接手了一个电商平台的订单分析需求,需要从导出的 Excel 报表中统计各品类销售额、退货原因分类以及客户评价情感分析。原始数据长这样:

- 商品名称列包含「【爆款】」等营销文案
- 客户评价是自由文本,夹杂着表情符号和错别字
- 退货原因写着「不想要 / 尺寸不对」等混合内容
手动处理时:
- 用 Excel 公式提取品类关键词经常漏判
- 分类退货原因要逐个阅读 2000+ 条记录
- VBA 处理中文文本时编码总出问题
传统方案 vs ChatGPT 方案对比
Pandas 方案短板:
- 正则表达式处理「颜色:红色;尺码:XL」这类文本时规则复杂
- 中文分词需要维护敏感词库和同义词表
- 无法理解「用着还行但物流慢」这类复合情感
ChatGPT 优势体现:
- 零样本学习:无需训练就能理解「买给妈妈的她很开心」的情感倾向
- 上下文理解:自动将「XL 号太大」归类到「尺寸问题」
- 多任务处理:一次 API 调用可同时完成分类和摘要
三阶段实战演示
阶段一:读取 Excel 数据
安装依赖:
pip install openai python-pptx python-dotx
核心读取代码(含异常处理):
import pandas as pd
from loguru import logger
def load_excel(file_path):
try:
df = pd.read_excel(file_path, engine='openpyxl')
logger.success(f'成功加载文件,共 {len(df)} 条数据')
return df
except Exception as e:
logger.error(f'文件读取失败:{str(e)}')
raise
阶段二:设计高效 Prompt 模板
关键设计原则:
- 明确输出格式:要求返回 JSON 方便后续处理
- 限制输出长度:添加「用 3 个以内关键词总结」等约束
- 示例引导:给出 1 - 2 个范例响应
订单分类 prompt 示例:
prompt_template = """
请对以下电商订单信息进行处理:1. 从商品名称提取品类(服装 / 食品 / 数码)2. 将退货原因归类到:尺寸问题 / 质量问题 / 其他
3. 用 1 - 3 个关键词总结客户评价情感
示例输入:商品名称:【热卖】男士纯棉 T 恤 XL
退货原因:衣服有破洞
客户评价:质量差,洗了一次就开线了
示例输出:{"品类": "服装", "退货原因": "质量问题", "评价关键词": ["差评", "质量差"]}
请处理:{input_text}
"""
阶段三:结构化写回 Excel
API 调用核心代码:
import openai
import json
from tenacity import retry, stop_after_attempt
@retry(stop=stop_after_attempt(3))
def call_chatgpt(text):
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=[{"role": "user", "content": prompt_template.format(input_text=text)}],
temperature=0.3 # 降低随机性
)
return json.loads(response.choices[0].message.content)
# 写回 DataFrame
for idx, row in df.iterrows():
result = call_chatgpt(row['原始文本'])
df.at[idx, '品类'] = result.get('品类', '')
df.at[idx, '退货分类'] = result.get('退货原因', '')
生产环境注意事项
API 调用控制
- 使用
time.sleep(1.2)避免每分钟超过 20 次的限流 - 异步批处理:
import asyncio async def batch_process(texts): semaphore = asyncio.Semaphore(5) # 并发控制 async with semaphore: return await asyncio.gather(*[process_single(text) for text in texts])
数据脱敏方案
- 正则替换手机号:
re.sub(r'1[3-9]\d{9}', '<PHONE>', text) - 邮箱替换:
.replace('@', '[at]')
错误重试机制
from tenacity import retry, wait_exponential
@retry(wait=wait_exponential(multiplier=1, min=4, max=10))
def safe_api_call(text):
try:
return call_chatgpt(text)
except openai.error.RateLimitError:
logger.warning('触发限流,自动重试')
raise
性能优化实战
添加监控装饰器:
import time
from functools import wraps
def log_time(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
logger.info(f'{func.__name__}耗时:{time.time()-start:.2f}s')
return result
return wrapper
实测对比:
| 处理方式 | 1000 条数据耗时 |
|---|---|
| 人工处理 | 6.5 小时 |
| 纯 Pandas | 42 分钟 |
| ChatGPT 方案 | 8 分钟(含 API 调用) |
开放性问题思考
- 多表格关联:用 LangChain 的 MultiRetriever 可以连接商品信息表 + 订单表 + 用户画像表,但要注意:
- 表格间关联字段的模糊匹配问题
-
token 超限时的分块处理策略
-
GB 级文件处理 建议架构:
- 先用 PySpark 分割原始文件
- 对每个分片启动独立的处理 Pod
- 最终用 Redshift 等数据仓库合并结果
踩坑经验分享
- 中文标点符号会占用更多 token,建议在 prompt 开头声明「请用英文标点回答」
- gpt-3.5-turbo 对数字敏感度较低,遇到「降价 30%」这类信息建议先用正则提取
- 当遇到「我不知道」这类拒绝回答时,在 prompt 中添加「如果无法确定请返回‘未知’」
完整代码已上传 Github(伪链接):github.com/example/excel-gpt-helper
下次我会尝试结合 Stable Diffusion,把分析结果自动生成可视化报告,有兴趣的读者可以关注后续更新。
正文完
