Milvus简介

Milvus是一款开源的向量数据库,由 Zilliz 开发并维护,适合用于机器学习和人工智能领域。是一款专为处理向量查询而设计的数据库,Milvus 能够对万亿级向量进行索引。
Milvus官网:https://milvus.io/
Milvus中文文档:https://www.milvus-io.com/

Milvus部署

环境准备

  • Linux操作系统
  • Docker 19.03 或更高版本
  • Docker Compose 1.25.1 或更高版本

检查Docker是否安装成功

运行以下命令,检查Docker是否安装成功,安装成功显示版本信息

docker version

运行以下命令,检查Docker Compose是否安装成功,安装成功显示安装的版本信息

docker-compose --version

安装Docker

未安装Docker可以按照以下命令安装,以下命令为Ubuntu系统环境命令

更新系统包

sudo apt update
sudo apt upgrade -y

安装依赖包

安装一些必要的系统工具和依赖,以便使用HTTPS源进行软件包安装:

sudo apt install apt-transport-https ca-certificates curl software-properties-common

添加Docker官方GPG密钥

Docker的官方GPG密钥用于验证Docker软件包的来源。

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# root账号使用以下命令
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

更新软件包列表并安装Docker

再次更新软件包列表,然后安装Docker CE(Community Edition):

sudo apt update
sudo apt-get install docker-ce docker-ce-cli containerd.io -y

启动Docker服务并设置开机启动

安装完成后,启动Docker服务并设置为开机启动:

sudo systemctl start docker
sudo systemctl enable docker

验证Docker安装

通过运行一个测试容器来验证Docker是否正确安装:

docker run hello-world

如果安装成功,您将看到一条欢迎消息,表明Docker已成功安装并运行了一个测试镜像。

以上步骤完成之后,就已经在Ubuntu Linux系统上成功安装了Docker。

(可选)配置Docker加速器

如果在中国大陆地区,为了加速Docker镜像的下载,可以考虑配置Docker的镜像加速器,如阿里云的镜像加速服务。

登录阿里云账号,找到容器镜像服务
镜像工具->镜像加速器,根据操作文档,配置镜像加速器

安装Docker Compose

未安装Docker Compose的可以按照以下命令安装

下载Docker Compose

使用curl命令下载Docker Compose的二进制文件。
有时候下载速度慢,耐心等待

# v2.16.0
sudo curl -L "https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# v2.27.0 选择一个版本安装即可
sudo curl -L "https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

设置执行权限:

sudo chmod +x /usr/local/bin/docker-compose

创建软链接(可选,但推荐):

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

验证安装

docker-compose --version

如果安装成功,这条命令将输出Docker Compose的版本号。

卸载Docker Compose(可选)

如果需要卸载Docker Compose,可以简单地删除/usr/local/bin/docker-compose文件:

sudo rm /usr/local/bin/docker-compose
sudo rm /usr/bin/docker-compose  #删除创建的软连接

Milvus安装

创建Milvus工作目录

为Milvus创建一个目录来存储数据和日志。

mkdir milvus-workdir  # 创建一个新的工作目录  
cd milvus-workdir     # 进入工作目录  

下载Docker Compose配置文件

下载适合Milvus版本的Docker Compose配置文件,这里下载的是v2.4.1版本,也可以下载其他版本


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

启动Milvus服务

sudo docker-compose up -d

如果运行出现下面这个问题,可以通过设置国内源,解决这个问题。这个是国内网络问题,无法连接到 docker hub。

❗error pulling image configuration: download failed after attempts=6: dial tcp 23.101.24.70:443: connect: connection refused

设置国内源,源地址设置在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

{
    "registry-mirrors": [
       	"https://registry.docker-cn.com",
       	"https://dockerhub.azk8s.cn",
       	"https://docker.mirrors.ustc.edu.cn",
       	"https://6kx4zyno.mirror.aliyuncs.com",
       	"https://hub-mirror.c.163.com",
       	"https://reg-mirror.qiniu.com"
	]
}

重启Docker

sudo systemctl restart docker
或者
service docker restart

检查国内源地址设置是否生效

docker info

生效之后,再次运行启动命令

sudo docker-compose up -d

image.png
如果还是失败,就更换一下国内源,多尝试几次
image.png
启动成功
image.png

检查Milvus服务是否正常启动:

docker ps

Milvus正常启动,如下图所示
image.png

(可选)授权端口号允许外网访问

如果是在云服务器上部署,需要授权端口号允许外网访问。阿里云服务器在安全组,入方向,授权端口 19530 允许访问
image.png

(可选)安装Milvus图形界面客户端Attu

Attu为 Milvus 专门开发的图形界面客户端,可以在 https://github.com/zilliztech/attu/releases 找到最新发布版本,找到可执行安装包下载到电脑安装即可使用。
image.png

Milvus客户端使用

安装依赖

在客户端的Python环境中安装pymilvus库,可以通过运行以下命令来安装:
pymilvus安装版本要与Milvus版本相对应
https://milvus.io/api-reference/pymilvus/v2.4.x/About.md

pip install pymilvus

# 建议安装指定版本2.4.1
pip install pymilvus==2.4.1

下载示例代码进行测试

使用Python运行Milvus:https://www.milvus-io.com/example_code
下载 hello_milvus.py 直接或使用以下命令

wget https://raw.githubusercontent.com/milvus-io/pymilvus/v2.4.1/examples/hello_milvus.py

将示例代码中链接Milvus数据库的localhost改为服务器IP地址

connections.connect(“default”, host=“localhost”, port=“19530”)
改为
connections.connect(“default”, host=“服务器IP”, port=“19530”)

运行 hello_milvus.py

python hello_milvus.py

运行成功,以下是返回的结果和查询延迟:

=== start connecting to Milvus     ===

Does collection hello_milvus exist in Milvus: False

=== Create collection `hello_milvus` ===


=== Start inserting entities       ===

Number of entities in Milvus: 3001

=== Start Creating index IVF_FLAT  ===


=== Start loading                  ===


=== Start searching based on vector similarity ===

hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911
hit: id: 999, distance: 0.09934989362955093, entity: {'random': 0.9519034206569449}, random field: 0.9519034206569449
hit: id: 1310, distance: 0.10135537385940552, entity: {'random': 0.26669865443188623}, random field: 0.26669865443188623
hit: id: 2999, distance: 0.0, entity: {'random': 0.02316334456872482}, random field: 0.02316334456872482
hit: id: 2502, distance: 0.13083189725875854, entity: {'random': 0.9289998713260136}, random field: 0.9289998713260136
hit: id: 2669, distance: 0.1590736359357834, entity: {'random': 0.6080847854541138}, random field: 0.6080847854541138
search latency = 0.2060s

=== Start querying with `random > 0.5` ===

query result:
-{'embeddings': [0.8367804, 0.20963514, 0.6766955, 0.39746654, 0.8180806, 0.1201905, 0.9467144, 0.6947491], 'pk': '0', 'random': 0.6378742006852851}
search latency = 0.2434s
query pagination(limit=4):
        [{'random': 0.6378742006852851, 'pk': '0'}, {'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]
query pagination(offset=1, limit=3):
        [{'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]

=== Start hybrid searching with `random > 0.5` ===

hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911
hit: id: 999, distance: 0.09934989362955093, entity: {'random': 0.9519034206569449}, random field: 0.9519034206569449
hit: id: 1553, distance: 0.12913644313812256, entity: {'random': 0.7723335927084438}, random field: 0.7723335927084438
hit: id: 2502, distance: 0.13083189725875854, entity: {'random': 0.9289998713260136}, random field: 0.9289998713260136
hit: id: 2669, distance: 0.1590736359357834, entity: {'random': 0.6080847854541138}, random field: 0.6080847854541138
hit: id: 2628, distance: 0.1914074569940567, entity: {'random': 0.940077754658375}, random field: 0.940077754658375
search latency = 0.1999s

=== Start deleting with expr `pk in ["0" , "1"]` ===

query before delete by expr=`pk in ["0" , "1"]` -> result:
-{'random': 0.6378742006852851, 'embeddings': [0.8367804, 0.20963514, 0.6766955, 0.39746654, 0.8180806, 0.1201905, 0.9467144, 0.6947491], 'pk': '0'}
-{'random': 0.43925103574669633, 'embeddings': [0.27875876, 0.95355743, 0.976228, 0.54545516, 0.16776836, 0.82360446, 0.65080017, 0.21096307], 'pk': '1'}

query after delete by expr=`pk in ["0" , "1"]` -> result: []


=== Drop collection `hello_milvus` ===

恭喜!Milvus已在服务器部署成功,客户端可以正常使用

RAG

使用BCEmbedding编码构建向量索引

国内访问不了huggingface,可以将BCEmbedding下载到本地电脑,下载链接:
https://www.modelscope.cn/models/maidalun/bce-embedding-base_v1/summary

使用Milvus向量数据库相关文档:https://python.langchain.com/v0.2/docs/integrations/vectorstores/milvus/

安装相关依赖

%pip install --upgrade --quiet  langchain_milvus

milvus_insert.py 构建向量索引示例代码:

from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_core.documents import Document
from langchain_community.vectorstores import Milvus

embedding_model_name = './本地文件夹/bce-embedding-base_v1'  # 修改为你的模型名称  
embedding_model_kwargs = {'device': 'cpu:0'}  
embedding_encode_kwargs = {'batch_size': 32, 'normalize_embeddings': True}  

# 可以使用Hugging Face的模型
embed_model = HuggingFaceEmbeddings(  
    model_name=embedding_model_name,  
    model_kwargs=embedding_model_kwargs,  
    encode_kwargs=embedding_encode_kwargs  
)

if __name__ == "__main__":
    # json数据,可以改为从文档中读取数据
    text_datas = [
        {
            "instruction": "请问中医如何治疗瘰疬?",
            "input": "",
            "output": "中医治疗瘰疬通常采用中药内服和外用结合的方法。具体治疗方案因人而异,以下是一些常用的治疗方法:\n\n1. 清热解毒:使用具有清热解毒功效的中药,如金银花、连翘、黄芩等,可帮助清除毒素和热邪,减轻瘰疬症状。\n\n2. 活血化瘀:使用具有活血化瘀功效的中药,如当归、川芎、红花等,可促进血液循环,加速瘰疬的愈合。\n\n3. 外用贴敷:使用中药贴敷患处,如石膏、黄连、苦参等,可起到消炎、止痛、祛肿的作用。\n\n4. 食疗调理:可选择清淡易消化的食物,如蔬菜、水果、粥等,避免辛辣刺激性食物,同时加强营养,增强身体抵抗力。\n\n需要注意的是,瘰疬属于慢性疾病,治疗过程需要耐心和坚持,同时需避免刺激患处,保持身体清洁,避免感染。最好在专业中医医师的指导下进行治疗。"
        },
        {
            "instruction": "我经常消瘦,最近感觉特别乏力,有什么中药方剂可以推荐一下?要求:1. 请考虑所有症状。2. 请根据中医知识输出一步步的推理过程。",
            "input": "",
            "output": "首先,根据您描述的症状,消瘦和乏力是比较常见的症状,可能与多种因素有关。为了准确地确定中药方剂的选择,我需要了解更多的细节信息。\n\n1. 您的年龄、性别和身高体重比例是什么?\n\n2. 您的饮食结构如何,有没有厌食、消化不良等症状?\n\n3. 您的睡眠质量如何?有没有失眠或多梦的现象?\n\n4. 您的情绪状态如何?有没有情绪低落、焦虑、烦躁等情况?\n\n5. 您是否有其他症状,如盗汗、头晕、心悸等?\n\n根据中医的理论,消瘦和乏力可能与脾胃虚弱、气血不足、肝肾不足等有关。因此,在选择中药方剂时,需要考虑调补脾胃、益气养血、补肝肾等因素。同时,也需要结合具体病情,选择相应的药材进行配方。\n\n建议您到中医诊所或医院进行详细的中医体检和诊断,以便准确确定病因,选择最适合您的中药方剂。"
        }
    ]
    # 编辑数据
    docs = []
    for i in range(len(text_datas)):
        page_content = text_datas[i]['instruction'] + "----------" + text_datas[i]['output']
        # new_document = Document(page_content=page_content, metadata={"namespace": "Wind_cold_disease"}) # 考虑多用户,使用 namespace 作为分区键,添加分区
        new_document = Document(page_content=page_content)
        docs.append(new_document)

    vector_db = Milvus.from_documents(
        docs,
        embed_model,
        collection_name="ChineseMedicineKnowledge",
        connection_args={"host": "服务器IP", "port": "19530"},
    )
    print(vector_db)

上述代码中,有两处地方需要根据自己电脑环境调整

  1. embedding_model_name = ‘./本地文件夹/bce-embedding-base_v1’ 将本地文件夹改为自己电脑下载bce-embedding-base_v1文件夹路径
  2. connection_args={“host”: “服务器IP”, “port”: “19530”} 将服务器IP改为自己部署的服务器ID

调整后,运行代码:

python milvus_insert.py

运行成功如下图所示
image.png

如果安装了Attu软件,可以在Attu中看到已添加的向量数据,下图所示:
image.png
image.png

向量搜索

milvus_rag.py 向量搜索示例代码:

from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Milvus  
from langchain_core.documents import Document
import re

# bce-embedding的模型
embedding_model_name = './本地文件夹/bce-embedding-base_v1'  # 修改为你的模型名称  
embedding_model_kwargs = {'device': 'cpu:0'}  
embedding_encode_kwargs = {'batch_size': 32, 'normalize_embeddings': True}  


# 使用Hugging Face的模型名称
embed_model = HuggingFaceEmbeddings(  
    model_name=embedding_model_name,  
    model_kwargs=embedding_model_kwargs,  
    encode_kwargs=embedding_encode_kwargs  
)

vector_db = Milvus(
    embed_model,
    connection_args={"host": "服务器IP", "port": "19530"},
    collection_name='ChineseMedicineKnowledge',
)

query = "请问中医如何治疗瘰疬?"
docs = vector_db.similarity_search(query)

# # 遍历列表中的每个字典
for document in docs:
    # # 打印文档的内容  
    print("Page Content:")  
    print(document.page_content)  
    print("\n\n")

    split_string = re.split("----------", document.page_content)
    print("content:"+split_string[1])

上述代码中,有两处地方需要根据自己电脑环境调整

  1. embedding_model_name = ‘./本地文件夹/bce-embedding-base_v1’ 将本地文件夹改为自己电脑下载bce-embedding-base_v1文件夹路径
  2. connection_args={“host”: “服务器IP”, “port”: “19530”} 将服务器IP改为自己部署的服务器ID

调整后,运行代码

python milvus_rag.py

查询出相关信息
image.png
可以将查询到的信息,根据需求再做适当的处理

恭喜你!已经学会使用RAG,快去试试吧

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐