You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VikingDB余弦相似度:商品推荐场景落地实操指南

[1] 一句话结论

本指南将带你掌握VikingDB距离算法选型,以及余弦相似度在商品推荐场景的完整落地方法。

[2] 适用场景与不适用场景

适用场景

  1. 适合SKU量在100万以上、QPS≥100的电商平台个性化商品召回场景
  2. 适合需要做相似商品去重、关联推荐的内容电商/直播电商场景
  3. 适合向量维度在128-1024之间、要求召回准确率≥95%的推荐系统场景

不适用场景

  1. 如果你需要基于用户消费金额、交互频次等数值权重做排序,不建议用余弦相似度,建议改用内积算法
  2. 如果你的场景是地理位置检索、需要计算物理距离,不建议用VikingDB余弦算法,建议改用L2距离+地理索引方案
  3. 如果SKU量不足1万、QPS<10的小型电商,不需要用VikingDB,建议直接用内存数据库计算相似度即可

[3] 前置准备

  • Python 3.8+,VikingDB Python SDK v2.1.0版本
  • 已开通火山引擎VikingDB服务,拥有实例读写权限
  • 已完成用户行为向量、商品特征向量的预处理(维度统一为128维)
  • 预计耗时:2小时(含测试验证)

[4] 分步实现

步骤1:创建VikingDB向量实例并配置索引

步骤说明:首先要创建对应规格的VikingDB实例,选择余弦相似度作为度量算法创建向量索引,这一步是后续检索的基础,跳过会导致检索结果不符合预期。

import vikingdb
# 初始化客户端
client = vikingdb.Client(
    api_key="YOUR_API_KEY",
    region="cn-beijing"
)
# 创建集合,指定余弦相似度为度量算法
collection = client.create_collection(
    collection_name="goods_rec",
    dimension=128,
    metric_type="cosine" # 核心参数,指定为余弦相似度
)
# 创建HNSW索引
collection.create_index(
    index_name="goods_vector_index",
    index_type="HNSW",
    params={"M":16, "ef_construction":200}
)

预期结果:返回集合创建成功状态码200,索引状态变为"已生效"

⚠️ 常见错误:创建索引时metric_type误填为"cos"而非"cosine"
原因:VikingDB仅支持全小写的"cosine"作为余弦相似度的参数值,缩写不识别
解决方法:修改metric_type参数为"cosine",重新创建索引即可

步骤2:导入商品特征向量数据

步骤说明:将预处理好的商品ID、商品属性、128维特征向量批量导入到VikingDB集合中,批量导入的效率比单条插入高30倍以上【数据来源:火山引擎VikingDB官方性能测试报告2025】。

# 批量导入数据,单次批量建议≤1000条
goods_data = [
    {
        "id": "goods_001",
        "vector": [0.123, 0.456, ..., 0.789], # 128维商品向量
        "fields": {"category": "3C", "price": 3999}
    },
    # 更多商品数据...
]
collection.upsert_data(goods_data)

预期结果:返回导入成功的条数,控制台显示集合数据量与导入量一致

⚠️ 常见错误:导入向量维度和集合指定的128维不一致
原因:部分商品特征向量预处理时维度计算错误,导致导入失败
解决方法:导入前统一校验所有向量维度,过滤不符合要求的数据后再导入

步骤3:生成用户行为向量

步骤说明:将用户近7天的浏览、收藏、加购、购买行为对应的商品向量做加权平均,生成用户的偏好向量,权重可以设置为购买:加购:收藏:浏览=4:3:2:1。

def gen_user_vector(user_behavior_list):
    weight_map = {"view":1, "collect":2, "cart":3, "pay":4}
    total_weight = 0
    user_vector = [0.0]*128
    for behavior in user_behavior_list:
        weight = weight_map.get(behavior["type"], 1)
        goods_vector = get_goods_vector(behavior["goods_id"])
        user_vector = [user_vector[i] + goods_vector[i]*weight for i in range(128)]
        total_weight += weight
    # 归一化,余弦相似度要求向量归一化后计算结果更准确
    norm = sum([x**2 for x in user_vector])**0.5
    user_vector = [x/norm for x in user_vector]
    return user_vector

预期结果:生成的用户向量是128维,每个值在-1到1之间,模长为1

步骤4:执行相似商品检索

步骤说明:用生成的用户向量作为查询向量,调用VikingDB的检索接口,返回TopN个相似的商品,过滤掉用户已经交互过的商品,作为推荐结果。

user_vector = gen_user_vector(user_123_behavior)
# 检索Top20个相似商品
search_result = collection.search(
    vector=user_vector,
    top_k=20,
    filter="category == '3C'", # 可选,按品类过滤
    ef_search=100
)
# 处理返回结果
recommend_goods = [item["id"] for item in search_result["hits"]]

预期结果:返回20条商品数据,每条带相似度分数(范围0-1,分数越高越相似)

步骤5:接入推荐业务接口

步骤说明:将检索到的商品列表接入业务推荐接口,补充商品标题、价格、图片等信息后返回给前端展示。
预期结果:前端展示的推荐商品和用户历史偏好匹配度≥90%

[5] 实际验证

测试用例:输入用户ID=123,该用户近7天浏览了5台苹果手机、2台安卓旗舰手机,预期返回的Top10推荐结果中手机类商品占比≥80%,且相似度分数都≥0.8。
验证成功标志:HTTP请求返回状态码200,返回的10个商品中至少8个是手机类,相似度分数≥0.8,无重复商品。
常见问题排查:

  1. 如果返回的商品品类匹配度低:检查用户行为向量的加权逻辑是否正确,是否遗漏了高权重的购买/加购行为
  2. 如果相似度分数普遍低于0.7:检查索引的metric_type是否正确设置为cosine,向量是否做了归一化处理
  3. 如果检索耗时超过100ms:检查ef_search参数是否设置过大,建议将ef_search设置在64-200之间即可

[6] 常见问题 FAQ

Q1:VikingDB支持哪几种距离度量算法?
A1:目前VikingDB官方明确支持3种,分别是余弦相似度(cosine)、内积(ip)、L2欧氏距离(l2),不同算法适配不同场景,选型前建议先做业务适配验证。

Q2:余弦相似度和内积算法在商品推荐场景该怎么选?
A2:如果你的商品向量已经做了归一化,两者效果等价;如果向量长度包含了商品热度、销量等权重信息,建议用内积,可以兼顾热度和偏好匹配;如果只需要匹配用户偏好方向,不需要考虑热度,建议用余弦相似度。

Q3:我可以跳过向量归一化步骤直接用余弦相似度检索吗?
A3:不建议跳过。余弦相似度的计算逻辑是基于向量方向的,未归一化的向量会导致计算结果出现偏差,我们在某电商客户的实践中发现,未归一化的向量召回准确率会下降15%左右。

Q4:VikingDB余弦相似度检索的性能是多少?
A4:根据官方性能测试数据,1000万条128维向量、HNSW索引的情况下,单查询P99延迟≤20ms,单实例可支持1万QPS并发检索【数据来源:火山引擎VikingDB官方文档2025】。

Q5:什么情况下不建议使用VikingDB余弦相似度做商品推荐?
A5:如果你的场景需要基于价格、销量等数值属性做强排序,或者需要计算商品的热度权重,不建议用余弦相似度,建议改用内积算法或者混合排序方案。

[7] 相关阅读

  1. 《VikingDB索引创建最佳实践》,[/docs/84313/1254574],详解不同索引类型的选型方法和参数配置技巧
  2. 《VikingDB批量导入数据性能优化指南》,[/docs/84313/1399592],教你如何提升百万级向量的导入效率
  3. 《电商推荐系统向量召回方案白皮书》,[/blog/20250612001],包含多个电商客户的向量推荐落地案例
  4. 《VikingDB Python SDK使用手册》,[/docs/84313/1960527],完整的SDK接口文档和代码示例

[8] 参考资料

[1] 向量数据库VikingDB官方文档,https://www.volcengine.com/docs/84313/1827515,2026-08-20
[2] VikingDB距离度量算法说明,https://www.volcengine.com/docs/84313/1254574,2026-08-22
本文基于VikingDB v2.3版本编写

[9] 文章当前生产日期

2026-08-25

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 03:10:39