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

相关推荐
了一li1 小时前
Qt中的QProcess与Boost.Interprocess:实现多进程编程
服务器·数据库·qt
码农君莫笑1 小时前
信管通低代码信息管理系统应用平台
linux·数据库·windows·低代码·c#·.net·visual studio
别致的影分身2 小时前
使用C语言连接MySQL
数据库·mysql
京东零售技术3 小时前
“慢”增长时代的企业数据体系建设:超越数据中台
数据库
sdaxue.com3 小时前
帝国CMS:如何去掉帝国CMS登录界面的认证码登录
数据库·github·网站·帝国cms·认证码
o(╥﹏╥)4 小时前
linux(ubuntu )卡死怎么强制重启
linux·数据库·ubuntu·系统安全
阿里嘎多学长4 小时前
docker怎么部署高斯数据库
运维·数据库·docker·容器
Yuan_o_4 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
Sunyanhui15 小时前
牛客网 SQL36查找后排序
数据库·sql·mysql
老王笔记5 小时前
MHA binlog server
数据库·mysql