在多语言电商平台的商品搜索场景中,商品往往包含名称、规格参数、详细描述、多语言标签等多个文本字段,单一字段生成的向量只能捕捉部分语义特征,很容易出现搜索结果与用户需求不匹配的问题。通过科学融合多字段文本生成高质量向量表示,能够充分挖掘商品的多维度信息,提升Qdrant向量检索的精准度。

多字段文本预处理规范
融合多字段文本前需要先完成统一的预处理,避免不同字段的格式差异影响向量质量。预处理流程需要覆盖所有参与融合的文本字段:
- 统一文本编码,将所有字段转换为UTF-8格式,避免乱码问题
- 多语言文本分别做对应语言的停用词过滤,比如中文过滤的、了等虚词,英文过滤the、a等虚词
- 提取各字段的核心关键词,比如商品名称提取品牌、品类词,描述提取功能、特性词
- 给不同字段添加标识前缀,避免语义混淆,比如给商品名称加
title_前缀,给描述加desc_前缀
多字段权重分配策略
不同字段对商品特征的贡献度不同,需要按照业务优先级分配权重,核心字段权重更高,辅助字段权重更低:
| 字段类型 | 权重范围 | 说明 |
|---|---|---|
| 商品名称 | 0.4-0.5 | 最核心的品类、品牌信息,权重最高 |
| 核心属性 | 0.2-0.3 | 规格、型号等关键参数,权重次之 |
| 商品描述 | 0.1-0.2 | 功能、使用场景等补充信息,权重较低 |
| 标签 | 0.05-0.1 | 运营标注的辅助标签,权重最低 |
向量融合实现方案
常见的多字段向量融合有两种可行方案,开发者可以根据业务需求选择:
方案一:文本拼接后生成向量
将预处理后的多字段文本按照权重顺序拼接,再调用多语言embedding模型生成单个向量,这种方式实现简单,适合向量维度要求统一的场景。
import sentence_transformers
# 加载多语言embedding模型
model = sentence_transformers.SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
def merge_text_to_vector(product_info):
# 按权重顺序拼接文本,权重高的放在前面
merged_text = f"title_{product_info['name']} "
merged_text += f"attr_{product_info['attributes']} "
merged_text += f"desc_{product_info['description']} "
merged_text += f"tag_{product_info['tags']}"
# 生成向量
vector = model.encode(merged_text)
return vector
# 示例商品数据
product = {
"name": "Wireless Bluetooth Headset 无线蓝牙耳机",
"attributes": "Battery life 20h 续航20小时",
"description": "Noise cancellation for commuting 通勤降噪",
"tags": "electronics,audio 电子,音频"
}
vector = merge_text_to_vector(product)
print(f"生成的向量维度:{len(vector)}")
方案二:多向量加权融合
先给每个字段单独生成向量,再按照预设权重加权求和得到最终向量,这种方式可以灵活调整单个字段的权重,适配不同搜索场景的需求。
import numpy as np
import sentence_transformers
model = sentence_transformers.SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
def weighted_fusion_vector(product_info, weights):
# 各字段单独生成向量
title_vec = model.encode(f"title_{product_info['name']}")
attr_vec = model.encode(f"attr_{product_info['attributes']}")
desc_vec = model.encode(f"desc_{product_info['description']}")
tag_vec = model.encode(f"tag_{product_info['tags']}")
# 加权求和
final_vec = (
title_vec * weights['title'] +
attr_vec * weights['attr'] +
desc_vec * weights['desc'] +
tag_vec * weights['tag']
)
# 归一化避免向量模长差异影响检索
final_vec = final_vec / np.linalg.norm(final_vec)
return final_vec
product = {
"name": "Wireless Bluetooth Headset 无线蓝牙耳机",
"attributes": "Battery life 20h 续航20小时",
"description": "Noise cancellation for commuting 通勤降噪",
"tags": "electronics,audio 电子,音频"
}
weights = {
"title": 0.45,
"attr": 0.25,
"desc": 0.2,
"tag": 0.1
}
final_vector = weighted_fusion_vector(product, weights)
print(f"融合后向量维度:{len(final_vector)}")
Qdrant向量存储与检索配置
生成高质量向量后,需要正确配置Qdrant的集合和检索参数,才能发挥向量的检索效果:
- 集合的向量维度需要和embedding模型的输出维度一致,上述示例模型输出维度为384
- 距离度量选择余弦相似度,更适合文本向量的匹配场景
- 开启索引优化,提升多语言向量的检索速度
- 检索时可以结合商品类目等标量字段做过滤,进一步提升结果精准度
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
# 初始化Qdrant客户端,连接本地服务
client = QdrantClient(host="127.0.0.1", port=6333)
# 创建集合,向量维度384,余弦相似度
client.create_collection(
collection_name="multilingual_products",
vectors_config=VectorParams(size=384, distance=Distance.COSINE)
)
# 插入融合后的向量
client.upsert(
collection_name="multilingual_products",
points=[
PointStruct(
id=1,
vector=final_vector.tolist(),
payload={
"name": "Wireless Bluetooth Headset 无线蓝牙耳机",
"category": "electronics",
"price": 99.9
}
)
]
)
# 执行检索
search_result = client.search(
collection_name="multilingual_products",
query_vector=final_vector.tolist(),
limit=5
)
for result in search_result:
print(f"匹配商品ID:{result.id},相似度:{result.score}")
效果验证与优化方向
完成向量融合和检索配置后,需要通过实际搜索场景验证效果,常见的优化方向包括:
- 调整各字段权重,根据搜索点击率优化权重分配比例
- 补充商品的用户搜索query日志,将高频query也纳入向量融合范围
- 针对低资源语言做单独的文本增强,提升小语种商品的向量质量
- 定期更新embedding模型,适配新的商品文本特征