Milvusを接続する
Milvusは、大容量のベクトル検索に使用する外部ベクトルDBです。すでに組織でMilvusを運用している場合や、検索データが非常に多く、別のクラスターで管理したい場合に使用します。
Milvusを使用しても、元のファイルと文書のテキストはSpaceBuilderにそのまま残ります。Milvusには、検索に必要なベクトルと最小限の情報だけが保存されます。
始める前に
- 必要な権限:Workspace管理者と、Milvusのコレクションを管理する権限
- SpaceBuilderサーバーから、Milvusのエンドポイントにアクセスできる必要があります。
- 使用する埋め込みモデルの出力次元を確認します。
Milvusのインストール
SpaceBuilderは、Milvus 2.4以降のREST API(v2、デフォルトのポートは19530)を使用します。すべてのリクエストを/v2/vectordb/...のパスに送信するため、Milvus 2.3以前では動作しません。SpaceBuilderサーバーからこのポートで接続できるMilvusが必要です。すでに運用中のMilvusがある場合は、この節を飛ばしてコレクションを事前に作成するに進んでください。
Milvusには、単一サーバー向けのStandaloneと、大規模クラスター向けのDistributedの2つの方式があります。SpaceBuilderとの接続には、Standaloneで十分です。
準備
| 項目 | 内容 |
|---|---|
| サーバー | LinuxサーバーにDockerがインストールされている必要があります。MilvusはQdrantより重いため、SpaceBuilderとは別のサーバーに置くことを推奨します。 |
| メモリ | 最小8GB。ベクトルが100万個を超える場合は、16GB以上を推奨します。 |
| ディスク | データとログをあわせて保存するため、余裕を持って確保してください。SSDを推奨します。 |
| ポート | 19530(API)。SpaceBuilderはこのポートだけを使用します。9091は、状態の確認と管理画面用です。 |
実行
Milvusが提供するインストールスクリプトを使用すると、必要な構成要素を含む1つのコンテナで実行されます。
mkdir -p ~/milvus && cd ~/milvus
curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh
bash standalone_embed.sh start
- データは、スクリプトを実行したフォルダの下の
volumes/milvusに保存されます。このフォルダを削除すると、データが失われます。 - 停止または再開するときは、同じフォルダで
bash standalone_embed.sh stop/bash standalone_embed.sh startを実行します。 - 設定を変更するときは、同じフォルダに作成された
user.yamlを編集してから再起動します。
認証を有効にする
SpaceBuilderとは別のサーバーで運用する場合や、複数の人がアクセスできるネットワークの場合は、認証を有効にしてください。user.yamlに次の内容を追加して再起動します。
common:
security:
authorizationEnabled: true
認証を有効にすると、デフォルトのアカウントroot / パスワードMilvusで接続できます。デフォルトのパスワードは必ず変更し、SpaceBuilder専用のアカウントを別に作成することを推奨します。SpaceBuilderの接続設定には、APIキー(トークン、ユーザー名:パスワード形式)、またはユーザー名とパスワードを入力できます。両方を入力した場合は、APIキーが使用されます。
インストールの確認
curl http://localhost:9091/healthz
OKが返れば正常です。ブラウザーでhttp://<Milvusサーバーのアドレス>:9091/webui/を開くと、コレクションと状態を確認できる管理画面が表示されます(Milvus 2.5以降)。
運用のヒント
- ファイアウォール:SpaceBuilderサーバーだけが
19530ポートに接続できるように制限してください。9091は外部に公開しないでください。 - バックアップ:ベクトルは、元の資料から作り直せる派生データです。別途バックアップがなくても、SpaceBuilderの
既存の埋め込みを同期でベクトルDBにデータを入れ直すことができます。 - アップデート:Milvusのバージョンを上げるときは、Milvus公式のアップグレード案内に従ってください。マイナーバージョンが変わると、データの移行が必要になる場合があります。
コレクションを事前に作成する
Qdrantとは異なり、Milvusのコレクションは自動的には作成されません。 接続設定を保存する前に、次の構造でコレクションを先に作成する必要があります。
| フィールド | 型 | 説明 |
|---|---|---|
id | VARCHAR(64)、主キー | ベクトルID |
instance_namespace | VARCHAR(64) | インスタンス分離キー。インスタンス(個別にインストールして運用する1つのSpaceBuilder)ごとに異なる値です。 |
generation_id | VARCHAR(64) | インデックス作成の世代 |
chunk_id | INT64 | 文書チャンクの番号 |
space_flag | VARCHAR(16) | チームスペース(team)または個人スペース(client) |
owner_id | VARCHAR(64) | 所有者 |
source_path | VARCHAR | 元のファイルのパス |
text | VARCHAR | 検索結果に表示する文書チャンク |
vector | FLOAT_VECTOR | 埋め込みベクトル。次元は埋め込みモデルと同じにする必要があります。 |
vectorフィールドの次元(dim)は、SpaceBuilderに設定するベクトル次元数と同じにする必要があります。(bge-m3は1024)vectorフィールドのインデックスの距離計算方式(metric)は、COSINEにする必要があります。- SpaceBuilderは、
textを4,096文字で切って保存します。UTF-8ではハングルは1文字あたり3バイト、絵文字は4バイトであるため、max_lengthを16384(4,096文字 × 4バイト)以上にしておくと、どの文書チャンクも長さの制限にかかりません。 source_pathは、ファイルパスが長く、ハングルが混ざる場合があるため、4096程度に余裕を持って設定してください。
次は、MilvusのREST API(v2)でコレクションを作成するコマンドです。<Milvusサーバーのアドレス>、認証情報、コレクション名、dimの値は、環境に合わせて変更してください。
Authorizationには、<ユーザー名>:<パスワード>を指定するか、その位置にAPIキー(トークン)を指定します。- 認証を有効にしていない場合は、
Authorizationの行を削除してください。
curl -X POST "http://<Milvusサーバーのアドレス>:19530/v2/vectordb/collections/create" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <ユーザー名>:<パスワード>" \
-d '{
"collectionName": "setfn_knowledge_example",
"schema": {
"autoId": false,
"enableDynamicField": false,
"fields": [
{ "fieldName": "id", "dataType": "VarChar", "isPrimary": true, "elementTypeParams": { "max_length": 64 } },
{ "fieldName": "instance_namespace", "dataType": "VarChar", "elementTypeParams": { "max_length": 64 } },
{ "fieldName": "generation_id", "dataType": "VarChar", "elementTypeParams": { "max_length": 64 } },
{ "fieldName": "chunk_id", "dataType": "Int64" },
{ "fieldName": "space_flag", "dataType": "VarChar", "elementTypeParams": { "max_length": 16 } },
{ "fieldName": "owner_id", "dataType": "VarChar", "elementTypeParams": { "max_length": 64 } },
{ "fieldName": "source_path", "dataType": "VarChar", "elementTypeParams": { "max_length": 4096 } },
{ "fieldName": "text", "dataType": "VarChar", "elementTypeParams": { "max_length": 16384 } },
{ "fieldName": "vector", "dataType": "FloatVector", "elementTypeParams": { "dim": 1024 } }
]
},
"indexParams": [
{ "fieldName": "vector", "indexName": "vector", "metricType": "COSINE", "params": { "index_type": "AUTOINDEX" } }
]
}'
"code":0を含む応答が返れば、コレクションが作成されています。
接続設定
ナレッジストレージ画面のベクトルDB構成で、次のように入力して保存します。
| 項目 | 入力値 | 説明 |
|---|---|---|
| ドライバー | Milvus | 外部のMilvusサーバーを使用します。 |
| エンドポイント | http://<Milvusサーバーのアドレス>:19530 | http://を省略すると自動的に付加されます。空欄にするとhttp://localhost:19530を使用します。 |
| コレクション | 事前に作成したコレクションの名前 | インスタンスごとに異なる名前にすることを推奨します。画面には、このインスタンスの推奨名(setfn_knowledge_...)が表示されます。 |
| APIキー | Milvusのトークン | 認証を有効にしたMilvusにトークンで接続する場合にのみ入力します。保存済みの値はマスクされて表示され、変更しなければそのまま維持されます。空欄にして保存すると削除されます。 |
| ユーザー名 / パスワード | Milvusのアカウント | アカウント認証を使用する場合に入力します。パスワードは変更するときにのみ入力し、空欄にすると保存済みの値を維持します。 |
| ベクトル次元数 | コレクションのdimと同じ値 | 異なる場合、接続はできますが、インデックス作成が保存の段階で失敗します。 |
Milvusはサービス型のストレージであるため、データパスの入力欄は表示されません。保存すると、インデックススケジューラーが新しい設定を確認し、必要な場合は元の資料全体の再インデックスを自動的に開始します。
接続の確認
ベクトルDBの運用状況で状態を確認します。
| 項目 | 正常な場合 |
|---|---|
| 接続状態 | 接続済み |
| コレクション設定 | 正常(現在の設定と互換性あり) |
| 保存済みベクトル数 | インデックス作成の進行に伴って増えます。このインスタンスが保存したベクトルだけを数えます。 |
| コレクション数 | Milvusサーバーにあるすべてのコレクションの数です。 |
正常でない場合は、次の内容を確認してください。
| 表示 | 原因と対処 |
|---|---|
コレクションがありません・先に Milvus でコレクションを作成してください | コレクションをまだ作成していないか、名前が異なります。上記の構造でコレクションを作成するか、名前を合わせてください。 |
コレクション設定の確認が必要 + collection dimension is ..., expected ... | コレクションの次元と、設定したベクトル次元数が異なります。次元が一致する新しいコレクションを作成して指定してください。 |
コレクション設定の確認が必要 + collection metric must be COSINE | vectorインデックスのmetricがCOSINEではありません。インデックスをCOSINEで作り直してください。 |