解析向量数据库在 LLM 应用中的关键作用(RAG、embedding 存储),是构建 AI 应用必知的技术。
随着 AI 的崛起,向量数据库正变得越来越流行。但究竟什么是向量数据库,以及何时应该使用它呢?
传统搜索引擎使用全文搜索,但像 ChatGPT 和 Bing AI 这样的 NLP 则使用语义搜索或相似度搜索,这是一种不仅考虑字符匹配,还考虑单词含义的搜索方式。语义搜索的这一特性是由向量数据库提供支持的。
最近 Google 也开始使用语义搜索。
让我们比较这两种搜索类型。
全文搜索
在大量文本中搜索一个单词或短语
搜索引擎返回包含搜索词的文档列表
SELECT title, content
FROM documents
WHERE search_vector @@ plainto_tsquery('english', 'example search');
语义搜索
在大量文本中搜索一个单词或短语
搜索引擎将返回包含搜索词或含义相似的文档列表
向量化是向量数据库的基础,所以首先我们需要理解这种技术及其优势。
NLP 接收文本作为输入并返回另一个文本作为输出。这涉及几个处理步骤,其中之一就是向量化。
NLP 接收文本作为输入并返回另一个文本作为输出。这涉及几个处理步骤,其中之一就是向量化。
在向量化过程中,输入文本的 token 使用线性代数运算转换为向量。简化来说:
在向量化过程中,输入文本的 token 使用线性代数运算转换为向量。简化来说:
文本变成了一个包含数值的数组,例如:
"learning NLP and AI" ---> [0.9, 0.02, 0.88, 0.1, 0.3]
这种"翻译"的结果被称为向量嵌入(vector embedding)。向量嵌入是输入文本的数值表示。
这种"翻译"的结果被称为向量嵌入(vector embedding)。向量嵌入是输入文本的数值表示。
这种方法不仅适用于文本,也适用于图像、音频和视频。这些数据类型中的每一种都使用不同的算法来生成向量嵌入。
这种方法不仅适用于文本,也适用于图像、音频和视频。这些数据类型中的每一种都使用不同的算法来生成向量嵌入。
图像:vgg、resnet、inception、mobilenet、googlenet 等
文本:word2vec、glove、fasttext、BERT、node2vec 等
音频:wav2vec、mxnet 等
现在我们有很多向量,但这些向量基本上就是数字、矩阵,它们本身没有任何意义。所以向量数据库被用来索引这些向量。
现在我们有很多向量,但这些向量基本上就是数字、矩阵,它们本身没有任何意义。所以向量数据库被用来索引这些向量。
向量数据库将对向量进行索引,使具有相似数值的向量彼此接近,这使得在数据库中执行相似度搜索成为可能。
向量数据库将对向量进行索引,使具有相似数值的向量彼此接近,这使得在数据库中执行相似度搜索成为可能。
使用数学公式查询数据库,在高维空间中找到最接近的向量
欧几里得距离
余弦相似度
使用数学公式查询数据库,在高维空间中找到最接近的向量
机器学习算法
K 最近邻(K-nearest neighbors,KNN)
近似最近邻(Approximate nearest neighbors,ANN)
假设你想搜索以下文本:
"Best football player in the world"
你很可能会得到关于梅西的结果,因为目前(2023 年)他被选为世界最佳足球运动员。但你也会得到关于克里斯蒂亚诺·罗纳尔多、姆巴佩、内马尔等的结果,因为他们也是非常优秀的足球运动员,被很多球迷认为是"最好的"。
# Load the dataset - 2000 first articles
dataset = load_dataset('openwebtext', split='train[:2000]')
# Preprocess the dataset
texts = [simple_preprocess(article['text']) for article in dataset]
# Train a Word2Vec model
model = Word2Vec(texts, vector_size=200, window=5, min_count=1, workers=4)
# Find the most similar words to "politics", "global", and "economy
similar_words = model.wv.most_similar(positive=['politics', 'global', 'economy'], topn=10)
print(similar_words)
在这段代码中,我们对术语"politics"、"global"和"economy"执行语义搜索。
在这段代码中,我们对术语"politics"、"global"和"economy"执行语义搜索。
结果是,我们得到 10 个语义上最接近的术语,包括术语本身和数值接近系数。
结果是,我们得到 10 个语义上最接近的术语,包括术语本身和数值接近系数。
>>> 10 most similar results to "politics", "global", "economy"
[
('debt', 0.9471450448036194),
('industry', 0.9427266716957092),
('conflict', 0.9362503290176392),
('labor', 0.9333578944206238),
('scientific', 0.9326208829879761),
('investment', 0.9326040148735046),
('capitalism', 0.9312210083007812),
('participation', 0.9291972517967224),
('society', 0.9280529618263245),
('crisis', 0.9253469705581665)
]
完整代码:semantic-search.py
(后续内容未提供)