基于ChatGPT+词向量/词嵌入实现相似商品推荐系统
最近一个项目有个业务场景是相似商品推荐,给一个商品描述(比如 'WIENER A/B 7IN 5/LB FZN' ),系统给出商品库中最相似的TOP 5种商品,这种单纯的推荐系统用词向量就可以实现,不过,这个项目特点是商品库巨大,有19万余商品,且商品相似度高(都是肉类制品),所以希望引入ChatGPT,利用大语言模型的推理能力进一步提高推荐准确率。
讨论了一下,决定用向量相似度计算初筛+ChatGPT优选。

处理思路:
1. 词向量相似度计算初筛
a. embedding 如何获取?
直接调用微软Azure Ada Embedding api,质量高,价格低,并且可以直接获取句子embedding。
b. 19万商品embedding如何存储并检索?
使用Redis存储,Redis可以做内存KNN,并有版本对向量计算做了优化(似乎叫STACK)。
c. 商品描述中包含大量缩写,歧义问题严重,直接获取embedding质量很低,如何解决?
使用ChatGPT扩展语义,类似以下prompt:
已知下面是关于一种百货产品的描述,描述中可能包含缩写,请推测是何种品类的商品,给出三种可能:WIENER A/B 7IN 5/LB FZN,并将答案按以下格式输出[答案1:xx,答案2:xx,答案3:xx]
以上prompt喂给ChatGPT,可以得到以下输出:
根据描述,这种百货产品可能是一种冷冻肉制品,下面是三种可能的商品:\n\n1. 热狗:根据描述中出现的\"WIENER\"这个词,可能是指热狗,这是一种由碎肉、淀粉、香料等原料制成的肉制品,通常是热狗面包的主要馅料之一。n2. 香肠:由于描述中出现了7IN和5/LB这两个词,可能是指长度为7英寸,每磅5个的香肠,这是一种由碎肉、淀粉、香料等原料制成的肉制品,通常是早餐的主食之一。\n3. 火腿肠:这是一种由肉类和淀粉等原料制成的肉制品,通常是热狗的替代品,由于描述中没有具体指明该产品的形状,因此这也是一种可能的商品。\n\n[答案1:热狗,答案2:香肠,答案3:火腿肠]
可以看到回答中的语义比原有描述 'WIENER A/B 7IN 5/LB FZN' 清晰了很多,试验下来推荐准确率比直接用原有描述高了很多,但是回答中仍然包含很多“废话”——介词/连词/符号其实都没有什么语义在里面,最后比较下来,直接用三种可能的商品名(比如'[答案1:熏肠,答案2:烤肠,答案3:火腿]')生成embedding来计算相似度是效果最好的。
2.ChatGPT优选
a. 为什么优选?
词向量相似度这种方法,对某个起到决定性作用关键词的判断能力是不足的,比如下面两种商品
'WIENER A/B 7IN 5/LB FZN CS'
'WIENER A/B 7IN 5/LB FZN EA'
毫无疑问,这两个描述的向量相似度是极高的,但这实际不是同种商品,因为他们的销售规格不同,CS是按箱销售,EA是按件销售,如果用户输入的描述中带有CS,必然是希望模糊检索按箱销售的商品。如果让人来检索,肯定是能判断这点的,现在就让ChatGPT来替代人完成这步优选,让GPT从相似度得到的TOP N件商品中,选出5件最靠谱的商品。
我们观察了正确商品在相似度排名结果中的分布情况,大部分在TOP5中,小部份在TOP6 - TOP20中,正确商品分布在TOP20之外的情况并不多,因此,我们将TOP N中的N设定为20。
b. 优选prompt
使用类似如下prompt,ChatGPT会格式化返回将它认为与给定描述最相似的5种商品的id。
It is known that the description of product A is '%s'. Now there are %s products with serial numbers starting from 0. Their descriptions are: '%s'. Abbreviations may be included in the above descriptions, please select %s product numbers that are most likely to be the same product as Product A, and strictly output the product serial numbers in the following template [xx, xx, xx, ...]
3. 其他
可以看到流程图上,除了上述两个主要步骤,还有两步,分别是相似度阈值筛选和二分类模型。我们在实践中不是直接取相似度TOP20商品进入下一步,而是给定一个相似度阈值,比如0.8,将所有相似度高于0.8的商品选出来,这导致三种结果——进入下一步的商品很少/适中/很多,前两种情况没什么影响,直接填进prompt喂给GPT择优就行,但如果是第三种情况,那GPT的推理能力会大大下降——GPT从20件商品中选5件商品比从100件商品中选5件商品要靠谱,因此为这种情况加入一个分类模型缩减备选商品规模。
相关文章:
基于ChatGPT+词向量/词嵌入实现相似商品推荐系统
最近一个项目有个业务场景是相似商品推荐,给一个商品描述(比如 WIENER A/B 7IN 5/LB FZN ),系统给出商品库中最相似的TOP 5种商品,这种单纯的推荐系统用词向量就可以实现,不过,这个项目特点是商品库巨大,有…...
虾皮商品链接获取虾皮商品详情数据(用 Python实现虾皮商品信息抓取)
在网页抓取方面,可以使用 Python、Java 等编程语言编写程序,通过模拟 HTTP 请求,获取虾皮网站上的商品页面。在数据提取方面,可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是,虾皮网站…...
【数据库系统概论】数据查询之单表查询。详细解释WHERE、OEDER BY、GROUP BY 和 HAVING
前言 ❓单表查询选择表中的若干列查询经过计算的值选择表中的若干元组(行)消除取值重复的行查询满足条件的元组(WHERE) 对查询结果排序(ORDER BY)聚集函数对查询结果分组(GROUP BY) …...
2023年医药商业行业发展研究报告
第一章 行业概况 1.1 定义 医药商业行业,作为医药领域的重要组成部分,扮演着至关重要的角色。这一行业专注于医药商品的经营与流通,确保药品能够有效、安全地到达消费者手中。随着医药科技的进步和市场需求的增长,医药商业行业在…...
Android 消息机制
Android 消息机制 Android 的消息机制也是Handler机制,主要作用是用来在不同线程之间通信,通常使用在子线程执行完成一些儿耗时操作,需要回到主线程更新UI时,通过Handler将有关UI操作切换到主线程。由于Android中主线程不可进行耗…...
QT计时器QTime的使用举例
Qt 中的计时器(QTimer)是一种用于执行定时操作的机制。您可以使用 QTimer 来执行周期性任务、在一段时间后执行操作或创建间隔定时器。以下是使用 QTimer 的基本步骤以及一个简单的示例: **包含头文件:**首先,确保您的…...
js中await用法
在JavaScript中,await用于暂停异步函数执行,等待Promise对象的解决。当Promise对象解决时,await将返回被解决的值,否则它将抛出一个被拒绝的Promise错误。 下面是一些使用await的例子: 使用await等待一个Promise对象…...
Qt多工程同名字段自动翻译工具
开发背景 项目里不同工程经常会引用同一批公共类,这些类里如果有字段需要翻译,需要在不同的项目里都翻译一遍,比较麻烦冗余。 特此开发了这个小翻译工具,能读取程序目录下的所有ts文件,以类名归类,不同项目…...
vue3+elementui实现表格样式可配置
后端接口传回的数据格式如下图 需要依靠后端传回的数据控制表格样式 实现代码 <!-- 可视化配置-表格 --> <template><div class"tabulation_main" ref"myDiv"><!-- 尝试过在mounted中使用this.$refs.myDiv.offsetHeight,获取父元素…...
x11截屏源码(ubuntu18.04)
使用x11库实现截屏并保存为png图片 【shot.c】 // filename: shot.c #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xatom.h> #include <X11/cursorfont.h> #include <png.h> #include <stdio.h> #include <stdlib.h>…...
【ComfyUI】MacBook Pro 安装(Intel 集成显卡)
文章目录 环境概述配置pip镜像配置pip代理git配置(选配)下载comfyUI代码创建、激活虚拟环境下载依赖安装torchvision启动comfyUI为什么Mac不支持CUDA,即英伟达的显卡?安装Intel工具包 环境 显卡:Intel Iris Plus Grap…...
HTTPS 加密全过程
加密协议以前是SSL,现在都是TLS, 而证书现在大多数都是SSL证书 抓包流程: TCP三次握手过后, 客户端发送Client Hello 服务器相应Server Hello 服务器再次响应发送证书: 服务器再发送公钥:...
联邦学习综述二
联邦学习漫画 联邦学习漫画链接: https://federated.withgoogle.com/ Federated Analytics: Collaborative Data Science without Data Collection 博客链接: https://blog.research.google/2020/05/federated-analytics-collaborative-data.html 本篇博客介绍了联邦分析&a…...
Idea本地跑flink任务时,总是重复消费kafka的数据(kafka->mysql)
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Idea中执行任务时,没法看到JobManager的错误,以至于我以为是什么特殊的原因导致任务总是反复消费。在close方法中,增加日志,发现jdbc连接被关闭了。 重新…...
基于nodemailer实现邮件发送
概述 node中可用nodemailer实现邮件的发送。本文使用QQ邮箱实现邮件的发送。 实现效果 实现 1. QQ邮箱配置 首先需要开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,如下图所示。 生成授权码 2. 发送邮件 发送邮件的代码比较简单,如下…...
【PostgreSQL内核学习(十八)—— (数据库表参数)】
数据库表参数 default_reloptions 函数案例 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。 本文主要参考了《PostgresSQL数据库内核…...
区块链的两个核心概念之一签名, 另一个是共识.
Alice的公私钥, 签名和验证签名仅仅确定了Alice对数字资产A所有权的宣言. 之后, Bob也可以用自己的私钥对资产A进行签名宣誓所有权。区块链中叫双花,即重复宣称所有权, 也称重复花费交易。这时候需要共识算法(集体成员pow或委员会代表pos监督…...
wpf中prism框架切换页面
主页面...
正则表达式(Regular Expression)学习网址分享
正则表达式(Regular expressions,也叫REs、 regexs 或regex patterns),是一种文本模式,包括普通字符(例如,a 到z 之间的字母)和特殊字符(称为"元字符"…...
【已解决】socket.gaierror: [Errno -3] Temporary failure in name resolution
问题描述 今天在环境迁移的过程中遇到多个问题,包括ModuleNotFoundError: No module named flask,socket.gaierror: [Errno -3] Temporary failure in name resolution以及Downloading: "https://huggingface.co/gyrojeff/YuzuMarker.FontDetection…...
OpenClaw配置优化:千问3.5-9B长任务稳定性提升50%
OpenClaw配置优化:千问3.5-9B长任务稳定性提升50% 1. 问题背景与挑战 去年11月接手一个自动化内容处理项目时,我第一次遭遇OpenClaw长任务执行的"断链"问题。当时需要连续完成"爬取网页→提取关键数据→生成报告→邮件发送"四个步…...
TPA2016D2音频放大器Arduino驱动与AGC工程实践
1. 项目概述Adafruit TPA2016 Library 是一款专为 Texas Instruments TPA2016D2 音频功率放大器设计的 Arduino 兼容驱动库。该库封装了 IC 协议通信、寄存器配置、自动增益控制(AGC)参数调节及硬件复位管理等底层操作,使嵌入式开发者无需直接…...
OpenClaw技能组合拳:Qwen3.5-9B实现多步骤跨境电商运营
OpenClaw技能组合拳:Qwen3.5-9B实现多步骤跨境电商运营 1. 为什么选择OpenClaw做跨境电商自动化? 去年夏天,我接手了一个跨境电商副业项目。每天需要手动处理商品信息抓取、多语言翻译、定价调整和库存同步,很快发现人工操作不仅…...
BLDC无刷电机脉冲注入启动法及其保护功能与控制原理
BLDC 无刷电机 脉冲注入 启动法 启动过程持续插入正反向短时脉冲;定位准,启动速度快; Mcu:华大hc32f030; 功能:脉冲定位,脉冲注入,开环,速度环,电流环&#x…...
COMSOL热应力仿真新手入门:从零开始设置热膨胀参数(附案例解析)
COMSOL热应力仿真新手入门:从零开始设置热膨胀参数(附案例解析) 热应力仿真是工程设计中不可或缺的一环,尤其在电子设备散热、航空航天材料分析等领域应用广泛。作为COMSOL Multiphysics的初学者,掌握热应力仿真的基础…...
Scratch 3.0二次开发实战:从零构建自定义插件
1. 为什么需要自定义Scratch插件? Scratch作为全球最受欢迎的少儿编程工具,其模块化积木设计让编程学习变得直观有趣。但你可能遇到过这种情况:想做一个天气预报项目,却发现内置积木无法获取实时天气数据;或者想开发一…...
三菱电梯保密资料解析与代码分析
三菱电梯保密资料凌云PRO地址码包括: 1.基本参数地址 2.轿厢部件地址 3.操作箱与外招部件地址 门部件地址 5.楼层部件地址 6.井道信息系统地址 7.操作模式地址 8.附加功能(各台)地址 9.附加功能(群控)地址 10.响应部件地址 11.声音部件地址 1…...
技术深度解构:R3nzSkin内存操作与游戏个性化实现奥秘
技术深度解构:R3nzSkin内存操作与游戏个性化实现奥秘 【免费下载链接】R3nzSkin Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3n/R3nzSkin 在游戏开发与逆向工程领域,内存操作技术一直是连接外部工具与…...
OpenClaw进阶配置:千问3.5-9B模型参数调优全解析
OpenClaw进阶配置:千问3.5-9B模型参数调优全解析 1. 为什么需要调优模型参数? 上周我在用OpenClaw自动处理一批技术文档时遇到了奇怪的现象:同样的任务指令,有时能完美执行,有时却会漏掉关键步骤。经过两天排查&…...
Wan2.2-I2V-A14B私有部署避坑指南:基于RTX4090D镜像的保姆级教程
Wan2.2-I2V-A14B私有部署避坑指南:基于RTX4090D镜像的保姆级教程 1. 开篇:为什么选择私有部署? 当你第一次接触Wan2.2-I2V-A14B这个强大的文生视频模型时,可能会被它的效果惊艳到。但随之而来的部署问题往往让人头疼——环境配置…...
