如何開始使用 Milvus
如何開始使用 Milvus
最後更新於 2025 年 1 月
隨著大型語言模型(Large Language Models, LLMs) 的進步以及資料量的不斷增加,我們需要一個靈活且可擴充的基礎架構來儲存大量的資訊,例如資料庫。然而,傳統資料庫的設計是用來儲存表格和結構化資料,而對於利用精密 LLM 和資訊檢索演算法的威力來說,通常有用的資訊都是非結構化的,例如文字、影像、視訊或音訊。
向量資料庫是專為非結構化資料設計的資料庫系統。我們不僅可以使用向量資料庫儲存大量的非結構化資料,也可以使用向量資料庫執行向量搜尋。向量資料庫擁有先進的索引方法,例如反向檔案索引 (IVFFlat) 或階層式導航小世界(HNSW),可執行快速有效的向量搜尋與資訊檢索程序。
Milvus是一個開放原始碼的向量資料庫,我們可以利用向量資料庫所提供的所有有利功能。以下是本篇文章的內容:
Milvus 是什麼?
Milvus是 一個開放原始碼的向量資料庫,讓我們能夠儲存大量非結構化資料,並在這些資料上執行快速有效的向量搜尋。Milvus 對於許多流行的 GenAI 應用程式非常有用,例如推薦系統、個人化聊天機器人、異常偵測、圖像搜尋、自然語言處理和retrieval augmented generation(RAG)。
使用 Milvus 作為向量資料庫可獲得多項優勢:
Milvus 提供多種部署選項,您可以依據您的使用情況和想要建立的應用程式大小來選擇。
Milvus 支援多樣化的索引方法,以滿足各種資料和效能需求,包括 FLAT、IVFFlat、HNSW 和SCANN 等記憶體內選項、可提高記憶體效率的量化變體、適用於大型資料集的磁碟上DANN,以及 GPU 最佳化索引,例如 GPU_CAGRA、GPU_IVF_FLAT 和 GPU_IVF_PQ,以進行加速、提高記憶體效率的搜尋。
Milvus 也提供混合搜尋功能,在向量搜尋作業中,我們可以結合使用密集嵌入、稀疏嵌入以及元資料篩選,進而獲得更精確的檢索結果。此外,Milvus 2.5現在支援混合全文檢索與向量檢索,讓您的檢索更加精準。
Milvus 可透過Zilliz Cloud 在雲端上完全使用,由於具有邏輯集群、串流與歷史資料分解、分層儲存、自動擴充與多租戶冷熱分離等四項進階功能,您可以優化其作業成本與向量搜尋速度。
使用 Milvus 作為向量資料庫時,您可以選擇三種不同的部署選項,每種選項都有其優點和好處。我們將在下一節逐一介紹。
Milvus 部署選項
我們可以從四個部署選項中選擇開始使用 Milvus:Milvus Lite、Milvus Standalone、Milvus Distributed 和 Zilliz Cloud (managed Milvus)。每個部署選項的設計都是為了滿足我們使用案例中的各種情況,例如我們的資料大小、應用程式的目的以及應用程式的規模。
Milvus Lite
Milvus Lite是 Milvus 的輕量級版本,也是我們最容易上手的方式。在下一節中,我們會看到如何實際執行 Milvus Lite,而要開始使用 Milvus Lite,我們只需要用 pip 安裝 Pymilvus 函式庫。之後,我們就可以執行 Milvus 作為向量資料庫的大部分核心功能。
Milvus Lite 非常適合做為快速原型或學習用途,而且可以在 Jupyter 記事本中執行,不需要任何複雜的設定。在向量儲存方面,Milvus Lite 適合儲存大約一百萬個向量嵌入。由於 Milvus Lite 具備輕量的特性與儲存容量,因此是與邊緣裝置合作的最佳部署選擇,例如私人文件搜尋引擎、裝置上的物件偵測等。
Milvus Standalone
Milvus Standalone 是包裝在 Docker 映像檔中的單機伺服器部署。因此,我們只需要在 Docker 中安裝 Milvus,然後啟動 Docker 容器即可開始使用。我們也會在下一節看到 Milvus Standalone 的詳細實作。
Milvus Standalone 是建立和生產中小規模應用程式的理想選擇,因為它能夠儲存高達 10M 的向量嵌入。此外,Milvus Standalone 透過主備份模式提供高可用性,使其在生產就緒的應用程式中使用時具有高度可靠性。
我們也可以使用 Milvus Standalone,例如,在使用 Milvus Lite 執行快速原型和學習 Milvus 功能之後,因為 Milvus Standalone 和 Milvus Lite 共享相同的客戶端 API。
分散式 Milvus
Milvus Distributed 是一個利用雲端架構的部署選項,資料擷取和資料擷取分開處理,讓應用程式具有高度擴充性和效率。
若要執行 Milvus Distributed,我們通常需要使用 Kubernetes 叢集,讓容器可以在多台機器和環境上執行。Kubernetes 集群的應用確保了 Milvus Distributed 的可擴展性和靈活性,可根據需求和工作量自訂分配的資源。這也代表如果其中一部分發生故障,其他部分可以接手處理,確保整個系統不中斷。
Milvus Distributed 可處理高達數百億個向量嵌入,專為資料過大而無法儲存在單一伺服器機器的使用個案而設計。因此,此部署選項非常適合服務大量使用者的企業用戶端。
圖:不同 Milvus 部署選項的向量嵌入儲存能力。
在這篇文章中,我們將教您如何開始使用 Milvus Lite 和 Milvus Standalone,因為這兩種方法都可以快速上手,不需要複雜的設定。然而,Milvus Distributed 的設定則比較複雜。一旦我們設定好 Milvus Distributed,建立集合、擷取資料、執行向量搜尋等的程式碼和邏輯流程,都與 Milvus Lite 和 Milvus Standalone 相似,因為它們共用相同的用戶端 API。
除了上述三種部署方式外,您也可以在Zilliz Cloud上嘗試管理式 Milvus,以獲得無憂的使用體驗。我們也會在本文稍後談到 Zilliz Cloud。
開始使用 Milvus Lite
Milvus Lite 可以直接使用 Python 來實作,方法是使用 pip 匯入一個叫做 Pymilvus 的函式庫。在安裝 Pymilvus 之前,請確保您的環境符合下列需求:
Ubuntu >= 20.04 (x86_64 和 arm64)
MacOS >= 11.0 (Apple Silicon M1/M2 和 x86_64)
Python 3.7 或更新版本
滿足這些需求後,您可以使用下列指令安裝 Milvus Lite 和必要的相依性來進行示範:
!pip install -U pymilvus
!pip install "pymilvus[model]"
!pip install -U pymilvus
:此指令會安裝或升級pymilvus
函式庫,也就是 Milvus 的 Python SDK。Milvus Lite 和 PyMilvus 是捆綁在一起的,所以只需要這一行代碼就可以安裝 Milvus Lite。!pip install "pymilvus[model]"
:此指令可增加 Milvus 預先整合的進階功能和額外工具,包括像 Hugging Face Transformers、Jina AI embedding models 和 reranking models 等機器學習模型。
以下是我們使用 Milvus Lite 的步驟:
使用嵌入模型將文字資料轉換成它們的嵌入表示。
在 Milvus 資料庫中建立一個模式,以儲存文字資料及其嵌入表示法。
在我們的模式中儲存和索引我們的資料。
在儲存的資料上執行簡單的向量搜尋。
圖:向量搜尋作業的工作流程。
為了將文字資料轉換成向量嵌入,我們會使用 SentenceTransformers 的嵌入模型「all-MiniLM-L6-v2」。這個嵌入模型會將我們的文字轉換成 384 維向量嵌入。讓我們載入模型,轉換我們的文字資料,然後將所有內容打包在一起。
from pymilvus import model
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England.",
]
sentence_transformer_ef = model.dense.SentenceTransformerEmbeddingFunction(
model_name='all-MiniLM-L6-v2',
device='cpu'
)
vectors = sentence_transformer_ef.encode_documents(docs)
data = [ {"id": i, "vector": vectors[i], "text": docs[i]} for i in range(len(vectors)) ]
接下來,讓我們建立一個模式,將上面所有的資料儲存在 Milvus 中。如上所示,我們的資料包含三個欄位:ID、向量和文字。因此,我們將以這三個欄位建立一個模式。
from pymilvus import MilvusClient, DataType, db, connections
schema = MilvusClient.create_schema(
auto_id=False,
enable_dynamic_field=True,
)
# Add fields to schema
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=384)
schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=512)
使用 Milvus Lite,我們只需要幾行程式碼,就可以輕鬆地根據上面定義的模式,在特定的資料庫上建立一個集合,以及將資料插入到集合中並建立索引。
client = MilvusClient("./milvus_demo.db")
index_params = client.prepare_index_params()
# Add indexes
index_params.add_index(
field_name="vector",
index_type="AUTOINDEX",
metric_type="COSINE"
)
# Create collection
client.create_collection(
collection_name="demo_collection",
schema=schema,
index_params=index_params
)
# Insert data into collection
res = client.insert(
collection_name="demo_collection",
data=data
)
在上面的程式碼中,我們在一個名為「milvus_demo」的 Milvus 資料庫中建立一個名為「demo_collection」的集合。接下來,我們將所有資料索引到剛剛建立的「demo_collection」中。
現在我們已將資料儲存在資料庫中,我們可以針對任何指定的查詢對這些資料執行向量搜尋。比方說,我們有一個查詢:「誰是 Alan Turing?我們可以透過執行下列步驟來取得查詢的最適當答案:
使用將資料庫中的資料轉換成嵌入式的相同嵌入式模型,將我們的查詢轉換成向量嵌入式。
使用余弦相似度或歐氏距離等指標,計算我們的查詢嵌入與資料庫中每個項目的嵌入之間的相似度。
擷取最相似的項目,作為我們查詢的適當答案。
以下是使用 Milvus 實作的上述步驟:
query = ["Who is Alan Turing"]
query_embedding = sentence_transformer_ef.encode_queries(query)
# Load collection
client.load_collection(
collection_name="demo_collection"
)
# Vector search
res = client.search(
collection_name="demo_collection",
data=query_embedding,
limit=1,
output_fields=["text"],
)
print(res)
"""
Output:
data: ["[{'id': 1, 'distance': 0.7199002504348755, 'entity': {'text': 'Alan Turing was the first person to conduct substantial research in AI.'}}]"]
"""
就是這樣!您也可以在Milvus 文件中了解更多關於Milvus 提供的其他功能,例如管理資料庫、插入和刪除集合、選擇合適的索引方法,以及使用元資料過濾和混合搜尋進行更先進的向量搜尋。
開始使用 Milvus Standalone
Milvus Standalone 是一種部署選項,其中所有東西都打包在 Docker 容器中。因此,我們需要在 Docker 中安裝 Milvus,然後啟動 Docker 容器來開始使用 Milvus Standalone。
在安裝 Milvus Standalone 之前,請確定您的硬體和軟體都符合本頁面所述的需求。此外,請確認已經安裝 Docker。若要安裝 Docker,請參閱此頁面。
一旦我們的系統符合要求,並且安裝了 Docker,我們就可以使用下列指令在 Docker 中安裝 Milvus:
# Download the installation script
$ curl -sfL <https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh> -o standalone_embed.sh
# Start the Docker container
$ bash standalone_embed.sh start
在上面的程式碼中,我們也啟動了 Docker 容器,一旦它被啟動,您會得到類似下面的輸出:
圖:成功啟動 Docker 容器後的訊息。
執行上面的安裝腳本「standalone_embed.sh」之後,一個名為「milvus」的 Docker 容器就在 19530 連接埠啟動了。因此,我們只要在建立連線時指向這個連接埠,就可以建立新的資料庫,以及存取所有與 Milvus 資料庫相關的東西。
比方說,我們要建立一個名為 "milvus_demo" 的資料庫,類似於上面在 Milvus Lite 所做的。我們可以如下進行:
conn = connections.connect(host="127.0.0.1", port=19530)
database = db.create_database("milvus_demo")
client = MilvusClient(
uri="<http://localhost:19530>",
token="root:Milvus",
db_name="milvus_demo"
)
接下來,您可以通過訪問 MilvusWeb UI 來驗證新創建的名為 "milvus_demo "的資料庫是否真正存在於您的 Milvus 實例中。顧名思義,Milvus Web UI 是 Milvus 提供的圖形化用戶介面,用來觀察組件的統計和度量,檢查資料庫、集合和配置的列表和細節。您可以在啟動上述 Docker 容器後存取 Milvus Web UI,網址是 http://127.0.0.1:9091/webui/。
如果您存取上述連結,您會看到像這樣的登陸頁面:
在「Collections」標籤下,您會看到我們的「milvus_demo」資料庫已成功建立。如您所見,您也可以使用此 Web UI 檢查其他事項,例如集合清單、組態、執行過的查詢等。
現在,我們可以完全按照上面 Milvus Lite 章節中的方法來執行一切。讓我們在 "milvus_demo 「資料庫內建立一個名為 」demo_collection "的資料集,這個資料集由三個欄位組成,與我們之前在 Milvus Lite 部分所建立的一樣。然後,我們要將我們的資料插入這個集合。
index_params = client.prepare_index_params()
# Add indexes
index_params.add_index(
field_name="vector",
index_type="AUTOINDEX",
metric_type="COSINE"
)
# Create collection
client.create_collection(
collection_name="demo_collection",
schema=schema,
index_params=index_params
)
# Insert data into collection
res = client.insert(
collection_name="demo_collection",
data=data
)
執行向量搜尋作業的程式碼也和 Milvus Lite 相同,您可以在下面的程式碼中看到:
query = ["Who is Alan Turing"]
query_embedding = sentence_transformer_ef.encode_queries(query)
# Load collection
client.load_collection(
collection_name="demo_collection"
)
# Vector search
res = client.search(
collection_name="demo_collection",
data=query_embedding,
limit=1,
output_fields=["text"],
)
print(res)
"""
Output:
data: ["[{'id': 1, 'distance': 0.7199004292488098, 'entity': {'text': 'Alan Turing was the first person to conduct substantial research in AI.'}}]"]
"""
除了使用 Docker,您也可以搭配Docker Compose(適用於 Linux) 和Docker Desktop(適用於 Windows) 來使用 Milvus Standalone。
當我們不再使用 Milvus 實例時,我們可以使用下列指令停止 Milvus Standalone:
$ bash standalone_embed.sh stop
完全管理 Milvus
另一個開始使用 Milvus 的方法是透過Zilliz Cloud 的原生雲端基礎架構,您可以獲得無後顧之憂且速度快 10 倍的體驗。
Zilliz Cloud 提供具有專用環境和資源的專用集群,以支援您的 AI 應用程式。由於它是建構在 Milvus 上的雲端資料庫,我們不需要設定和管理本機基礎架構。Zilliz Cloud 也提供更先進的功能,例如向量儲存與計算之間的分離、資料備份到 S3 等常用物件儲存系統,以及資料快取以加速向量搜尋與檢索作業。
然而,在考慮雲端服務時,有一點需要考慮的是運作成本。在大多數情況下,即使集群閒置,沒有資料擷取或向量搜尋活動,我們仍需要付費。如果您想要進一步優化應用程式的作業成本與效能,Zilliz Cloud Serverless 將會是一個絕佳的選擇。
圖:使用 Zilliz Cloud Serverless 的主要優點。
Zilliz Cloud Serverless 可在 AWS、Azure 和 GCP 等主要雲供應商上使用。它提供隨用隨付定價等功能,意即您只需在使用集群時付費。
Zilliz Cloud Serverless 還實現了先進的技術,例如邏輯集群、自動擴充、分層儲存、串流與歷史資料的分解,以及冷熱資料分離。與記憶體內的 Milvus 相比,這些功能可讓 Zilliz Cloud Serverless 節省高達 50 倍的成本,並使向量搜尋作業的速度提升約 10 倍。
圖:分層儲存與冷熱資料分離的說明。
如果您想開始使用 Zilliz Cloud Serverless,請查看此頁面以瞭解更多資訊。
總結
Milvus 是一款多功能且功能強大的向量資料庫,專為因應現代人工智慧應用程式中管理非結構化資料與執行快速、有效率向量搜尋作業的挑戰而設計。Milvus 提供多種部署選項,例如適用於快速原型設計的 Milvus Lite、適用於中小型應用程式的 Milvus Standalone,以及適用於企業級擴充能力的 Milvus Distributed,可靈活配合任何專案的規模與複雜性。
此外,Zilliz Cloud Serverless 將 Milvus 的功能延伸至雲端,並提供符合成本效益的隨用隨付模式,讓您不再需要本機基礎架構。Zilliz Cloud Serverless 具備分層儲存與自動擴充等先進功能,可確保更快速的向量搜尋作業,同時優化成本。
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word