使用向量/嵌入菜单的语义搜索
#python #ai #datascience #nlp

如果您是像我这样的人,他在启动了LLM(大语言模型)之后听到语义搜索,向量和嵌入式,并发现这些术语感到困惑,那么我希望此博客能给您一些清晰度。

什么是语义搜索

自然语言处理中的语义搜索(NLP)是指理解含义意图在用户的搜索查询背后的或意图,并根据该理解来检索相关信息。与传统的基于关键字的搜索(基于确切的单词匹配)匹配文档的查询不同,语义搜索旨在理解查询的上下文和语义,以生成更多准确上下文相关的结果。

下一个问题是如何使计算机理解语义信息...人类具有很高的认知能力,因此他们可以轻松地以多种语言理解语义,但是要使计算机理解语义是具有挑战性的。

在此博客中,我们将了解如何使用向量/嵌入来理解语义信息。在我以前的博客中,我已经展示了CountVectorizer & TFIDF的工作原理,现在我们将看到一种更高级但更简单的语义搜索方法

什么是向量

数学上,向量是一个具有幅度方向的值。

Single Dimensional Vector
在这里,向量A,B,C,D的幅度为4、2,A,B,D具有相同的方向,但C的方向不同。这些是单维向量。

Multi Dimensional Vector
在数学中,与物理学不同,矢量可能有 n 维度,这些维度称为多维向量(上图中的每个箭头都是维度)。我们将在此博客中使用的 All-Minilm-L6-V2 模型生成了一个具有尺寸的向量 384 。这些维度中存储的信息用于找到语义相似性。

句子变形金刚

sencencetransformers是用于最先进句子,文本和图像嵌入的Python框架。它提供了计算嵌入(密度向量表示)的简单方法。

现在,我们将看到如何使用句子变形金刚的预训练模型生成嵌入式并进行语义搜索。

验证的句子变压器模型-All-Minilm-L6-V2

我们有一个python库来访问模型

pip install -U sentence-transformers

我们将使用 All-Minilm-L6-V2 模型,这是一个轻巧而功能强大的模型。

from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')

现在,我们可以采取一些问答句子并从中生成嵌入并对它们进行语义搜索。

# Q&A sentences
question_answers = [
           "Q : What is this software used for? A : This software is used to handle you finances and provide useful suggestion",
           "Q : How much does it cost per year? A : It costs 5000 rupees per year",
           "Q : Is there a premium version available? A : Yes it is available for a cost of 7000 rupees per year",
           "Q : Why should I choose this rather than product Y? A : Our product outperforms in W and Z"  
          ]

#Sentences are encoded by calling model.encode()
question_answer_embeddings = model.encode(question_answers, convert_to_tensor=True)

编码函数将生成嵌入,然后我们将嵌入式转换为 pytorch张量

Image description
那很容易!!!!

现在,我们将提出一个问题,并从生成的嵌入式中找到与语义相关的内容。

question = ['Can you explain the use of this software']
question_embeddings = model.encode(question, convert_to_tensor=True)

我们还应该为我们的问题生成嵌入...

from sentence_transformers.util import semantic_search
hits = semantic_search(question_embeddings, question_answer_embeddings, top_k=1)

我们使用的是一个称为 semantic_search 的实用程序函数,该默认使用cosine similarity在两个嵌入式之间找到相似性 >,您也可以使用任何其他指标来比较 dot product

等向量

Hits

print([question_answers[hits[0][i]['corpus_id']] for i in range(len(hits[0]))])

Image description

question = ['How much do you charge?']
question_embeddings = model.encode(question, convert_to_tensor=True)

from sentence_transformers.util import semantic_search
hits = semantic_search(question_embeddings, question_answer_embeddings, top_k=1)

print([question_answers[hits[0][i]['corpus_id']] for i in range(len(hits[0]))])

Image description

您可以从上面的示例中观察到问题不完全匹配Question_answers中的任何输入,但我们能够找到与我们的输入非常匹配的一个。

还有许多其他模型可以生成更强大的嵌入,并且嵌入质量与语义相似性成正比。
快乐学习:))
www.linkedin.com/in/praveenr2998