未记录事实核验 · 状态:维护中
记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。
warning 适用边界与维护说明
本文适合用于比较部署方式、练习以 Weaviate 1.29.0 为基础的本地 Compose、模型模块配置及 Python v4 客户端连接,不是可直接套用的生产高可用、升级或恢复方案。本次仅作全文结构审阅,未运行示例或进行外部事实核验。Helm 示例未指定适配的 Chart 版本,生产配置关闭匿名访问后仍缺数据库身份认证配置,OpenAI Secret 不能替代数据库访问凭证;多 Pod 示例也不包含完整的数据复制和故障恢复设计。升级脚本固定挂载的 weaviate_data 可能不是 Compose 实际数据卷,无条件输出“备份完成”,末步仅查询版本而未验证业务数据完整性,使用前须定位真实数据卷、确认备份成功并完成恢复演练,不能将 Helm 回滚等同于数据恢复。云沙箱期限、计费方式、高可用与自动备份权益,以及版本里程碑和 Named Vectors 重新导入要求均缺少对应依据,应在采购或迁移决策前另行确认。
Weaviate 安装与部署
#向量数据库 #Weaviate #Docker #Kubernetes #部署运维
目录
- 快速开始:5步跑通本地环境
- 三种部署方式概览
- 部署前的关键决策
- 方式一:Weaviate Cloud 托管服务(WCS)
- 方式二:Docker 本地部署(推荐)
- 方式三:Kubernetes 生产集群
- Python 客户端安装与连接
- 模块启用配置
- 配置参数速查
- 版本与升级
- 常见问题排查
快速开始:5步跑通本地环境
tip 给没耐心的人
如果你只是想先跑起来再说,可以先按这5步尝试本地启动;在 Docker 环境就绪、端口可用且镜像下载顺利的情况下,可将10分钟作为练习时间估计,而非完成保证。
- [ ] 第1步:确认 Docker 已安装(
docker --version,需要 20.10+) - [ ] 第2步:创建项目目录,新建
docker-compose.yml(内容见基础版(无外部模块)) - [ ] 第3步:在同目录创建
.env文件,填入OPENAI_API_KEY=sk-xxx(如果使用 OpenAI 模块) - [ ] 第4步:运行
docker compose up -d,等待约30秒 - [ ] 第5步:执行
curl http://localhost:8080/v1/meta看到 JSON 输出,代表成功
通过后继续往下读完整配置说明,再前往 05-第一个Weaviate应用 动手写代码。
三种部署方式概览
选择部署方式之前,先用这张表对齐预期:
| 维度 | WCS 云服务 | Docker 本地 | Kubernetes 生产集群 |
|---|---|---|---|
| 适用场景 | 快速原型、PoC、小团队 | 本地开发、功能验证 | 企业级生产、高可用需求 |
| 启动时间 | 2分钟(点几下) | 5分钟(写 yaml 文件) | 30分钟+ |
| 运维复杂度 | 极低(全托管) | 低 | 高 |
| 成本 | 有免费 14 天沙箱,生产按用量付费 | 仅服务器费用 | 服务器 + 运维人力 |
| 数据掌控 | 数据在 Weaviate 云上 | 完全本地 | 完全自控 |
| 高可用 | 内置,托管 SLA | 单点,无高可用 | 多副本,自定义 SLA |
| 推荐程度 | 新手/快速验证 ★★★★★ | 日常开发 ★★★★★ | 生产部署 ★★★★☆ |
note 怎么选
- 刚接触 Weaviate,想快速体验:WCS 免费沙箱
- 本地开发、需要调试:Docker Compose(本文重点)
- 已有 K8s 集群、上生产:Helm Chart
部署前的关键决策
在安装 Weaviate 之前,有一个思维模型值得先建立起来。
想象你在开一家咖啡馆。开业前你不只是"租个铺子",还要决定:要不要配咖啡机?要不要加奶泡器?要不要装冰淇淋机?这些设备需要提前接好电、备好耗材,开张之后临时加装会很麻烦。
Weaviate 的部署也是这样。 它不只是一个数据库,还是一个模块化的 AI 原生系统。你需要在启动时就决定:
- 要不要内置向量化能力?(用 OpenAI、Cohere 还是本地模型?)
- 要不要内置生成式 AI?(直接在数据库里跑 RAG?)
- 要不要内置重排序?(提升搜索质量?)
这些"外挂技能"都要在 ENABLE_MODULES 里声明,就像装修房子时先想好要装几个插座——事后再改要大动干戈。
tip 初学者建议
第一次部署,先用最简单的 text2vec-openai + Docker Compose 方案跑通流程,再考虑生产环境的复杂配置。如果完全不想依赖外部 API,直接跳到完全本地化方案(无外部 API)。
方式一:Weaviate Cloud 托管服务(WCS)
什么时候选择 Weaviate Cloud?
如果你不想自己管理服务器、担心运维、或者只是做 PoC 验证,Weaviate Cloud(WCD)是零运维的最佳选择。它就像点外卖——你不需要买菜、洗碗,只管吃就行。
适用场景:
- 快速原型验证
- 小团队 / 个人项目
- 不想在基础设施上花时间
- 需要高可用但团队没有 DevOps 资源
注册与创建免费集群
- 访问 Weaviate Cloud Console
- 注册账号(支持 GitHub / Google 登录)
- 点击 "Create cluster"
- 选择 "Free sandbox"(免费,14 天有效期,到期前可以重建)
- 输入集群名称,选择区域(建议选离你最近的节点,国内用新加坡或日本)
- 等待约 2 分钟,集群状态变为 "Running"
获取连接信息
集群创建后,在 Console 里可以找到:
| 信息 | 位置 | 示例 |
|---|---|---|
| Cluster URL | Details 页面 | https://my-cluster.weaviate.network |
| API Key | Details > API Keys | xxxxx-xxxxx-xxxxx |
warning API Key 只显示一次
创建 API Key 后,完整的 key 只会显示这一次。务必立即复制并妥善保存(建议存入密码管理器),之后在 Console 里只能看到 key 的前几位,无法找回完整内容。
Python 连接代码(weaviate-client v4)
import weaviate
from weaviate.classes.init import Auth, AdditionalConfig, Timeout
import os
# 基础连接(从环境变量读取)
client = weaviate.connect_to_weaviate_cloud(
cluster_url=os.environ["WEAVIATE_URL"], # https://xxx.weaviate.network
auth_credentials=Auth.api_key(os.environ["WEAVIATE_API_KEY"]),
# 如果需要调用 OpenAI 等模型,传入对应的 API Key
headers={
"X-OpenAI-Api-Key": os.environ["OPENAI_API_KEY"],
}
)
# 健康检查
assert client.is_ready(), "Weaviate 连接失败,请检查 URL 和 API Key"
print("连接成功,Weaviate 版本:", client.get_meta()["version"])
client.close()
如果在国内连接 WCS 有延迟,调整超时参数:
client = weaviate.connect_to_weaviate_cloud(
cluster_url=os.environ["WEAVIATE_URL"],
auth_credentials=Auth.api_key(os.environ["WEAVIATE_API_KEY"]),
additional_config=AdditionalConfig(
timeout=Timeout(init=30, query=60, insert=120)
),
headers={
"X-OpenAI-Api-Key": os.environ["OPENAI_API_KEY"],
}
)
WCS 方案优缺点:
- 优点:零运维、开箱即用、内置高可用、自动备份
- 缺点:生产环境成本较高(按向量数量和查询次数计费)、数据存储在外部、免费沙箱只有14天
方式二:Docker 本地部署(推荐)
这是日常开发最常用的方式,通过 docker-compose.yml 文件可以清晰管理所有配置,也是本文的重点章节。
前置条件
# 检查 Docker 版本(需要 20.10+)
docker --version
# 检查 Docker Compose(需要 v2,即 docker compose 而非 docker-compose)
docker compose version
warning 内存要求
Weaviate 对内存较敏感。推荐至少 8GB 可用内存,如果同时启用本地模型推理容器,建议 16GB+。内存不足会导致容器 OOM 或性能严重下降。
最小化启动(无向量化模块)
如果你只是想快速体验 Weaviate,不需要自动向量化(自己传向量进去),可以用最简单的命令:
docker run -d \
--name weaviate \
-p 8080:8080 \
-p 50051:50051 \
semitechnologies/weaviate:1.29.0
note 端口说明
- 8080:HTTP REST API 端口
- 50051:gRPC 端口(v4 Python 客户端主要走这个,性能更好)
v4 版本的 Python 客户端默认使用 gRPC 通信,所以 50051 端口必须暴露,否则 Python 客户端连接会失败。
验证服务是否正常:
curl http://localhost:8080/v1/meta | python3 -m json.tool
看到类似这样的输出就表示 Weaviate 已经在运行了:
{
"hostname": "http://[::]:8080",
"modules": {},
"version": "1.29.0"
}
基础版(无外部模块)
# docker-compose.yml
version: '3.4'
services:
weaviate:
image: semitechnologies/weaviate:1.29.0
container_name: weaviate
restart: on-failure:0
ports:
- "8080:8080" # HTTP REST API
- "50051:50051" # gRPC(v4客户端必须)
volumes:
- weaviate_data:/var/lib/weaviate
environment:
# 允许匿名访问(开发环境)
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
# 数据持久化路径(容器内部路径)
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
# 默认查询返回条数
QUERY_DEFAULTS_LIMIT: 25
# 集群节点名称
CLUSTER_HOSTNAME: 'node1'
volumes:
weaviate_data:
完整版(含 text2vec-openai + generative-openai)
这是日常开发最常用的配置,启用了 OpenAI 的向量化和生成模块:
# docker-compose.yml(OpenAI 全栈方案)
version: '3.4'
services:
weaviate:
image: semitechnologies/weaviate:1.29.0
container_name: weaviate
restart: on-failure:0
ports:
- "8080:8080"
- "50051:50051"
volumes:
- weaviate_data:/var/lib/weaviate
environment:
# ===== 访问控制 =====
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
# ===== 数据存储 =====
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
# ===== 模块配置(核心!) =====
# 默认向量化模块
DEFAULT_VECTORIZER_MODULE: 'text2vec-openai'
# 启用的模块列表(逗号分隔,顺序无关)
ENABLE_MODULES: 'text2vec-openai,generative-openai'
# ===== OpenAI API Key =====
# 从环境变量读取,绝对不要硬编码!
OPENAI_APIKEY: ${OPENAI_API_KEY}
# ===== 查询配置 =====
QUERY_DEFAULTS_LIMIT: 25
CLUSTER_HOSTNAME: 'node1'
volumes:
weaviate_data:
warning API Key 安全提醒
绝对不要把 API Key 直接写进 docker-compose.yml 文件里!使用 ${OPENAI_API_KEY} 从环境变量读取,然后创建 .env 文件存放真实的 key,并把 .env 加入 .gitignore。
创建 .env 文件:
# .env 文件(务必加入 .gitignore!)
OPENAI_API_KEY=sk-your-actual-key-here
完全本地化方案(无外部 API)
不想依赖 OpenAI 等外部 API?可以用 text2vec-transformers 在本地跑开源嵌入模型,用 generative-ollama 在本地跑 LLM。这套组合完全不需要任何外部 API,适合数据合规要求高或网络受限的场景。
warning 资源要求较高
本地推理容器需要加载模型到内存。text2vec-transformers 需要约 1-2 GB 内存;Ollama 运行 7B 模型需要约 8 GB 内存(或显存)。建议至少 16 GB 内存的机器运行完整本地化方案。
# docker-compose.yml(完全本地化方案:text2vec-transformers + Ollama)
version: '3.4'
services:
weaviate:
image: semitechnologies/weaviate:1.29.0
container_name: weaviate
restart: on-failure:0
ports:
- "8080:8080"
- "50051:50051"
volumes:
- weaviate_data:/var/lib/weaviate
environment:
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
# ===== 本地向量化模块 =====
DEFAULT_VECTORIZER_MODULE: 'text2vec-transformers'
ENABLE_MODULES: 'text2vec-transformers,generative-ollama'
# ===== 推理服务地址 =====
# text2vec-transformers 推理服务
TRANSFORMERS_INFERENCE_API: 'http://t2v-transformers:8080'
# Ollama 服务地址
GENERATIVE_OLLAMA_APIENDPOINT: 'http://ollama:11434'
QUERY_DEFAULTS_LIMIT: 25
CLUSTER_HOSTNAME: 'node1'
# 声明服务启动顺序;此处未配置健康检查,不保证推理服务已经就绪
depends_on:
- t2v-transformers
- ollama
# 文本向量化推理服务(本地运行 Sentence-Transformers 模型)
t2v-transformers:
image: semitechnologies/transformers-inference:sentence-transformers-multi-qa-MiniLM-L6-cos-v1
container_name: t2v-transformers
environment:
# 如果有 GPU,改为 '1'
ENABLE_CUDA: '0'
# 推理服务不需要对外暴露,内部通信即可
# Ollama 本地 LLM 服务
ollama:
image: ollama/ollama:latest
container_name: ollama
ports:
- "11434:11434"
volumes:
- ollama_models:/root/.ollama
# 如果有 GPU,取消注释以下配置
# deploy:
# resources:
# reservations:
# devices:
# - driver: nvidia
# count: 1
# capabilities: [gpu]
volumes:
weaviate_data:
ollama_models:
启动后,还需要在 Ollama 里拉取要使用的 LLM 模型:
# 启动容器
docker compose up -d
# 等待 Ollama 就绪后拉取模型(约几分钟,取决于网速)
docker exec ollama ollama pull llama3.2
# 验证模型已就绪
docker exec ollama ollama list
Python 代码中使用本地化方案(先执行 import weaviate 和 from weaviate.classes.config import Configure,再执行 client = weaviate.connect_to_local();默认连接要求前述8080和50051端口映射可用,使用完毕后调用 client.close()):
client.collections.create(
"Article",
vectorizer_config=Configure.Vectorizer.text2vec_transformers(),
generative_config=Configure.Generative.ollama(
api_endpoint="http://ollama:11434",
model="llama3.2",
)
)
启动与管理命令
# 启动(后台运行)
docker compose up -d
# 查看日志
docker compose logs -f weaviate
# 查看运行状态
docker compose ps
# 停止(保留数据)
docker compose stop
# 停止并删除容器(数据 volume 保留)
docker compose down
# 彻底清除(包括数据!谨慎操作)
docker compose down -v
验证模块是否加载成功
curl http://localhost:8080/v1/meta | python3 -c "
import json, sys
data = json.load(sys.stdin)
print('Weaviate 版本:', data['version'])
print('已加载模块:', list(data.get('modules', {}).keys()))
"
期望输出:
Weaviate 版本: 1.29.0
已加载模块: ['text2vec-openai', 'generative-openai']
常见问题:端口冲突
如果 8080 或 50051 端口被占用:
# 检查端口占用
lsof -i :8080
lsof -i :50051
# 修改 docker-compose.yml 中的端口映射(宿主机端口:容器端口)
ports:
- "18080:8080" # 用 18080 替代 8080
- "50052:50051" # 用 50052 替代 50051
方式三:Kubernetes 生产集群
适用场景
Kubernetes 部署适合:
- 需要水平扩展(多副本,raft 一致性协议)
- 需要高可用(Pod 故障自动恢复)
- 需要与现有 K8s 集群集成
- 数据量超过单机承载能力(通常 > 50GB 向量数据)
前置条件
# 检查 kubectl
kubectl version --client
# 检查 Helm(需要 v3+)
helm version
# 添加 Weaviate Helm 仓库
helm repo add weaviate https://weaviate.github.io/weaviate-helm
helm repo update
# 查看可用版本
helm search repo weaviate/weaviate --versions | head -10
生产最低配置建议
| 资源 | 最低(单节点) | 推荐(3节点高可用) |
|---|---|---|
| CPU | 2 核 | 每节点 4 核 |
| 内存 | 8 GB | 每节点 16 GB |
| 存储 | 50 GB SSD | 每节点 200 GB SSD |
| 节点数 | 1 | 3(生产最低) |
基础 values.yaml(开发/测试)
# values.yaml - 开发/测试环境
# 副本数
replicas: 1
# Weaviate 镜像版本
image:
tag: "1.29.0"
# gRPC 服务(v4 客户端必须启用!)
grpc:
enabled: true
service:
type: LoadBalancer
# 存储配置
storage:
size: 32Gi
# 环境变量
env:
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: "true"
PERSISTENCE_DATA_PATH: "/var/lib/weaviate"
DEFAULT_VECTORIZER_MODULE: "text2vec-openai"
ENABLE_MODULES: "text2vec-openai,generative-openai"
QUERY_DEFAULTS_LIMIT: "25"
CLUSTER_HOSTNAME: "node1"
# 资源限制(根据实际需求调整)
resources:
requests:
cpu: "500m"
memory: "1Gi"
limits:
cpu: "2000m"
memory: "4Gi"
生产环境 values.yaml(多Pod示例,尚非完整高可用配置)
# values.yaml - 生产环境
# 生产环境建议至少 3 副本
replicas: 3
image:
tag: "1.29.0"
grpc:
enabled: true
service:
type: LoadBalancer
# 存储配置(生产环境建议 SSD StorageClass)
storage:
size: 200Gi
storageClassName: "premium-ssd" # 根据云服务商调整
# API Key 通过 K8s Secret 引用,不写在 values.yaml 明文里
envSecrets:
OPENAI_APIKEY: "weaviate-secrets/openai-api-key"
env:
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: "false"
PERSISTENCE_DATA_PATH: "/var/lib/weaviate"
DEFAULT_VECTORIZER_MODULE: "text2vec-openai"
ENABLE_MODULES: "text2vec-openai,generative-openai,reranker-cohere"
QUERY_DEFAULTS_LIMIT: "25"
# Raft 协议配置(多副本时必须设置,等于副本数)
RAFT_BOOTSTRAP_EXPECT: "3"
# 资源配置
resources:
requests:
cpu: "2000m"
memory: "8Gi"
limits:
cpu: "4000m"
memory: "16Gi"
# Pod 反亲和性:优先分布到不同的Kubernetes节点;preferred为软约束,不保证节点分散
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- weaviate
topologyKey: kubernetes.io/hostname
使用 Helm 部署
# 创建命名空间
kubectl create namespace weaviate
# 创建存放 API Key 的 Secret(不要用 values.yaml 明文存 Key)
kubectl create secret generic weaviate-secrets \
--from-literal=openai-api-key=sk-your-key-here \
--namespace weaviate
# 首次安装
helm install weaviate weaviate/weaviate \
--namespace weaviate \
--values values.yaml
# 查看部署状态(-w 持续监视)
kubectl get pods -n weaviate -w
# 等待所有 Pod 就绪
kubectl wait --for=condition=ready pod \
-l app=weaviate \
-n weaviate \
--timeout=300s
# 端口转发到本地测试
kubectl port-forward svc/weaviate 8080:80 -n weaviate &
kubectl port-forward svc/weaviate-grpc 50051:50051 -n weaviate &
# 测试连通性
curl http://localhost:8080/v1/meta
# 后续更新(修改 values.yaml 后执行)
helm upgrade weaviate weaviate/weaviate \
--namespace weaviate \
--values values.yaml
# 回滚到上一个版本
helm rollback weaviate -n weaviate
Python 客户端安装与连接
安装
pip install weaviate-client
warning v3 已废弃,必须使用 v4
Weaviate Python 客户端在 v4 版本做了破坏性变更,API 完全重写。网上很多教程和 Stack Overflow 答案还在用 v3 的写法,直接拷贝会报错。
最明显的区别:
- v3:
client = weaviate.Client("http://localhost:8080") - v4:
client = weaviate.connect_to_local()
如果你看到代码里出现 weaviate.Client(),那是 v3 的写法,不要用。
v3 vs v4 主要变化对照
| 功能 | v3 写法(废弃) | v4 写法(当前) |
|---|---|---|
| 连接本地 | weaviate.Client("http://localhost:8080") |
weaviate.connect_to_local() |
| 连接 WCS | weaviate.Client(url, auth_client_secret=...) |
weaviate.connect_to_weaviate_cloud(...) |
| 创建 Collection | client.schema.create_class({...}) |
client.collections.create(...) |
| 查询 | client.query.get(...).do() |
collection.query.near_text(...) |
| 插入数据 | client.data_object.create(...) |
collection.data.insert(...) |
| 关闭连接 | 无需显式关闭 | 必须 调用 client.close() |
三种连接方式
1. 连接本地 Docker(最常用)
import weaviate
# 连接本地 Docker(默认 localhost:8080 和 50051)
client = weaviate.connect_to_local()
# 如果本地使用了 OpenAI 模块,需要传入 API Key
client = weaviate.connect_to_local(
headers={
"X-OpenAI-Api-Key": "sk-your-key",
}
)
print(client.is_ready()) # True 表示连接成功
2. 连接 WCS 云服务
import weaviate
from weaviate.classes.init import Auth
import os
client = weaviate.connect_to_weaviate_cloud(
cluster_url=os.environ["WEAVIATE_URL"],
auth_credentials=Auth.api_key(os.environ["WEAVIATE_API_KEY"]),
headers={
"X-OpenAI-Api-Key": os.environ["OPENAI_API_KEY"],
}
)
print(client.is_ready())
3. 连接带认证的自托管实例
import weaviate
from weaviate.classes.init import Auth
# 自托管 Weaviate 启用了 API Key 认证
client = weaviate.connect_to_custom(
http_host="your-weaviate-host.com",
http_port=80,
http_secure=True, # 是否使用 HTTPS
grpc_host="your-weaviate-host.com",
grpc_port=50051,
grpc_secure=True, # 是否使用 gRPC TLS
auth_credentials=Auth.api_key("your-api-key"),
headers={
"X-OpenAI-Api-Key": "sk-your-key",
}
)
健康检查
import weaviate
client = weaviate.connect_to_local()
try:
# 基本就绪检查
if client.is_ready():
print("Weaviate 已就绪")
else:
print("Weaviate 未就绪,请检查服务状态")
# 获取版本和模块信息
meta = client.get_meta()
print(f"版本: {meta['version']}")
print(f"已加载模块: {list(meta.get('modules', {}).keys())}")
# 列出所有 Collections
collections = client.collections.list_all()
print(f"现有 Collections: {list(collections.keys())}")
finally:
# 必须关闭连接,否则可能导致资源泄漏
client.close()
tip 使用 with 语句自动关闭连接
with weaviate.connect_to_local() as client:
print(client.is_ready())
# 退出 with 块时自动调用 client.close()
模块启用配置
ENABLE_MODULES 格式
# 单个模块
ENABLE_MODULES: 'text2vec-openai'
# 多个模块(逗号分隔,注意不要有空格)
ENABLE_MODULES: 'text2vec-openai,generative-openai'
# 多模块单行写法(逗号分隔,不含空格或末尾逗号)
ENABLE_MODULES: 'text2vec-openai,text2vec-cohere,generative-openai,reranker-cohere'
warning 常见格式错误
ENABLE_MODULES 的值是逗号分隔的字符串,不是数组,不要写成 YAML 列表格式。
- 错误:
ENABLE_MODULES: [text2vec-openai, generative-openai] - 正确:
ENABLE_MODULES: 'text2vec-openai,generative-openai'
方案一:全 OpenAI 栈(最简单)
适合想快速跑通、不在意 API 费用的场景:
environment:
DEFAULT_VECTORIZER_MODULE: 'text2vec-openai'
ENABLE_MODULES: 'text2vec-openai,generative-openai'
OPENAI_APIKEY: ${OPENAI_API_KEY}
方案二:多模型混合栈
适合需要同时支持多个模型提供商的场景:
environment:
DEFAULT_VECTORIZER_MODULE: 'text2vec-openai'
ENABLE_MODULES: 'text2vec-openai,text2vec-cohere,generative-openai,generative-anthropic,reranker-cohere'
OPENAI_APIKEY: ${OPENAI_API_KEY}
COHERE_APIKEY: ${COHERE_API_KEY}
ANTHROPIC_APIKEY: ${ANTHROPIC_API_KEY}
方案三:完全本地化(text2vec-transformers + Ollama)
适合数据不出内网、或无法访问外部 API 的场景(完整 docker-compose 见完全本地化方案(无外部 API)):
environment:
DEFAULT_VECTORIZER_MODULE: 'text2vec-transformers'
ENABLE_MODULES: 'text2vec-transformers,generative-ollama'
TRANSFORMERS_INFERENCE_API: 'http://t2v-transformers:8080'
GENERATIVE_OLLAMA_APIENDPOINT: 'http://ollama:11434'
常用模块速查表
| 模块名称 | 类型 | 依赖 | 说明 |
|---|---|---|---|
text2vec-openai |
向量化 | OpenAI API Key | 使用 OpenAI Embeddings,最常用 |
text2vec-cohere |
向量化 | Cohere API Key | 多语言支持好,中文效果佳 |
text2vec-transformers |
向量化 | 本地推理容器 | 完全本地,无需外部 API |
text2vec-huggingface |
向量化 | HuggingFace API | 调用 HF 推理接口 |
multi2vec-clip |
向量化(多模态) | 本地推理容器 | 图文混合向量化 |
generative-openai |
生成 | OpenAI API Key | GPT 系列生成 |
generative-anthropic |
生成 | Anthropic API Key | Claude 系列生成 |
generative-ollama |
生成 | 本地 Ollama 服务 | 本地 LLM,完全离线 |
generative-cohere |
生成 | Cohere API Key | Command 系列生成 |
reranker-cohere |
重排序 | Cohere API Key | 提升搜索结果相关性 |
reranker-transformers |
重排序 | 本地推理容器 | 本地重排序模型 |
配置参数速查
核心环境变量
| 变量名 | 说明 | 默认值 | 示例 |
|---|---|---|---|
PERSISTENCE_DATA_PATH |
数据存储路径 | - | /var/lib/weaviate |
ENABLE_MODULES |
启用的模块(逗号分隔) | "" |
text2vec-openai,generative-openai |
DEFAULT_VECTORIZER_MODULE |
默认向量化模块 | none |
text2vec-openai |
QUERY_DEFAULTS_LIMIT |
默认查询条数 | 10 |
25 |
CLUSTER_HOSTNAME |
节点名称 | - | node1 |
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED |
允许匿名访问 | false |
true |
AUTHENTICATION_APIKEY_ENABLED |
启用 API Key 认证 | false |
true |
API Key 环境变量
| 变量名 | 对应模块 |
|---|---|
OPENAI_APIKEY |
text2vec-openai, generative-openai, qna-openai |
COHERE_APIKEY |
text2vec-cohere, generative-cohere, reranker-cohere |
HUGGINGFACE_APIKEY |
text2vec-huggingface |
ANTHROPIC_APIKEY |
generative-anthropic |
GOOGLE_APIKEY |
text2vec-palm, generative-palm |
性能调优参数
| 变量名 | 说明 | 建议值 |
|---|---|---|
QUERY_MAXIMUM_RESULTS |
单次查询最大返回数 | 10000 |
LIMIT_RESOURCES |
自动限制资源使用 | false(生产手动配置) |
DISK_USE_READONLY_PERCENTAGE |
磁盘使用率触发只读阈值 | 90 |
DISK_USE_WARNING_PERCENTAGE |
磁盘使用率警告阈值 | 80 |
版本与升级
版本命名规则
Weaviate 采用语义版本(Semantic Versioning):主版本.次版本.补丁版本,例如 v1.29.0。
当前处于 v1.x 系列,次版本(中间数字)的变更通常引入新特性,补丁版本只修 Bug。
重要版本里程碑
| 版本 | 关键特性 | 说明 |
|---|---|---|
| v1.24 | Named Vectors(命名向量) | 单个对象可以存储多个命名向量,支持多模态和多模型场景 |
| v1.25 | Async Indexing | 异步向量索引,写入性能大幅提升 |
| v1.26 | FROZEN Tenant | 多租户中租户支持冷冻(FROZEN)状态,降低低频租户的存储成本 |
| v1.27 | gRPC 稳定版 | gRPC 接口正式稳定,v4 Python 客户端全面切换 gRPC |
| v1.28 | RBAC 正式版 | 基于角色的访问控制(RBAC)正式 GA,企业级权限管理 |
| v1.29 | 性能优化 | HNSW 压缩率和查询延迟持续优化 |
note 使用 Named Vectors(v1.24+)前需确认版本
如果你打算使用 Named Vectors 特性(同一对象存多个向量),请确保 Weaviate 版本 >= v1.24。低版本不支持该特性且升级后结构不兼容,需要重新导入数据。
升级前必读
warning 升级高风险操作,务必备份
Weaviate 的向量索引(HNSW 图结构)和对象存储格式在主要版本间可能不兼容。升级前必须完整备份数据卷,并在测试环境验证升级可行性后再操作生产环境。
升级步骤(Docker Compose):
# 1. 备份数据卷
docker compose stop
docker run --rm \
-v weaviate_data:/data \
-v $(pwd)/backup:/backup \
alpine tar czf /backup/weaviate_data_$(date +%Y%m%d).tar.gz /data
echo "备份完成"
# 2. 修改 docker-compose.yml 中的镜像版本
# image: semitechnologies/weaviate:1.28.0 → semitechnologies/weaviate:1.29.0
# 3. 拉取新镜像并重启
docker compose pull
docker compose up -d
# 4. 验证版本和数据完整性
curl http://localhost:8080/v1/meta | python3 -c "import json,sys; print(json.load(sys.stdin)['version'])"
Kubernetes 滚动升级注意事项:
# 修改 values.yaml 中的 image.tag 后,执行滚动升级
helm upgrade weaviate weaviate/weaviate \
--namespace weaviate \
--values values.yaml \
--wait \
--timeout 10m
# 监控升级过程(滚动更新,Pod 逐个替换)
kubectl rollout status statefulset/weaviate -n weaviate
# 如果升级失败,立即回滚
helm rollback weaviate -n weaviate
tip 跨多个次版本升级
不建议跨越多个次版本直接升级(如从 v1.24 直接升到 v1.29)。建议逐个次版本升级,确保每步数据正常后再继续,特别是涉及存储格式变更的版本。
常见问题排查
问题一:Python 客户端连接超时
症状: weaviate.connect_to_local() 抛出超时异常
原因: 通常是 gRPC 端口 50051 没有暴露或被防火墙拦截
排查步骤:
# 1. 检查容器是否正常运行
docker compose ps
# 2. 检查端口是否监听
docker compose port weaviate 50051
# 3. 直接测试 REST API
curl http://localhost:8080/v1/.well-known/ready
# 4. 检查日志是否有错误
docker compose logs weaviate | grep -i error
解决方案: 确保 docker-compose.yml 里同时暴露了 8080 和 50051 两个端口。
问题二:模块加载失败
症状: 创建 Collection 时报 module not found 或 vectorizer not enabled
排查:
# 检查已加载的模块
curl http://localhost:8080/v1/meta | python3 -c "
import json, sys
data = json.load(sys.stdin)
print(json.dumps(data.get('modules', {}), indent=2))
"
解决方案: 检查 ENABLE_MODULES 环境变量是否正确设置,重启容器后重新检查。
问题三:OpenAI 向量化失败
症状: 插入数据时报 could not generate vector 或 401 错误
原因: OpenAI API Key 未正确传入 Weaviate
解决方案:
- 检查
.env文件中的 Key 是否正确 - 确认 docker-compose.yml 里有
OPENAI_APIKEY: ${OPENAI_API_KEY} - 重新执行
docker compose up -d - 或者在 Python 连接代码中通过
headers传入:
client = weaviate.connect_to_local(
headers={"X-OpenAI-Api-Key": "sk-your-key"}
)
问题四:数据重启后消失
症状: 重启容器后,之前写入的数据全都不见了
原因: 没有挂载数据卷(Volume)
解决方案: 在 docker-compose.yml 中添加:
services:
weaviate:
volumes:
- weaviate_data:/var/lib/weaviate
volumes:
weaviate_data:
问题五:内存不足(OOM)
症状: 容器频繁重启,docker compose logs 显示 OOM Killed
解决方案:
# 检查 Docker 分配给容器的内存上限
docker stats weaviate
# 在 Docker Desktop 设置中增加内存(建议 8GB+)
# 或者给 docker-compose.yml 添加内存限制(防止撑爆宿主机)
services:
weaviate:
deploy:
resources:
limits:
memory: 6G
reservations:
memory: 4G
问题六:Kubernetes Pod 一直 Pending
症状: kubectl get pods -n weaviate 显示 Pod 处于 Pending 状态
排查:
# 查看 Pod 详细事件(关键!通常错误信息都在 Events 里)
kubectl describe pod -l app=weaviate -n weaviate
# 常见原因:
# 1. 资源不足:requests 超过节点可用资源
# 2. PVC 无法绑定:StorageClass 不存在
# 3. 节点选择器不匹配
小结
安装 Weaviate 的关键不是"安装"本身,而是提前想清楚你要启用哪些模块。
- 本地开发:Docker Compose + 必要的模块,用
.env文件管理 API Key,两端口(8080/50051)都要暴露 - 完全本地化:
text2vec-transformers+generative-ollama,数据不出内网,代价是资源消耗更大 - 云端托管:Weaviate Cloud 免费沙箱,零运维,适合快速验证(14天有效期)
- 生产部署:Kubernetes + Helm,配合 K8s Secret 管理敏感信息;本文以 3 个 Pod 副本为配置示例,高可用还取决于数据复制、节点分布、认证和故障恢复配置,不能仅凭副本数保证
- 升级前必备份,跨次版本升级要逐步进行
下一步,用 Python v4 客户端构建第一个完整的 Weaviate 应用——从连接、建表、插入数据,到向量搜索、混合搜索,再到内置 RAG 问答,一气呵成。
相关文档: