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

相关推荐
煎饼小狗5 分钟前
Redis五大基本类型——Zset有序集合命令详解(命令用法详解+思维导图详解)
数据库·redis·缓存
永乐春秋22 分钟前
WEB-通用漏洞&SQL注入&CTF&二次&堆叠&DNS带外
数据库·sql
打鱼又晒网1 小时前
【MySQL】数据库精细化讲解:内置函数知识穿透与深度学习解析
数据库·mysql
大白要努力!1 小时前
android 使用SQLiteOpenHelper 如何优化数据库的性能
android·数据库·oracle
tatasix2 小时前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。2 小时前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了2 小时前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度2 小时前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮2 小时前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9993 小时前
Etcd 框架
数据库·etcd