向量数据库Weaviate的使用
Abstract
向量数据库作为处理高维向量数据的重要工具,在语义检索、推荐系统和大语言模型等场景中发挥着关键作用。Weaviate 是一款开源的向量数据库,支持结合自定义嵌入模型实现高效的相似性搜索与数据管理。本文以开源模型 qwen3-embedding 为例,简单介绍 Weaviate 的部署、配置、数据导入及查询方法,为相关应用提供实践参考。
安装
1 . 首先是安装,这里采用流行的docker安装,docker-compose内容如下:
services:
weaviate:
command:
- --host
- 0.0.0.0
- --port
- '8080'
- --scheme
- http
image: semitechnologies/weaviate:1.34.0
ports:
- 9080:8080
- 50051:50051
volumes:
- weaviate_data:/var/lib/weaviate
restart: on-failure:0
environment:
QUERY_DEFAULTS_LIMIT: 25
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
ENABLE_MODULES: 'text2vec-transformers,reranker-transformers'
ENABLE_API_BASED_MODULES: 'true'
CLUSTER_HOSTNAME: 'node1'
TRANSFORMERS_INFERENCE_API: http://text2vec-transformers:8080
RERANKER_INFERENCE_API: http://reranker-transformers:8080
container_name: weaviate
text2vec-transformers:
image: qwen3_embedding
ports:
- 9010:8080
reranker-transformers:
image: semitechnologies/reranker-transformers:cross-encoder-ms-marco-MiniLM-L-6-v2
volumes:
weaviate_data:
在这个配置中不仅是运行了weaviate,同时运行text2vec-transformers(向量模型)和reranker-transformers(重排序模型)这2个容器。向量模型是为文本向量化和向量搜索提供嵌入文本模型支持的,重排序模型是为搜索结果重排序提供支持的,这2个是非必要,需要时运行。
2 . 嵌入式文本模型:在这里采用的是qwen3-embedding模型,需要依赖semitechnologies/transformers-inference:custom构建一个包含qwen3-embedding的镜像文件,并启动容器,修改weaviate的配置,使模型可用,具体操作如下
2.1 从HuggingFace下载模型文件 ,需要下载整个目录

2.2 构建镜像文件
# DockeFile文件
FROM semitechnologies/transformers-inference:custom
COPY 模型目录 /app/models/model
# 构建命令
docker build -f 配置文件 -t qwen3-embedding .```
2.3 docker-compose文件修改
services:
weaviate:
省略
ENABLE_MODULES: 'text2vec-transformers,reranker-transformers'
ENABLE_API_BASED_MODULES: 'true'
TRANSFORMERS_INFERENCE_API: http://text2vec-transformers:8080
RERANKER_INFERENCE_API: http://reranker-transformers:8080
text2vec-transformers:
image: qwen3_embedding
ports:
- 9010:8080
reranker-transformers:
image: semitechnologies/reranker-transformers:cross-encoder-ms-marco-MiniLM-L-6-v2
volumes:
weaviate_data:
2.4 . 注意测试容器是否正常运行
curl localhost:9010/vectors -H 'Content-Type: application/json' -d '{"text": "foo bar"}'
容器第一次使用时会报错Resource punkt_tab not found.,最简单的处理方式,进入容器,手动处理,方法如下
# python3
>>> import nltk
>>> nltk.download('punkt_tab')
[nltk_data] Downloading package punkt_tab to /root/nltk_data...
[nltk_data] Unzipping tokenizers/punkt_tab.zip.
True
>>> quit()
再次测试,正确返回向量数据
python的weaviate使用
安装依赖包
python3安装依赖包:pip3 install weaviate-client注意最新版本为4++。
使用
1 . 连接库,容器端口为9080,注意修改下
client = weaviate.connect_to_local(
host="127.0.0.1", # Use a string to specify the host
port=9080,
grpc_port=50051
)
client.connect()
3 . 建立数据集,给数据集定义property,数据集的名字不能为中文
self.client.collections.create(
collection名字,
description=‘描述’,
# 定义数据集的`property`
properties=[
Property(name="title",data_type=DataType.TEXT,description="文章标题"),
Property(name="content",data_type=DataType.TEXT,description="文章内容",vectorize_property_name=True),
],
# 向量配置,需要weaviate的配置对应
vector_config=Configure.Vectors.text2vec_transformers(
name="content_vector",
source_properties=["content"]
# 向量索引
vector_index_config=Configure.VectorIndex.hnsw()
),
# 重排序,也需要与weaviate的配置对应
reranker_config=Configure.Reranker.transformers()
)
4 . 查看定义的collection
config = client.collections.get(collection_name).config.get()
5 . 删除collection
client.collections.delete(collection_name)
6 . 插入文档
collection = client.collections.use(collection_name)
uuid=collection.data.insert(data_obj)
7 . 通过uuid获取文档
# 设置include_vector=True,可以获取到向量,默认不返回向量,
obj = collection.query.fetch_object_by_id(uuid,include_vector=True)
文档查询
- 向量查询
collection = client.collections.use(collection_name)
response = collection.query.near_text(
query="查询内容",
limit=2,
target_vector="content_vector"
return_metadata=MetadataQuery.full()
)
- 关键字查询
collection = self.client.collections.use(collection_name)
obj = collection.query.bm25(
query=query,
limit=3,
return_metadata=MetadataQuery.full()
)
- 混合查询
collection = self.client.collections.use(collection_name)
obj = collection.query.hybrid(
query=query,
limit=3,
target_vector="content_vector",
return_metadata=MetadataQuery.full()
)
- 重排序,在查询设置重排序模块,那么查询之后的文档根据相似度重新排序
response = collection.query.near_text(
略过
# 重排序
rerank=Rerank(
prop="content",
query=query
),
return_metadata=MetadataQuery.full()
)
问题
- 嵌入模型可以将本地模型替换为云模型,通过配置
api-key,url以及对应的函数可以调用云模型 - 查询通过设置不同的模型,方法,参数提高查询的精度

2622

被折叠的 条评论
为什么被折叠?



