场景方案·网购决策因子分析
一、应用场景的背景介绍
1.1 场景描述
场景来源:网购app
场景名称:购物决策因子分析
场景描述:针对网购APP上用户反馈、评论、提问的高频问题进行分析,对应到决策因子的三级类目,进而分析用户在购买过程中的影响购买决策的要素和权重,指导后续运营策略和顾客的精准营销
1.2 场景的具体需求
- 场景需求:对用户评论进行唯一标签化
- 场景建模:短文本向多层标签空间的映射
- 评估标准:
评估指标 | 业务上线接受度 |
---|---|
准确率,即一、二、三级标签均完全匹配即为“准确” | 90%的准确率 |
标签空间:单品类(以鞋为例)标签:
点击展开标签空间部分内容
运营流程中,定期对用户实际评论和标签进行人工校准,校准后的评论和标签进入“经验库”,经验库在运营层面准确度最高。
点击展开经验库部分内容
限制条件: 不能SFT,得物决策因子场景不能使用SFT,原因如下:
标签变化快 | 标签标注不均衡 |
---|---|
标签类目库变化较快,模型微调速度很难跟上业务变化 | 运营检验并不是为了模型训练,技术团队无法要求业务运营团队“按每个标签”进行“均匀”标注 |
二、问题与挑战
2.1 Prompt过长导致大模型成本较高
按照标准的Prompt构建方式(标准Prompt结构如下),针对用户的每一次输入构建后的Prompt,Token数量在4千左右:
长Prompt主要包括任务指令、因子类目结构说明、注意事项、思考示例和用户输入。样例如下:
点击展开Prompt样例
分析 msg_body 文本语义,结合 参考答案 从 三级类目表 , 获得 level1,level2,level3 类目
<三级类目表>
以下是 toml 格式的 level1,level2,level3 全量分类表,不要自创类目!
["适用性"]
"适用场景" = ["适用场合","是否适合送礼","适用季节"]
"适用对象" = ["适用肤色","适用人群","适用腕围","适用性别","适用年龄","适用身型"]
["商品属性"]
"商品功能" = ["是否防水/防汗","是否支持播放音乐","是否可以下载APP","是否有倒计时","是否可以语音通话","定位功能","是否可以支付","是否支持下载音乐","支持的操作系统","是否支持连接蓝牙耳机","是否有月相","是否防震","是否需要插卡","是否支持自定义屏幕背景","是否可以充电","是否支持通话","是否可打开微信","是否可以联网","是否支持文件传输","是否可测心率","整点报时功能","是否可同步运动记录","有哪些功能","是否支持连接到其他设备播放音乐","是否支持NFC","是否发光/夜光","是否可测高度/湿度","是否可打游戏","是否可以看视频","防水深度","是否支持插卡","是否可以发送/接收短信","是否可记录运动消耗","是否可以视频通话","是否支持抬手亮屏","是否需要更换电池","支持的语言","运动追踪功能","是否防摔","是否支持运动/省电等模式","续航能力","是否支持截图","是否支持连接手机","是否可记录配速","兼容机型","是否可测运动距离","支持的操控方式","手电筒功能","功能含义","支持的充电方式","是否支持快充","快充技术","是否防尘","是否防刮","是否有闹钟","是否有陀飞轮","是否可监测血氧","是否可监测血压","是否可监测体温","是否有日历功能","是否支持蓝牙","是否可以通话","屏幕分辨率/刷新率","屏幕触控模式","CPU型号/核数","支持的连接方式","支持连接的设备数","麦克风类型","麦克风数量","支持插卡的数量","显示灯代表含义"]
"商品规格" = ["商品规格详情-是否有配件","商品规格详情","商品规格含义","商品规格详情-是否有赠品","商品规格详情-颜色","商品规格差异","商品规格详情-尺码"]
"商品质量" = ["商品质量评价","商品是否掉色/氧化","商品是否易变色","商品是否有异味","商品是否易刮花","商品是否有色差","商品是否掉漆","时间不准确","商品是否易脱落","表带是否易起毛","表盖移位","手表停止走动/工作","商品是否需要贴膜","商品故障问题","商品是否易生锈","表链是否夹毛","商品是否与描述相符","商品使用寿命","图案是否易脱落","商品无法连接","商品是否掉皮","商品是否有瑕疵","商品是否易变形","商品是否易褶皱","五金是否易磨损"]
"商品材质" = ["动力类型","商品材质弹性","机芯类型","表扣材质类型","表壳材质类型","商品材质是否耐磨","商品材质是否易过敏","商品材质软硬度","商品材质类型","商品材质是否耐脏","表镜材质类型","表带材质类型","电池类型","表针材质类型","时标材质类型","表盘材质类型","镜面材质类型"]
"商品尺码尺寸" = ["表盘长度/宽度/直径","表带长度","表带宽度","表盘厚度","商品具体尺寸","尺码对应的尺寸信息","根据年龄推荐尺码","尺码推荐","根据腕围推荐尺码","根据性别推荐尺码","平台的尺码推荐是否值得信任","尺码测量方法"]
"商品容量" = ["内存大小","电池容量"]
"商品设计" = ["设计风格","表带设计","表针设计","机芯设计","商标设计","是否有显示灯","有哪些功能","表盘设计","表冠设计","背透设计","表扣设计","手表适配的表带","显示方式"]
"商品版本" = ["商品版本/款式差异","商品版本发售时间","商品具体型号","商品具体版本/款式","是否是男女同款","是否是明星同款"]
"商品净含量" = ["商品自重重量"]
"使用感受" = ["定位准确性"]
"商品名称" = ["商品简称"]
"商品品牌" = ["商品具体品牌"]
"商品系列" = ["系列差异","商品具体系列"]
"商品类型" = ["香水分类"]
"商品生产信息" = ["产地","厂家","生产日期"]
["正品保障"]
"商品真伪" = ["是否是正品","是否品牌官方售卖","是否全新","是否有保卡","是否有鉴定证书","是否有吊牌/防伪标识","吊牌详情","鉴别真假方法"]
["商品使用"]
"选购建议" = ["颜色对比推荐","商品/款式对比推荐","相似推荐"]
"使用方法" = ["调节表带方法","如何看时间","功能是否需要连接手机来实现","下载/播放音乐方法","商品搭配组合","设备连接方法","更换表带方法","商品佩戴方法","打开卡槽方法","调节时间方法","连接设备方法","商品是否可拆卸","是否可以在充电时使用","商品清洗/保养方法","如何更换电池","是否有使用说明书","上弦方法","商品使用教程","表带是否可加长","屏幕操控方法","商品保存/储存方法","商品拆卸方法","调节闹钟方法","调节亮度方法","充电方法","使用注意事项"]
"使用感受" = ["续航时长","时间准确性","音频体验","性价比","舒适度","连接稳定性","通话质量","续航时间"]
"效果" = ["佩戴效果","是否有商品实物图"]
["商品包装"]
"普通包装信息" = ["包装清单","是有有品牌原盒","包装样式","是否有包装实物图片展示","有无外包装","包装材质","包装大小","是否有防尘袋"]
"礼盒信息" = ["礼盒样式","是否有礼盒","可否指定礼盒","是否是品牌官方礼盒","如何购买礼盒","礼盒价格","礼盒尺寸"]
"礼袋信息" = ["是否有礼袋","是否是品牌官方礼袋","可否指定礼袋","如何购买礼袋","礼袋价格","礼袋样式","礼袋尺寸"]
["商品服务"]
"售后服务" = ["保修服务","有无售后服务","商品瑕疵处理","是否支持退换货","是否有运费险","退换货是否减免运费","换货价差问题","退换货上门取件时间","退换货上门取件规则"]
"售中服务" = ["是否可以刻字","定制服务入口","是否可以定制贺卡","如何定制贺卡","是否可以定制包装/礼盒","定制服务价格","定制服务规则"]
["交易规则"]
"交易购买规则" = ["如何购买配件","购买渠道咨询","如何购买","商品何时有货","是否可开发票","商品是否是现货","如何求购","如何联系卖家","是否可以多件购买","如何一次购买多件/多款","套装/情侣装是否可以分开购买","是否可以代买","是否可以给其他人购买","如何预约预定","如何处理闲置商品","支付方式","如何购买不同款式/版本","下单后更改商品规格","分期购问题"]
"商品价格" = ["价格不合理","不同渠道价差原因","确认商品价格/到手价格","不同规格价差原因","发售价格","价格太便宜","价格波动大","是否包含税金","价格太贵","购买后降价问题","他人购买价格","商品无价格原因"]
"交易购买流程" = ["订单编号查询"]
"商品优惠" = ["活动规则","有无优惠券","优惠券获取/使用规则","不认可优惠券使用规则","有无赠品","可否指定赠品","何时有活动","不认可活动规则","活动规则有误"]
["物流服务"]
"发货问题" = ["发货地","指定快递公司","发货时间","快递公司是哪个","发错商品"]
"运输问题" = ["物流速度","商品完整性","物流信息查询"]
["其他"]
"其他" = ["其他"]
<注意事项>
level1、level2、level3 必须与三级类目表内容严格匹配,从属关系正确
以标准 JSON 格式输出 level1、level2、level3
输出的 JSON 中不要 msg_body 字段
特别注意:level1、level2、level3 绝对不能相同
<思考示例>
msg_body: '哪里产的?'
分析: 纵观类目树,这个问题与 商品属性 -> 商品生产信息 -> 产地 类目线匹配度最高
输出: {"level1": "商品属性", "level2": "商品生产信息", "level3": "产地"}
<开始推理>
msg_body: '怎么调时针啊'
模型采用ERNIE 3.5,其刊例价为(输入)0.004元/千tokens,输出为0.012元/千tokens,当前每次大模型请求Tokens数为3K,远远超出了业务运营团队能够承担的水平,需要较大幅度优化大模型调用成本。
启用ERNIE 3.5模型处理,您可以先到预置服务中开通付费。
ERNIE 3.5
百度自研的旗舰级大规模大语言模型,覆盖海量中英文语料,具有强大的通用能力,可满足绝大部分对话问答、创作生成、插件应用场景要求;支持自动对接百度搜索插件,保障问答信息时效。
三、问题诊断与方案
从以上章节中可以看出,超长Prompt有如下三大问题:
说明冗长 | 指令重复 | 相似评论 |
---|---|---|
全量的类目说明部分Token共计2500左右的,占整体Prompt的60%以上,而与用户评论相近的类目最多不超过10个,所以大部分Token请求是浪费的。 | 除了2500左右的类目Token,仍然指令和示例Token也占到了500多,而每一个用户评论,都需要重复输入指令和示例,也在一定程度上形成Token的浪费。 | 用户是短评论,海量评论中会出现大量的重复和极其相似的评论,例如“透气性如何”、“透气吗?”、“透气么”这种极其相似的评论内容会反复出现,每次评论都使用大模型来重头判断也造成了算力浪费。 |
针对上面的问题诊断提出如下三个方案
3.1 方案一:利用RAG缩小备选类目
对于以上问题,占有60%token以上的全部类目,可通过RAG召回的方式来对“用户评论”真正相关的类目进行召回,并作为备选 召回有两种方式:
匹配最相似的类目 | 匹配最相似的历史评论 |
---|---|
通过文本相似度,针对“用户评论”在类目库中逐一判断相似度,并召回最相似的几个类目作为备选。 例如:用户的评论是“会不会磨脚”,在类目库中“脚感-是否磨脚”最为相似。 |
匹配最相似的历史评论:通过文本相似度,针对“用户评论”在经验库中逐一判断相似度,并召回最相似的几个历史评论,然后使用这些评论对应的类目作为备选。 例如:用户的评论是“什么时候可以有货”,在经验库中有历史评论“什么时候才有”最为相似,这个评论对应的类目为“交易规则 - 交易购买规则 - 商品何时有货”。 |
把两种召回的类目合并去重后,形成该“用户评论”的备选类目集:
3.2 方案二:优化Prompt支持批量请求
当每一个评论均可以通过3.1章节中筛选出小范围的备选类目时,就可以优化Prompt,把每次输入的一个评论,变成评论列表,同时输出JSON的格式,可以要求为JSON List返回多个评论对应的类目结果 优化后的Prompt如下,结构主要包含:
第一部分 | 第二部分 | 第三部分 | 第四部分 | 第五部分 |
---|---|---|---|---|
任务说明,表明大模型扮演的角色和执行的任务目的。 | 关于评论和备选类目对应关系及格式说明(TOML格式) | COT的思考步骤 | 输出结果说明,返回JSON List | 需要分析的用户评论列表及每一个用户评论对应的备选类目集合 |
点击展开示例任务说明
任务说明:
作为一位专注于电商领域([鞋类])资深运营专家
您的任务是分析TOML列表中每一行用户问题,并将每个问题准确匹配到最适合的分类答案。
TOML格式详解:
在此任务中,TOML格式用于列出用户的问题(Q)和一系列可能的答案分类(A1, A2, A3等)。格式示例:
"Q" = ["A1", "A2", "A3"]
这里,Q代表一个具体的客户问题,而A1, A2, A3等代表可能的分类答案。
步骤要求:
1、仔细理解用户问题的真实行为意图,包括理解可能存在的隐喻、假设、暗示或反话;
2、基于question的理解,选择最合适的答案分类 category-y。注意:category-y 如果没有合适答案,给默认值 unknown
结果格式说明:
您的分析结果应以JSON格式返回,包括问题原文(question)和您选择的最匹配分类(category-y)。格式如下:
[{"question": "具体问题内容", "category-y": "选择的分类"},{...},...]
请确保遵循此格式,直接且准确地反映分析结果。只要JSON结果,不要任何推理过程和提示。
开始推理:
<TOML列表>
"米粉紫这个配色国内跟国外有什么区别?" = ["商品何时有货", "商品规格详情-颜色", "商品规格详情-颜色", "国内外尺码对应关系", "国内外尺码差异", "商品规格详情-颜色"]
"欧文七穿43这个穿多大啊是43还是43.5" = ["根据常穿尺码推荐尺码", "根据常穿尺码推荐尺码", "根据常穿尺码推荐尺码", "根据常穿尺码推荐尺码", "国内外尺码对应关系", "鞋带宽度/长度"]
"李宁小绝影42这个多大" = ["根据常穿尺码推荐尺码", "尺码推荐", "商品是否偏码", "平台的尺码推荐是否值得信任", "根据年龄推荐尺码", "商品是否偏码"]
"平时穿46码,这双多少?" = ["根据常穿尺码推荐尺码", "根据常穿尺码推荐尺码", "商品规格详情-尺码", "根据常穿尺码推荐尺码", "平台的尺码推荐是否值得信任", "商品是否偏码"]
"脚感可以吗" = ["脚感-整体", "适用人群", "脚感-整体", "脚感-是否磨脚", "脚感-整体", "脚感-稳定性"]
"这个不带灯是吧" = ["商品规格详情", "退换货是否减免运费", "显示方式", "不认可活动规则", "不认可优惠券使用规则", "价格不合理"]
"鞋子破了怎么办" = ["商品清洗/保养方法", "商品瑕疵处理", "商品瑕疵处理", "鞋盒破损", "商品材质类型-鞋体", "鞋底厚度"]
"货号在哪里看" = ["商品货号/型号", "商品规格含义", "发货地", "快递公司是哪个", "商品何时有货", "发货方式"]
"37码买39码大概会大多少" = ["根据常穿尺码推荐尺码", "尺码对应的尺寸信息", "商品是否偏码", "平台的尺码推荐是否值得信任", "商品是否偏码", "尺码对应的尺寸信息"]
"鞋带长几厘米" = ["商品规格详情", "增高效果", "鞋底厚度", "鞋带宽度/长度", "系鞋带方法", "鞋跟高度"]
"宽脚,全程10,43.5,这个多少?" = ["根据常穿尺码推荐尺码", "根据常穿尺码推荐尺码", "如何购买", "根据脚型推荐尺码", "根据脚长推荐尺码", "鞋带宽度/长度"]
"波12和sen9哪个好" = ["商品/款式对比推荐", "商品具体品类", "商品/款式对比推荐", "是否适合送礼", "价格波动大", "商品是否有异响/摩擦声"]
"空军42.5这个买42 2/3可以吗" = ["根据常穿尺码推荐尺码", "根据常穿尺码推荐尺码", "商品规格详情-尺码", "套装/情侣装是否可以分开购买", "是否可以多件购买", "是否支持试用/试穿"]
"滑板能穿吗" = ["商品质量评价", "是否防滑", "脚感-缓震性", "是否防滑", "防滑效果", "是否有碳板"]
3.3 方案三:引入小模型对原始评论进行筛选过滤
用户输入的评论一般都是短文本,大概在20个token以内,而评论的体量比较大,每天单品类新增会有20w之多,这里面就会存在大量类似甚至重复的问题,而类似的问题对应的标签也是一致的,例如:
问题示例 | 对应标签 |
---|---|
“可以换成白色的鞋带吗”和“可以换成紫色的鞋带吗” | 下单后更改商品规格 |
“可以跑1000米吗”、“可以跑800 1000米吗”、“可以跑长跑吗” | 适合场合 |
“几天可以收到货”、“几天可以收货”、“今天买,后天上午可以到吗?” | 物流速度 |
这里采用了bge-large-zh模型作为评论相似度判断的Embedding模型,通过当前评论的向量与历史评论向量的夹角余弦进行计算,最终选择0.92作为阈值,来判断当前评论是否与某一条的历史评论的内容是“一致”的,具体步骤如下图:
四、动态Prompt工程最佳实践
4.1 完整方案介绍
结合以上三个解决方案,最终完整的方案如下:
主要流程如下:
第一步 | 第二步 | 第三步 | 第四步 |
---|---|---|---|
历史评论“相似度”判断,使用bge模型对于用户当前评论与运营校准的历史评论进行相关度匹配,小于0.08(1-向量夹角余弦),则直接使用历史评论对应的标签进行返回。 | 对于与历史评论“相似度”较低的用户评论,首先进行备选类目的召回: |
针对用户评论,召回示例,通过RAG对评论与示例评论相似度召回top1的历史评论与对应的类目,同时在把top1的历史评论重新进行第二步召回备选类目,进而组成完整示例的输入(评论 + 备选类目)和输出(准确的类目) | 每10-15个评论批量拼接Prompt,进入ERNIE 3.5输出Json的列表结果 |
4.2 批量拼接后的Prompt模版
在上述章节中,第四步讲到的10-15个评论批量拼接Prompt,输入至大模型并返回结果。
点击展开示例说明
你是一位专注于[鞋类]电商运营专家,擅长对用户的行为进行分析,并匹配标签。
你的任务是仔细阅读和理解【TOML列表】中每一个问题以及对应的候选标签列表,一步一步思考,理解每一个问题的真实意图,将每一个问题匹配到最符合用户意图的标签
步骤要求:
1、仔细理解用户问题的真实行为意图,包括理解可能存在的隐喻、假设、暗示或反话
2、检查用户问题是否有错别字,并改正
3、基于问题Q的理解,在可能的标签(A1, A2, A3等)中选择一个最符合用户意图的标签
【TOML列表】格式详解:
在此任务中,TOML格式用于列出用户的问题(Q)和一系列可能的标签(A1, A2, A3等)。格式示例:
"Q" = ["A1", "A2", "A3"]
这里,Q代表一个具体的客户问题,而A1, A2, A3等代表候选标签。
输出格式说明:
您的分析结果应以JSON格式返回,包括问题原文(question)和您选择的最匹配分类(category)。格式如下:
[{"question": "具体问题内容", "category": "匹配的标签"},{...},...]
请确保遵循此格式,直接且准确地反映分析结果。只要JSON结果,不要任何推理过程和提示。
<正确思考示例>
- 示例1
输入:'雪天打滑吗' = ['脚感-轻重程度', '脚感-抓地', '脚感-软硬程度', '是否防寒', '是否保暖', '是否防滑', '保暖效果']
输出:{"question": "雪天打滑吗", "category": "是否防滑"}
- 示例2
输入:'马丁靴会捂脚吗' = ['搭配效果', '适用身型', '商品穿搭方法', '脚感-整体', '鞋帮/鞋靴高度', '适用脚型', '脚感-是否透气/吸汗']
输出:{"question": "马丁靴会捂脚吗", "category": "脚感-是否透气/吸汗"}
- 示例3
输入:'鞋面啥材质,冬天穿可以吗' = ['商品材质类型-鞋体', '鞋垫是否易移位', '脚感-是否磨脚', '脚感-整体', '鞋面厚度', '脚感-是否透气/吸汗', '鞋舌是否易移位']
输出:{"question": "鞋面啥材质,冬天穿可以吗", "category": "商品材质类型-鞋体"}
- 示例4
输入:'大小怎么样' = ['商品是否有异味', '脚感-轻重程度', '脚感-整体', '性价比', '外观是否好看', '上脚效果', '脚感-是否透气/吸汗']
输出:{"question": "大小怎么样", "category": "上脚效果"}
- 示例5
输入:'轻不轻,跑步可以穿吗' = ['脚感-轻重程度', '是否有气垫', '尺码感受-是否挤脚/顶脚趾/压脚背/掉跟', '是否防寒', '脚感-是否透气/吸汗', '是否防滑', '是否保暖']
输出:{"question": "轻不轻,跑步可以穿吗", "category": "脚感-轻重程度"}
- 示例6
输入:'耐脏吗' = ['商品材质是否耐磨', '商品材质是否耐脏', '脚感-是否磨脚', '五金是否易磨损', '商品材质是否易清洁', '是否防滑']
输出:{"question": "耐脏吗", "category": "商品材质是否耐脏"}
- 示例7
输入:'沾水裂纹吗' = ['商品是否开胶/开线', '商品是否掉漆', '商品是否易断裂', '商品是否溢胶', '外观是否好看', '商品是否褶皱/起皮']
输出:{"question": "沾水裂纹吗", "category": "商品是否易断裂"}
- 示例8
输入:'是超轻19的同款鞋舌吗(无奈)' = ['商品材质类型-鞋体', '商品属性-商品材质类型-其他(鞋标/鞋舌/鞋带等)', '商品材质类型-其他(鞋标/鞋舌/鞋带等)', '尺码感受-是否挤脚/顶脚趾/压脚背/掉跟', '鞋舌厚度', '商品具体版本/款式', '鞋舌是否易移位']
输出:{"question": "是超轻19的同款鞋舌吗(无奈)", "category": "商品具体版本/款式"}
- 示例9
输入:'有没有4??2??的鞋' = ['商品材质类型-鞋体', '鞋垫是否易移位', '商品规格详情-尺码', '鞋帮/鞋靴高度', '鞋舌厚度', '鞋面厚度', '鞋舌是否易移位']
输出:{"question": "有没有4??2??的鞋", "category": "商品规格详情-尺码"}
- 示例10
输入:'这个鞋的蓝色是那种蓝' = ['商品材质类型-鞋内衬', '商品材质类型-鞋体', '鞋垫是否易移位', '鞋垫可否拆卸', '脚感-整体', '鞋舌是否易移位', '商品规格详情-颜色']
输出:{"question": "这个鞋的蓝色是那种蓝", "category": "商品规格详情-颜色"}
- 示例11
输入:'学生运动可以穿吗' = ['适用身型', '是否有气垫', '适用场合', '是否防寒', '上脚效果', '是否保暖', '保暖效果']
输出:{"question": "学生运动可以穿吗", "category": "适用场合"}
- 示例12
输入:'防侧翻怎么样 脚踝有伤可以吗' = ['是否防震', '防水效果', '防滑效果', '是否防风', '防侧翻效果', '是否防滑']
输出:{"question": "防侧翻怎么样 脚踝有伤可以吗", "category": "防侧翻效果"}
- 示例13
输入:'好穿吗?' = ['鞋垫是否易移位', '是否有气垫', '脚感-整体', '是否防寒', '脚感-是否透气/吸汗', '鞋舌是否易移位', '是否保暖']
输出:{"question": "好穿吗?", "category": "脚感-整体"}
- 示例14
输入:'0度左右能穿吗?' = ['脚感-是否磨脚', '脚感-轻重程度', '脚感-稳定性', '适用季节', '适用脚型', '脚感-是否透气/吸汗', '脚感-软硬程度']
输出:{"question": "0度左右能穿吗?", "category": "适用季节"}
- 示例15
输入:'那个皮带,和鞋扣怎么使用' = ['系鞋带方法', '商品穿搭方法', '鞋垫可否拆卸', '脚感-稳定性', '脚感-整体', '其他使用方法', '鞋带宽度/长度']
输出:{"question": "那个皮带,和鞋扣怎么使用", "category": "其他使用方法"}
<TOML列表>
'去雪地可以吗' = ['适用场合', '适用季节', '保暖效果', '是否防寒', '是否防滑', '是否保暖']
'这个款马丁靴适合搭配什么样的衣服穿?' = ['搭配效果', '商品穿搭方法', '商品是否偏码', '是否防水', '尺码推荐', '适用脚型', '脚感-是否透气/吸汗']
'江西冬天穿冷嘛?鞋面好打理吗' = ['商品材质类型-鞋体', '脚感-是否磨脚', '适用季节', '鞋面厚度', '鞋舌是否易移位']
'整体怎么样' = ['商品材质类型', '脚感-稳定性', '脚感-整体', '性价比', '商品质量评价', '外观是否好看', '上脚效果']
'主要练的是 200 米,可以穿吗?' = ['脚感-轻重程度', '适用场合', '是否防寒', '适用体重', '适用人群', '是否防滑', '是否保暖']
'耐脏吗是不是打几场就黑了' = ['商品材质是否易清洁', '商品材质是否耐磨', '商品是否开胶/开线', '商品材质是否耐脏']
'你们的鞋子皮面裂了吗' = ['商品是否掉色/变色/氧化/脱落', '商品材质类型', '商品是否开胶/开线', '商品是否易断裂', '商品是否褶皱/起皮']
'一体化鞋舌还是普通的' = ['商品版本/男女款GS款差异', '商品材质类型-鞋体', '商品材质类型', 'LOGO设计', '是否有商品实拍图', '鞋舌厚度', '商品具体版本/款式', '外观是否好看', '鞋舌是否易移位']
'有没有鞋头不对称的' = ['商品材质类型', 'LOGO设计', '鞋垫是否易移位', '商品规格详情-尺码', '鞋舌厚度', '商品规格详情', '上脚效果', '鞋舌是否易移位']
'这个鞋为啥掉色是蓝色' = ['商品材质类型-鞋内衬', '商品是否掉色/变色/氧化/脱落', '商品材质类型-鞋体', '商品清洗/保养方法', '商品规格详情', '鞋舌是否易移位', '商品规格详情-颜色']
'孩子上体育课可以穿不' = ['适用身型', '脚感-整体', '适用场合', '是否防寒', '适用体重', '适用人群', '是否保暖']
'防侧翻怎么样?' = ['是否防震', '防滑效果', '防侧翻效果', '是否防滑']
'难穿进去吗' = ['商品材质是否耐磨', '脚感-整体', '商品是否有瑕疵', '脚感-软硬程度', '脚感-是否透气/吸汗', '鞋舌是否易移位', '是否保暖']
'10度以下穿会断脚吗?' = ['脚感-是否磨脚', '脚感-整体', '适用季节', '脚感-软硬程度', '脚感-是否透气/吸汗', '是否保暖']
'那个APP用不了 然后怎么用手机调节鞋带啊?' = ['系鞋带方法', '闭合方式', '鞋垫可否拆卸', '配件是否可更换', '其他使用方法', '鞋带宽度/长度']
输出:
4.3 整体方案效果介绍
经过我们的对比实践,
- 原长Prompt方案的整体准确率为: ERNIE 4.0 为 75.2% ,其他同量级第三方大模型为 83.6% 。
- 成本优化后动态Prompt的整体准确率为:ERNIE 3.5 为 91.00%,其他同量级第三方大模型为 90.50% 。
详细的每一个环节准确率(ERNIE 3.5)水平如下:
4.4 整体方案成本大幅下降
每100条请求,最终会拆分成:
- 大约30%的评论可直接通过Embedding接口与经验库做RAG匹配检索,由于bge embedding接口费用为0.002元/千tokens,且输入Token仅为用户评论(小于20),该部分费用几乎可以忽略不计,例如:用户实际评论为“宽脚能穿吗?”,经验库的评论为“宽脚的可以穿不”,两者向量夹角余弦大于0.99,可直接使用经验库的“标准答案”
- 剩余70%的评论需要合并批量调用,经测试按10个评论批量调用比较稳定,由于RAG类目需要分别召回以及示例召回,这里面10个评论批量的Prompt长度为3K水平,平均每个评论仅300个Token 综合下来,100条请求中平均每条评论的成本为0.3 X 0.004 X 70% = 0.00084元。每天20w条的评论对应成本为168元,一年调用成本约为6.1w。相比起初每年87.6w的大模型调用,成本下降93%
方案 | 模型选择 | 单价(元/千tokens) | 平均每次评论输入Tokens | 每次评论的成本 | 每天新增评论20w条 | 每年365天 | 该场景全年大模型调用费用(元) |
---|---|---|---|---|---|---|---|
原始方案 | ERNIE 3.5 | 0.004 | 3000 | 0.012 | 200000 | 365 | 0.004 / 1000 * 3000 * 20w * 365 = 876000 |
Token优化方案 | ERNIE 3.5 | 0.004 | 300 * 70%(30%评论不走大模型) | 0.00252 | 200000 | 365 | 0.004 / 1000 * 300 * 70% * 20w * 365 = 61320 |
五、最佳实践总结
综上,通过本场景优化实践,提供了一种在保持高准确率的情况下,大幅优化大模型推理成本的方法和思路,大致分为几个方向:
动态Prompt | Prompt批量化 | 大小模型结合 |
---|---|---|
分析Prompt中“有效”描述的占比,通过RAG或者其他技术,根据用户实际输入动态拼接Prompt,尽量保障Prompt的Token都是必要的。 | 由于大模型Prompt中存在大量指令描述,在不考虑大模型请求实效性的前提下,把每次请求“合并”输入,可以尽可能得降低“指令描述”Token的占比,提高Prompt的Token有效率。 | 大模型推理成本远远高于小模型,结合小模型的能力,在大模型输入之前,对用户输入进行处理、过滤、筛选,可以有效降低大模型请求的体量,进而降低大模型调用成本。 |
未来可能探索的其他方向:
- SFT模型微调也是一种可以优化大模型推理成本的路径,由于本场景业务特点的原因,没有使用到SFT模型微调的方式,您可在其他场景中尝试