在 第 1 部分中,我们准备了观察清单并提取了实体提及。现在我们准备回答那个难题:一个提及实际指的是哪个实体?让我们回到本系列第一篇博客中的例子,该例子说明了我们为何需要实体解析:“Swift 更新来了!”想象一下,这个标题伴随着一些上下文:
- 新的 Swift 更新来了!开发人员迫不及待地想要尝试新功能。
- 新的 Swift 更新来了!新专辑将于下个月发布。
有了这些增加的上下文,我们应该能够将名称“Swift”解析到正确的实体。
在上一篇文章中,我们设置了观察清单,并用额外的上下文丰富了实体信息。看上面的例子,我们需要在清单中至少包含以下两个实体:Taylor Swift 和 Swift 编程语言。我们还介绍了如何从文本中提取实体提及。这两个例子都能提取“Swift”。有了这些要素——丰富的观察清单和提取出的实体——我们终于可以介绍本次的主角了:实体匹配。
请记住:这是一个教育原型,旨在教授实体匹配概念。生产系统可能会使用不同的大型语言模型 (LLM)、自定义匹配规则、专门的判断管道或结合多种匹配策略的集成方法。
问题:为何匹配如此困难
人类语言是一种非凡的事物。它最有趣的特性之一是其无限的创造力。我们可以生成并理解无数的新句子。那么,在实体解析中完全精确的匹配极为罕见,这还奇怪吗?作者们在可能的情况下都力求创新。如果每次提到某个实体时,我们都必须书写和阅读完整名称,那将会变得非常乏味。因此,尽管精确匹配很简单,但现实情况是我们需要一种更复杂的方法来进行实体解析:这种方法必须足够强大,以处理人类作者无限创造力中的至少一部分挑战。这就是我们将问题分解为两个步骤的原因:使用 Elasticsearch 大规模检索可能的候选实体,然后使用 LLM 来判断这些候选实体是否真正指向同一个现实世界中的实体。
解决方案:三步匹配与透明的 LLM 判断
我们正处于使用计算机方式的范式转变之中。正如互联网的兴起将我们从本地计算带入全球互联网络一样,生成式 AI (GenAI) 正在从根本上改变内容、代码和信息的创建方式。事实上,伴随本系列的教育型原型几乎完全是作者通过精心设计提示词,使用 LLM “vibe coded” 出来的。这并不是说 LLM 已经或将要达到人类语言所固有的那种生产力,但这确实意味着我们现在拥有一个强大的资源来帮助进行实体解析。
我们在使用生成式 AI 时的一个常见模式是检索增强生成 (RAG)。在这里,检索检索意味着检索实体候选(而不是生成答案),LLM 严格用于匹配评估和解释。虽然我们可以要求 LLM 帮助我们进行端到端的实体解析,但这在时间和金钱上都是一种成本高昂的方法。RAG 通过使用更高效的方式为 LLM 提供上下文,从而帮助 LLM 完成工作,进而使 LLM 能够有效地协助实体解析。
对于 RAG 中的检索部分,我们再次求助于 Elasticsearch。我们首先使用精确匹配、别名匹配以及结合了关键词和语义搜索的混合搜索来寻找潜在的匹配项。一旦找到这些潜在匹配项,我们就将它们发送给 LLM 进行判断。LLM 充当最终的匹配评估器。我们还让 LLM 解释其推理过程,这是与其他实体解析系统的一个重要区别。没有这些解释,实体解析就是一个黑匣子;有了它们,我们可以亲眼看到为什么某个匹配是合理的。
关键概念:三步匹配、混合搜索和透明 LLM 判断
什么是三步匹配?在项目开始时,我们假设语义搜索将是系统的一个关键部分,但并非每个匹配都需要如此复杂的搜索。为了有效地找到匹配项,我们采用了渐进式的方法。首先,我们使用关键词搜索检查完全精确的匹配。如果找到这样的匹配,我们的工作就完成了,可以继续下一个。如果精确匹配失败,我们转向别名匹配。为简化起见,在原型中,别名匹配也是使用关键词进行精确匹配完成的。在生产环境中,您可能会通过标准化、音译规则、模糊匹配或精心管理的别名表来扩展这一步。如果在前两步之后仍未找到潜在的匹配项,那么是时候通过 Elasticsearch 的混合搜索(结合了倒数排序融合)来引入语义搜索了。
什么是混合搜索?在 Elasticsearch 中,我们可以使用语义搜索来找到将上下文考虑在内的有意义的匹配。Elasticsearch 广泛用于向量搜索和混合检索。语义相似性对于理解含义非常强大,但它不能替代结构化过滤(例如,按时间范围、位置或标识符过滤),并且在存在精确匹配时通常是不必要的。Elasticsearch 以其词汇搜索而闻名,这在不适合语义搜索的任务中表现出色。为了充分利用这两种方法,我们在单个混合查询中将词汇搜索与语义搜索结合使用。然后,我们使用 RRF 合并结果,以找到最可能的匹配项。在原型中,排名前两位的结果成为可以发送给 LLM 进行判断的潜在匹配项。
为什么需要 LLM 判断?LLM 的判断和解释使得我们的系统能够透明地处理歧义和上下文。这对于像“the president”这样可能根据上下文指代多个实体的情况至关重要,但它也使昵称和文化差异等情况在系统中能够很好地处理。最后,当我们考虑关键任务,例如识别制裁名单中的实体时,我们需要知道匹配被接受的原因,才能信任该系统。至关重要的是,LLM 并不搜索整个语料库;它只评估 Elasticsearch 返回的那一小部分候选集。
实际结果:通过 LLM 推理进行匹配
任何自然语言处理任务的一个主要挑战是创建一份黄金文档,一份告诉我们预期结果是什么的“答案”。没有它,几乎不可能判断一个系统在某个任务上表现如何,但创建这样一份文档可能是一个费力且费时的过程。对于实体解析原型,我们再次求助于生成式 AI 来帮助建立我们可以用来测试的数据。
我们首先定义了几种挑战类型,例如昵称和音译,然后要求 LLM 创建一个分层的数据集集合,这些数据集将逐渐变大,对系统来说也更具挑战性。数据集的创建并不像人们希望的那样简单。LLM 有一种强烈的“作弊”倾向,使得获取正确答案变得过于容易。例如,其中一种挑战类型侧重于语义上下文。这种类型包括将“Russian author”解读为“Leo Tolstoy”。LLM 错误地将“Russian author”作为“Leo Tolstoy”的一个别名,这就没有必要通过混合搜索来寻找匹配项了。
在进行了几次重构以修复此类问题后,我们有了五个可供使用的数据集层级。第 1-4 层规模逐渐增大,包含的挑战类型也更多。第 5 层是“终极挑战”数据集,由所有挑战类型中最棘手的例子组成。所有测试数据都可以在全面评估目录中找到。
为了评估我们基于提示的实体解析方法,我们将注意力集中在第 4 层数据集上。一个重要的说明是,评估是作为受控实验进行的,这样我们可以专注于实体匹配的质量。观察清单数据预先丰富了上下文,并且实体是提前从文章中提取出来的。这确保了评估的重点是匹配而非提取的准确性。这将匹配质量孤立出来;端到端的性能还将额外取决于提取的召回率和丰富数据的质量。
评估数据集
第 4 层评估数据集对系统的能力提供了一个全面的测试:[1]
- 观察清单实体:跨不同类型(人物、组织、地点)的 66 个实体。
- 测试文章:69 篇涵盖现实世界实体解析场景的文章。
- 预期匹配:所有文章中预期的 206 个实体匹配。
- 挑战类型:测试实体解析各个方面的 15 种不同挑战类型。
数据集中包含的挑战类型有:
- 昵称:“Bob Smith” → “Robert Smith”(七篇文章)。
- 头衔和尊称: “Dr. Sarah Williams” → “Sarah Williams”(五篇文章)。
- 语义上下文:“Russian author” → “Leo Tolstoy”(八篇文章)。
- 多语言名字:处理不同书写系统中的名称(六篇文章)。
- 商业实体: 公司名称变体(七篇文章)。
- 高管引用:“Microsoft CEO”→“Satya Nadella”(五篇文章)。
- 政治领导人:基于头衔的引用(五篇文章)。
- 名称首字母:“J.Smith” → “John Smith”(三篇文章)。
- 名称顺序变体:不同的名称顺序惯例(三篇文章)。
- 名称截断:部分名称匹配(三篇文章)。
- 名称拆分:名称在文本中拆分(三篇文章)。
- 缺少空格/连字符:格式变体(两篇文章)。
- 音译:跨书写系统的名称匹配(两篇文章)。
- 组合挑战:一篇文章中包含多个挑战(共六篇文章)。
- 复杂商业关系:分层商业关系(五篇文章)。
让我们看看基于提示的实体解析表现如何。
整体性能
结果显示,由 LLM 驱动的匹配评估前景广阔,但也揭示了一个显著的可靠性问题。因为每个候选对都必须由 LLM 进行评估,结构化输出的失败可能会抑制接受率和召回率,即使检索环节工作正常。
| 指标 | 值 |
|---|---|
| 精确率 | 83.8% |
| 召回 | 62.6% |
| F1 分数 | 71.7% |
| 找到的总匹配数 | 344 |
| LLM 接受率 | 44.8% |
| 错误率 | 30.2% |
错误率问题
回顾一下,我们在原型中采取的第一步是使用 Elasticsearch 创建潜在的匹配对。每个这样的潜在匹配都需要由 LLM 进行评估。为了高效地处理所有这些匹配项,我们将 LLM 调用批量组合在一起。这降低了 API 成本和延迟,但也增加了在输出中得到格式错误 JSON 的风险。随着批量大小的增加,JSON 变得更长、更复杂,使得 LLM 更有可能生成无效的 JSON。这就是 30% 错误率的来源。在评估中,我们每个请求使用 5 个匹配项的批量大小。即使采用这个保守的批量大小,我们仍然遇到 JSON 解析失败的情况,这显著地影响了评估结果。
下一步:优化 LLM 集成
现在,我们已经使用语义搜索和 LLM 判断匹配了实体,我们拥有了一个完整的实体解析管道。然而,这种方法引入了一种新的故障模式:当模型的判断正确,但其输出却不可用时。我们可以优化 LLM 集成以获得更好的可靠性和成本效益。在下一篇文章中,我们将探讨如何使用函数调用来实现结构化输出,这可以在减少错误和成本的同时,提供有保障的结构和类型安全。
亲自试用
想亲眼看看实体匹配是如何运作的吗?请查看实体匹配笔记本,它通过实际实现、详细解释和动手示例,提供了完整的实践指南。该笔记本精确地向您展示了如何使用三步搜索、带有 RRF 的混合搜索以及由 LLM 驱动的带推理的判断来匹配实体。
请记住:这是一个教育原型,旨在教授这些概念。在构建生产系统时,需要考虑额外的因素,如模型选择、成本优化、延迟要求、质量验证、错误处理和监控等,而这些在本学习重点的原型中并未涵盖。
备注
- 这些数据集是合成的,专为教育目的设计;它们模拟了真实的挑战,但不代表任何单一的生产环境领域。




