Weaviate on Ubuntu — AIネイティブベクターデータベースの構築

データベース

この記事のポイント

  • Weaviate はテキスト・画像をベクトルとして保存し「意味の近さ」で検索できるAIネイティブなベクターデータベースで、RAGやセマンティック検索のバックエンドに最適です
  • Ubuntu + Docker で docker run するだけで起動でき、起動直後のメモリはわずか30.2MiB・起動は2.56秒(いずれも実測)と非常に軽量です
  • Collection を作ると、指定しなくても hnsw ベクトルインデックスと BM25 全文検索(b=0.75, k1=1.2)が自動で有効になります(実応答で確認)
  • REST API・GraphQL・Python クライアント(v4)の3通りで操作でき、オブジェクト登録からベクトル検索まで本記事で実際に動かして解説します

「RAGを自分で動かしてみたいけど、ベクターデータベースって難しそう…」と感じていませんか?

Weaviate(ウィービエイト)は、AI時代のアプリケーション開発を念頭に設計されたオープンソースのベクターデータベースです。テキストや画像をベクトル(数値の配列)として保存し、「完全一致」ではなく「意味の近さ」で検索できるのが特徴です。LLMと組み合わせたRAG(Retrieval-Augmented Generation)の「知識源」として特に注目されています。

結論から言うと、Ubuntu に Docker さえ入っていれば docker run 一発で起動できます。本記事では実際に Ubuntu 環境で Weaviate 1.25.1 を Docker で起動し、Collection の作成・オブジェクト登録・ベクトル検索まで手を動かして取得した本物のAPI応答をそのまま載せます。

動作確認済み環境

Ubuntu 24.04.4 LTS(Noble Numbat)/ Docker 公式イメージ / Weaviate 1.25.1(cr.weaviate.io/semitechnologies/weaviate:1.25.1)/ 2026-06-14 実行。前提パッケージのバージョンは Docker 公式の ubuntu:24.04 イメージで実測した値です。

目次

Weaviate とは何か

Weaviate は、Weaviate B.V. が開発するオープンソースのベクターデータベースです。従来のリレーショナルデータベースが「完全一致」で検索するのに対し、ベクターデータベースは「意味の近さ」で検索します。

具体例を挙げると、「大きな犬」 というテキストで検索したとき、「巨大なシェパード」 というデータも候補として見つかります。これが「セマンティック検索」と呼ばれる仕組みです。本記事の後半では、実際にベクトルを登録して意味の近いものほどスコアが高くなる様子を実測値で確認します。

Weaviate の主な特徴は次のとおりです。

機能 概要 用途例
ベクトルインデックス(HNSW) 高速な近傍検索アルゴリズム セマンティック検索・類似画像検索
BM25 全文検索 従来のキーワード検索も内蔵 ハイブリッド検索(BM25+ベクトル)
REST API / GraphQL 言語を問わず扱いやすい あらゆるスタックからのアクセス
マルチモーダル対応 テキスト・画像・動画を統合管理 画像検索・RAG・推薦システム
モジュールシステム OpenAI/Cohere/HuggingFace等と連携 自動ベクトル化・LLM統合RAG

特に最近注目されているのが、LLM(大規模言語モデル)と組み合わせたRAG(Retrieval-Augmented Generation)への活用です。Weaviate に自社のドキュメントを登録しておき、ユーザーの質問に関連する情報を取り出してから LLM に回答させる仕組みを、比較的簡単に構築できます。

前提:Docker のインストール

Weaviate の最もかんたんな起動方法は Docker です。まず Ubuntu に Docker をインストールしておきましょう。なお、Weaviate 構築で使う前提パッケージのバージョンは、Ubuntu のリリースによって少し変わります。ubuntu:22.04ubuntu:24.04 の公式イメージで apt-cache policy を実際に叩いて比較したのが次の図です。

Weaviate構築の前提パッケージ apt バージョン比較(Ubuntu 22.04 vs 24.04・実測)
Weaviate構築の前提パッケージ apt バージョン比較(Ubuntu 22.04 vs 24.04・実測)

注目したいのは python3curl です。Ubuntu 22.04 は python3 3.10.6 / curl 7.81.0、24.04 は python3 3.12.3 / curl 8.5.0 でした。後述する weaviate-client の v4 系は新しめの Python と相性が良いので、これから始めるなら 24.04 がおすすめです。docker.io 自体は両 LTS とも 29.1.3 で同じでした。




ubuntu@linuxlab: ~
$ sudo apt update && sudo apt install -y docker.io
$ sudo systemctl enable –now docker
$ sudo usermod -aG docker $USER
# ログアウト→再ログイン後、グループが反映されます
$ docker –version
Docker version 29.1.3, build …

注意

sudo usermod -aG docker $USER を実行したら、一度ターミナルを閉じて再ログインしてください。再ログインしないと、sudo なしで docker コマンドを実行できません。ここは正直、忘れがちなポイントです。

Weaviate を起動する(docker run)

まず手軽に試すなら、docker run 一発で起動できます。本記事で実測した環境でも、この方法で Weaviate 1.25.1 を起動しました。




ubuntu@linuxlab: ~
$ docker run -d \
–name weaviate \
-p 8080:8080 \
-p 50051:50051 \
-e AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true \
-e PERSISTENCE_DATA_PATH=/var/lib/weaviate \
-e DEFAULT_VECTORIZER_MODULE=none \
-e CLUSTER_HOSTNAME=node1 \
cr.weaviate.io/semitechnologies/weaviate:1.25.1
1f9b260c89891dbf6873bd339cf6fca1685dddf9a48ad8f1aa16574c829854bb

オプションの意味を簡単に説明します。

  • -p 8080:8080:REST API/GraphQL のポート。ブラウザや curl でアクセスします
  • -p 50051:50051:gRPC のポート。Python クライアント(v4)が使います
  • AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true:認証なしでアクセス可(開発用)
  • DEFAULT_VECTORIZER_MODULE=none:ベクトル化モジュールなし(自分でベクトルを渡す)

実際に起動して計測すると、docker restart から /v1/.well-known/ready が HTTP 200 を返すまで わずか2.56秒でした。さらに起動直後のメモリ使用量は docker stats 実測で 30.2MiB。下の実測サマリのとおり、想像以上に軽量です。

Weaviate 1.25.1 起動コストの実測サマリ(起動2.56秒・メモリ30.2MiB)
Weaviate 1.25.1 起動コストの実測サマリ(起動2.56秒・メモリ30.2MiB)
著者アイコン
著者アイコン

実際に docker stats で見て驚きました。30MiB台って、もはや常駐していることを忘れるレベルの軽さです。モジュールなし構成なら、メモリ1GBの一番安いVPSでも普通に動かせます。

Docker Compose でより本格的に動かす

データを永続化したり、設定を管理しやすくするには Docker Compose を使うのがお勧めです。docker-compose.yml を作成しましょう。




ubuntu@linuxlab: ~
$ mkdir ~/weaviate && cd ~/weaviate
$ nano docker-compose.yml

以下の内容を貼り付けてください。




docker-compose.yml
services:
weaviate:
image: cr.weaviate.io/semitechnologies/weaviate:1.25.1
ports:
– “8080: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’
DEFAULT_VECTORIZER_MODULE: ‘none’
CLUSTER_HOSTNAME: ‘node1’
volumes:
weaviate_data:



ubuntu@linuxlab: ~/weaviate
$ docker compose up -d
[+] Running 2/2
✔ Volume “weaviate_weaviate_data” Created
✔ Container weaviate-weaviate-1 Started
$ docker compose ps
NAME IMAGE STATUS PORTS
weaviate-weaviate-1 weaviate:1.25.1 running 0.0.0.0:8080->8080/tcp

docker compose up -d で起動後、データは weaviate_data というボリュームに永続化されます。コンテナを停止・再起動してもデータは消えません。なお、最近の Compose では version: 行は不要(無視されます)なので省略しています。

起動確認と API ヘルスチェック

Weaviate が正常に起動しているか、API で確認します。下が実際に叩いた curl の出力です。

Weaviate 1.25.1 の起動とヘルスチェック実測(ready・/v1/meta・/v1/nodes)
Weaviate 1.25.1 の起動とヘルスチェック実測(ready・/v1/meta・/v1/nodes)



ubuntu@linuxlab: ~
$ curl -s http://localhost:8080/v1/.well-known/ready && echo “Ready!”
Ready!
$ curl -s http://localhost:8080/v1/meta
{“hostname”:”http://[::]:8080″,”modules”:{},”version”:”1.25.1″}
$ curl -s http://localhost:8080/v1/nodes | python3 -m json.tool
{
“nodes”: [{
“name”: “node1”,
“status”: “HEALTHY”,
“version”: “1.25.1”,
“gitHash”: “2fc82d0”,
“batchStats”: {“queueLength”: 0, “ratePerSecond”: 0}
}]
}

/v1/.well-known/ready が HTTP 200 を返せば起動完了です。/v1/meta でバージョン(1.25.1modules は空=モジュールなし構成)、/v1/nodes でノードの "status": "HEALTHY"(gitHash 2fc82d0)が確認できれば問題ありません。

Weaviate には Grafana のような管理ダッシュボードはありませんが、REST API はブラウザからもそのまま確認できます。http://localhost:8080/v1/meta を開くと、次のように JSON がそのまま表示されます。

ブラウザで /v1/meta を開いた実画面(version 1.25.1 を表示)
ブラウザで /v1/meta を開いた実画面(version 1.25.1 を表示)

Collection(クラス)を作成する

Weaviate では「Collection(コレクション)」がデータの器になります。RDBのテーブルに相当するものです。REST API の POST /v1/schema でかんたんに作成できます。




ubuntu@linuxlab: ~
$ curl -s -X POST http://localhost:8080/v1/schema \
-H ‘Content-Type: application/json’ \
-d ‘{
“class”: “Article”,
“description”: “技術記事コレクション”,
“vectorizer”: “none”,
“properties”: [
{“name”: “title”, “dataType”: [“text”]},
{“name”: “content”, “dataType”: [“text”]},
{“name”: “url”, “dataType”: [“text”]}
]
}’
# → HTTP 200。レスポンスに自動付与された設定が返ります

面白いのはここからです。こちらが指定したのは vectorizer: "none" とプロパティ3つだけなのに、レスポンスを見ると明示していない設定が自動で付与されています。下の図は実際の応答(と /v1/schema の取得結果)から抜き出したものです。

Collection作成とスキーマ確認(hnsw・BM25が自動有効・実測)
Collection作成とスキーマ確認(hnsw・BM25が自動有効・実測)

具体的には、デフォルトで vectorIndexType: "hnsw"(距離関数 cosinemaxConnections: 64efConstruction: 128)と、BM25 全文検索(k1: 1.2, b: 0.75)が有効になっていました。これは実際に API を叩いて確認した値です。つまり何も設定しなくても、ベクトル検索とキーワード検索の両方がすぐ使える状態になります。

ブラウザで http://localhost:8080/v1/schema を開くと、作成した Collection のスキーマ全体を確認できます。

ブラウザで /v1/schema を開いた実画面(Article コレクションの hnsw・bm25 設定)
ブラウザで /v1/schema を開いた実画面(Article コレクションの hnsw・bm25 設定)

オブジェクトを追加する

Collection が作成できたら、オブジェクトを追加してみましょう。vectorizer: "none" の場合、ベクトルは自分で用意して渡します。ここでは動作確認用に5次元のダミーベクトルを付けて、3件登録しました。




ubuntu@linuxlab: ~
$ curl -s -X POST http://localhost:8080/v1/objects \
-H ‘Content-Type: application/json’ \
-d ‘{
“class”: “Article”,
“properties”: {
“title”: “UbuntuにDockerをインストールする方法”,
“content”: “apt install docker.io でDockerを使えるようになります”,
“url”: “https://linuxlab.jp/docker-install”
},
“vector”: [0.1, 0.2, 0.3, 0.4, 0.5]
}’
{“id”:”ad2e4387-ccb0-4c52-bea3-86ed13ed05c2″,”class”:”Article”,…}
# → HTTP 200。生成された UUID が返ってきます(実測)

同じ要領で「Weaviateでベクトル検索を試す」「Nginxでリバースプロキシを構築する」の2件も登録しました。3件とも HTTP 200 で、それぞれ UUID が払い出されています。

注意

本番環境では vector に適切な埋め込みモデルが生成した高次元ベクトルを使います。上の例は動作確認用の5次元ダミーです。実際には text-embedding-3-small(OpenAI)や all-MiniLM-L6-v2(HuggingFace)などのモデルを使い、通常は384〜1536次元のベクトルを渡します。

①ベクトル検索(nearVector)

登録したベクトルと意味的に近いオブジェクトを探します。GraphQL の nearVector クエリを使います。




ubuntu@linuxlab: ~
$ curl -s -X POST http://localhost:8080/v1/graphql \
-H ‘Content-Type: application/json’ \
-d ‘{“query”: “{ Get { Article(
nearVector: {vector: [0.1,0.2,0.3,0.4,0.5]} limit: 3
) { title _additional { certainty distance } } } }”}’

結果がこちらです。クエリと同じベクトルを持つ1位は certainty 0.99999994(ほぼ1.0)。意図的にベクトルを離した「Nginx」の記事は certainty 0.60679 まで下がり、関連する記事(0.9995)とくっきり差がつきました。これがベクトル検索の「意味の近さがスコアに出る」という挙動です。

nearVector検索の certainty 実測値(意味の近さがスコアに反映される)
nearVector検索の certainty 実測値(意味の近さがスコアに反映される)

②BM25 全文検索(bm25)

通常のキーワード検索も内蔵されています。ベクトルなしでも利用できます。




ubuntu@linuxlab: ~
$ curl -s -X POST http://localhost:8080/v1/graphql \
-H ‘Content-Type: application/json’ \
-d ‘{“query”: “{ Get { Article(bm25: {query: \”Docker Ubuntu\”}) { title _additional { score } } } }”}’
{“data”:{“Get”:{“Article”:[
{“title”:”UbuntuにDockerをインストールする方法”,”_additional”:{“score”:”0.35408998″}}
]}}}

キーワード "Docker Ubuntu" では、タイトルと本文の両方に該当語を含む「Docker インストール」記事が score 0.35408998 でヒットしました。ベクトル検索とBM25を組み合わせた「ハイブリッド検索」hybrid オペレーターで1クエリで実現でき、これが Weaviate の強みのひとつです。

Python クライアントで操作する

実際のアプリケーション開発では Python クライアントを使うのが一般的です。

手順1:weaviate-client をインストールする




ubuntu@linuxlab: ~
$ sudo apt install -y python3-pip
$ pip3 install “weaviate-client>=4.0”
Successfully installed weaviate-client-4.x grpcio httpx …

注意

weaviate-client は v4 系(現行)と v3 系で API が大きく変わっています。ネット上のサンプルコードが v3 対応の場合は動かないことがあります。pip3 install "weaviate-client>=4.0" で v4 を明示して入れるのが安全です。v4 は gRPC(ポート 50051)も使うため、docker run-p 50051:50051 を開けておくのを忘れないでください。

手順2:接続・Collection 操作




weaviate_demo.py
import weaviate
import weaviate.classes as wvc

# ローカルの Weaviate に接続(REST 8080 + gRPC 50051)
client = weaviate.connect_to_local()

# Collection 作成
articles = client.collections.create(
name=”Article”,
vectorizer_config=wvc.config.Configure.Vectorizer.none()
)

# オブジェクト追加
articles.data.insert(
properties={“title”: “Ubuntu入門ガイド”},
vector=[0.1, 0.2, 0.3, 0.4, 0.5]
)

# ベクトル検索
result = articles.query.near_vector(
near_vector=[0.1, 0.2, 0.3, 0.4, 0.5],
limit=3
)
for obj in result.objects:
print(obj.properties[“title”])

client.close()

v4 クライアントは weaviate.connect_to_local() でローカルの Weaviate(localhost:8080 + gRPC 50051)に自動接続します。先ほど curl でやった操作が、そのまま Python のメソッド呼び出しで書けるイメージです。

よくあるエラーと解決策

①「port is already allocated」— ポート 8080 が使われている




ubuntu@linuxlab: ~
docker: Error response from daemon: driver failed programming external
connectivity on endpoint weaviate: Bind for 0.0.0.0:8080 failed:
port is already allocated.
$ sudo lsof -i :8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 123 www 6u IPv4 12345 0t0 TCP *:http-alt (LISTEN)
# 別のポート(例: 8090)に変更して起動
$ docker run -d -p 8090:8080 -p 50061:50051 … weaviate:1.25.1

これは筆者も実際に踏みました。すでに別のコンテナが 8080 を使っていると、上のように port is already allocated で起動に失敗します。ホスト側のポートを -p 8090:8080 のように空いている番号へ変えれば回避できます。

②「connection refused」— Weaviate がまだ起動していない

curl http://localhost:8080/v1/metaConnection refused が出るのは、コンテナ起動直後でサービスの準備ができていない場合です。今回の実測では Ready まで約2.56秒でした。次のように ready が200を返すまで待つと確実です。




ubuntu@linuxlab: ~
# /.well-known/ready が 200 を返すまで待機
$ until curl -s http://localhost:8080/v1/.well-known/ready; do sleep 0.5; done && echo “Ready!”
Ready!

③「class already exists」— Collection が重複している




ubuntu@linuxlab: ~
{“error”:[{“message”:”could not add class: class name \”Article\” already exists”}]}
# 既存の Collection を削除してから再作成
$ curl -s -X DELETE http://localhost:8080/v1/schema/Article
# レスポンスなし(200 OK)= 削除成功

まとめ

Weaviate on Ubuntu のセットアップと基本操作を、実際に動かしながら確認しました。

  • docker run 一発で起動でき、起動は2.56秒・起動直後メモリは30.2MiB(いずれも実測)と非常に軽量
  • /v1/.well-known/ready が200を返せば起動完了。/v1/nodes で status は HEALTHY を確認
  • Collection 作成は POST /v1/schema で即完了。指定しなくても hnsw と BM25(k1=1.2, b=0.75)が自動で有効
  • nearVector の certainty は、関連記事0.9995に対し無関係な記事は0.607まで下がり、意味の近さがスコアに明確に出た
  • Python クライアント(v4・weaviate-client 4.0以上)を使えばシンプルなコードで同じ操作ができる
  • RAG・セマンティック検索・ハイブリッド検索のバックエンドとして活用できる

次のステップとして、OpenAI の埋め込みモデルや Ollama(ローカルLLM)と組み合わせてみると、Weaviate の真の威力を実感できます。

VPSで本番運用するなら

  • モジュールなし構成なら30MiB台と軽量なので、メモリ1GBのVPSでも学習・検証には十分。埋め込みモジュールを載せる本番では4GB以上が安心です
  • 東京リージョン対応の Vultr は $5/月〜(1vCPU / 1GB)から選べます
  • RAGアプリを公開するならリバースプロキシ(nginx)と SSL の設定も必須です

Weaviate を動かすVPSの選び方は (VPS比較記事)もあわせてご覧ください。

コメント

タイトルとURLをコピーしました