一、Milvus特性
Milvus 是一个高性能的向量数据库。
- 高性能的向量检索
- 多种索引类型
- 支持多种数据类型
- 高可扩展性
- 灵活的查询支持
- 分布式架构
- 集成支持
- 跨平台支持
二、资源
三、基于 Docker Componse 的本地部署
yml
version: '3.5'
services:
etcd:
container_name: milvus-etcd
image: quay.io/coreos/etcd:v3.5.5
environment:
- ETCD_AUTO_COMPACTION_MODE=revision
- ETCD_AUTO_COMPACTION_RETENTION=1000
- ETCD_QUOTA_BACKEND_BYTES=4294967296
- ETCD_SNAPSHOT_COUNT=50000
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd
command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
healthcheck:
test: ["CMD", "etcdctl", "endpoint", "health"]
interval: 30s
timeout: 20s
retries: 3
minio:
container_name: milvus-minio
image: minio/minio:RELEASE.2023-03-20T20-16-18Z
environment:
MINIO_ACCESS_KEY: minioadmin
MINIO_SECRET_KEY: minioadmin
ports:
- "9001:9001"
- "9000:9000"
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data
command: minio server /minio_data --console-address ":9001"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
standalone:
container_name: milvus-standalone
image: milvusdb/milvus:v2.4.14
command: ["milvus", "run", "standalone"]
security_opt:
- seccomp:unconfined
environment:
ETCD_ENDPOINTS: etcd:2379
MINIO_ADDRESS: minio:9000
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
interval: 30s
start_period: 90s
timeout: 20s
retries: 3
ports:
- "19530:19530" # 这里可以改变推荐的端口
- "9091:9091"
depends_on:
- "etcd"
- "minio"
networks:
default:
name: milvus
Docker Compose 分为三个部分:
- etcd 分布式键值存储系统
- minio 高性能对象存储
- milvus-standalone 向量数据库核心(简化版)
然后使用 docker-compose up -d
启动服务。
四、API 访问
Milvus 提供 python 的 sdk 包 pymilvus,我们使用 python 访问客户端需要下载
sh
pip install pymilvus
poetry add pymilvus
下面是一个简单的示例:
py
from pymilvus import MilvusClient
# c = MilvusClient(uri="tcp://localhost:9530")
# c.create_collection(
# collection_name="demo_collection",
# dimension=384 # The vectors we will use in this demo has 384 dimensions
# )
c = MilvusClient(uri="http://localhost:9530")
print(c.list_collections())
print(c.list_users())
print(c.list_databases())
# output
# ['demo_collection']
# ['root']
# ['default']
这里我们就可以通过 python 的 sdk 操作 MilvusClient 了,但是明显作为一种数据库没有 GUI 并不完整。Milvus 数据库推荐 Attu。
五、Attu UI
Attu是一款一体化的 milvus 管理工具。
5.1) Attu 特性
- 数据库、集合和分区管理
- 向量嵌入的插入、索引和查询
- 执行矢量搜索
- 用户和角色管理
- 查看系统拓扑
5.2) 基于 Docker 安装
sh
docker run -p 8000:3000 -e MILVUS_URL={milvus server IP}:19530 zilliz/attu:v2.4
如果你是本地 localhost, 可以使用 ipconfig ipv 对应的本地地址
, 以下是登录界面。
有了准备工作我们就可以在 langchian 中使用 Milvus。
六、langchain 中使用 Milvus
sh
pip install langchain_milvus
# 如果是在 poetry 项目中
poetry add langchain_milvus
下面是一个例子, 为了更好的访问国内使用 zhipu 的 embedding-3
, 你可以根据自己的需求进行切换(openai , huggingface 等等)
py
import dotenv
from langchain_community.embeddings import ZhipuAIEmbeddings
from langchain_milvus import Milvus
from langchain_core.documents import Document
key = dotenv.get_key(".env", "OPENAI_API_KEY")
model_path = dotenv.get_key(".env", "LOCAL_EMBEDDING_NAME")
print(key, model_path)
embeddings = ZhipuAIEmbeddings(model="embedding-3",api_key=key)
URi = "http://localhost:9530"
def create_vector_store():
vector_store = Milvus(
embedding_function=embeddings,
connection_args={"uri": URi},
)
return vector_store
vector_store = create_vector_store()
vector_store_saved = Milvus.from_documents(
[Document(page_content="你好!")],
embeddings,
collection_name="langchain_example",
connection_args={"uri": URi},
)
使用 from_documents 方法和 embeddings 在 langchain_example 的 collection 中进行:
接下来我们使用 similarity_search 进行查询:
sh
vector_store_loaded = Milvus(
embeddings,
connection_args={"uri": URi},
collection_name="langchain_example",
)
results = vector_store_loaded.similarity_search(
"你好",
k=2,
)
print(results)
在 result 的结果中我们查到一条数据,符合预期。
七、小结
本文从 Milvus 的安装与本地部署出发,到 langchain 集成向量搜索。Milvus 本身提供了数据库服务。本文使用 Attu 作为 GUI 显示管理 Milvus 数据库.最后配合 zhipu embedding 模型做向量存储。