实体关系映射是目前AI落地非常成熟的应用场景,但是如何做到多、快、好、省,仍然需要一些技巧,这里文分享一下我的方案。
什么是实体关系映射
实体匹配(entity mapping)通常是指将两个没有直接关系的对象,通过一些方式建立起映射关系。比如:故宫、故宫博物院、北京故宫 三者指的是同一景区,将三者关联起来,就属于实体关系映射。
场景
现在A库有1w景区数据,B库有100w级别景区数据。需要从B库中挑选出与A库匹配的景区。他们的数据情况如下图。
A库 | B库 | |
---|---|---|
名称 | ✅ | ✅ |
城市 | ✅ | 空 |
地址 | 可能空 | ✅ |
简述 | 可能空 | 可能空 |
方案
我认为如果能简单通过规则来确定的,尽量通过规则来处理,当需要逻辑推理时再让AI接入,同时需要多名AI交叉比对,多个角色校验结果,尽量减少AI犯错的可能性。这里我先把流程图贴出,后续我将对每个环节进行具体介绍。
不完全匹配
BM25得分最高的N个景区
景区名称&城市匹配
多个LLM判断出最相似的景区
LLM结果相同
failed
pass
结果可能有争议
B景区数据库
rule1
A数据库某景区
rule2:BM25
LLM_best_match*2
LLM_final_check
结果是否相同
human_check
mappings
开始
我们每次从A库取一条从B库获取匹配数据。整体流程如上图,但是并非完全按如上步骤进行。比如我们可以批量跑完规则1再跑规则2,按各位喜好进行。
规则1:
如果相同城市内,景区名称完全相同,大概率是同一个景区。
如何判断在同一个城市,我们可以简单的判断A库数据的城市被B库数据的地址信息包含即可粗略判断。
规则2:
如果名称、地址、城市比较相似,那么有一定概率是同一个景区。
这里实际上主要目的是从100w数据里面,筛选出较为可能的几条数据。
有两个方案:
- 根据语义判断,使用embedding技术,计算余弦相似度排序。
- 使用分词技术,按分词匹配得分来排序。
我最终使用的是分词技术,使用了es默认的BM25算法。因为实际上类似“河南”“河北”在语义上是非常接近的,区分程度明显。但是使用分词的方式,河南河北则会有比较明显的区别,更贴近我们的场景。
需要注意的是,为了达到更理想的匹配效果,我们最好是调小BM25的b参数,来消除掉文档长度对评分的过度影响。(不太了解BM25的朋友,可以看我的另一篇关于BM25的博客)
下面是我的查询语句,使用的IK分词,仅仅对名称和位置进行了匹配,且名称权重是位置权重的2倍。
python
复制代码
{ "query": { "bool": { "should": [ { "match": { "title": { "query": spot.scenic_name, "boost": 2 } } }, { "match": { "s_location": f"{spot.city}{spot.scenic_addr or ''}" } } ] } }, "size": size }
AI判断1:best match
通常让大语言模型做一件复杂的事情效果不会太理想,但是如果是一个较为单一的任务,大模型效果可能不错。所以我们将任务分为多层。
现在我让LLM来判断从BM25算法筛选出的TopN景区中最匹配的一个,这是我所使用的Prompt。
复制代码
任务描述: 请根据给定的目标景区,从以下待选景区中选出一个最接近的景区。判断标准包括景区的名称、地址和简介。 {format_instructions} 目标景区: {target_str} 待选景区列表: {candidates_str}
需要注意的是,我们可以使用多个AI供应商提的中等级别大模型来进行判断,来避免一个AI可能出现的错误,例如使用GPT3.5、volcano-pro、qwen-plus等。匹配结果如果有出入,则说明结果可靠度并不高。
AI判断2:final check
在我们可以得到一个1对1的匹配结果后,我们需要一个最终的审查者来对结果输出进行最终复验。要想着这一步最终结果的可靠,通常有两个方案。
- 使用一个较高级别的LLM,如GPT4、qwen-max等,然后增加一些example。
- 使用微调技术,挑选一些有特征的数据,对大模型进行微调,让其对该特征数据有更稳定的结果输出。
我这里使用了更为简单的的方案1,这是我使用的提示词。
css
复制代码
给定两个景区,根据景区的信息,判断相似景区是否为同一景区。 需要判断景区范围,例如:太行大峡谷王相岩和太行大峡谷并不是同一个景区。 Just answer yes or no. 景区 A: {scenic_sport_1} 景区 B: {scenic_sport_2}
人工检查
就这个使用的场景下,有很多地方都可能导致匹配错误(比如B库就没有对应数据,或者信息不全导致AI判断失败等等),所以,我们最终要需要人工来处理一部分数据。而我们能做到的,就是尽量让人工去处理有争议,或者明显有错误的数据。
验证
我们测试了1000条数据,人工与AI进行效果比对,AI遗漏率仅为0.5%,低于人工错误率2%。大约需要5%的数据需要人工复核,大幅缩短人工工作压力。