关于OpenAI Embeddings API电商分类输入及优化的技术问询
我正在使用OpenAI text-embedding-3-small模型为约6000条层级化产品分类生成嵌入向量,产品分类格式示例如下:
Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Off-Road & All-Terrain Vehicle Protective Gear Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Off-Road & All-Terrain Vehicle Protective Gear > ATV & UTV Bar Pads Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Alarms & Locks Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Alarms & Locks > Automotive Alarm Accessories Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Alarms & Locks > Automotive Alarm Systems Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Alarms & Locks > Motorcycle Alarms & Locks
生成嵌入向量的代码如下:
from openai import OpenAI client = OpenAI() response = client.embeddings.create( input="Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Alarms & Locks", model="text-embedding-3-small", encoding_format="float", dimensions=512 )
生成的向量存储在Cosmos DB for MongoDB中,通过向量相似性搜索为用户输入的产品标题匹配最合适的分类。整体效果不错,但偶尔会出现错误结果,比如搜索植物名称“Pinus Sylvestris”时,返回完全无关的产品分类。
技术疑问
- 将这种带有
>符号的层级化产品分类传入模型是否合规可行? - 有没有方法可以告知模型这是电商网站的产品分类,使其更好地理解输入内容?
查询代码补充:
from openai import OpenAI from pymongo import MongoClient import sys MONGODB_CON_STR=XXXXXX db = MongoClient(MONGODB_CON_STR)["shop"] client = OpenAI() def get_vector_for_text(input:str): response = client.embeddings.create( input=input, model="text-embedding-3-small", encoding_format="float", dimensions=512 ) return response.data[0].embedding for line in sys.stdin: queryVector = get_vector_for_text(line) res = db["product_taxonomy"].aggregate([ { "$search": { "cosmosSearch": { "vector": queryVector, "path": "vector", "k": 2 }, "returnStoredSource": True }}, { "$project": { "similarityScore": { "$meta": "searchScore" }, "document" : "$$ROOT" } } ]); while res.alive: for doc in res: print(f'\tsimilarityScore: {doc["similarityScore"]} {doc["document"]["text"]}') print('\n')
关于层级化分类格式的合规性
完全可行。OpenAI的嵌入模型对包含>这类特殊符号的文本没有限制,只要文本语义清晰,模型就能正常处理。>作为层级分隔符,会被模型识别为分类间的语义边界,不会影响嵌入向量的生成质量。
小优化建议:把文本中的&替换为实际的&,避免HTML转义字符带来的微小语义干扰——虽然影响不大,但处理后文本更贴近日常语言,可能进一步提升向量的语义准确性。
让模型理解电商产品分类的方法
有几种实用方案可以给模型注入场景上下文:
1. 给文本添加固定前缀提示
生成嵌入向量时,给每个分类文本加上统一前缀,比如:
"电商产品分类:Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Alarms & Locks"
这样模型会明确知道输入属于电商分类体系,生成的向量会更贴合电商场景语义。同时,生成查询向量时,也要给用户输入的内容加上对应前缀,比如用户输入“Pinus Sylvestris”,就转换成:
"电商产品分类匹配:Pinus Sylvestris"
保持查询与存储向量的上下文一致,能大幅降低无关匹配概率。
2. 优化层级结构的自然语言表达
把层级分类转换成更通顺的描述性文本,比如将:
Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Alarms & Locks
改成:
电商产品:交通工具及配件 > 车辆配件及附件 > 车辆安全防护 > 车辆警报与锁具
(英文场景对应调整为自然英文描述),结构化的自然语言提示能让模型更清晰地理解分类的场景和层级关系。
3. 前置过滤无关查询
对于明显不属于电商范畴的输入(比如植物名称),可以在向量搜索前加一层规则过滤:比如维护电商领域关键词库,或用轻量分类模型先判断输入是否属于电商产品,若不属于直接返回“无匹配分类”,避免无效的向量搜索。
4. 设置相似度分数阈值
在查询结果中设定分数阈值(比如只保留相似度高于0.7的结果,具体数值需根据你的数据测试调整),低于阈值的结果直接丢弃,过滤语义差距较大的无关匹配。
内容的提问来源于stack exchange,提问作者eztam

