向量数据库Weaviate的使用

开源AI·十一月创作之星挑战赛 10w+人浏览 627人参与

向量数据库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)
文档查询
  1. 向量查询
collection = client.collections.use(collection_name)
response = collection.query.near_text(  
	query="查询内容",  
	limit=2,  
	target_vector="content_vector"
	return_metadata=MetadataQuery.full()
)
  1. 关键字查询
collection = self.client.collections.use(collection_name)
obj = collection.query.bm25(
	query=query,
	limit=3,
	return_metadata=MetadataQuery.full()
)
  1. 混合查询
collection = self.client.collections.use(collection_name)
obj = collection.query.hybrid(
	query=query,
	limit=3,
	target_vector="content_vector",
	return_metadata=MetadataQuery.full()
)
  1. 重排序,在查询设置重排序模块,那么查询之后的文档根据相似度重新排序
response = collection.query.near_text(  
	略过
	# 重排序
	rerank=Rerank(
		prop="content",
		query=query
	),
	return_metadata=MetadataQuery.full()
)

问题

  1. 嵌入模型可以将本地模型替换为云模型,通过配置api-key,url以及对应的函数可以调用云模型
  2. 查询通过设置不同的模型,方法,参数提高查询的精度
### Weaviate 使用指南 Weaviate 是一款开源的向量数据库,专为高效管理和检索大规模向量数据设计。该平台不仅支持复杂的查询操作,还具备良好的扩展性和灵活性,适合各种规模的应用程序开发需求[^1]。 #### 安装与配置 为了开始使用 Weaviate,首先需要安装并启动服务实例。可以通过 Docker 或者 Kubernetes 部署方式轻松完成这一过程: ```bash docker pull semitechnologies/weaviate:latest docker run -p 8080:8080 \ --env AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED="true" \ --env QUERY_DEFAULTS_LIMIT=25 \ --env DEFAULT_VECTORIZER_MODULE="text2vec-contextionary" \ semitechnologies/weaviate:latest ``` 上述命令会下载最新版本镜像文件,并设置一些基本环境变量以便于初次体验[^4]。 #### 数据模型定义 创建类(Class)是构建 Weaviate 应用的基础步骤之一。每个类别代表一类实体对象及其属性描述。下面展示如何利用 RESTful API 创建一个新的 `Article` 类型: ```json POST /v1/schema HTTP/1.1 Host: localhost:8080 Content-Type: application/json { "class": "Article", "description": "A news article or blog post.", "properties": [ { "name": "title", "dataType": ["string"], "description": "The title of the article." }, ... ] } ``` 此 JSON 请求体指定了新类别的名称、说明以及若干字段信息[^5]。 #### 向量索引与搜索 一旦建立了适当的数据模式之后就可以考虑导入具体记录了。对于每条新增加的内容项而言,除了常规属性外还可以关联一组或多组特征向量用于后续相似度匹配计算目的。当执行查找请求时,则允许指定目标空间维度大小以及其他参数选项来优化结果质量[^2]。 例如,在 GraphQL 查询语句中加入如下片段即可实现基于内容推荐功能: ```graphql query GetSimilarArticles($id: ID!) { Explore( nearVector: {vector: $embedding, certainty: 0.7}, limit: 5, class: Article ) { ... on Article { id title _additional { distance } } } } ``` 这段代码展示了怎样通过给定的文章ID获取与其最接近的五篇其他文章列表,并附带距离分数作为参考依据[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值