RAG组件:向量数据库(Milvus)

       在当前大模型盛行的时代,大模型的垂类微调、优化成为产业落地、行业应用的关键;RAG技术应运而生,主要解决大模型对专业知识、实效性知识欠缺的问题;

       RAG的核心工作逻辑是将专业知识、实效知识等大模型欠缺的知识进行收集、打包、保存为一个知识库,在用到该部分知识的时候,可以通过检索关键信息,将知识库內对应知识片段进行返回,再整合为一个结构化的prompt(提示词)输入给大模型,这样以来,大模型就可以结合这些知识片段和具体问题,整理汇总出客户想要的答案;

       那在对这些知识进行保存和检索的过程中,就需要数据库技术的支持,而在众多类型的数据库中,有一类向量数据库,对图片等非结构化类型数据的保存和检索起到关键性作用;常用的向量数据库主要有Milvus、Faiss、Chroma等,今天就简单介绍一下Milvus向量数据库的应用;

一、介绍

       Milvus 是一款开源的向量数据库,其高性能、分布式、专为 AI 和机器学习设计的向量数据库,广泛应用于推荐系统、图像检索、自然语言处理等领域;它支持多种数据类型(如图片、文本、音频等)的嵌入式表示,并提供快速的相似性搜索能力;

1.1 核心功能:

  • 向量相似性搜索: 支持基于距离度量(如欧几里得距离、余弦相似度等)的高效查询。
  • 大规模数据处理: 能够轻松处理数十亿甚至上百亿的向量数据。
  • 分布式架构: 支持水平扩展,满足高性能和高并发需求。
  • 多模态数据支持: 可以处理图像、文本、音频等多种非结构化数据。
  • 插件式集成: 提供与主流大数据生态系统的无缝集成,例如 Kafka、Spark 和 Elasticsearch。

1.2 技术特点:

  • 索引优化: 内置多种高效的向量索引算法(如 IVF、HNSW 等),提升查询性能。
  • GPU 加速: 利用 GPU 的计算能力加速向量搜索。
  • 实时写入与查询: 支持低延迟的数据写入和查询操作。
  • 跨平台支持: 兼容多种操作系统和硬件环境。

1.3 应用场景:

  • 推荐系统: 基于用户行为或内容特征进行个性化推荐。
  • 图像检索: 快速查找与目标图片最相似的图像。
  • 自然语言处理: 实现语义相似性搜索,如问答系统或文档检索。
  • 生物信息学: 分析基因序列或蛋白质结构数据。

1.4 优势:

  • 开源社区活跃: Milvus 拥有庞大的开发者社区,持续迭代和改进。
  • 易用性: 提供丰富的 API 和 SDK,便于开发者快速上手。
  • 灵活性: 支持多种部署方式(本地、云端、容器化)。

1.5 整体流程图:

  • 创建集合: 集合是 Milvus 中存储向量数据的基本单位;
  • 插入数据: 将向量数据插入到集合中;
  • 构建索引: 为向量字段构建搜索方式;
  • 执行查询:进行向量相似性搜索;

二、安装 

2.1 安装 Milvus 客户端库

       首先需要安装 pymilvus 库,这是 Milvus 的官方 Python SDK;

# 使用以下命令安装:
pip install pymilvus

2.2  安装 Milvus

       Milvus的安装采用Docker的形式进行:

# 拉取docker镜像
docker pull milvusdb/milvus:v2.3.0# 后台运行Mlivus服务
docker run -d --name milvus_cpu -p 19530:19530 -p 8080:8080 milvusdb/milvus:v2.3.0
  • 默认情况下,Milvus 的服务地址为 localhost,端口为 19530;

三、操作 

3.1 连接到 Milvus

使用 pymilvus 连接到 Milvus 服务:

from pymilvus import connections# 连接到 Milvus 服务
connections.connect("default", host="localhost", port="19530")

3.2 创建集合

集合是 Milvus 中存储向量数据的基本单位。以下是创建集合的示例:

from pymilvus import Collection, FieldSchema, CollectionSchema, DataType, utility# 定义字段
fields = [FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),  # 主键字段FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128)          # 向量字段,维度为128
]# 查询集合是否存在
has = utility.has_collection("example_collection")# 创建集合模式
schema = CollectionSchema(fields, "Example collection")# 创建集合
collection = Collection(name="example_collection", schema=schema)
  • FieldSchema:
    定义集合中的字段,每个字段都有特定的数据类型、名称和其他属性。

  • 字段 1: "id"

    • name="id": 字段的名称,这里是 "id"
    • dtype=DataType.INT64: 字段的数据类型为 64 位整数 (INT64)。
    • is_primary=True: 将该字段设置为主键字段。主键用于唯一标识集合中的每条记录。
    • auto_id=True: 表示主键值由 Milvus 自动生成。如果设置为 False,则需要手动提供主键值。
  • 字段 2: "embedding"

  • name="embedding": 字段的名称,这里是 "embedding"
  • dtype=DataType.FLOAT_VECTOR: 字段的数据类型为浮点向量 (FLOAT_VECTOR)。
  • dim=128: 向量的维度为 128。这意味着每条记录的 "embedding" 字段是一个长度为 128 的浮点数组; 
  • CollectionSchema:
    定义集合的整体模式,包括字段列表和描述信息。

  • 参数说明:

    • fields: 字段列表,即上一步中定义的 fields
    • "Example collection": 集合的描述信息,用于说明该集合的用途或内容。这是一个可选参数,可以为空字符串。
  • Collection:
    创建一个具体的集合实例。

  • 参数说明:

    • name="example_collection": 集合的名称,必须是唯一的。在这里,集合被命名为 "example_collection"
    • schema=schema: 集合的模式,即上一步中定义的 schema

3.3 插入数据

将向量数据插入到集合中:

import random# 生成随机向量数据
data = [[i for i in range(10)],  # 主键(可选)[[random.random() for _ in range(128)] for _ in range(10)]  # 10个128维向量
]# 插入数据
collection.insert(data)

3.4 构建索引

为了加速相似性搜索,需要为向量字段构建索引:

# 定义索引参数
index_params = {"index_type": "IVF_FLAT",  # 索引类型"params": {"nlist": 128},  # 分区数量"metric_type": "L2"        # 距离度量(如欧氏距离)
}# 构建索引
collection.create_index(field_name="embedding", index_params=index_params)
  • 需要留意的一点是构建索引是针对字段进行的,前面创建了两个字段‘id’和‘embeding’,定义的索引需要作用到‘embeding’字段上,因为‘embeding’字段是向量数据,是数据样本的核心;
  • 更多索引类型请查看这篇博客;

3.5 执行查询

进行向量相似性搜索:

# 加载集合到内存
collection.load()# 定义查询参数
search_params = {"metric_type": "L2","params": {"nprobe": 10}  # 查询时的分区采样数量
}# 定义查询向量
query_vector = [[random.random() for _ in range(128)]]# 执行查询
results = collection.search(data=query_vector,anns_field="embedding",param=search_params,limit=5  # 返回前5个最相似的结果
)# 输出结果
for result in results:print(result)
  • search_params:
    定义搜索时使用的参数。

  • 参数说明:

    • metric_type="L2": 指定距离度量方式为欧氏距离(L2 距离)。其他常见选项包括:
      • "IP": 内积(Inner Product),用于余弦相似度计算。
      • "COSINE": 余弦相似度(Cosine Similarity)。
    • params={"nprobe": 10}:
      参数定义了向量相似度搜索的具体配置,通常与索引类型相关联;它的作用是调整查询算法的行为,以优化查询性能或结果精度;
      • nprobe: 控制索引分组的数量(即访问的倒排列表数量)。值越大,搜索越精确,但性能开销也会增加。
      • 对于基于 IVF 的索引类型(如 IVF_FLATIVF_PQ),nprobe 是一个关键参数;
      • 例如:IVF_FLAT索引类型,它在保存数据时会通过聚类将数据划分为若干个蔟,在检索时选择最相似的蔟心的蔟进行筛选,提高检索速度;那当‘nprobe’为10时,就是在带检索向量距离最近的10个蔟心对应的蔟中进行相似度计算,所以数值越小,待检索的向量越少,速度越快,反之检索的越准确权威,但速度越慢;
      • 下面是不同检索类型对应的参数:
        索引类型支持的参数
        IVF_FLATnprobe
        IVF_SQ8nprobe
        IVF_PQnprobem
        HNSWef
        ANNOYsearch_k

四、总结

       当然也不是只要是使用RAG技术就一定要用向量数据库,主要还是看需要构建知识库的数据类型来决定;当需要构建的知识库信息是图像、PDF等非结构信息时,就可以通过主流的图像特征提取网络对图像进行特征提取,完成向量空间的数据转化,再将其保存至向量数据库,方便检索调用;如果知识库是比如法律条文的文本信息,如果不涉及复杂的语义信息的理解的话,可以直接将法律条文的文本不经过任何语义空间转化,直接将其切片保存在传统数据库也是可以的。

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/27583.html

    如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    2022java面试总结,1000道(集合+JVM+并发编程+Spring+Mybatis)的Java高频面试题

    1、面试题模块汇总 面试题包括以下十九个模块: Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 。如下图所示…

    英码科技携昇腾DeepSeek大模型一体机亮相第三届北京人工智能产业创新发展大会

    2025年2月28日,第三届北京人工智能产业创新发展大会在国家会议中心隆重开幕。本届大会以"好用、易用、愿用——以突破性创新加速AI赋能千行百业”为主题,重点展示人工智能技术创新成果与产业化应用实践。作为昇腾生态的APN伙伴,英码科技…

    (链表 删除链表的倒数第N个结点)leetcode 19

    设空结点指向head便于插入和删除结点 考虑特殊情况 head结点被删除 a结点仅用来测试长度,找到目标结点的位置 b结点为空结点指向head返回值 cur用来删除目标值(特殊情况 目标值为head 这时curb) 则开始就将cur初始化为b开始遍历 /*** Definition fo…

    Android Studio 新版本Gradle发布本地Maven仓库示例

    发布代码到JitPack示例:https://blog.csdn.net/loutengyuan/article/details/145938967 以下是基于 Android Studio 24.2.2(Gradle 8.10.2 AGP 8.8.0 JDK17) 的本地 Maven 仓库发布示例,包含aar和jar的不同配置: 1.…

    [今年毕业设计]最新最全最有创意的基于云计算的计算机专业毕设选题精选推荐汇总建议收藏!!

    文章目录 前言基于云计算的毕业设计选题毕设作品展示 前言 2025全新毕业设计项目 💗博主介绍:✌全网粉丝10W,CSDN全栈领域优质创作者,博客之星、掘金/华为云/阿里云等平台优质作者。 👇🏻 精彩专栏 推荐订阅&#x1f4…

    coze生成的工作流,发布后,利用cmd命令行执行。可以定时发日报,周报等。让他总结你飞书里面的表格。都可以

    coze生成的工作流,发布后,利用cmd命令行执行。可以定时发日报,周报等。让他总结你飞书里面的表格。都可以。 很简单。 准备工作,先发布你的工作流,和发布应用。 然后,点击扣子API 。 申请一个&#xff0…

    安防监控/视频集中存储EasyCVR视频汇聚平台如何配置AI智能分析平台的接入?

    EasyCVR安防视频监控平台不仅支持AI边缘计算智能硬件设备的接入,还能快速集成AI智能分析平台,接收来自智能分析平台或设备的AI告警信息,如烟火检测、周界入侵检测、危险区域闯入检测、安全帽/反光衣佩戴检测等。 本文将详细介绍如何在EasyCVR…

    以1.7K深圳小区房价为例,浙大GIS实验室使用注意力机制挖掘地理情景特征,提升空间非平稳回归精度

    地理加权回归 (Geographically Weighted Regression, GWR) 是一种广泛应用于地理空间分析的统计方法,用于捕捉地理现象的空间非平稳性(即空间异质性)。传统 GWR 通过为每个观测点分配权重来反映其对回归参数的影响,这些权重通常基…

    【JavaEE】线程安全

    【JavaEE】线程安全 一、引出线程安全二、引发线程安全的原因三、解决线程安全问题3.1 synchronized关键字(解决修改操作不是原子的)3.1.1 synchronized的特性3.1.1 synchronized的使用事例 3.2 volatile 关键字(解决内存可见性) …

    智慧农业中光谱相机对土壤成分的无损检测应用‌

    可浏览之前发布的一篇文章:光谱相机在农业中的具体应用案例 一、土壤成分定量分析 ‌养分检测‌ 光谱相机通过捕捉土壤反射的特定波长光线,可精准检测氮、磷、钾等主要养分含量,以及有机质和水分比例。例如,不同养分对近红外波段…

    实现浏览器交互Ai Web Ui-本地化部署的deepseek + Ollama + Page Assist

    一、deepseek本地化部署 上篇写了deepseek本地化部署的小白教程。 deepseek 本地化部署(小白也可部署) 但有个问题,Ollama只能在命令行进行交互,体验相当差。 二、Page Assist安装 本篇给大家介绍个好用的chrome浏览器AI Web …

    使用Maven搭建Spring Boot框架

    文章目录 前言1.环境准备2.创建SpringBoot项目3.配置Maven3.1 pom.xml文件3.2 添加其他依赖 4. 编写代码4.1 启动类4.2 控制器4.3 配置文件 5.运行项目6.打包与部署6.1 打包6.2 运行JAR文件 7.总结 前言 Spring Boot 是一个用于快速构建 Spring 应用程序的框架,它简…

    易语言模拟真人鼠标轨迹算法 - 防止游戏检测

    一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…

    10.【线性代数】—— 四个基本子空间

    十、 四个基本子空间 1. 列空间 C ( A ) C(A) C(A) in R m R^m Rm2. 零空间 N ( A ) N(A) N(A) in R n R^n Rn3. 行空间 C ( A T ) C(A^T) C(AT) in R n R^n Rn4. 左零空间 N ( A T ) N(A^T) N(AT) in R m R^m Rm综述5. 新的向量空间 讨论矩阵 A m ∗ n A_{m*n} Am∗n​…

    使用通义万相Wan2.1进行视频生成

    使用通义万相Wan2.1进行视频生成 源代码准备运行环境准备创建Python虚拟环境并激活安装依赖包 模型下载生成视频官网的视频生成例子简单描述场景视频生成示例详细描述场景视频生成示例 最近通义万相开源了其视频生成模型。模型有两个版本,一个是1.3B的,一…

    P8651 [蓝桥杯 2017 省 B] 日期问题--注意日期问题中2月的天数 / if是否应该连用

    P8651 [P8651 [蓝桥杯 2017 省 B] 日期问题--注意日期问题中2月的天数 / if是否应该连用 题目 分析代码 题目 分析 代码中巧妙的用到3重循环,完美的解决了输出的顺序问题【题目要求从小到大】 需要注意的是2月的值,在不同的年份中应该更新2月的值 还有…

    smolagents学习笔记系列(番外二)Agent+Ollama分析本地图像与文件

    这篇文章是在 smolagents 官方教程结束后的番外篇二,实现了如何使用 smolagents 库 Ollama 调用本地模型对图像与文件进行分析。 【注意】:这篇文章需要你在本地部署Ollama的视觉语言模型,如果你的架构方案是纯线上模式,则可以跳…

    Java 入门 (超级详细)

    一、什么是Java Java是一种高级编程语言,由Sun Microsystems公司于1995年推出。Java具有跨平台性、面向对象、健壮性、安全性、可移植性等特点,被广泛应用于企业级应用开发、移动应用开发、大数据处理、云计算等领域。Java程序可以在不同的操作系统上运…

    02_NLP文本预处理之文本张量表示法

    文本张量表示法 概念 将文本使用张量进行表示,一般将词汇表示为向量,称为词向量,再由各个词向量按顺序组成矩阵形成文本表示 例如: ["人生", "该", "如何", "起头"]># 每个词对应矩阵中的一个向量 [[1.32, 4,32, 0,32, 5.2],[3…

    【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.4.2内存与磁盘配置陷阱

    👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 Elasticsearch内存与磁盘配置深度避坑指南1. 内存管理核心原理1.1 内存分配矩阵1.2 内存压力预警线 2. 堆内存配置陷阱解析2.1 错误配置案例2.2 正确配置公式2.3 堆内存与分…