コントで学ぶ、高性能ベクトルデータベースMilvusの導入と活用法


コントで学ぶ、高性能ベクトルデータベースMilvusの導入と活用法

milvus-io/milvus

2025-09-15

今日の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…じゃなかった、最高のシステムを開発してください!


milvus-io/milvus




エンタープライズRAG基盤 WeKnora:Go言語で構築する、高速・高信頼なLLM知識検索フレームワークの解剖

今回は、中国の巨大テック企業Tencentが公開している、文書理解・検索・質問応答のためのLLM(大規模言語モデル)活用フレームワーク「Tencent/WeKnora」について見ていきましょう。「え、また新しいLLMフレームワーク?もうお腹いっぱいだよ


「太陽光でタダ充電」を叶えるEVCCの仕組み:ソフトウェアエンジニアが解説する設定と互換性

ここでご紹介する evcc-io/evcc は、まさにその悩みを解決してくれる、ソフトウェアエンジニアから見て「これは使える!」と思える素晴らしいオープンソースプロジェクトです。evcc("Electric Vehicle Charge Controller"の略)は、電気自動車(EV)の充電を賢くコントロールするためのエネルギー管理システムです。


【エンジニア向け】Infisicalで秘密情報も体重もスマートに管理!

ダイエット中のエンジニアさん、お疲れ様です!食事制限、運動、そしてコード. .. 毎日やることがいっぱいですよね。でも、ちょっと待ってください!あなたのコードの中にも、ひっそりと隠れている「秘密」はありませんか?そう、APIキーとかデータベースのパスワードとか


メディアサーバーの決定版!bluenviron/mediamtxで君のプロジェクトにモジョを注入!

オースティン・パワーズだぜ!今回は君たちソフトウェアエンジニアの悩みを解決する、とびっきりクールなツールを紹介するぜ!その名も「bluenviron/mediamtx」!君たちのプロジェクトに、こう、なんていうか…「映像と音声のセクシーな魔法」をかけることができるんだ!この「mediamtx」は、まるで僕のモジョみたいに、あらゆる種類のメディアストリームを自由自在に操れる、まさに究極のメディアサーバー&プロキシなんだ!


NginxとGoで作る、お手軽ログイン機能

一言で言うと、Webアプリケーションに手軽にログイン画面を追加するためのツールです。通常、Webアプリをパスワードで保護しようとすると、ユーザー管理やセッション管理など、色々な処理を自分で実装する必要があります。これは結構な手間ですし、セキュリティを考慮すると慎重な設計が求められます。


牛丼一筋の心意気で学ぶ、Go言語とgRPCによる高速RPC通信

一言でいうと、「Go言語でサクッとマイクロサービスを構築するための、うまい、早い、安いRPCフレームワーク」です。RPC(Remote Procedure Call)とは、ネットワーク越しに別々のプログラムの関数を呼び出す仕組みのこと。簡単に言えば、サーバーの機能(関数)を、クライアントからまるで自分のプログラム内の関数のように呼び出せるようにしてくれる技術です。


ソフトウェアエンジニア必見!Cobraで実現するプロ級Go CLIツール

「コマンドの解析が面倒だ…」 「ヘルプメッセージをいちいち書くのが大変…」 「サブコマンドをうまく管理できない…」もう大丈夫です!そんな悩みとは今日でサヨナラ。 今回は、あなたの開発を劇的にラクにする、魔法のツール「Cobra」をご紹介します!


妹が教える!エンジニアのためのOllama活用術

ねえねえ、最近流行りの「Ollama」って知ってる?お兄ちゃんの好きそうな、めちゃくちゃ便利なツールなんだよ!Ollamaはね、お兄ちゃんのパソコンで、いろんなAIモデルを簡単に動かせるようにしてくれるすごーいツールなんだ!今までだと、AIモデルを使おうと思ったら、いろいろ難しそうな設定をしなきゃいけなかったり、パソコンの性能が足りなかったりしたんだけど、Ollamaを使えば、そんな心配はほとんどいらなくなるんだって!


【Go言語バックエンド】PocketBase:一杯入魂!高速開発を叶える秘密の屋台

PocketBaseは、例えるなら「一杯入魂のこだわりラーメン屋台」のような存在です。「一杯入魂」 これ一本で認証、データベース、ファイルストレージ、リアルタイム同期まで、バックエンドに必要な機能がギュッと凝縮されています。まるで、店主が一人で麺打ちからスープ作り、盛り付けまでこなすようなイメージです。


ソフトウェアエンジニアがChainlinkを導入するメリットとサンプルコード

さて、今回は「smartcontractkit/chainlink」について、ソフトウェアエンジニアの視点から、どういうときに役に立つのか、どうやって使うのか、といったことを、キャンプのコントを演じているつもりで、分かりやすく解説していきますね。