【大模型】FAISS向量数据库记录:从基础搭建到实战操作

文章目录

本人数据分析领域的从业者,拥有专业背景和能力,可以为您的数据采集、数据挖掘和数据分析需求提供支持。期待着能够与您共同探索更多有意义的数据洞见,为您的项目和业务提供数据分析方面的帮助。

文章简介

RAG系统的成功在很大程度上取决于其高效地获取和处理海量信息的能力。向量数据库又在其中发挥了不可替代的作用,并构成了RAG系统的核心。向量数据库专门用于存储和管理高维向量数据,它们能把文本、图像、音频甚至视频转换为向量并存储。RAG系统最终能实现的效果就取决于这些底层向量数据库的表现。

在众多向量数据库和向量库中,每个都有自己的一些特点,选择一个适合自己应用场景的也需要经过评估,本文将介绍FAISS的基本搭建和使用。

Embedding模型

Embedding模型在RAG技术中非常关键,因为它们直接影响到信息检索的效果和生成文本的质量。经过多方对比和业务场景选择,本文选用了BGE-M3作为Embedding模型。

BGE-M3 模型亮点

  1. 多语言(Multi-Linguality),训练集包含100+种以上语言
  2. 多功能(Multi-Functionality),支持稠密检索(Dense Retrieval),还支持稀疏检索(Sparse Retrieval)与多向量检索(Multi-vector Retrieval)
  3. 多粒度(Multi-Granularity) BGE-M3目前可以处理最大长度为8192 的输入文本,支持"句子"、"段落"、"篇章"、"文档"等不同粒度的输入文本

huggingface下载太慢、超时可以使用国内的开源模型服务平台下载

如modelscope:

  • SDK下载
py 复制代码
#模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('Xorbits/bge-m3')
  • Git下载
    请确保 lfs 已经被正确安装
bash 复制代码
git lfs install
git clone https://www.modelscope.cn/Xorbits/bge-m3.git

FAISS是什么

Faiss 是一个用于高效相似性搜索和密集向量聚类的库。它包含在任意大小的向量组中搜索的算法,直到可能不适合 RAM 的向量组。它还包含用于评估和参数调整的支持代码。

Faiss 是用 C++ 编写的,带有完整的 Python 包装器(版本 2.0+ 和 3.0+)。一些最有用的算法是在 GPU 上实现的。它由Facebook AI Research开发。

FAISS实战

安装faiss

推荐使用Anaconda安装,如果你的电脑上还未安装与配置Anaconda环境,请先安装Anaconda。

cpu版本:

py 复制代码
conda install -c pytorch faiss-cpu

gpu版本:

py 复制代码
conda install -c pytorch faiss-gpu
加载Embedding模型

安装sentence_transformers

py 复制代码
conda install sentence-transformers
py 复制代码
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("./bge-m3") 
py 复制代码
model.max_seq_length

可以看到该模型max_tokens为8192

创建FAISS数据库

Faiss 中有常用的三种索引方式 IndexFlatL2、IndexIVFFlat 和 IndexIVFPQ。

本示例使用IndexFlatL2 进行演示。

  • IndexFlatL2 - 暴力检索L2

    使用欧氏距离(L2)进行精确检索。

    适用于较小规模的数据集,采用暴力检索的方式,即计算查询向量与所有数据库向量之间的距离,然后返回相似度最高的前 k 个向量。

  • IndexIVFFlat - 倒排索引,加速:

    使用倒排索引结构,将数据集划分为多个聚类空间,以加速搜索。

    在查询阶段,首先定位到可能包含相似向量的聚类中心,然后在该聚类中心附近进行精确搜索。

  • IndexIVFPQ - 省空间超快:

  • 使用 Product Quantization(PQ)技术进行有损压缩,以节省内存。

    在查询阶段,返回近似结果。

    本示例使用IndexFlatL2

py 复制代码
import faiss 
import numpy as np

d = 1024  # 设置向量维度为 1024
sentences = ['中国气象局启动暴雨二级应急响应!黄淮地区及四川盆地等地有强降雨', '强降雨集中在河南山东安徽江苏等地', '警惕次生灾害', '主雨带逐步移至四川盆地到黄淮一带(扎实做好防汛抗旱、抢险救灾各项工作)', '中国气象局启动暴雨二级响应,黄淮地区及四川盆地等有强降雨', '长江水利委员会贯彻落实水利部防汛会商要求',  '聚焦防汛抗洪丨河南对郑州等9市启动防汛三级应急响应', '受降雨影响', '河南郑州、南阳等地部分高速路段禁止所有车辆上站', '暴雨黄色预警:10省区部分地区有大到暴雨', '河南局地有特大暴雨', '超40支救援队驰援南阳!当地应急管理局:降水量逐渐减小,暂无人员伤亡', '透视2024广东高招提前批:小语种转向"复合型"', '大湾区做强"高教圈"', '广东省教育考试院:考生可通过这些方式查询高考录取结果', '广东2024高招录取启动!投档、进档、预录、退档、征集志愿......一文看懂!', '广东高考提前批本科院校录取结束,清华大学摘得非军检院校投档线首位', '\ufeff学子观察/中欧班列省成本', '"新三样"加速出海', '构建欧亚贸易"黄金通道"', '中欧班列(西安)让"中国制造"一路畅行', '江苏中欧(亚)班列累计开行超1.6万列', '2024年中欧班列累计开行1万列', '发送货物108.3万标箱同比增长11%', ......]

embeddings = model.encode(sentences)  # 使用模型对句子进行编码,获取句子嵌入向量
index = faiss.IndexFlatL2(d)  # 创建一个 L2 距离的索引
index.add(embeddings)  # 将句子嵌入向量添加到索引中

print("向量数量:", index.ntotal)  # 打印索引中向量的总数 101个
搜索FAISS数据
py 复制代码
k = 5  # 设置检索的最近邻个数

# 对查询句子进行编码,并在索引中进行检索,返回距离和索引
D, I = index.search(model.encode(['河南大雨']), k)  # 检查结果

# 打印每个最近邻的距离和对应的句子
for i, _i in enumerate(I[0]):
    print(D[0][i], sentences[_i])

output:

bash 复制代码
0.31428105 河南局地有特大暴雨
0.5695877 受降雨影响
0.59010285 强降雨集中在河南山东安徽江苏等地
0.8355587 中国气象局启动暴雨二级响应,黄淮地区及四川盆地等有强降雨
0.8516881 聚焦防汛抗洪丨河南对郑州等9市启动防汛三级应急响应
删除FAISS数据
py 复制代码
print(index.ntotal)
index.remove_ids(np.arange(5)) # 需要移除的向量的id
print(index.ntotal)  #移除了5个向量,还剩96个
保存、加载FAISS索引

可以使用如下方法将索引保存为文件:

py 复制代码
faiss.write_index(index, "large.index")

需要使用时,使用以下方法读取文件建立索引:

复制代码
index = faiss.read_index("news.index")
print("向量数量:", index.ntotal)  

可以看到索引数量依然是96个

总结

本文介绍了FAISS在RAG系统中的重要作用以及其基本使用方法。通过使用BGE-M3模型进行句子嵌入,并利用FAISS进行索引和检索,我们展示了如何高效地管理和搜索高维向量数据。此外,本文还涵盖了如何删除向量、保存和加载索引等实用操作。希望这些内容能帮助您更好地理解和应用FAISS,以提升数据处理和信息检索的效率。

数据采集、产品定制开发、数据分析

clike 复制代码
url='https://wx.《17610352720》.wx'

大数据分析为运营和各行业带来了前所未有的机会,使企业能够更敏锐地洞察市场、优化运营,并更有效地应对竞争和变革。在信息时代,充分利用大数据分析,将成为企业取得竞争优势的不可忽视的关键要素。

创作不易,如果你觉得有帮助,请点个赞支持一下。你的鼓励是我创作的最大动力,期待未来能为大家带来更多有趣的分析文章。感谢大家的阅读和支持!

最后,祝愿你我的生活都灿烂如花。

相关推荐
Elastic 中国社区官方博客2 小时前
在 Elasticsearch 中使用 Mistral Chat completions 进行上下文工程
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
编程爱好者熊浪4 小时前
两次连接池泄露的BUG
java·数据库
TDengine (老段)5 小时前
TDengine 字符串函数 CHAR 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
qq7422349845 小时前
Python操作数据库之pyodbc
开发语言·数据库·python
姚远Oracle ACE6 小时前
Oracle 如何计算 AWR 报告中的 Sessions 数量
数据库·oracle
Dxy12393102166 小时前
MySQL的SUBSTRING函数详解与应用
数据库·mysql
码力引擎6 小时前
【零基础学MySQL】第十二章:DCL详解
数据库·mysql·1024程序员节
杨云龙UP7 小时前
【MySQL迁移】MySQL数据库迁移实战(利用mysqldump从Windows 5.7迁至Linux 8.0)
linux·运维·数据库·mysql·mssql
l1t7 小时前
利用DeepSeek辅助修改luadbi-duckdb读取DuckDB decimal数据类型
c语言·数据库·单元测试·lua·duckdb
安当加密7 小时前
Nacos配置安全治理:把数据库密码从YAML里请出去
数据库·安全