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

相关推荐
Javatutouhouduan1 分钟前
SQL优化从入门到精通!
java·数据库·mysql·sql优化·java面试·后端开发·java程序员
jnrjian3 分钟前
restore archivelog RAC thread from sequence logseq
服务器·数据库
小草儿7994 分钟前
PG18之插件使用大全(简单用例)
数据库
Elastic 中国社区官方博客4 分钟前
从 Elasticsearch runtime fields 到 ES|QL:将传统工具适配到当前技术
大数据·数据库·sql·elasticsearch·搜索引擎·全文检索
刘晨鑫15 分钟前
MySQL主从复制与读写分离
数据库·mysql·adb
ClouGence8 分钟前
数据迁移同步工具 CloudCanal-v5.5.0.0 发布,支持 RETL(定时扫描同步)
数据库·mysql·postgresql·oracle·sqlserver·kafka·etl
DomDanrtsey9 分钟前
oracle与tidb时间格式化函数不兼容简述
数据库·oracle·tidb
Yvonne爱编码13 分钟前
数据库---Day4 数据表的操作
数据库
杨云龙UP14 分钟前
Linux环境下Oracle RMAN全量、增量备份与定时任务实践_20260331
linux·运维·服务器·数据库·oracle
Yvonne爱编码16 分钟前
数据库---Day5 数据表的增删改查
数据库