《向量数据库,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插件,新排版大家感觉怎么样?