5.6.md 2.8 KB

5.6 实体标准化与问题实体定位

库存表写“新鲜草莓”,店长说“草莓没了”。这不是两个不同东西。图检索必须先确认店长指的是哪一个对象,才知道从哪里开始找关系。

{{figure:06-link|图 5-9 先把同一个东西的不同叫法连到同一稳定编号。}}

一、一个对象可以有多个名字

“新鲜草莓”有一个固定编号,标准名“新鲜草莓”与已登记别名“草莓”都可以指向它。编号给计算机认对象,名字给人阅读。增加一个别名,不应该再创建一个相同食材节点。

先看处理输入写法的小函数:

{{snippet:normalize}}

它统一兼容字符、空白与大小写,不会凭空知道所有别名。业务简称仍要登记;没有找到名字时,不能随便选一个看起来相似的对象。

二、先处理长名称,再处理里面的短词

如果一句话只问“草莓奶昔由谁做”,应该优先识别完整商品名“草莓奶昔”,不能因为里面出现“草莓”又无条件把原料当作另一个问题对象。项目的链接方法处理名称重叠,并限定当前知识域:

{{snippet:entity-resolve}}

这里同时在做两种判断:是否命中某个名称、多个名称是否在同一段文字中重叠。同一别名对应多个不同对象时需要处理歧义,不能只取字典里的第一个。

三、两家店的同名套餐,不要混在一起

配套的另一门店也有“双人下午茶”,但里面包含原味曲奇,负责人是小方,与当前甜品店的组成和分工不同。图查询中写 知识域 = '甜品店' 时只用当前店的数据;写 知识域 = '另一门店' 时使用实验分店的数据。

知识域过滤让同名对象不串起来,但它还不是完整的身份权限系统。真正供不同员工使用时,需要根据登录身份决定可查询范围,不能让客户端任意指定所有店铺。

四、观察起点,而不是直接看最终答案

python -m graph_qa retrieve \
  --question "草莓缺货,为什么双人下午茶也会受影响?" \
  --mode graph --scope 甜品店

本题可以识别新鲜草莓和双人下午茶。识别到两个对象,不代表已经证明它们有关系。 后面的查询才负责检查能否找到套餐、蛋糕、果酱与草莓之间的完整路径。

再试一个资料里没有的商品名,观察空候选或证据不足。最后增加一个合理别名、重新导入,验证它仍链接到同一稳定对象。

五、当前方法适合讲清楚什么

确定性的名字与别名匹配容易读懂和测试,但会漏掉未登记叫法,也需要处理过短别名和名称重叠。未来可增加候选检索和消歧模型,仍应保留知识域、歧义和空结果边界。下一节从这些已定位对象出发,真正把路径查出来。