langchain结合云原生Milvus向量数据库问答实践指南

langchain结合云原生Milvus向量数据库问答实践指南

本文探索云原生向量数据库Milvus的安装和使用,使用Langchain和港大的Instruction-XL模型做本地数据的切分和转向量,为那些无法使用OpenAIEmbeddings、不想将数据外泄到境外的项目提供了一个示例。

Milvus架构和简介

langchain结合云原生Milvus向量数据库问答实践指南

是一个云原生向量数据库,主要开发语言是Go和Python。

langchain结合云原生Milvus向量数据库问答实践指南
支持文本、语音、图像等原始材料经过模型转换成向量后,都可以存储在Milvus中。

Windows MacOS和Ubuntu都可安装:

langchain结合云原生Milvus向量数据库问答实践指南

相关的效率工具

  • Milvus_CLI
    命令行工具

  • 界面:Attu 图形管理系统
    langchain结合云原生Milvus向量数据库问答实践指南

  • MilvusDM:用于导入和导出Milvus数据。

langchain结合云原生Milvus向量数据库问答实践指南

  • Milvus API: 在Milvus API之上封装了客户端库,可用于从应用程序代码以编程方式插入、删除和查询数据.

安装

Docker安装

Windows 上Docker安装,要选择Use WSL2
langchain结合云原生Milvus向量数据库问答实践指南
一键自动化安装完,登录即可

如果Windows上安装了WSL(Windows Ubuntu 子系统),终端cmd
langchain结合云原生Milvus向量数据库问答实践指南

Ubuntu和Mac上安装参考 Ubuntu和Mac Docker安装

后面如果想要在WSL中使用,需要在Windows中启动Docker Desktop。
在settings下General中,确保启用了wsl引擎。
langchain结合云原生Milvus向量数据库问答实践指南

启用前后,可以使用:docker compose version查看一下
langchain结合云原生Milvus向量数据库问答实践指南

安装Milvus

这里介绍在Windows子系统(Ubuntu)中使用Docker安装的步骤~

第一步:下载 docker-compose.yml
可以在终端上执行命令:

wget https://github.com/milvus-io/milvus/releases/download/v2.2.9/milvus-standalone-docker-compose.yml -O docker-compose.yml

或者创建docker-compose.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

  minio:
    container_name: milvus-minio
    image: minio/minio:RELEASE.2023-03-20T20-16-18Z
    environment:
      MINIO_ACCESS_KEY: minioadmin
      MINIO_SECRET_KEY: minioadmin
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data
    command: minio server /minio_data
    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.2.9
    command: ["milvus", "run", "standalone"]
    environment:
      ETCD_ENDPOINTS: etcd:2379
      MINIO_ADDRESS: minio:9000
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    ports:
      - "19530:19530"
      - "9091:9091"
    depends_on:
      - "etcd"
      - "minio"

networks:
  default:
    name: milvus(base)

上面我们使用 docker compose version 命令查看了版本号,

如果是v1,运行命令:

sudo docker-compose up -d

如果v2,运行命令:

sudo docker compose up -d

langchain结合云原生Milvus向量数据库问答实践指南
运行完:

langchain结合云原生Milvus向量数据库问答实践指南

可以检测一下是否启动了docker container:

sudo docker-compose ps

langchain结合云原生Milvus向量数据库问答实践指南
显然已经启动起来了。

关掉容器:

sudo docker-compose down

删除数据【慎用】:

sudo rm -rf volumes

执行后可就全没了啊~
langchain结合云原生Milvus向量数据库问答实践指南

langchain结合云原生Milvus向量数据库问答实践指南

如果关掉了容器,下次启动只需要找到我们compose-up.yaml文件目录,按照图中的命令执行一下即可(命令都在上文中)

langchain结合云原生Milvus向量数据库问答实践指南

langchain+Milvus实践

今天我们探索Python操作Milvus,将文本转换成向量并存储。

安装 pymilvus:

pip install pymilvus

这里我们使用港大最新的instruction-xl做文本embedding转换模型,而不是网上那么多教程都是使用CloseAI的:embeddings = OpenAIEmbeddings()。

此处的数据就直接使用了milvus介绍页的英文

from langchain.document_loaders import WebBaseLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Milvus

MILVUS_HOST = "localhost"
MILVUS_PORT = "19530"
# 数据加载器

# pip install bs4
loader = WebBaseLoader([
    "https://milvus.io/docs/overview.md",
])
docs = loader.load()
# 数据分割
text_splitter = CharacterTextSplitter(chunk_size=1024, chunk_overlap=0)
docs = text_splitter.split_documents(docs)

embedding模型选择

上面数据就分块好了,接下来我们看看如何用langchain本地转向量操作:这里我们不使用 OpenAIEmbeddings()。

  1. 普通 sentence embedding
from langchain.embeddings import HuggingFaceEmbeddings

# 为空,默认是 "sentence-transformers/all-mpnet-base-v2"
embeddings = HuggingFaceEmbeddings()
query_result = embeddings.embed_query(query)
  1. 指令类embedding
from langchain.embeddings import HuggingFaceInstructEmbeddings
# 默认是:"hkunlp/instructor-large"
embeddings = HuggingFaceInstructEmbeddings(
    model_name = "hkunlp/instructor-xl",
    embed_instruction = "Represent the document for retrieval: "
)

我们使用指令类embedding 将上面的docs文档,转换成embedding 向量, Milvus存储:

milvus_db = Milvus.from_documents(
    docs,
    embedding=embeddings,
    connection_args={"host": MILVUS_HOST, "port": MILVUS_PORT}
)

试试Milvus基于相似度的向量问答:

query = "What is milvus?"
smi_docs = milvus_db.similarity_search(query)

from pprint import pprint
pprint(smi_docs[0])
原创文章。转载请注明: 作者:JiangYuan 网址: https://www.icnma.com
Like (0)
JiangYuan管理
Previous 02/05/2024 13:09
Next 21/05/2024 22:43