1. 项目概述
最近在电商项目中遇到了一个典型需求:用户希望输入"夏季轻薄连衣裙"时,系统不仅能返回标题含有关键词的商品,还能智能推荐材质、款式相似的同类商品。传统的关键词匹配显然无法满足这种语义化搜索需求,于是我们基于华为云数据仓库服务DWS的向量计算能力,配合pgvector插件搭建了一套轻量级的商品搜索推荐系统。
这个方案的核心在于利用bge-m3等嵌入模型将商品信息转化为高维向量,通过DWS内置的向量相似度计算实现"以图搜图"式的语义检索。相比单独部署向量数据库的方案,直接在DWS中完成向量存储与计算能大幅降低系统复杂度。实测在百万级商品库中,平均搜索延迟控制在200ms以内,且TOP10推荐结果的相关性评分提升40%以上。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心架构设计
2.1 技术选型依据
选择DWS+pgvector的组合主要基于三点考量:
- 基础设施统一性:企业已有DWS集群承载订单分析业务,扩展向量计算功能无需新增运维单元
- 性能基准测试:在16核64G配置下,pgvector对100万条768维向量的ANN搜索(probes=32)可达QPS>500
- 功能完整性:DWS的PostgreSQL 12.5版本支持pgvector全部操作符(<->,<#>等),且与现有SQL查询可无缝结合
2.2 系统数据流设计
典型查询流程如下:
- 用户输入"商务休闲衬衫"
- 前端调用bge-m3模型生成查询向量[0.21, -0.34, ..., 0.78]
- 向DWS发送包含向量距离条件的SQL:
sql复制SELECT product_id, name, price FROM products ORDER BY embedding <-> '[0.21,-0.34,...,0.78]' LIMIT 10 - DWS使用IVFFlat索引快速返回相似商品
- 结果集与用户历史行为数据融合排序后呈现
3. 关键实现细节
3.1 向量化建模方案
商品信息的向量化采用三级嵌入策略:
- 基础属性嵌入:将标题、类目等结构化字段通过BERT-base生成128维向量
- 多模态融合:商品图片通过ResNet-50提取特征向量(1024维)
- 组合降维:使用PCA将拼接后的1152维向量降至768维
实测发现:对于服装类商品,加入图片向量可使相似度计算准确率提升27%
3.2 DWS环境配置
在华为云DWS中启用向量计算的完整步骤:
bash复制# 登录DWS管理节点
gsql -d postgres -p 8000 -U dbadmin
# 安装pgvector扩展
CREATE EXTENSION vector;
# 创建带向量列的商品表
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(255),
category VARCHAR(50),
embedding vector(768) -- 根据模型输出维度确定
);
# 创建IVFFlat索引(建议数据量>1万时使用)
CREATE INDEX ON products
USING ivfflat (embedding vector_l2_ops)
WITH (lists = 100);
3.3 混合检索实现
结合传统SQL查询与向量搜索的示例:
sql复制-- 查找价格低于500元且与查询向量最相似的女士包
SELECT id, name, price,
1 - (embedding <-> '[0.12,...,0.45]') AS similarity
FROM products
WHERE category = 'handbag'
AND price < 500
ORDER BY similarity DESC
LIMIT 10;
4. 性能优化实践
4.1 索引调优参数
通过实际测试得出的最佳实践:
| 参数 | 小数据集(<10万) | 大数据集(≥100万) |
|---|---|---|
| ivfflat.lists | 10 | sqrt(行数) |
| ivfflat.probes | 1 | lists/10 |
| parallel_workers | 2 | 4 |
4.2 常见问题排查
-
精度异常问题:
- 现象:相似度计算结果出现>1的值
- 原因:未对向量做L2归一化
- 解决:存储前执行
embedding = embedding / norm(embedding)
-
性能下降问题:
- 现象:数据量增长后查询变慢
- 检查:
EXPLAIN ANALYZE查看是否走索引 - 措施:重建索引时调整lists参数
-
插件兼容问题:
- 确认DWS的PostgreSQL版本与pgvector的兼容性
- 当前验证可用的组合:
- DWS 3.0 + pgvector 0.4.1
- PostgreSQL 12.5 + pgvector 0.5.0
5. 扩展应用场景
5.1 个性化推荐增强
通过记录用户行为向量(浏览、购买等),在DWS中实现实时个性化排序:
sql复制-- 融合用户偏好向量与商品向量
SELECT p.*,
0.7 * (1 - (p.embedding <-> '[商品向量]')) +
0.3 * (1 - (p.embedding <-> '[用户向量]')) AS combined_score
FROM products p
ORDER BY combined_score DESC
LIMIT 20;
5.2 多模态搜索实践
将文本查询与图片搜索统一为向量计算:
python复制# 文本查询向量生成
text_embedding = bge_m3.encode("蓝色条纹衬衫")
# 图片查询向量生成
img_embedding = resnet50.extract_features(uploaded_image)
# 混合查询
hybrid_embedding = 0.6*text_embedding + 0.4*img_embedding
这套方案在3个月的生产运行中表现出色,相比原有Elasticsearch方案,不仅节省了30%的硬件成本,更重要的是实现了搜索推荐效果的量级提升。一个意外的收获是,向量存储使得"找相似"功能的开发变得极其简单——原来需要两周开发的功能现在通过5行SQL即可实现。
