语义搜索与向量数据库的应用探索

2024年04月24日 由 daydream 发表 52 0

在自然语言处理(NLP)领域,向量数据库通过存储、索引和检索表示文本含义的高维向量,显著提升了语义搜索的能力。因此,语义搜索与向量数据库是紧密相关的两个领域。


本文将深入探讨语义搜索以及如何利用向量数据库来实现它。


微信截图_20240424134911


语义搜索如何工作


在讨论语义搜索时,我们首先要了解它是如何在向量数据库的上下文中运行的。


语义搜索的核心思想是基于文本的含义来进行搜索。那么,如何捕捉这些含义呢?计算机不能像人类一样感知或理解知识,因此,“意义”这个词在语义搜索中需要有一个可以量化的表达形式。在语义搜索中,“意义”转化为了一种适合进行精确检索的知识表示。


这种意义的表示通常来源于嵌入技术,即将文本转化为包含数字信息的向量的过程。例如,我们可以使用OpenAI的嵌入模型来将句子“我想学习语义搜索”转化为一个数值向量。


[-0.027598874643445015, 0.005403674207627773, -0.03200408071279526, -0.0026835924945771694, -0.01792600005865097,...]


那么,这个数值向量是如何捕捉意义的呢?想象一下,如果我们改变句子中的哪怕一个词,嵌入的结果都会有所不同。即使是单个词,不同的上下文也会产生不同的嵌入结果。这是因为嵌入考虑了单词之间的关系以及整个句子的含义,这在单个词的嵌入中是无法体现的。因此,每个词、句子和文本的嵌入结果都是独一无二的。这就是嵌入能够捕捉文本意义而不是仅仅进行词汇匹配的原因。


那么,语义搜索是如何与向量一起工作的呢?语义搜索首先将整个语料库嵌入到向量空间中。这样,每个数据点(无论是文本、句子还是文档)都成为一个坐标点,提供了丰富的信息。在搜索时,查询输入也被嵌入到相同的向量空间中。我们使用向量相似性度量(如余弦相似性)来找到与查询输入最接近的语料库中的嵌入。简单来说,就是找到与查询在语义上最相近的文档。


微信截图_20240424134942


然而,维护一个包含所有坐标的向量空间是一项巨大的任务,特别是在语料库非常庞大的情况下。与将整个向量空间作为存储相比,使用向量数据库来存储这些向量更为高效,因为它允许进行更高效的向量计算,并能随着数据的增长保持高性能。


语义搜索与向量数据库的高级过程


下面是一个高级过程的图示,展示了语义搜索与向量数据库如何协同工作。


微信截图_20240424135016


(此处应插入一个图示,展示每个文档嵌入坐标在向量空间中的位置,以及查询嵌入如何在向量空间中找到最接近的文档嵌入)


在下一部分,我们将通过一个Python示例来演示如何进行语义搜索。


Python实现


在本文中,我们将使用开源的向量数据库Weaviate来进行演示。为了方便起见,我们还将使用Weaviate的云服务(WCS)来存储向量。


首先,我们需要安装Weaviate的Python包。


pip install weaviate-client

 

然后,你需要在Weaviate的控制台注册一个免费的集群,并获取集群的URL和API密钥。


作为数据集示例,我们将使用Kaggle上的法律文本数据。为了简化操作,我们只使用前100行数据。


import pandas as pd
data = pd.read_csv('legal_text_classification.csv', nrows = 100)

 微信截图_20240424135040


接下来,我们将把这些数据存储在Weaviate云服务的向量数据库中。为此,我们需要设置与数据库的连接。


import weaviate
import os
import requests
import json


cluster_url = "YOUR_CLUSTER_URL"
wcs_api_key = "YOUR_WCS_API_KEY"
Openai_api_key ="YOUR_OPENAI_API_KEY"

client = weaviate.connect_to_wcs(
cluster_url=cluster_url,
auth_credentials=weaviate.auth.AuthApiKey(wcs_api_key),
headers={
"X-OpenAI-Api-Key": openai_api_key
}
)


然后,我们需要做的是连接到Weaviate云服务,并创建一个类(类似于SQL中的表)来存储文本数据。


import weaviate.classes as wvc

client.connect()
legal_cases = client.collections.create(
name="LegalCases",
vectorizer_config=wvc.config.Configure.Vectorizer.text2vec_openai(),
generative_config=wvc.config.Configure.Generative.openai()
)


在上面的代码中,我们创建了一个名为LegalCases的类,它使用OpenAI的嵌入模型。在后台,无论我们将哪个文本对象存储在LegalCases类中,它都会通过OpenAI的嵌入模型进行转换,并以嵌入向量的形式存储。


现在,我们可以尝试将法律文本数据存储在向量数据库中。你可以使用以下代码来完成这个操作。


sent_to_vdb = data.to_dict(orient='records')
legal_cases.data.insert_many(sent_to_vdb)


你应该能够在Weaviate集群中看到,你的法律文本数据已经被成功存储了。


既然向量数据库已经准备就绪,我们就可以进行语义搜索了。Weaviate的API使得这个过程变得非常简单,如下所示。在下面的示例中,我们将尝试查找与“澳大利亚”相关的案例。


response = legal_cases.query.near_text(
query="Cases in Australia",
limit=2
)

for i in range(len(response.objects)):
print(response.objects[i].properties)


搜索结果如下所示。


{'case_title': 'Castlemaine Tooheys Ltd v South Australia [1986] HCA 58 ; (1986) 161 CLR 148', 'case_id': 'Case11', 'case_text': 'Hexal Australia Pty Ltd v Roche Therapeutics Inc (2005) 66 IPR 325, the likelihood of irreparable harm was regarded by Stone J as, indeed, a separate element that had to be established by an applicant for an interlocutory injunction. Her Honour cited the well-known passage from the judgment of Mason ACJ in Castlemaine Tooheys Ltd v South Australia [1986] HCA 58 ; (1986) 161 CLR 148 (at 153) as support for that proposition.', 'case_outcome': 'cited'}

{'case_title': 'Deputy Commissioner of Taxation v ACN 080 122 587 Pty Ltd [2005] NSWSC 1247', 'case_id': 'Case97', 'case_text': 'both propositions are of some novelty in circumstances such as the present, counsel is correct in submitting that there is some support to be derived from the decisions of Young CJ in Eq in Deputy Commissioner of Taxation v ACN 080 122 587 Pty Ltd [2005] NSWSC 1247 and Austin J in Re Currabubula Holdings Pty Ltd (in liq); Ex parte Lord (2004) 48 ACSR 734; (2004) 22 ACLC 858, at least so far as standing is concerned.', 'case_outcome': 'cited'}


如你所见,我们得到了两个结果。在第一个案例中,“澳大利亚”这个词在文档中直接被提及,因此很容易找到。然而,第二个结果中并没有直接提到“澳大利亚”这个词。但是,语义搜索能够找到它,因为文档中存在与“澳大利亚”相关的词汇,如“NSWSC”(代表新南威尔士州最高法院)或“Currabubula”(澳大利亚的一个地名)。


传统的基于词汇匹配的方法可能会错过第二个记录,但语义搜索则能够更准确地找到它,因为它考虑了文档的含义。


这就是使用向量数据库实现简单语义搜索的全部内容。


结论


尽管传统的基于词汇匹配的方法在信息检索中存在局限,即无法准确捕捉用户的搜索意图,但搜索引擎仍然是互联网上信息获取的主要途径。这一局限性催生了语义搜索的发展,它是一种能够解释文档和查询含义的搜索引擎方法。借助向量数据库,语义搜索的能力得到了进一步的提升。

文章来源:https://www.kdnuggets.com/semantic-search-with-vector-databases
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消