基于LangChain和FAISS构建的电商商品问答系统,用sentence-transformers做语义检索,通义千问做答案生成。
最近在学RAG相关技术,看到很多教程都是简单的文档问答,想试试在电商场景下效果怎么样。选择电商主要是因为商品信息比较结构化,而且查询场景比较明确(找商品、比较价格之类的)。
- LangChain: 主要是方便集成各种组件,虽然有点重但是省事
- FAISS: 向量检索比较快,CPU版本就够用
- sentence-transformers: all-MiniLM-L6-v2模型,384维向量,中英文都还行
- 通义千问: 用的turbo版本,便宜而且中文支持好
使用Kaggle上的Amazon Products Dataset 2023,包含140万条真实Amazon商品数据。支持灵活的数据规模和采样方法,可以根据硬件配置调整处理的数据量。
# Python 3.11,避免依赖冲突
conda create -n rag_py311 python=3.11
conda activate rag_py311
pip install -r requirements.txt需要在根目录创建.env文件:
DASHSCOPE_API_KEY=your_key_here
去阿里云DashScope申请,很快就能通过。
项目提供三个核心脚本:
# 重要:必须先激活正确的环境
conda activate rag_py311
# 脚本1:下载Kaggle数据集(可选)
python download_kaggle.py
# 脚本2:Kaggle真实数据测试
python test_kaggle.py --size 10000 --sampling random
# 脚本3:生成随机数据测试(快速验证)
python test_generated.py --size 5000--size N: 数据规模(推荐范围:5000-20000)--sampling: 采样方法random: 随机采样(推荐,数据分布均匀)stratified: 分层采样(按类别平衡采样)sequential: 顺序采样(可能分布不均)
# 快速验证功能
python test_generated.py --size 3000
# 真实数据测试(推荐规模)
python test_kaggle.py --size 10000 --sampling stratified
# 大规模测试(需要16GB+内存)
python test_kaggle.py --size 50000 --sampling random设计了两套模式:
- ADVANCED模式: LangChain + FAISS + sentence-transformers,功能全但是依赖多
- SIMPLE模式: TF-IDF + 直接API调用,作为降级方案
系统会自动检测依赖,如果ADVANCED模式初始化失败会自动切换到SIMPLE模式。
不同规模测试结果:
| 数据规模 | 向量构建速度 | 平均响应时间 | 内存使用 | 推荐配置 |
|---|---|---|---|---|
| 5,000条 | 76向量/秒 | 0.88秒 | 4GB | 快速测试 |
| 10,000条 | 65向量/秒 | 0.95秒 | 6GB | 日常测试 |
| 20,000条 | 55向量/秒 | 1.2秒 | 10GB | 中等规模 |
| 50,000条 | 40向量/秒 | 0.97秒 | 16GB | 大规模测试 |
- Python版本兼容性: 升级到Python 3.11解决pydantic冲突
- 内存管理: 分批处理避免大规模数据OOM
- FAISS稳定性: 优化向量构建过程,避免segmentation fault
- 数据分布: 支持分层采样确保类别平衡
- 价格过滤: 智能识别价格条件,精确过滤结果
支持多种查询类型:
价格条件查询:
问:"200美元以下的商品有哪些?"
答:推荐了符合价格条件的商品,不会显示超出预算的商品
类别推荐查询:
问:"推荐一些电子产品"
答:根据数据中的实际类别匹配相关商品
综合条件查询:
问:"有什么高评分的便宜商品?"
答:结合评分和价格进行智能推荐
- 智能列匹配: 自动识别不同数据源的列名格式
- 分批处理: 避免大规模数据的内存问题
- 价格解析: 支持多种价格格式和货币符号
- 容错降级: 高级模式失败时自动切换到简单模式
- 灵活采样: 支持随机、分层、顺序三种采样方法
主要依赖在requirements.txt里,注意numpy版本锁定在<2.0避免兼容性问题。建议使用conda环境管理依赖。