本文将介绍三种常用的向量数据库:faiss, Milvus和Qdrant,并给出一个具体的使用例子。
向量数据库(Vector Database)是一种专门用于存储、管理、查询、检索向量的数据库,主要应用于人工智能、机器学习、数据挖掘等领域。
在向量数据库中,数据以向量的形式进行存储和处理,需要将原始的非向量型数据转化为向量表示(比如文本使用Embedding技术获得其表征向量)。
这种数据库能够高效地进行相似性搜索,快速找到最相似的向量,适用于人脸识别、图像搜索、推荐系统等需要相似性匹配的应用。
去年大模型的大火也带动了向量数据库的迅速发展,使得向量数据库成为热门方向之一,成为AI领域不可或缺的一项重要工具。
本文将介绍常见的三种向量数据库,并结合具体的样例文本给出它们在文本相似性搜索方面的应用。这三个向量数据库分别为:
- faiss
- Milvus
- Qdrant
获取文本Embedding向量
我们使用的样例文本来源于百度百科的“中国载人登月工程”词条,将其本文切分为句子,过滤其中的纯数字的句子,保存为dengyue.txt文件。
对于上述文本,使用OpenAI的embedding模型text-embedding-ada-002来获取句子的表征向量(向量维度为1536,L2范数为1,即单位向量),并保存为numpy模块的npz文件,用于离线存储,避免每次使用时都需要加载。
示例的代码如下:
# -*- coding: utf-8 -*-
import os
import re
import json
from typing import List
from dotenv import load_dotenv
import requests
import numpy as np
from sentencex import segment
load_dotenv()
def get_embedding(texts: List[str]):
url = "https://api.openai.com/v1/embeddings"
payload = json.dumps({
"model": "text-embedding-ada-002",
"input": texts,
"encoding_format": "float"
})
headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {os.getenv("OPENAI_API_KEY")}'
}
response = requests.request("POST", url, headers=headers, data=payload)
embedding = [_["embedding"] for _ in response.json()['data']]
response.close()
return embedding
def read_file():
with open("dengyue.txt", "r", encoding="utf-8") as f:
content = [_.strip() for _ in f.readlines() if _.strip()]
file_sentences = []
for line in content:
sents = list(segment(language="zh", text=line))
for sent in sents: # filter
if sent and not re.match(r'\[\d+\]', sent):
file_sentences.append(sent)
return file_sentences
if __name__ == '__main__':
sentences = read_file()
sentences_embeddings = np.array(get_embedding(sentences))
np.savez('text_embedding.npz', sentences_embeddings)
with open('text.json', 'w') as f: