将嵌入映射到 Elasticsearch 字段类型:semantic_text、dense_vector、sparse_vector

讨论如何以及何时使用 semantic_text、dense_vector 或 sparse_vector,以及它们与嵌入生成的关系。

从向量搜索到强大的 REST API,Elasticsearch 为开发人员提供了最全面的搜索工具包。探索 GitHub 上的示例笔记本,尝试新事物。您也可以立即开始免费试用在本地运行 Elasticsearch

多年来,利用嵌入式技术提高信息检索相关性和准确性的做法有了长足的发展。Elasticsearch 等工具已经通过密集向量、稀疏向量和语义文本等专门字段类型支持这类数据。不过,要取得良好的效果,必须了解如何将嵌入正确映射到可用的 Elasticsearch 字段类型:semantic_textdense_vectorsparse_vector

在本文中,我们将讨论这些字段类型、每种类型的使用时间,以及它们与嵌入生成和使用策略的关系,包括在索引和查询过程中的关系。

密集矢量类型

Elasticsearch 中的dense_vector 字段类型用于存储密集向量,密集向量是文本、图像和音频等数据的数字表示,其中几乎所有维度都是相关的。这些向量是使用 OpenAI、Cohere 或 Hugging Face 等平台提供的嵌入模型生成的,旨在捕捉数据的整体语义,即使数据与其他文档不共享确切术语。

在 Elasticsearch 中,稠密向量的维度最多可达 4096,具体取决于所使用的模型。例如,all-MiniLM-L6-v2 模型生成的向量有 384 个维度,而 OpenAI 的 text-embedding-ada-002 模型生成的向量有 1536 个维度。

dense_vector 字段通常被用作存储这类嵌入的默认类型,当需要更多控制时,例如使用预生成向量、应用自定义相似性函数或与外部模型集成。

何时以及为何使用 dense_vector 类型?

密集向量非常适合捕捉句子、段落或整个文档之间的语义相似性。当目标是比较文本的整体含义时,即使它们不共享相同的术语,它们也能很好地发挥作用。

密集矢量字段非常适合已经拥有外部嵌入生成管道,使用 OpenAI、Cohere 或 Hugging Face 等平台提供的模型,并且只想手动存储和查询这些矢量的情况。这种类型的字段与嵌入模型具有很高的兼容性,在生成和查询方面具有充分的灵活性,允许您控制矢量的生成、索引和搜索使用方式。

此外,它还支持不同形式的语义搜索,在需要调整排名逻辑的情况下,可使用 k-NN 或 script_score 等查询。这些可能性使密集矢量成为 RAG(检索增强生成)、推荐系统和基于相似性的个性化搜索等应用的理想选择。

最后,该字段允许您自定义相关性逻辑,使用cosineSimilaritydotProductl2norm 等函数,根据使用情况的需要调整排名。

对于需要灵活性、定制化和与上述高级用例兼容的用户来说,密集矢量仍然是最佳选择。

如何使用密集矢量类型查询?

对定义为dense_vector 的字段的搜索使用 k 近邻查询。该查询负责查找密集向量与查询向量最接近的文档。下面举例说明如何将 k-NN 查询应用于密集向量场:

除 k-NN 查询外,如果需要自定义文档评分,也可以使用 script_score 查询,将其与余弦相似度、点积或 l2norm 等向量比较函数相结合,以更可控的方式计算相关性。请看示例:

如果您想深入了解,我建议您阅读《如何在 Elasticsearch 中设置向量搜索》一文。

稀疏矢量类型

sparse_vector 字段类型用于存储稀疏矢量,稀疏矢量是一种数值表示,其中大部分值为零,只有少数项具有重要权重。这种类型的向量在基于术语的模型中很常见,如 SPLADE 或 ELSER(弹性学习稀疏 EncodeR)。

何时以及为何使用稀疏向量类型?

当你需要更精确的词汇搜索而又不牺牲语义智能时,稀疏向量是理想的选择。它们将文本表示为标记/值对,只突出显示最相关的术语和相关权重,从而提供清晰度、控制和效率。

这类字段在根据术语生成向量时特别有用,例如在 ELSER 或 SPLADE 模型中,这些模型会根据每个标记在文本中的相对重要性为其分配不同的权重。

如果您想控制查询中特定词语的影响,稀疏向量类型允许您手动调整词语的权重,以优化结果的排名。

它的主要优点包括:搜索透明,因为可以清楚地了解为什么某个文件被认为是相关的;存储高效,因为只保存非零值的标记,而不像密集向量那样存储所有维度。

此外,稀疏向量是混合搜索策略的理想补充,甚至可以与密集向量相结合,将词汇精确性与语义理解相结合。

如何使用稀疏向量类型查询?

sparse_vector 查询可让您根据标记/值格式的查询向量搜索文档。请看下面的查询示例:

如果希望使用训练有素的模型,可以使用推理端点自动将查询文本转换为稀疏向量:

要进一步探讨这一主题,我建议阅读《用训练有素的 ML 模型理解稀疏向量嵌入》。

语义文本类型

semantic_text 字段类型是在 Elasticsearch 中使用语义搜索的最简单、最直接的方法。它通过一个推理端点,在索引和查询时自动处理嵌入生成。这意味着你不必担心手动生成或存储矢量的问题。

何时以及为何使用语义文本?

semantic_text 字段非常适合那些希望以最少的技术投入、无需手动处理矢量即可开始工作的用户。该字段可自动执行嵌入生成和矢量搜索映射等步骤,使设置更快更方便。

如果您重视简单性和抽象性,就应该考虑使用semantic_text ,因为它消除了手动配置映射、嵌入生成和摄取管道的复杂性。只需选择推理模型,其余的就交给 Elasticsearch 处理。

其主要优势包括在索引和查询过程中自动生成嵌入,以及可随时使用的映射,该映射经过预先配置,可支持选定的推理模型。

此外,该领域还提供对自动分割长文本(文本分块)的本地支持,可将大文本分割成较小的段落,每个段落都有自己的嵌入,从而提高搜索精度。这极大地提高了工作效率,尤其是对于那些希望在不处理语义搜索底层工程的情况下快速实现价值的团队而言。

不过,虽然semantic_text 提供了速度和简便性,但这种方法也有一些局限性。它允许使用市场标准模型,只要这些模型可以作为 Elasticsearch 中的推理端点。但它不支持外部生成的嵌入,而dense_vector 字段则可以做到这一点。

如果您需要对向量的生成方式进行更多控制,希望使用自己的嵌入,或需要将多个字段结合起来以实现高级策略,dense_vectorsparse_vector 字段可提供更多自定义或特定领域方案所需的灵活性。

如何使用语义文本类型查询

semantic_text 之前,必须根据嵌入类型(密集或稀疏)使用不同的查询。sparse_vector 查询用于稀疏字段,而dense_vector 字段则需要 KNN 查询。

使用语义文本类型时,搜索是通过语义查询进行的,查询会自动生成查询向量,并与索引文档的嵌入进行比较。semantic_text 类型允许您定义用于嵌入查询的推理端点,但如果未指定任何推理端点,则将对查询应用索引过程中使用的相同端点。

要了解更多信息,我建议您阅读 Elasticsearch 新语义_文本映射这 篇文章 :简化语义搜索

结论

在选择如何在 Elasticsearch 中映射嵌入时,必须了解要如何生成向量以及需要对向量进行何种程度的控制。如果您追求简单,语义文本字段可实现自动和可扩展的语义搜索,使其成为许多初始用例的理想选择。当需要更多控制、微调性能或与自定义模型集成时,密集矢量和稀疏矢量场可提供必要的灵活性。

理想的字段类型取决于您的使用案例、可用基础设施以及机器学习堆栈的成熟度。最重要的是,Elastic 提供了用于构建现代化和高度适应性搜索系统的工具。

参考资料

相关内容

准备好打造最先进的搜索体验了吗?

足够先进的搜索不是一个人的努力就能实现的。Elasticsearch 由数据科学家、ML 操作员、工程师以及更多和您一样对搜索充满热情的人提供支持。让我们联系起来,共同打造神奇的搜索体验,让您获得想要的结果。

亲自试用