如何在Weaviate数据库中查找语义相似词汇?
实现Weaviate语义相似查询并存储额外字段
核心逻辑
Weaviate的语义匹配依赖向量嵌入,只需确保语义相关字段(比如示例里的词汇名称)被纳入向量计算,额外字段(如描述)作为普通属性存储即可——这些额外字段不会参与向量生成,仅用于数据返回。
具体实现步骤及代码示例
1. 初始化Weaviate客户端
假设使用本地Weaviate实例,若用第三方向量器(如OpenAI)需补充对应密钥:
import weaviate client = weaviate.Client( url="http://localhost:8080", # 若使用OpenAI向量器,添加以下配置 # additional_headers={"X-OpenAI-Api-Key": "YOUR_OPENAI_KEY"} )
2. 定义Schema(数据结构)
创建数据类,指定向量器,同时定义语义字段和额外字段:
# 测试时先删除已有类 if client.schema.exists("Vocabulary"): client.schema.delete_class("Vocabulary") class_definition = { "class": "Vocabulary", "vectorizer": "text2vec-openai", # 也可使用Weaviate内置的text2vec-contextionary "properties": [ { "name": "word", "dataType": ["string"], "description": "用于语义匹配的核心词汇" }, { "name": "description", "dataType": ["string"], "description": "无关语义的额外描述信息" }, { "name": "category", "dataType": ["string"], "description": "额外分类标签" } ] } client.schema.create_class(class_definition)
3. 导入带额外字段的数据
批量添加包含核心词汇和额外信息的对象:
data_objects = [ {"word": "orange", "description": "橙色柑橘类水果,富含维生素C", "category": "fruit"}, {"word": "dog", "description": "常见家养宠物,性格忠诚活泼", "category": "animal"}, {"word": "cat", "description": "喜静的家养宠物,擅长捕捉小型啮齿动物", "category": "animal"}, {"word": "bottle", "description": "用于盛装液体的容器,材质多为玻璃或塑料", "category": "container"}, {"word": "laptop", "description": "便携个人计算机,适合移动办公", "category": "electronic"} ] with client.batch as batch: batch.batch_size = 5 for obj in data_objects: batch.add_data_object(obj, class_name="Vocabulary")
4. 执行语义相似查询
通过nearText查询与'tangerine'语义最接近的对象,并返回所有字段:
response = client.query.get( "Vocabulary", ["word", "description", "category"] # 指定要返回的所有字段 ).with_near_text({ "concepts": ["tangerine"] }).with_limit(1).do() print(response["data"]["Get"]["Vocabulary"])
输出示例
[ { "word": "orange", "description": "橙色柑橘类水果,富含维生素C", "category": "fruit" } ]
关键说明
- 默认情况下,Weaviate会对所有字符串属性生成向量,若需指定仅特定字段参与向量计算,可在Schema的
vectorizer配置中添加vectorizePropertyNames参数限定字段 - 额外字段可按需任意扩展,不会影响语义匹配逻辑,查询时按需指定返回字段即可
内容的提问来源于stack exchange,提问作者user20305852
相关产品推荐
相关产品推荐

