Faiss,开源的向量索引库

标签: dev | 发表时间:2023-07-17 00:00 | 作者:
出处:https://itindex.net/relian

《向量数据库,LLM生态的核心组件》介绍了vector index和vector databases,这篇文章介绍 Faiss,它是一个非常流行的vector index,通过这篇文章能大概理解如何应用 Faiss。

Faiss 是Facebook开源的一个Python包,它的目标:

Faiss is a library for efficient similarity search and clustering of dense vectors. It contains algorithms that search in sets of vectors of any size, up to ones that possibly do not fit in RAM.

意思就是进行向量的相关性搜索,同时对向量进行聚类管理,它本身是基于内存运行的。

环境安装:

  $ pip install faiss-cpu   
$ pip install openai

这篇文章介绍的例子是为了实现一个聚类。

输入如下图:

通过训练数据,将text转换为向量,且每一个text对应(相当于向量)一个label

输出什么呢?根据query找出相近的两个label,如下图:

1:数据源text,label

  data = [['您的总部在哪儿?', '位置'],   
        ['把我的手机扔进水里', '随机'],
        ['网络控制设备?', '网络'],
        ['地址', '位置']]
df = pd.DataFrame(data, columns = ['text', 'category'])
text = df['text']
print(df)

2:使用openai的text-embedding-ada-002模型,将text转换为向量

  dflist = text.to_list()   
embeddings = []
for  dfv in dflist:
    embedding = openai.Embedding.create(
        input= dfv , model="text-embedding-ada-002"
    )
    embedding = embedding["data"][0]["embedding"]
    embeddings.append({"text": dfv, "vector": embedding})

# 将向量转换为numpy数组,其shape为(4, 1536)
vectors = np.array([embedding["vector"] for embedding in embeddings])

3:使用FAISS 建立索引

  # 获得向量维度   
vector_dimension = vectors.shape[1]
print("vector_dimension",vector_dimension)
 
# IndexFlatIP 表示使用内积进行相似度计算,还可以选择其它索引
index = faiss.IndexFlatIP(vector_dimension)
index.add(vectors)

4:构建查询向量

  search_text = '我的办公室在哪儿?'   

search_vector = openai.Embedding.create(
    input= search_text , model="text-embedding-ada-002"
    )["data"][0]["embedding"]
 
_vector = np.array([search_vector])
# 将向量进行归一化,使得查询向量和索引向量在同一个空间,这样才能计算相似度
normalized_vector = _vector / np.linalg.norm(_vector, axis=1, keepdims=True)

5:根据索引查询结果

  # ntoal 表示查询结果的数量   
k = index.ntotal
k = 2 

# distances 表示距离,ann 表示索引
distances, ann = index.search(normalized_vector, k=k)
print("distances",distances.shape) # (1,2)
print("ann",ann.shape) #(1,2)
 
results = pd.DataFrame({'query': search_text, 'distances': distances[0], 'ann': ann[0]})

# 将查询结果和原始数据进行合并
merge = pd.merge(results, df, left_on='ann', right_index=True) 
print("merge",merge)

这篇文章放弃了多年的Markdown Here Chrome插件,新排版大家感觉怎么样?

相关 [faiss 开源 向量] 推荐:

Faiss,开源的向量索引库

- - IT瘾-dev
《向量数据库,LLM生态的核心组件》介绍了vector index和vector databases,这篇文章介绍 Faiss,它是一个非常流行的vector index,通过这篇文章能大概理解如何应用 Faiss. Faiss 是Facebook开源的一个Python包,它的目标:. It contains algorithms that search in sets of vectors of any size, up to ones that possibly do not fit in RAM..

faiss相似性搜索和向量聚类库 faiss: A library for efficient similarity search and clustering of dense vectors.

- -
Faiss是一个有效的相似性搜索和密集向量聚类的库. 它包含搜索任意大小的向量集的算法,包括不适合放入RAM的数据集. 它还包含用于评估和参数调整的支持代码. Faiss是用C ++编写的,包含Python / numpy的完整包装. 一些最有用的算法是在GPU上实现的. 它由 Facebook AI Research开发.

facebook-faiss库 - YiLiang - CSDN博客

- -
三月初,Facebook AI Research(FAIR)开源了一个名为 Faiss 的库,Faiss 主要用于有效的相似性搜索(Similarity Search)和稠密矢量聚类(Clustering of dense vectors),包含了在任何大小的矢量集合里进行搜索的算法. Faiss 上矢量集合的大小甚至可以大到装不进 RAM.

FAISS + SBERT实现的十亿级语义相似性搜索

- - 雷锋网
译者:AI研习社( FIONAbiubiu). 双语原文链接: Billion-scale semantic similarity search with FAISS+SBERT. 语义搜索是一种关注句子意义而不是传统的关键词匹配的信息检索系统. 尽管有许多文本嵌入可用于此目的,但将其扩展到构建低延迟api以从大量数据集合中获取数据是很少讨论的.

[转]词向量

- - 狮子座明仔知识集散场
本教程来自深度学习框架PaddlePaddle的入门引导. 我没有修改前面的理论知识部分,是在后面加入了自己的应用实例便于理解. 本教程源代码目录在 book/word2vec, 初次使用请参考PaddlePaddle 安装教程,更多内容请参考本教程的 视频课堂. 本章我们介绍词的向量表征,也称为word embedding.

Javascript向量图Lib–Raphaël

- winners - 酷壳 - CoolShell.cn
我们知道很多的Javascript的lib库了,比如:jQuery,YUI,Ext JS等等. 今天看到一个很牛X的lib叫Raphaël [ˈrafēəl],这是一个很小的JavaScript library,可以让在你的Web上整一些向量图,并且可以完成一些动画和图形变化,很强大. Raphaël使用的是  W3C 推荐的 SVG和VML 来创建图片.

Facebook词向量工具FastText

- - 标点符
fastText是Facebook于2016年开源的一个词向量计算和文本分类工具,在文本分类任务中,fastText(浅层网络)往往能取得和深度网络相媲美的精度,却在训练时间上比深度网络快许多数量级. 在标准的多核CPU上, 能够训练10亿词级别语料库的词向量在10分钟之内,能够分类有着30万多类别的50多万句子在1分钟之内.

Google开源LevelDB

- 酿泉 - Solidot
Google宣布在BSD许可证下开源其键值存储引擎LevelDB. LevelDB C++库可用于多种不同环境,如被浏览器用于存储最近访问的网页缓存,或者被操作系统使用去储存安装的软件包和依赖包清单,或被应用程序用于存储用户设置. Google称,即将发布的新版Chrome浏览器,就包含了基于LevelDB的IndexedDB HTML5 API实现.

再论开源

- - 谢益辉
几年前我写过一些关于开源的 想法,如今再来看开源,我觉得问题已经不在说教上,而是在趋势上. 倒退十年或更久,那时候程序员相对还比较稀缺,软件闭源开发出来之后别人模仿的成本高,而这些年计算机教育的普及让码农数量变得越来越多,更多人懂编程了,模仿的成本大幅下降. 写软件作为谋生的目的已经在弱化,更多的是为了自己的实际需求,或社区名声:你不开源.

SoftEther VPN开源

- - Solidot
日本筑波大学的全球分布式公共VPN中继服务器软件SoftEther VPN正式在GPLv2许可证下开源,源代码托管在Github、SourceForge和Google Code上. SoftEther VPN是VPN Gate的底层VPN引擎,在开源之后用户将可以编译出自己定制的二进制包. SoftEther VPN提供了一种分布式的免费公共VPN中继服务,服务器由志愿者托管,因此很少能提供长时间的VPN连接,但代理服务器的不断变化也增加了封杀难度.