向量与嵌入简介

572 阅读35分钟

在第一章中,我们将深入探讨嵌入(或向量)的迷人世界及其在各个领域中的多样化应用。我们将介绍嵌入的概念,它帮助表示复杂数据,并使强大的机器学习(ML)模型能够分析和处理这些数据。你将了解监督学习和无监督学习在创建嵌入中的作用以及向量所解决的挑战。此外,我们还将通过实例展示向量表示在不同领域的广泛应用。我们还会向你介绍一系列工具和平台,这些工具和平台在使用向量搜索时提升了开发者的体验,包括 Hugging Face 和各种后端考量。

随着我们深入这一章,你将发现快速发展的市场格局和促进向量搜索实现的平台。我们将探索一系列使用案例和应用领域,如命名实体识别、情感分析、文本分类、问答系统和文本摘要。最后,我们将探讨 Elastic 在这个领域的作用,特别是将向量集成到 Elasticsearch 中,在搜索和网络安全中的应用。贯穿整章,你将获得关于向量表示及其应用的坚实理解,为在后续章节中更深入探讨使用 Elasticsearch 实现向量搜索的实际应用奠定基础。

因此,本章将涵盖以下主题:

  • 监督学习与无监督学习
  • 使用案例和应用领域
  • Elastic 在这一领域的作用
  • 这本书将如何帮助你

探讨监督学习和无监督学习在向量搜索中的作用

监督学习是一种机器学习方法,其中模型通过从标注数据中学习来确定输入特征和输出标签之间的映射。在训练过程中,模型调整其参数以最小化预测值与真实标签之间的误差。监督学习广泛应用于图像分类、语音识别和自然语言处理(NLP)等各种应用中。监督学习的一个主要挑战是必须提供经过精心标注的数据集来训练模型。

另一方面,无监督学习涉及在不使用标注样本的情况下发现输入数据中的模式和结构。这种学习类型侧重于通过聚类、降维和密度估计等技术在数据中找到相似性、差异或潜在结构。无监督学习通常应用于异常检测、数据压缩和特征提取等任务中。

在向量搜索和 NLP 的背景下,监督学习可以通过训练模型来预测给定词语基于其邻近词的上下文或将文档分类到预定义类别中,从而生成词或句子的嵌入。这种方法有助于捕捉文本中的语义和句法关系,使生成的嵌入对各种 NLP 任务有用。另一方面,无监督学习可以通过识别文本数据中的模式和相似性(如词共现信息)来生成嵌入。诸如 word2vec 和 GloVe 等模型利用无监督学习来创建密集的向量表示,这些表示可用于向量搜索和其他 NLP 应用。

什么是嵌入/向量?

嵌入或向量在向量搜索和 NLP 任务中起着至关重要的作用,它们通过将复杂数据转化为数值表示来实现。这些在连续向量空间中的单词、短语、文档、图像、视频或声音的数学表示捕捉了元素之间的语义和句法关系,从而使机器学习算法能够有效地处理和分析数据。这些向量表示的应用包括情感分析、机器翻译、文本分类、图像识别、物体检测和图像检索。以下图表展示了将数据、应用机器学习过程以及应用领域的整体过程:

image.png

在自然语言处理(NLP)中,词、句子和文档嵌入作为文本信息的向量表示,使算法能够更有效地处理和理解文本。同样,计算机视觉应用将图像表示为高维向量,每个像素值对应一个特定维度。其他领域,如社交网络、生物系统和推荐系统,也受益于向量表示。例如,社交网络用户及其连接可以被编码为捕捉网络结构和动态的图嵌入。在推荐系统中,用户和物品都可以表示为向量,从而计算相似性和偏好。

用向量表示世界的能力使得开发强大的机器学习模型和应用成为可能,这些模型和应用能够在各个领域提供有价值的见解和预测。

向量解决了哪些挑战?

BM25 是一种广泛使用的基于概率信息检索理论的文本检索算法。它根据文档中查询词的频率进行排序,并考虑词频、逆文档频率和文档长度归一化等因素。虽然 BM25 在传统搜索应用中有效,但它有一些局限性。例如,BM25 严重依赖精确的词匹配,这在处理同义词、拼写错误或细微语义变化时可能导致结果不够相关。此外,BM25 无法捕捉词语之间的上下文关系,难以理解短语或句子的含义。

向量搜索(包括精确匹配和近似最近邻(ANN)搜索)通过利用现代嵌入模型生成的高维向量,解决了 BM25 的一些局限性。这些向量捕捉了词、短语甚至整个文档之间的语义和上下文关系。在向量搜索中,查询和文档向量之间的相似性用于确定相关性,超越了精确的词匹配。因此,对于包含同义词、拼写错误或不同措辞的查询,向量搜索可以返回更相关的结果。精确匹配向量搜索确保返回最相似的向量,而 ANN 搜索则提供了在准确性和速度之间的可扩展折衷。通过关注潜在的含义和上下文,向量搜索提供了一种更细致的信息检索方法,可以更好地理解和应对自然语言的复杂性。

以下是一些向量搜索的应用实例:

  • 电子商务产品搜索:客户即使在搜索查询中使用不同术语或拼写错误,也能找到相关产品,提供更有效的购物体验。
  • 文档检索:用户可以找到内容、上下文或主题相似的文档,即使查询中使用的确切词汇没有出现在文档中,从而增强搜索引擎和知识管理系统的有效性。
  • 问答系统:向量搜索可以将用户查询与大型数据集中潜在的答案匹配,使聊天机器人或基于 AI 的客户支持系统提供更准确和上下文相关的回答。
  • 图像识别和检索:图像可以表示为高维向量,简化图像识别和检索。向量搜索可以在大型数据集中找到视觉上相似的图像,支持反向图像搜索、重复检测和视觉推荐系统等应用。
  • 音乐推荐:通过将音频表示为向量,向量搜索可以识别特征或风格相似的曲目,帮助用户根据其偏好和收听习惯发现新音乐。
  • 安全与用户和实体行为分析(UEBA):在安全和 SecOps 领域,向量搜索可用于 UEBA,以识别包含网络流量、日志、用户活动和其他安全相关数据的大型数据集中的模式和关系。通过将用户表示为向量并利用向量搜索,分析人员可以高效地揭示隐藏的连接并检测潜在的威胁、异常或恶意活动,从而提高组织的整体安全态势。

鉴于开发向量搜索项目的多种方式,我们将现在了解开发人员需要了解的主要组件以及开发人员的体验。

开发人员体验

为向量搜索项目选择合适的向量模型是开发人员的重要初步步骤。模型的选择(例如预训练的 BERT 模型或定制训练的模型)取决于项目的具体要求和限制。开发人员需要考虑数据集的规模和性质、预期的搜索性能以及可用于训练和微调模型的资源。应对不同模型进行彻底评估,以确保所选模型在 k 最近邻(kNN)搜索中使用时能够提供相关结果。在 kNN 中,“k”指的是算法在进行预测时考虑的特征空间中最近邻的数量——提供一个用户定义的参数来调整搜索或分类过程的粒度。

一旦选择了合适的向量模型,开发人员需要将模型加载到向量数据库中,如 Elasticsearch。这涉及配置数据库以与所选模型配合工作,并指定必要的设置和参数以使模型能够存储和部署。以下图表展示了工作流程,其中模型从模型注册中心(如 Hugging Face)中提取并加载到向量数据库中:

image.png

该图还显示了传入的数据通过加载的模型生成嵌入,用户基于这些嵌入进行向量搜索查询。

准备数据库以存储向量涉及创建一个具有适当映射和设置的索引,以定义向量的存储和查询方式。以 Elasticsearch 为例,这需要配置一个具有 dense_vector 类型的字段。开发人员需要指定向量的维度、相似度度量以及与其使用案例相关的其他参数,以确保数据库能够高效地处理向量搜索操作。

一旦设置好数据库,如前图所示,开发人员可以通过将模型应用于新数据或现有数据来为数据集生成向量。这个过程包括将文本数据传递通过模型以获得密集的向量表示,这些向量表示捕捉了单词和短语之间的语义和句法关系。

开发人员还需要准备一个系统或流程,以便为新查询生成向量。这通常涉及创建一个 API 或服务,该服务将用户查询作为输入,使用相同的向量模型进行处理,并生成相应的向量表示。然后可以使用该向量在数据库中执行 kNN 或精确匹配搜索,以检索最相关的结果。在 Elasticsearch 中,用户可以将字符串发送到 _infer 端点,指定适当的模型,并在响应中获取一个向量。

在模型部署和向量创建后,对环境进行负载测试是确保向量搜索系统能够处理预期查询负载的重要步骤。需要考虑特定的向量搜索系统资源,如 RAM 和 CPU 线程。开发人员应模拟现实的用户流量和查询模式,以评估系统在各种条件下的性能。这有助于识别潜在的瓶颈和优化区域,确保系统保持高效和响应迅速。

测试搜索结果的相关性对于确保向量搜索系统满足最终用户需求至关重要。开发人员应与领域专家或用户密切合作,评估搜索结果的质量,并根据需要微调模型或搜索参数。这一迭代过程有助于提高向量搜索系统的整体效果。

一旦向量搜索系统投入生产,持续监控是确保查询性能最佳的必要措施。开发人员和运营人员应定期监控系统的性能问题、资源使用情况和潜在错误。他们可能还需要根据用户反馈和不断变化的需求调整搜索参数、更新模型或重新训练系统。这一持续过程有助于保持向量搜索系统的更新和对最终用户的相关性。

Hugging Face

Hugging Face 是一个领先的 AI 研究组织,在现代嵌入和 NLP 模型的开发和广泛应用中发挥了关键作用。通过其在 NLP 领域的开创性工作,Hugging Face 为开发人员、研究人员和企业提供了先进模型、资源和工具,极大地推动了该领域的发展。以下是 Hugging Face 社区主页的预览:

image.png

Hugging Face 的关键产品之一是 Model Hub,这是一个集中存储预训练模型的库,适用于各种 NLP 任务。Model Hub 使开发人员能够轻松发现、下载和微调模型以满足其特定需求。通过提供从 BERT 和 GPT 到 T5 和 RoBERTa 等多种模型,Hugging Face 使开发人员能够更轻松地在其应用程序中实验和集成先进的 NLP 功能,包括向量搜索。Model Hub 还为研究人员和开发人员提供了一个共享自定义模型的平台,促进社区内的协作和知识交流。

Hugging Face 在开发 Transformers 库方面发挥了重要作用。Transformers 库是一个流行的开源 Python 库,用于训练和使用基于 transformer 的模型。Transformers 库提供了一个易于使用的 API,用于处理最先进的 NLP 模型,简化了复杂性,使开发人员能够专注于他们的特定任务。通过提供大量预构建的模型、分词器和实用工具,Transformers 库大大加速了现代 NLP 技术在各种应用中的开发和采用。

Hugging Face 的 Datasets 库是该组织提供的另一个有价值的资源。该库包含超过一千个 NLP 和 ML 任务的数据集,使开发人员和研究人员能够更轻松地访问和使用高质量数据。Datasets 库提供数据预处理、操作和评估工具,简化了为模型训练和微调准备数据的过程。

Hugging Face 开发了一门综合的免费培训课程,涵盖 NLP 的基础知识,并利用 Hugging Face 生态系统内的库和资源。该课程包括使用社区提供的模型的示例,以及微调这些模型以适应特定任务和数据集的指导,对开发人员和爱好者而言是一个无价的资源。

市场格局及其如何加速开发人员体验

近年来,专门针对向量搜索用例的部分和全管理数据库平台激增。如此多的选择使得开发人员可以在个人和组织层面探索、实验和实施向量搜索项目,令人兴奋。以下是一些平台的展示,说明了如今实施向量搜索的便利性。需要注意的是,这里列出的公司并不是市场上的唯一参与者,也不是实施向量搜索的唯一方法。它们只是为了让您一窥当前的市场状况。

Pinecone

Pinecone 是一个专为大规模向量搜索和相似性应用设计的托管向量数据库服务。作为托管服务,它在简化部署和维护方面表现出色,使开发人员可以专注于他们的应用程序,而无需担心基础设施管理。Pinecone 支持多种距离度量,例如余弦相似度和欧几里得距离,并提供内置的去重和过滤支持。然而,作为托管服务,Pinecone 可能不如自托管解决方案那样可定制,其定价结构可能对预算紧张或工作负载不可预测的用户构成限制。

Vespa.ai

Vespa.ai 是一个开源、可扩展的实时搜索引擎,支持向量搜索、文本搜索和结构化数据搜索。Vespa 非常灵活,能够处理从推荐系统到新闻文章搜索的各种用例。它提供了一个表达力强的查询语言,支持自定义排名函数,并允许实时索引。然而,Vespa 的多功能性也可能对某些用户来说是一个弱点,因为与专门设计用于向量搜索的数据库相比,它的设置和配置更加复杂。

Milvus

Milvus 是一个开源向量相似性搜索引擎,构建在 FAISS 和 NMSLIB 等其他流行的开源技术之上。Milvus 旨在实现高性能和可扩展性,支持各种相似性搜索算法和距离度量。它能够处理数十亿个向量,并且可以轻松与 TensorFlow 和 PyTorch 等 ML 框架集成。然而,如果用户对底层技术不熟悉,他们可能会发现 Milvus 的学习曲线较陡。此外,Milvus 主要专注于向量搜索,不支持其他搜索模式,这可能限制其在需要结合向量、文本和结构化数据搜索的某些用例中的适用性。

Weaviate

Weaviate 是一个开源的、基于 GraphQL 的向量搜索引擎,允许用户使用自然语言查询进行数据搜索。Weaviate 的一个优势是其对语义搜索的关注,使其非常适合在理解查询含义重要的应用中使用。它还支持基于模式的数据建模,允许用户定义数据的结构和不同实体之间的关系。然而,Weaviate 对语义搜索(向量或混合搜索)的关注及其对 GraphQL 的依赖,可能会给某些用户带来复杂性,尤其是那些不熟悉这些概念的用户。

Elasticsearch

Elastic.co 的 Elasticsearch v8+ 支持密集向量存储,用于 ANN 和精确匹配搜索,提供了一种在大数据集上进行向量搜索的可扩展方法。与精确匹配的最近邻搜索不同,ANN 以速度换取完美的准确性,使其在处理高维向量时更加高效。Elasticsearch 使用层次导航小世界(HNSW)图 ANN 算法,具有强大的性能,并在行业中广泛使用。基于 Apache Lucene,这一功能可以无缝集成到其他 Elasticsearch 功能中,包括过滤和与 BM25 的混合搜索。然而,Elasticsearch 的复杂性可能对某些用户的设置和配置构成挑战。Lucene 的 dense_vector 数据类型限制也适用于 Elasticsearch,尽管它可以处理数十亿个向量数据集,但在如此大规模下进行 ANN 可能会有不切实际的内存需求。

这些向量数据库中的每一个都有其独特的优点和缺点,取决于具体的用例和需求。Pinecone 在易用性和维护方面表现突出,Vespa 提供多种搜索模式的支持,Milvus 设计用于高性能和可扩展性,Weaviate 专注于具有自然语言能力的语义搜索。最后,Elasticsearch 提供对密集向量和 ANN 搜索的支持,并且其搜索功能无缝集成。

在选择向量数据库时,开发人员应仔细考虑其具体需求,并根据特性、性能和易用性评估每种解决方案。

用例和应用领域

基于 AI 的搜索对大多数用户来说往往令人望而生畏,主要原因在于缺乏标准化——有太多选择可以开始。在本书中,我们认为让从业者了解从哪里开始是有益的,通过针对更成熟和被广泛采用的技术、用例和应用领域,我们可以提供一些指导。

我们将直接探讨搜索的各种可能性,避开 ML、NLP 和深度学习复杂领域的术语。此外,在开始这样的项目之前,有一点需要牢记:保持复杂性、努力和成本之间的平衡。鉴于该领域的新研究技术发展迅速,初始投资可能是短暂的。在本节中,我们将探讨什么是基于 AI 的搜索,并探索不同的技术,如命名实体识别(NER)、情感分析、文本分类、问答(QA)和文本摘要,提供可以运行的实际例子。

基于 AI 的搜索

在过去的三年中,不同行业一直在寻找将其面向客户的搜索体验从关键字搜索升级为语义搜索的方法。除了让用户以自己的思维方式进行搜索外,组织还在寻找基于用户浏览行为个性化其客户体验的方法。

正如之前所讨论的,对于这个挑战的完整解决方案很少,因为这个领域非常活跃且变化迅速,客户通常会使用像 Elastic 这样的特权平台,因为它提供了更高的灵活性。

审视构建基于 AI 的搜索体验的整体过程,可以了解相对于技能、努力和成本的潜在挑战。通常来说,运行这样一个项目有五个高级步骤;我们将在以下子节中详细讨论这些步骤:

  1. 数据收集
  2. 数据表示
  3. 应用 ML
  4. 集成个性化
  5. 将项目投入生产

让我们开始吧。

数据收集

第一步可能是最具挑战性的,因为它将提供一个已知的有趣事件的宇宙,这将设定模型可以学习的边界。这涉及到为应用构建的领域收集和处理足够大量的数据。组织会使用文本,如产品描述、用户相关数据、评论,甚至是客户支持数据。目的是训练数据用于比较和检索。

数据表示

训练数据是一回事,但将其表示为对用户体验有益的模式则是另一回事。使用词嵌入或其他向量化技术将数据表示为高维空间中的向量,是在撰写本文时最有效的方法。主要好处是向量捕获了语义意义和上下文,最终服务于最终用户体验。

举个例子,当电子商务客户搜索“无线耳机”时,组织会将用户查询表示为高维空间中的向量,并使用预训练模型(如 word2vec)将查询中的每个词转换为向量表示。组合结果代表整个查询。这使我们能够将该向量与产品表示生成的向量空间进行比较。以下是一个10维向量,展示了表示的示例:

0.213,−0.178,0.425,−0.067,0.321,0.195,−0.267,0.132,−0.455,−0.0330.213, -0.178, 0.425, -0.067, 0.321, 0.195, -0.267, 0.132, -0.455, -0.0330.213,−0.178,0.425,−0.067,0.321,0.195,−0.267,0.132,−0.455,−0.033

这里有趣的是,查询突然被转换为一个可能性的空间,允许我们比较向量空间,而不是关键字,以确定相似性。产品存在吗?正在搜索的是什么类型的产品?从查询中提取的语义非常有趣。

应用 ML

另一个基于 AI 的搜索体验层次是使用卷积神经网络(CNNs)、循环神经网络(RNNs)或 Transformers 等模型来训练数据。这是在之前向量化的数据上进行的,以学习和理解数据之间的模式和关系。此阶段的目标是准备支持 NLP 的搜索应用。

继续我们关于无线耳机的例子,使用 CNNs 或 RNNs 等模型可以浏览该特定物品可能具有的连接图。在这种情况下,考虑如噪音消除、电池寿命、是否防水、或在做波比运动时是否能固定在耳朵上的特性。

集成个性化

没有个性化,搜索无论比关键字搜索多么智能,都会显得冷冰冰的。个性化允许您根据过去的搜索和类似搜索将上下文集成到搜索中。这些分别称为网络分析和用户分析。

CNNs/RNNs/Transformers 的好处不仅限于我们之前提到的——它们有助于根据用户的过去搜索提供推荐。

投入生产

我们希望告诉您,基于 AI 的搜索解决了从相关性和延迟性能的持续优化角度来看,搜索应用程序所需的来回调整,但事实并非如此。

获得正确数据的关键在于做出正确的决策并限制优化工作量,这意味着不仅需要能够全面监控用户体验,还需要“有趣的事件”来理解搜索质量。

您需要某种程度的 A/B 测试来比较给定状态与搜索引擎新状态(例如调整模型后)的性能。然而,您还需要某种反馈回路来理解结果的相关性。

一旦使用我之前提到的高级步骤构建了基于 AI 的搜索系统,您可以通过引入 NER、情感分析、文本分类、问答和文本摘要等技术进一步增强系统。我们将接下来学习这些技术。

命名实体识别 (NER)

NER 是 NLP 的一个组成部分,它检测和分类非结构化文本中的命名实体。实体可以是名称、品牌、地点或组织,这些都有独特的名称或标识符。

有了这种技术,流入系统的非结构化数据会被分类,这通常是经过上游训练在注释数据上的 ML 模型的结果。在这个过程中,数据会被贴上相应的标签。一旦训练完毕,ML 模型会使用这些标签来学习文本中的模式和关系,从而能够准确地识别和分类新见文本中的命名实体。

我们能想到的一个用例是个人身份信息 (PII),这指的是流入系统的敏感信息而没有任何控制。这些信息可以是姓名、地址、社会安全号码和财务信息。

对于银行而言,无法检测流入数据中的 PII 可能对银行及其客户造成严重后果。例如,如果黑客成功获取银行数据并窃取 PII,他们可以用来进行欺诈和身份盗用,导致客户的财务损失和银行的罚款,因为银行需要遵守相关法规。

因此,金融服务公司使用 NER 来减轻 PII 暴露的风险,在处理过程中对静态数据或流动数据进行处理。结果是对数据进行编辑、加密、掩码或设置正确的访问权限,从而避免与 PII 暴露相关的法律和声誉风险。

情感分析

情感分析是 NLP 的另一种技术,旨在识别和提取非结构化文本中的情感。它通常用于社交网络,例如从推文中提取情感。组织经常使用它来了解与其品牌相关的情感。

然而,尽管情感分析的用途广泛,它对更有针对性的用例也很有用,例如实时分析产品评论或监控新投资的市场情绪。这有助于金融分析师做出更明智的投资决策。

对于今天的公司来说,最糟糕的情况是未能检测到针对其产品或服务的负面情感,这可能导致声誉受损和客户流失。

自然语言 Python 工具包(www.nltk.org/)在这个非常流行的任务中派上了用场。以下代码示例展示了如何实现一个非常简单的情感分析以及可能的结果:

import nltk
nltk.download('vader_lexicon')
from nltk.sentiment import SentimentIntensityAnalyzer
sia = SentimentIntensityAnalyzer()
text = "I really enjoyed the new movie. The acting was great and the plot was engaging."
scores = sia.polarity_scores(text)
print(scores)

您可以在这个笔记本中找到并运行上述代码:github.com/PacktPublis… 代码使用 SentimentIntensityAnalyzer 执行实际的情感分析。极性分数然后返回每种极性的分数(负面、中性和正面),以及从-1(最负面)到+1(最正面)的综合分数。运行笔记本应该会给您以下结果:

{'neg': 0.0, 'neu': 0.522, 'pos': 0.478, 'compound': 0.8777}

该分数表明捕捉到的文本情感非常正面!

文本分类

文本分类是另一种自然语言处理 (NLP) 技术,用于将预定义的类别分配给非结构化数据。一个影响我们所有人的现实例子是垃圾邮件管理,即过滤和标记电子邮件为垃圾邮件或非垃圾邮件的操作。

垃圾邮件可能包含许多使其可疑的信号,例如使用某些关键词、拼写错误、链接等。一旦模型在大量标记数据集上进行训练,电子邮件就会自动分类为垃圾邮件或非垃圾邮件。这带来了许多好处,例如更好的整体电子邮件体验或更高的生产力。

为了简化说明,以下是一个使用在线数据源并显示分类结果及其准确率的示例:

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score

# 加载数据集
newsgroups_train = fetch_20newsgroups(subset='train')
newsgroups_test = fetch_20newsgroups(subset='test')

# 对文本数据进行向量化
vectorizer = CountVectorizer()
X_train = vectorizer.fit_transform(newsgroups_train.data)
X_test = vectorizer.transform(newsgroups_test.data)

# 训练朴素贝叶斯分类器
clf = MultinomialNB()
clf.fit(X_train, newsgroups_train.target)

# 对测试集进行预测
y_pred = clf.predict(X_test)

# 打印准确率和预测类别
print(f"Accuracy: {accuracy_score(newsgroups_test.target, y_pred)}")
print(f"Predicted classes: {y_pred}")

在 Google Colab 笔记本中执行代码应该会给你以下输出:

Accuracy: 0.7728359001593202
Predicted classes: [ 7 11 0 ... 9 3 15]

让我们理解一下上述代码实现了什么: 如前所述,代码使用了一个名为 20 Newsgroup 数据集的在线数据集(链接)。这是一个很好的分类测试平台,因为它包含了约 20,000 个新闻组文档,分为大约 20 个不同的新闻组。该数据集由卡内基梅隆大学的 Ken Lang 组装。

我们使用了 scikit-learn,简称 sklearn,这是一个非常流行且被广泛采用的 Python 开源机器学习库。因为它提供了广泛的监督学习和无监督学习算法,如分类、回归、聚类和降维,我们将其作为本书中的工具。

在此示例中,我们通过 CountVectorizer 函数使用了词频向量化技术,这本质上是将文本数据转换为可用于机器学习的数字格式。

我们在向量化的训练数据上训练了一个朴素贝叶斯分类器。在这个例子中,分类器假设文档中每个词的频率与所有其他词的频率无关。这个假设是为了对新文档的类别进行预测。

结果是对测试数据类别标签的预测。由于我们使用了 20 Newsgroup 数据集,因此预测的类别标签是一个介于 0 到 19 之间的整数,代表 20 个不同的类别。例如,数组中的第一个类别标签是 7,这意味着测试集中第一个实例属于由整数 7 表示的新闻组类别。这里的整数标签是任意的——它们没有任何固有意义。

问答系统 (QA)

问答系统在 2022 年底随着 ChatGPT 的引入变得非常流行。ChatGPT 不仅理解对话的上下文,还可以生成与用户问题相关的响应。它基于 GPT-3 架构预训练的问答模型。

问答系统是 NLP 的一个领域,旨在构建系统以自动回答人类提出的问题。这是一个非常具有挑战性的领域,因为正如我们前面提到的,系统必须理解问题的上下文。此外,问题可能是对话的一部分,并且在给定的会话中可能会交织多个对话。

在大型语言模型 (LLM) 引入之前,基于事实的问答系统的过程需要几个步骤:

  1. 系统需要理解问题并将其分解为主语、宾语和谓语。
  2. 它需要依赖一个庞大的数据库来搜索相关信息,并从检索到的信息中提取和综合答案。

这个过程涉及大量的文本处理、搜索和机器学习算法,如深度学习和神经网络。

让我们从现实生活的角度来看这个问题。医疗行业可能是一个意想不到但很好的选择。它可以帮助医生提供更好的患者护理。例如,当医生遇到一个有复杂健康背景的患者并需要比较处方某种药物与另一种药物的后果时,问答系统可以提供很大的帮助。错误的处方可能会带来严重的副作用,这种技术可以为患者节省时间和痛苦,并为医疗专业人员或组织提供更好的整体服务质量。

以下示例展示了如何使用 Hugging Face Transformers 库中的预训练模型来回答基于给定上下文的问题:

!pip install transformers
from transformers import pipeline

# 加载问答模型
model = pipeline("question-answering", model="distilbert-base-cased-distilled-squad", tokenizer="distilbert-base-cased")

# 定义问题和上下文
question = "What is the capital city of Japan?"
context = "Japan is an island country in East Asia. Located in the Pacific Ocean, it lies to the east of the Sea of Japan, China, North Korea, South Korea and Russia, stretching from the Sea of Okhotsk in the north to the East China Sea and Taiwan in the south. The capital city of Japan is Tokyo."

# 获取答案
result = model(question=question, context=context)

# 打印答案
print(f"Answer: {result['answer']}")

在这里,我们从 transformers 包加载了一个预训练的问答模型,并使用 distilbert-base-cased-distilled-squad 模型,该模型在斯坦福问答数据集(SQuAD)上预训练。你可以在 SQuAD explorer(由 Pranav Rajpurkar、Robin Jia 和 Percy Liang 于 2018 年创建)找到该数据集。

我们定义了一个问题和一个上下文来回答问题,然后将它们传递给模型。

如果你在 Google Colab 笔记本中运行代码,你应该会得到以下关于日本首都的问题的输出:

Answer: Tokyo

文本摘要

文本摘要是另一个具有挑战性的 NLP 任务,因为它需要理解文档的语义并识别出最相关的信息。我们必须在不丢失其意义和准确性的情况下减少文本中的信息。

我们每天使用的一个现实例子是新闻提要。你用来消费新闻的应用会对数据进行摘要以吸引你的注意。在这个过程中有一个真正的挑战,因为新闻提要行业有实时环境的约束,你的滚动体验中的每一毫秒都很重要。在你看到某个新闻的这段短暂时间里,摘要应该激励你点击并进入新闻页面,这几乎肯定包含了许多广告,这些广告是新闻机构获取收入的关键。

以下示例使用 Hugging Face Transformers 库对来自 维基百科 的一段文字进行摘要:

!pip install transformers
from transformers import pipeline

# 定义要摘要的文本
text = ("The blue-throated macaw (Ara glaucogularis) is a species of macaw that is endemic to a small area of north-central Bolivia, "
        "known as the Llanos de Moxos. Recent population and range estimates suggest that about 350 to 400 individuals remain in the wild. "
        "Its demise was brought on by nesting competition, avian predation, and a small native range, exacerbated by indigenous hunting and capture for the pet trade. "
        "Although plentiful in captivity, it is critically endangered in the wild and protected by trading prohibitions. In 2014, the species was designated a natural patrimony of Bolivia. "
        "This blue-throated macaw in flight was photographed at Loro Parque, on the Spanish island of Tenerife in the Canary Islands.")

# 实例化摘要管道
summarizer = pipeline("summarization")

# 生成文本摘要
summary = summarizer(text, max_length=100, min_length=30, do_sample=False)[0]["summary_text"]

# 打印摘要
print(summary)

使用 summarizer 和 Hugging Face 的 DistilBert 模型,并传递最大和最小长度参数,得到以下输出:

The blue-throated macaw (Ara glaucogularis) is a species of macaw that is endemic to a small area of north-central Bolivia, known as the Llanos de Moxos . Recent population and range estimates suggest that about 350 to 400 individuals remain in the wild.

你手边有许多可用的模型数量令人印象深刻。Hugging Face 等社区通过使你能够运行复杂的 NLP 任务而无需对模型进行微调,加速了你的生产力。

此时,你应该对基于 AI 的搜索有一个良好的掌握,对如何使用可用的技术有一个很好的理解,甚至可以立即将一些学习整合到你的应用代码中。

Elastic 在这个领域中的作用是什么?

Elastic 在这里扮演着什么角色呢?你可以利用 Elastic 的多种方式,包括 Elasticsearch。Elasticsearch 是一个分布式且高度可扩展的数据存储。它的特长在于信息检索。在笔记本中运行上述代码一回事,但要在规模上使其运作并让数百、数千或数百万用户访问,那是另一回事。

此外,由于训练需要算法能够访问大量数据并以规模进行快速访问,所以训练可能会很长。很少有数据存储能够同时处理结构化和非结构化数据,管理各种数据类型并支持数据摄入和搜索的可扩展性。

Elasticsearch 是一个独特的选择,不仅因为其技术特性,还因为其充满活力的社区和广泛的采用。正如前文所述,基于 AI 的搜索应用领域正在迅速变化,因此在这个过程中保持一定的一致性是一种奢侈。像 Elasticsearch 和 Hugging Face 这样的技术和社区使用户能够在这个过程中有一个安全网和一定的韧性。

我们喜欢将 Elasticsearch 描述为一个搜索和分析引擎。Elasticsearch 的分析功能在这里起着至关重要的作用,因为它允许你对数据执行复杂的查询和聚合。

然而,Elasticsearch 的可扩展性是其最大的优点。在 2021 年,Elastic 引入了索引向量的功能。这意味着 Elasticsearch 本地化理解什么是向量,并且针对这一任务进行了优化,不让用户管理和迫使数据存储处理不支持的数据类型。

除了搜索,我们还想打开你的思路,看看如何将向量搜索应用于其他用例,比如可观察性和网络安全。

可观察性和网络安全概述

向量不仅在 NLP 等任务中很重要,而且在可观察性和网络安全等领域也非常重要。它们允许有效地处理和分析大量数据。

让我们暂停一下,思考一下当前可观察性的状态。今天,运维团队在他们的工具包中有几种工具可以加速调查过程,例如异常检测,主要依赖于无监督学习。现在,文本分类对于诸如日志等数据,数据相当不结构化且需要分组的信号来说,可能会带来很大的好处。结果是更好的分析师体验和加速的根本原因分析。现在,让我们思考一下未来的状态会是什么样子。通过向量化数据——换句话说,将数据点转换为向量——更容易识别模式和异常。

在网络安全领域,向量可用于表示和分析多种类型的数据,例如网络流量、恶意软件签名和用户行为。

我们将分别在第 7 和第 8 章讨论可观察性和网络安全,并看看你可以在自己的环境中使用和应用的实际示例,之后我们将它们扩展到其他适当的地方。

总结

本书将引导你通过实际的、实用的例子,满足你的需求,从构建一个基于向量的搜索应用程序到将向量应用于可观察性和安全领域。它面向广泛的从业者,但更侧重于处理特定挑战的运维团队,他们可以充分利用向量和 Elastic 的结合。

在本章中,你了解了 NLP、向量搜索、基于 AI 的搜索及其相关技术的关键方面。你还展示了一些可以运行和适应于你的业务应用的代码片段。最后,你对 Elasticsearch 在这一背景下的角色有了高层次的理解,以及如何将向量搜索应用于搜索以外的用例,例如可观察性。

在接下来的章节中,我们将开始探讨 Elasticsearch 中的向量。我们将探索当前的搜索方法论,并看看向量是如何增强和提升它的。此外,我们还将深入研究 Elasticsearch 中向量实现的技术细节