我们现在已经看到智能实体解析通过两种方式实现。两种方法都以相同的方式开始:实体准备和提取,然后使用 Elasticsearch 检索候选对象。然后,我们通过基于提示的 JSON 生成或函数调用,使用大语言模型 (LLM) 对这些候选对象进行评估,并要求该模型对其判断做出透明的解释。
正如我们在之前的帖子中看到的,函数调用提供的一致性不仅仅是一种不错的优化手段,它还是至关重要的。一旦我们从评估循环中消除了结构性错误,标准场景(例如第 4 层数据集中的场景)的结果便有了显著提升。
然而,有一个显而易见的问题需要回答:
当情况变得真正复杂时,这种方法还管用吗?
现实中的实体解析很少因简单情况而失败。当名称跨越语言、文化、书写系统、时间段和组织边界时,它就会失效。当人们用头衔而非名字称呼,公司更改名称,音译不一致,且尝试仅凭上下文(而非拼写)提及现实实体时,这种方法就失败了。
因此,在本系列的最后一篇文章中,我们对该系统进行了所谓的终极挑战。
是什么让这成为终极挑战?
在之前的评估中,我们使用越来越复杂的数据集对该系统进行了测试。当我们达到上一篇帖子中所讨论的第 4 层时,我们已经要应对昵称、头衔、多语言名称以及语义引用的混合情况了。这些测试表明,架构本身是可靠的,但可靠性问题,特别是不规范的 JSON 格式抑制了召回率。
有了函数调用,我们终于有了稳定的基础。这让我们有机会提出一个更有趣的问题:
一个统一的管道能否同时处理多种不同类型的实体解析问题?
终极挑战数据集的设计正是为了推动这一层面的发展。
该数据集并未专注于单一难点(如昵称或音译),而是结合了 50 多种不同的挑战类型,包括:
- 文化命名惯例。
- 基于标题的引用。
- 业务关系和历史名称变更。
- 多语言和跨脚本提及。
- 复合挑战融合了上述多种元素。
关键是,这并不是针对某个狭窄的用例进行优化。这是要测试当规则从一个实体变更到另一个实体时,设计模式是否成立。
数据集概览
终极挑战数据集包含:
- 50个实体,涵盖个人、组织和机构。
- 约 60 篇文章,结构和语言复杂程度各不相同。
- 51 个不同的挑战类别,大致分为以下几类:
- 文化命名惯例。
- 标题和专业背景。
- 商业关系与组织关系。
- 多语言和音译挑战。
- 综合场景和边缘情况场景。
在本系列的前几篇文章中,我们看到使用生成式 AI (GenAI) 创建数据集可谓喜忧参半。如果没有它,要收集足够多、足够多样化的测试数据将极其困难。但如果不加以控制,这种模式往往会让事情变得过于简单。
例如,在早期的一次生成过程中,我们发现模型将“俄罗斯总统”等短语作为弗拉基米尔·普京 (Vladimir Putin) 的明确别名。这在今天看来可能是合理的,但却违背了测试上下文解析的目的。如果文章讨论的是 20 世纪 90 年代的俄罗斯,会发生什么情况?系统应根据上下文推断出正确的实体,而不是依赖于硬编码的别名。
因此,我们特意设计了这个数据集,以避免使用捷径。当系统能够推断出含义时,则不明确列出别名。描述性短语没有预先链接到实体。正确的匹配通常取决于文章层面的上下文,而不仅仅是局部文本。
重要说明:尽管我们展示了系统在各种场景下的能力,但这仍是一个具有教育意义的原型。处理真实世界受制裁实体监控的生产系统需要额外的验证、合规性检查、审计跟踪,以及针对敏感用例的专门处理。
为什么这些场景很难应对
在本系列的第一篇文章中,我们介绍了一个简单但含义模糊的示例:“新的 Swift 更新来了!”挑战在于,“Swift”可以根据上下文解析为现实世界中的多个实体。这个示例反映了一个更广泛的事实:自然语言本质上是模棱两可的。
因此,实体解析不仅仅是字符串匹配的问题。人们经常依赖共享知识、文化规范和情境背景来解析引用,我们甚至很少注意到我们正在这样做。
考虑以下几个常见案例:
- 没有地缘政治和时间背景,“总统”这样的头衔就毫无意义。
- 公司名称可能指母公司、子公司或之前的品牌,具体取决于文章的撰写时间。
- 一个人的名字可能会以不同的顺序、书写系统或音译方式出现,这取决于语言和文化。
- 同一个短语在不同的语境中可以合法地指代不同的实体,系统必须能够像接受匹配短语一样自信地拒绝匹配短语。
没有单一的规则集可以高效地处理所有这些情况。这就是为什么这款原型如此激进地将关注点分开:
- Elasticsearch 高效而透明地缩小了候选空间。
- LLM 仅在需要判断且必须自行解释的情况下使用。
- 检索和推理仍然是两个不同步骤。
随着挑战类型多样性的增加,这种区分变得更加重要。
系统如何在无特殊处理的情况下应对多样性
这次评估最有趣的结果之一是没有改变的内容:
- 我们没有针对日语名字添加特殊逻辑。
- 我们没有为阿拉伯语父名添加自定义规则。
- 我们没有添加历史公司名称的硬编码映射。
相反,该系统依赖于系列早期引入的相同核心要素:
- 为语义搜索编制索引的上下文丰富实体。
- Elasticsearch 中的混合检索(精确检索、别名检索和语义检索)。
- 一组数量少且定义明确的候选匹配项。
- 受函数调用和最小模式约束的 LLM 判断。
这表明系统的灵活性来自表征和架构,而非不断增长的规则集合。
当系统成功时,是因为检索到了正确的候选对象,且 LLM 有足够的上下文来解释为什么某个引用会(或不会)映射到某个特定实体。
结果:它的表现如何?
在最终挑战数据集上,系统得出了以下总体结果:
- 精度:约 91%
- 召回: ~86%
- F1 分数:约 89%
- LLM 接受率:约 72%
在各类挑战中的表现
按挑战类型细分结果可以揭示优势和局限性:
在以下领域的表现最为突出(100% F1 分数):
- 跨脚本匹配(西里尔字母、韩文、中文企业实体)。
- 希伯来语场景(父名、职业头衔、宗教头衔、音译)。
- 企业层级(航空航天、多元化制造、多部门公司)。
- 专业头衔(学术、军事、政治、宗教)。
- 涉及多种书写系统的综合日语场景。
表现优异(80–99% F1 分数)包括:
- 国际政治人物(98%)。
- 历史名称变更 (90%)。
- 复杂的业务层次结构(89%)。
- 日本公司名称(93%)。
- 跨脚本音译(86%)。
- 阿拉伯语父名(86%)。
更具挑战性的领域包括:
- 高级音译(中文、韩文):0% F1。
- 某些日本场景(敬语、姓名顺序、书写系统变化):~67% F1。
- 一些阿拉伯语场景(公司名称、机构引用):约 40% F1。
这里重要的是为什么系统在这些情况下会遇到困难。这些失败并非由于整体方法的崩溃,而是由于特定组件的局限性,尤其是在某些多语言场景中用于语义搜索的密集向量模型。
由于检索和判断是完全分离的,因此提高性能无需重写系统。更换功能更强大的多语言嵌入模型、丰富实体上下文或改进检索策略,都能在不改变核心架构的情况下改善这些类别的结果。
从架构的角度来看,这才是真正的成功指标。
这告诉我们关于设计的启示
回顾整个系列,有几个模式尤为突出:
- 准备工作比巧妙搭配更重要。预先为实体添加上下文信息可以显著减少以后可能出现的歧义。
- LLM 作为评判者最有价值,而非检索者。让他们解释为什么某个匹配是有意义的,比要求他们进行搜索要有效得多。
- 可靠性确保准确性。函数调用不仅清理了 JSON,还释放了检索步骤中已存在的召回能力。
- 通用性胜过专业化。少量经过精心挑选的抽象概念无需自定义逻辑即可处理数十种挑战类型。
这就是为什么原型有意采用 Elasticsearch 原生架构,并在 LLM 的使用上有意采取保守策略的原因。目标不是取代搜索;而是在意义至关重要的情况下,使搜索变得可解释。
总结
最终的挑战并非追求完美的指标,而是回答一个更根本的问题:
一个透明、搜索优先、LLM 辅助的架构能否处理现实世界中的实体歧义,而不陷入规则或黑箱的情况?
对于这个具有教育意义的原型,答案是肯定的,但需要明确注意生产环境的强化、合规性、监控以及数据质量等方面的问题。如果您正在构建的系统需要说明为什么要进行实体匹配,那么这种模式值得认真考虑。我希望这个系列能告诉人们,实体解析其实并不神秘。只要合理地进行关注点分离,就可以对问题进行推理、评估和优化。
这项工作还提出了一种更广泛的架构模式。由此出现了经典检索增强生成 (RAG) 的一次细微但重要的演变。我们没有让检索直接为生成提供信息,而是引入了一个明确的评估步骤。首先使用 LLM 对检索到的候选结果进行判断和合理性检查,只有通过审核的结果才允许用于增强生成。您可以将其视为“生成增强型检索增强生成与评估”,或者简称为“GARAGE”,毕竟谁不喜欢一个好听的缩写词呢。
还有哪些其他用例可以从这种模式中受益?需要信任、透明和可辩护推理的系统是当然的候选者。未来在这一领域的工作应该会像我们在这里看到的结果一样引人注目,我很期待看到社区接下来会有什么新的发展。
下一步:亲自试用
想看看终极挑战的实际操作吗?请查看终极挑战笔记本,它通过实际实现、详细解释和动手示例,提供了完整的实践指南。
完整的实体解析管道展示了生产使用所需的核心概念和架构。您可以将其用作构建系统的基础,这些系统可以监测新闻文章、跟踪实体提及情况,并回答有关哪些实体出现在哪些文章中的问题,同时还能保持透明度和可解释性。




