大模型应用开发 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 模型做向量存储。

相关推荐
风哥2号12 分钟前
数据库教程FGMT52‑PostgreSQL用户权限与安全管理
数据库·postgresql
风哥2号6 小时前
数据库教程FGMT27‑MySQL数据库基础知识与体系架构
数据库·mysql
YangYang9YangYan7 小时前
2026 校招商品分析岗位 JD 拆解,核心指标、工具与面试考点
大数据·数据库·数据分析
西安栈上月明软件科技8 小时前
从业务黑话到本体图谱:OAG本体建模五步法(西安老系统AI化改造实战)
数据库·人工智能·架构
anxiao_m8 小时前
跨云跨机房大数据迁移怎么选?不同场景工具适配指南
数据库·云启快传
风哥2号10 小时前
数据库教程FGMT43‑MySQL性能分析与优化调整
数据库·mysql
随身数智备忘录11 小时前
财务数据分析如何与业务场景结合?财务数据分析如何从数出有据到数出有用?
数据库
这个DBA有点耶12 小时前
数据库教程:从零基础到实战的完整学习路径(2026版)
数据库·程序员·代码规范
forestsea13 小时前
从零构建 Java 智能体 RAG 系统:Milvus 向量数据库实战指南
java·数据库·milvus
probex_13 小时前
从 ByConity 到 VictoriaMetrics:一次指标数据迁移引发的四种存储对比
数据库