大模型应用开发 langchain 之 Milvus 向量数据库

一、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 模型做向量存储。

相关推荐
NineData2 小时前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师4 小时前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
全栈老石8 小时前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
倔强的石头_1 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
加号35 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏5 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker