コントで学ぶ、高性能ベクトルデータベースMilvusの導入と活用法
今日のBBQの主役は、milvus-io/milvus、通称「ミルバス」!
「ミルバスって、なんか難しそう…」って思いましたか?
大丈夫!
BBQに例えれば、ミルバスは「最高の焼き加減を自動で見つけてくれるスマートBBQグリル」みたいなものなんです。
BBQで例えると、ミルバスは「大量の食材(データ)」の中から、「最高の焼き加減の肉(類似するデータ)」を、超高速で、しかも自動で探してくれる、そんなすごいやつなんです。
具体的には、こんな風に役立ちます!
似ている画像や動画を超高速で探す!
例
「このBBQの画像に似ている画像を全部見つけて!」って言われたら、ミルバスがサッと探してくれます。
まるで、「この肉と同じくらい美味しい肉、全部持ってきて!」って言った時に、最高の肉だけを持ってきてくれる、そんな感じです。
自然言語処理(NLP)で似た文章を探す!
例
「BBQのレシピ」に関する文章を大量に持っている時に、「最高のBBQソースのレシピ」に関する文章を、ミルバスが超高速で探してくれます。
まるで、「このBBQソースに似た、最高のソースのレシピを全部見つけて!」って言った時に、一瞬で探してくれる、そんな感じです。
ユーザーにおすすめ商品を提案する!
例
「このBBQセットを買ったお客さんにおすすめのBBQグッズは?」って聞かれたら、ミルバスが「このBBQセットと似ている、他のBBQセット」を見つけて、そこからおすすめを提案してくれます。
まるで、「このお客さんが好きそうなBBQグッズ、全部持ってきて!」って言われた時に、最高の組み合わせを提案してくれる、そんな感じです。
さあ、ミルバスという最高のBBQグリルを、あなたのBBQに導入してみましょう!
今回は、docker-composeという、BBQで言うところの「火起こしセット」を使って、ミルバスを動かしてみましょう。
まずは、以下の内容でdocker-compose.yamlファイルを作成します。
version: '3.5'
services:
etcd:
image: quay.io/coreos/etcd:v3.5.0
command: etcd -listen-client-urls http://0.0.0.0:2379 -advertise-client-urls http://etcd:2379
ports:
- "2379:2379"
restart: always
minio:
image: minio/minio:latest
ports:
- "9000:9000"
command: minio server /data
environment:
MINIO_ACCESS_KEY: minioadmin
MINIO_SECRET_KEY: minioadmin
restart: always
milvus:
image: milvusdb/milvus:v2.2.0
ports:
- "19530:19530"
environment:
MINIO_ADDRESS: minio:9000
ETCD_ADDRESS: etcd:2379
restart: always
ターミナルで、先ほどのファイルがある場所で、以下のコマンドを実行します。
docker-compose up -d
このコマンドで、ミルバスが動き出します!
これで、あなたのPCの中に、最高のBBQグリル「ミルバス」が立ち上がりました!
あとは、Go言語を使って、このグリルにBBQの食材(データ)を入れて、最高の焼き加減(類似データ)を探してもらいましょう!
さあ、いよいよBBQパーティーの始まりです!
まずは、go.modファイルを作成して、ミルバスのGoクライアントをインストールします。
go mod init mybbq
go get github.com/milvus-io/milvus-sdk-go/v2
そして、以下のGo言語のコードを書いて、BBQパーティーを始めましょう!
このコードは、ミルバスにBBQのデータを入れて、その中から似たデータを探す例です。
package main
import (
"context"
"fmt"
"log"
"github.com/milvus-io/milvus-sdk-go/v2/client"
"github.com/milvus-io/milvus-sdk-go/v2/entity"
)
func main() {
// 1. BBQグリル(ミルバス)に接続!
c, err := client.NewClient(context.Background(), "localhost:19530")
if err != nil {
log.Fatal(err)
}
// 2. BBQのコレクション(肉のカテゴリ)を作成
collectionName := "bbq_collection"
// ベクトルデータのスキーマを定義
schema := &entity.Collection{
Name: collectionName,
Fields: []*entity.Field{
{
Name: "id",
DataType: entity.FieldTypeInt64,
IsPrimaryKey: true,
AutoID: true,
},
{
Name: "bbq_name",
DataType: entity.FieldTypeVarChar,
TypeParams: map[string]string{"max_length": "256"},
},
{
Name: "bbq_vector",
DataType: entity.FieldTypeFloatVector,
TypeParams: map[string]string{"dim": "4"}, // ベクトルの次元
},
},
}
err = c.CreateCollection(context.Background(), schema, false)
if err != nil {
log.Fatal(err)
}
// 3. BBQの食材(データ)をグリル(ミルバス)に入れる
data := []entity.Column{
entity.NewColumnVarChar("bbq_name", []string{"焼肉", "串焼き", "海鮮焼き", "野菜焼き"}),
entity.NewColumnFloatVector("bbq_vector", 4, [][]float32{{1.0, 2.0, 3.0, 4.0}, {1.1, 2.1, 3.1, 4.1}, {5.0, 6.0, 7.0, 8.0}, {9.0, 10.0, 11.0, 12.0}}),
}
_, err = c.Insert(context.Background(), collectionName, "", data...)
if err != nil {
log.Fatal(err)
}
// 4. グリルをロードする(BBQ開始!)
err = c.LoadCollection(context.Background(), collectionName, false)
if err != nil {
log.Fatal(err)
}
// 5. 似た食材(データ)を探す!
queryVector := []float32{1.1, 2.1, 3.1, 4.1} // 「串焼き」と似た食材を探す
searchResult, err := c.Search(context.Background(), collectionName, []string{}, []string{}, []entity.Vector{{Dim: 4, Data: []float32{1.1, 2.1, 3.1, 4.1}}}, "bbq_vector", entity.L2, 2)
if err != nil {
log.Fatal(err)
}
// 結果を表示
for _, sr := range searchResult {
fmt.Printf("最も似ているBBQ食材は: %s (距離: %f)\n", sr.GetFields()[0].String(), sr.Distance)
}
}
このコードを実行すると、
最も似ているBBQ食材は: 串焼き (距離: 0.000000)
最も似ているBBQ食材は: 焼肉 (距離: 0.040000)
こんな感じで、指定したベクトルに似ているデータを超高速で探してくれます!
これで、あなたもBBQマスター!じゃなかった、ミルバスエンジニア!
さあ、ミルバスを使って、最高のBBQ…じゃなかった、最高のシステムを開発してください!