使用实体解析 与 Elasticsearch 与 LLMs ,第 2 部分:使用 LLM 判断和语义搜索匹配实体

0 阅读1分钟

作者:来自 Elastic Jessica Moszkowicz

在 Elasticsearch 中使用语义搜索和透明的 LLM 判断 进行实体解析。

Elasticsearch与行业领先的 Gen AI 工具和提供商具有原生集成。欢迎查看我们的网络研讨会,了解如何超越 RAG 基础,或使用 Elastic 向量数据库构建可用于生产的应用

为了为你的使用场景构建最佳搜索解决方案,现在即可开始免费 cloud 试用,或立即在你的本地机器上试用 Elastic。

第 1 部分中,我们准备了观察列表并提取了实体提及。现在,我们已准备好回答一个困难的问题:一个提及实际上指向哪个实体?让我们回到本系列第一篇博客中的示例,它说明了为什么我们需要实体解析:“The Swift update is here!” 想象一下,这个标题伴随着更多上下文:

  1. The new Swift update is here! Developers are eager to try out the new features.
  2. The new Swift update is here! The new album will drop next month.

有了这些额外的上下文,我们就应该能够将 “Swift” 解析为正确的实体。

上一篇文章中,我们设置了观察列表,并为实体添加了额外的上下文。结合上面的示例,我们至少需要在列表中包含以下两个实体:Taylor Swift 和 Swift 编程语言。我们还介绍了如何从文本中提取实体提及。这两个示例都会提取 “Swift”。在这些要素就位之后,包括丰富后的观察列表和提取出的实体,我们终于可以介绍本文的主角:实体匹配。

请记住:这是一个教学用原型,旨在讲解实体匹配的概念。生产系统可能会使用不同的大语言模型(LLMs)、自定义匹配规则、专用判断流水线,或结合多种匹配策略的集成方法。

问题:为什么匹配很难

人类语言是一件了不起的事。它最有趣的特性之一是无尽的创造力。我们可以生成并理解无限数量的新句子。那么,在实体解析中精确匹配罕见也就不足为奇了吧?作者在可能的情况下会力求创造性。如果每次提及实体都必须写出和读出完整名称,那将非常乏味。因此,虽然精确匹配很容易,但现实是我们需要一种更复杂的实体解析方法:它必须足够稳健,以应对人类作者至少部分无尽的创造力。这就是为什么我们将问题分为两个步骤:使用 Elasticsearch 大规模检索可能的候选实体,然后使用 LLM 判断这些候选实体是否真正指向同一个真实世界的实体。

解决方案:三步匹配与透明的 LLM 判断

我们正处于计算使用方式的范式转变中。正如互联网的兴起将我们从本地计算带入全球互联网络一样,生成式 AI (GenAI) 正从根本上改变内容、代码和信息的创建方式。实际上,伴随本系列的教学原型几乎完全是通过 LLM 在作者精心提示下进行 “vibe 编码” 的。这并不意味着 LLM 已经或将达到人类语言固有的生产力,但这确实意味着我们现在拥有一个强大的资源来帮助进行实体解析。

我们在 GenAI 中常用的一个模式是倒数排序增强生成 (RAG)。这里的检索指的是检索实体候选(而非生成答案),LLM 则严格用于匹配评估和解释。虽然我们可以让 LLM 帮助完成端到端的实体解析,但这种方法在时间和成本上都很高。RAG 通过提供更高效的上下文给 LLM 帮助 LLM 高效完成实体解析。

对于 RAG 的检索部分,我们再次使用 Elasticsearch。我们首先使用精确匹配、别名匹配 和 混合搜索(结合 keyword 和 语义搜索)找到潜在匹配。一旦找到这些潜在匹配,我们将它们发送给 LLM 进行判断。LLM 充当最终匹配评估者。我们还让 LLM 解释其推理,这是与其他实体解析系统的重要区别。有了这些解释,实体解析不再是黑箱;我们可以亲自看到为什么匹配是合理的。

关键概念:三步匹配、混合搜索和透明的 LLM 判断

**什么是三步匹配?**在这个项目开始时,我们假设 semantic search 将是系统的关键部分,但并非每个匹配都需要如此复杂的搜索。为了高效地找到匹配,我们采用渐进式方法。首先,我们使用 keyword search 检查精确匹配。如果找到匹配,我们的工作就完成,可以继续下一步。如果精确匹配失败,我们转向别名匹配。在原型中,别名匹配也使用 keyword 的精确匹配,为了简化。在生产中,你可能会扩展这一步,使用规范化、音译规则、模糊匹配或精心维护的别名表。如果在前两步中仍未找到潜在匹配,那么就需要通过 Elasticsearch 的 hybrid search 和 倒数排序融合 (RRF) 引入 semantic search。

**什么是混合搜索?**在 Elasticsearch 中,我们可以使用 semantic search 找到考虑上下文的有意义匹配。Elasticsearch 被广泛用于向量搜索和混合检索。语义相似性 对理解意义很强,但它不能替代结构化过滤(例如按时间范围、位置 或 标识符),而且当存在精确匹配时,通常也不必要。Elasticsearch 以词汇搜索闻名,它非常适合语义搜索不适用的任务。为了充分利用两种方法,我们在单个 hybrid query 中同时使用词汇搜索和语义搜索,然后使用 RRF 合并结果,找到最可能的匹配。在原型中,前两个结果成为可以发送给 LLM 判断的潜在匹配。

**为什么使用 LLM 判断?**LLM 的判断和解释让我们的系统能够透明地处理歧义和上下文。这对于像 “the president” 这样的情况至关重要,它可能根据上下文指向多个实体,同时也使昵称和文化差异在系统中有效。最后,当我们考虑关键任务,如从制裁名单中识别实体时,我们需要知道为什么匹配被接受,以便信任系统。关键是,LLM 并不搜索整个语料库;它只评估 Elasticsearch 返回的小集合候选。

现实世界结果:使用 LLM 推理进行匹配

对于任何自然语言处理任务,一个主要挑战是创建黄金文档,即告诉我们预期结果的 “答案键”。没有它,几乎不可能判断系统在任务上的表现,但创建这样的文档可能是一个繁琐的过程。对于实体解析原型,我们再次使用 GenAI 来帮助设置可以用于测试的数据。

我们首先定义了几种挑战类型,例如昵称和音译,然后让 LLM 创建一个分层数据集集合,数据集会逐渐增大并对系统提出更多挑战。数据集的创建比预期更复杂。LLM 有强烈的 “作弊” 倾向,会让正确答案过于容易获得。例如,其中一种挑战类型关注语义上下文。这类挑战包括将 “Russian author” 解析为 “Leo Tolstoy”。LLM 错误地将 “Russian author” 作为 “Leo Tolstoy” 的别名,这就消除了使用 hybrid search 找到匹配的必要性。

经过多次重构以修复此类问题后,我们有了五个数据集层次可供使用。第 1 – 4 层逐渐增大,包含更多挑战类型。第 5 层是 “终极挑战” 数据集,由所有挑战类型中最棘手的示例组成。所有测试数据均可在 comprehensive evaluation 目录中获取。

为了评估我们的基于 prompt 的实体解析方法,我们将注意力集中在第 4 层数据集。一个重要说明是,评估是以受控实验形式进行的,以便专注于实体匹配质量。观察列表数据已预先丰富了上下文,并提前从文章中提取了实体。这确保评估专注于匹配,而不是提取准确性。这使匹配质量得以隔离;端到端性能还会依赖于提取召回率和丰富质量。

评估数据集

第 4 层评估数据集提供了对系统能力的全面测试:[1]

  • 观察列表实体:66 个实体,涵盖多种类型(people、organizations、locations)。
  • 测试文章:69 篇文章,涵盖现实世界的实体解析场景。
  • 预期匹配:所有文章中共有 206 个预期实体匹配。
  • 挑战类型:15 种不同的挑战类型,用于测试实体解析的各个方面。

数据集中包含的挑战类型有:

  • 昵称: "Bob Smith" → "Robert Smith"(7 篇文章)
  • 头衔和尊称: "Dr. Sarah Williams" → "Sarah Williams"(5 篇文章)
  • 语义上下文: "Russian author" → "Leo Tolstoy"(8 篇文章)
  • 多语言名称:处理不同书写体系的名称(6 篇文章)
  • 商业实体:公司名称变体(7 篇文章)
  • 高管引用: "Microsoft CEO" → "Satya Nadella"(5 篇文章)
  • 政治领导人:基于头衔的引用(5 篇文章)
  • 首字母: "J. Smith" → "John Smith"(3 篇文章)
  • 姓名顺序变化:不同的姓名排序规则(3 篇文章)
  • 截断姓名:部分姓名匹配(3 篇文章)
  • 姓名拆分:文本中拆分的姓名(3 篇文章)
  • 缺失空格/连字符:格式变化(2 篇文章)
  • 音译:跨书写体系的名称匹配(2 篇文章)
  • 组合挑战:一篇文章中包含多种挑战(6 篇文章)
  • 复杂商业:层级业务关系(5 篇文章)

让我们看看基于 prompt 的实体解析表现如何。

整体表现

结果显示,LLM 驱动的匹配评估具有很大潜力,但也揭示了显著的可靠性问题。由于每个候选对都必须由 LLM 评估,即使检索效果良好,结构化输出失败也可能抑制接受率 和 召回率。

指标
Precision83.8%
Recall62.6%
F1 score71.7%
总匹配数344
LLM 接受率44.8%
错误率30.2%

错误率问题

回想一下,在原型中我们采取的第一步是使用 Elasticsearch 创建潜在匹配对。每一个潜在匹配都需要由 LLM 评估。为了高效处理所有这些匹配,我们将 LLM 调用批量处理。这可以降低 API 成本和延迟,但也增加了输出中生成格式错误 JSON 的风险。随着批量大小增加,JSON 变得更长、更复杂,使得 LLM 更可能生成无效 JSON。这就是 30% 错误率的来源。在评估中,我们使用每次请求五个匹配的批量大小。即使使用这个保守的批量大小,我们仍然会看到 JSON 解析失败,这显著影响了评估结果。

接下来:优化 LLM 集成

现在我们已经使用语义搜索和 LLM 判断完成了实体匹配,拥有了完整的实体解析管道。然而,这种方法引入了一种新的失败模式:当模型的判断正确,但其输出不可用时。我们可以优化 LLM 集成,以提高可靠性和成本效率。在下一篇文章中,我们将探讨如何使用 function calling 获取结构化输出,这可以提供保证的结构和类型安全,同时减少错误和成本。

自己尝试

想要看到实体匹配的实际操作吗?查看 Entity Matching notebook,获得完整的演示,包括真实实现、详细解释 和 实操示例。该 notebook 将向你展示如何使用三步搜索、带 RRF 的 hybrid search,以及 LLM 驱动的推理判断 来匹配实体。

请记住:这是一个教学原型,旨在讲解概念。在构建生产系统时,需要考虑额外因素,如模型选择、成本优化、延迟要求、质量验证、错误处理 和 监控,这些在该学习型原型中未涵盖。

说明

这些数据集是合成的、为教学设计;它们近似真实挑战,但不代表任何单一生产领域。

原文:www.elastic.co/search-labs…