Ai

Milvus APIで作る業務自動化:実装サンプルと設計の勘所

社内に散らばる膨大なマニュアル、過去の契約書、そして日々蓄積される顧客との対話ログ。これらを「必要な時に、一瞬で、的確に見つけ出す」ことができたら、あなたの業務はどれほど劇的に変わるでしょうか。

従来のキーワード検索では、「言葉が一致しなければ見つからない」という大きな壁がありました。しかし、AI技術の進化により、言葉の意味や文脈を理解して情報を探し出す「ベクトル検索」が可能になりました。その中心に位置するのが、今回解説する**Milvus(ミルバス)**です。

Milvusは、世界で最も広く利用されているオープンソースのベクトルデータベースの一つです。これを活用することで、ChatGPTなどの生成AIに社内知識を組み込む「RAG(Retrieval-Augmented Generation)」システムを構築し、問い合わせ対応の自動化や資料作成の半自動化を実現できます。

この記事では、非エンジニアの方でも理解できるようにMilvusの仕組みを噛み砕きつつ、実務ですぐに使えるPythonによる実装サンプルと、失敗しないシステム設計の勘所を徹底解説します。

Milvusとは? AIのための「脳内図書館」

まず、Milvusが一体何なのか、専門用語を使わずにイメージしてみましょう。

従来のエクセルやデータベースは「整理されたロッカー」です。「A棚の3番」と指定すれば正確に取り出せますが、「なんとなく赤い表紙の本」や「売上アップについて書かれた資料」といった曖昧な指示では探せません。

一方、Milvusは「超優秀な司書がいる図書館」です。本の内容(意味)をすべて把握しており、「以前のプロジェクトでトラブルになった件に似た事例はある?」と聞けば、タイトルにその言葉が含まれていなくても、内容が近い資料を瞬時に持ってきてくれます。

なぜ「ベクトル」なのか?

ここで少しだけ技術的な話をします。コンピュータは本来、言葉の意味を理解できません。そこで、文章を「数値の列(ベクトル)」に変換します。

たとえば、「りんご」という単語を [0.1, 0.8, 0.5] という数字に変え、「みかん」を [0.2, 0.9, 0.4] に変えます。この数字が近ければ近いほど「意味が似ている」と判断する仕組みです。この数値変換を「エンベディング(埋め込み)」と呼びます。

Milvusは、この数値を何億個でも高速に保存・検索することに特化したデータベースです。

導入するビジネスメリット

Milvusを業務に導入することで、以下の3つの変革が起こります。

  1. 検索時間の短縮: 数万ページのPDFから、必要な回答をミリ秒単位で発見できます。
  2. 属人化の解消: ベテラン社員の頭の中にしかなかった「過去の類似事例」を、新入社員でも検索可能になります。
  3. AIの精度向上: 生成AIが社内データを参照できるようになり、「嘘をつく(ハルシネーション)」リスクを大幅に減らせます。

Milvus APIを活用した自動化の仕組み

ここからは、実際にMilvus APIを使ってどのようなシステムを作るのか、その全体像を解説します。もっとも一般的な用途である「社内ドキュメント検索ボット」を例にします。

システムの全体フロー

このシステムは大きく分けて2つのフェーズで動きます。

1. データの登録(準備)

社内ドキュメント(PDFやWord)を用意します。

OpenAIなどのAPIを使って、テキストをベクトル(数値)に変換します。

変換したベクトルをMilvusに保存します。

2. データの検索(利用)

ユーザーが質問を投げかけます(例:「交通費の申請方法は?」)。

質問文を同じくベクトルに変換します。

Milvus内で、質問のベクトルと最も近い(意味が似ている)ドキュメントを探し出します。

見つかった情報をChatGPTなどのLLM(大規模言語モデル)に渡し、回答を作成させます。

この一連の流れをプログラムで制御するのが、Milvus APIの役割です。

実践:Milvus APIによる実装サンプル

それでは、実際にPythonを使ったコードを見ながら、具体的な手順を解説します。ここでは、開発環境として非常に人気のあるPython用ライブラリ pymilvus を使用します。

プログラミングに詳しくない方も、「どのような指示をコンピュータに出しているか」という流れを掴んでください。

前提条件

Pythonがインストールされていること

Milvusのサーバーが稼働していること(初心者はクラウド版の「Zilliz Cloud」を使うのが最も手軽です。無料枠があります)

OpenAIのAPIキーなど、文章をベクトル化する手段があること

ステップ1:Milvusへの接続とコレクション作成

まずはデータベースへの接続です。Milvusではデータを格納する箱のことを「コレクション」と呼びます。エクセルでいう「シート」のようなものです。

Python

from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection

# 1. Milvusサーバーに接続
# ローカル環境の場合の例です。クラウド版の場合はuriとtokenを設定します。
connections.connect(
  alias="default", 
  host='localhost', 
  port='19530'
)

# 2. スキーマ(データの設計図)を定義
# id: データの管理番号
# embedding: ベクトルデータ(ここでは次元数を1536とします。OpenAIのモデル等に合わせます)
# text: 元のテキストデータ(検索結果として表示するため)

field1 = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True)
field2 = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1536)
field3 = FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=65535)

schema = CollectionSchema(fields=[field1, field2, field3], description="社内マニュアル検索用")

# 3. コレクション(箱)を作成
collection_name = "company_manuals"
collection = Collection(name=collection_name, schema=schema)

print(f"コレクション '{collection_name}' が作成されました。")

ここでのポイントは dim=1536 という部分です。これはベクトルの「次元数」を表しており、使用するAIモデル(OpenAIのtext-embedding-3-smallなど)によって決まっています。この数字が合っていないとエラーになるので注意が必要です。

ステップ2:データのベクトル化と登録(インサート)

次に、テキストデータをベクトルに変換してMilvusに入れます。ここでは簡略化のため、ダミーのベクトル生成関数を使いますが、実際にはOpenAIのAPIなどを使用します。

Python

import random

# ダミーのベクトル生成関数(実際はOpenAI APIなどを使用)
def get_embedding(text):
    # 本来はここでAIモデルにテキストを投げ、1536次元の数値リストを受け取ります
    return [random.random() for _ in range(1536)]

# 登録したいデータ
documents = [
    "交通費の精算は月末までに申請システムから行ってください。",
    "リモートワークの上限は週3回までです。事前申請が必要です。",
    "有給休暇はチャットツールで上長に連絡後、システム登録してください。"
]

# データを整形
data_embeddings = [get_embedding(doc) for doc in documents]
data_contents = documents

# データの挿入
# スキーマの定義順に合わせてリストを作成します
entities = [
    data_embeddings, # embeddingフィールドへ
    data_contents    # contentフィールドへ
]

insert_result = collection.insert(entities)
collection.flush() # データを永続化

print(f"{insert_result.insert_count} 件のデータを登録しました。")

ステップ3:インデックスの作成

データを入れただけでは、高速な検索はできません。図書館でいう「索引カード」を作る作業が必要です。これを「インデックス作成」と呼びます。

Python

# インデックスの設定
index_params = {
    "metric_type": "L2",       # 距離計算の方法(L2はユークリッド距離。意味の近さを測ります)
    "index_type": "IVF_FLAT",  # インデックスの種類(データ量や精度に応じて選びます)
    "params": {"nlist": 1024}
}

collection.create_index(
    field_name="embedding", 
    index_params=index_params
)

# コレクションをメモリにロード(検索準備完了)
collection.load()

ステップ4:ベクトル検索の実行

いよいよ検索です。「経費はどうやって申請する?」という質問を投げかけてみます。

Python

# ユーザーの質問
query = "経費はどうやって申請する?"
query_vector = get_embedding(query) # 質問文も同じルールでベクトル化します

# 検索実行
search_params = {
    "metric_type": "L2", 
    "params": {"nprobe": 10}
}

results = collection.search(
    data=[query_vector],       # 検索したいベクトル
    anns_field="embedding",    # 検索対象のフィールド
    param=search_params,
    limit=3,                   # 上位3件を取得
    output_fields=["content"]  # 結果として元のテキストも取得
)

# 結果の表示
print("=== 検索結果 ===")
for hits in results:
    for hit in hits:
        print(f"スコア(距離): {hit.distance}")
        print(f"内容: {hit.entity.get('content')}")
        print("---")

このプログラムを実行すると、「交通費の精算は…」というテキストが、質問文との意味的距離が近いものとして上位に表示されます。キーワードが完全に一致していなくてもヒットするのが最大の特徴です。

成功させるための「設計の勘所」

コードが動くことと、業務で使えるシステムになることは別問題です。ここからは、プロが現場で意識している「設計の勘所」を3つ紹介します。

1. チャンク(分割)戦略が命

長いドキュメントをそのまま1つのベクトルにしてはいけません。例えば、全100ページの就業規則を1つのベクトルにしてしまうと、細かい質問(例:「慶弔休暇の日数は?」)に対する検索精度が落ちます。

ドキュメントは、適切な長さ(例:500文字〜1000文字程度)に分割(チャンク化)してからMilvusに保存するのが鉄則です。

文脈が切れないように、前のチャンクと少し重複させて分割する「オーバーラップ」という手法も有効です。

2. メタデータの活用で検索を絞り込む

ベクトル検索は万能ではありません。時には「2024年以降の資料から探したい」「営業部の資料だけを見たい」という明確な条件指定が必要な場合があります。

Milvusでは、ベクトルと一緒に「日付」や「部署名」などのメタデータを保存できます。

検索時に expr=”department == ‘Sales'” のようなフィルタリング条件を加えることで、検索範囲を絞り込み、精度と速度を両立させることができます。これをハイブリッド検索と呼びます。

3. コストと精度のバランス

クラウド版のベクトルデータベースや、高性能なエンベディングモデル(OpenAIなど)は、利用量に応じてコストがかかります。

すべてのデータを最高精度で保存する必要があるかを検討してください。

頻繁に更新されないアーカイブデータは安価なストレージに置き、頻繁に検索されるデータだけをMilvusに置くといった階層化も、大規模システムでは重要な視点です。

実務への導入ステップ

いきなり全社のデータを投入するのはリスクが高いです。以下のステップで小さく始めることをお勧めします。

ステップ1:PoC(概念実証)

まずは無料枠のあるツールを使い、特定の部署(例:ヘルプデスク)のマニュアルだけでプロトタイプを作ります。

「本当に欲しい回答が返ってくるか」を確認します。

ステップ2:社内ハッカソン的な試用

少数のユーザーに使ってもらい、フィードバックを集めます。「検索結果が的外れ」という場合は、データの分割方法(チャンクサイズ)を見直す必要があります。

ステップ3:本番運用とデータ更新の自動化

ドキュメントが更新されたら、自動的にMilvus内のデータも更新されるパイプラインを構築します。ここが自動化されていないと、AIが古い情報を回答してしまい、信頼を失います。

注意点:セキュリティとプライバシー

業務利用する際、最も注意すべきはデータの取り扱いです。

機密情報(個人情報や社外秘データ)をベクトル化して外部のAPI(OpenAIなど)に送信する場合、そのデータがAIの学習に使われない設定になっているか必ず確認してください。

Milvus自体はデータを保存する金庫ですが、そこに至るまでの経路のセキュリティも重要です。オンプレミス(自社サーバー)での運用が可能な点も、Milvusが企業に選ばれる理由の一つです。

まとめ:検索の進化がビジネスを加速させる

Milvus APIを用いた業務自動化は、単なる「検索ツールの置き換え」ではありません。それは、社内に眠る膨大な「知」を、誰もがいつでも引き出せる状態にする「資産の再活用」です。

これまで資料探しに費やしていた時間は、創造的な業務や意思決定のための時間へと変わります。

最初は難しく感じるかもしれませんが、まずは小さなマニュアル一つから、ベクトル検索の世界に触れてみてください。その「一瞬で答えが見つかる」体験は、一度味わうと元には戻れないほどのインパクトをあなたの業務にもたらすはずです。

TOP