logo
咨询企业版

社区动态

AI 生成旅游图谱:一次“美丽错误”的技术思考

导读:星影 StarShadow 是由 NebulaGraph Committer 大叶老师(CorvusYe@GitHub)开发的一款 ‌NebulaGraph 图数据库客户端,提供图数据库的可视化操作界面,让用户可以通过图形化的方式,对图数据库进行操作。自 2024 年 6 月发布以来,星影快速迭代,努力成为开发者们在图实践路上值得信赖的同伴。五一前,星影正式发布 2.0 版本,集成了 DeepSeek, 该 AI 模块命名"DeSrc". 今天,让 DeSrc 为 NGer 们规划一条「厦门三日游」路线,DeSrc 会有何推荐,又将给我们怎样的图数据库思考呢?

本文首发于「NebulaGraph 技术社区」,更多资讯请访问官网

一、起

在年初时,初步验证了DeepSeek 在构建知识图谱的可行性。

🔍查看原文

经过数月的摸索与研发,最终在图数据库客户端星影中集成,并将完成之后的模块取名 DeSrc,大致流程如下:

二、承

今天,带来一个小案例,使用 DeSrc 规划一条厦门三日游路线,并将数据保存到 NebulaGraph 数据库中。

(完整过程截图过长,请见文末)

小案例的输入输出过程如下:

  • 输入: 帮我出一个厦门的旅游攻略图谱,需要有日程安排、公共交通方案等,需要涉及吃住行及用时,公共交通的线路。

  • 输出:

以上推荐由 AI 生成,不代表文章观点,仅供参考。

从旅游的角度看,在三天的行程里,AI 推荐了 6 个景点、3 家具有当地特色的餐馆,6 个住宿区。总体来看算是比较经典的线路安排,偏简单。

从技术的角度看,看似简单的背后,也藏着点“猫腻”。在整个过程中,AI 完成了 4 个 Tag 及 6 个 EdgeType 的设计,并写入了 18 个节点及 20 条关系。

三、转

当然,从提出需求到生成图数据的过程中,并非一帆风顺。

在需求的描述中提到了“公共交通方案”,但图数据中并未体现这部分信息,因为 AI 在生成 nGQL 的过程中出现了语法错误,但为了顺利形成图数据,被我人为干预修正了,但在详细思考之后,个人认为这是个具有参考意义的错误,所以称之为“美丽的错误”。

以下截取几段这个“错误”的相关脚本:

INSERT VERTEX `ScenicSpot` (
  spotId, name, coordinates, visitDuration, ticketPrice
) VALUES
'Spot_GDY':(101, '鼓浪屿', '24.4489,118.0664', 180, 35),
'Spot_ZSL':(102, '中山路步行街', '24.4795,118.0894', 120, 0);

INSERT VERTEX `Transport` (
  transportId, vehicleType, routeNumber, duration, cost
) VALUES
'Transport_LY':(201, '轮渡', '邮轮中心厦鼓码头—三丘田码头', 20, 35);

INSERT EDGE `TRANSIT_CONNECT` (
  departure_time
) VALUES
'Spot_GDY'->'Spot_ZSL':'Transport_LY'@('16:00');

语法错误发生在脚本最后一行中,探究其意图,似乎 AI 想把一个实体锚定在一段关系中。而“两个地点的出发与到达”场景中,显然 AI 的想法虽然不符合语法,但却更为精准,如图:

为了方便表述与理解,我将代码中的鼓浪屿换成 A 地点,中山路步行街换成 B 地点,轮渡换成11路公交车。

而符合当前主流图数据库的存储方式又与场景相近的做法有:

  1. 将摆渡方式作为一个中间节点,将三元组拆分成五元组

这种修正方式的缺陷很明显,丢失了关系的同一性,或者说事件的同时性。

  1. 将摆渡方式作为一个属性

这种修正方式还有两种可能性:

  • 实体名称当成边的一个属性

  • 节点的 id 当成边的一个属性

无论上述哪种都依然带有难以消除的弊端:

第一点中,现实中实际存在的、有边界的、唯一的实体,以名称的方式参与到关系中,当多条关系出现同一名称,无法确定是否属于同一实物。

第二点中,以 id 作为属性虽然解决了同一性问题,但从当下主流图数据库查询返回值的角度,又很难将嵌入在边中的节点很好地表达出来。

四、合

那么问题究竟出在哪?

AI 的意图,本质上属于一种使用超图的解决方案。主流图数据库从存储到返回值,实现的都是一种普通图的方案。

在数学中,超图(Hypergraph)是一种广义上的图。不同于普通图的一条边只能连接两个顶点,超图的一条边可以连接任意数量的顶点。

按照超图的定义,AI 意图所形成的结构应为:

而这种结构,在生活中更为常见。例如:五个人同时在一张桌子吃饭,用一条多端的边同时连接桌子与众人,对这一场景的表达最为精准。也许先前建模困难,时常需要在实际中纠结取舍,不能按生活直觉创建,或许原因就在于超图的模型要放入普通图的容器,难免有些水土不服,期待早日可以看到图数据库能具备超图的特性,或者如果已经有了,请带带我。

附:

  1. 小案例过程 DeSrc 界面截图

所用大模型为【阿里云百炼 DeepSeek-R1】

  1. 数据可视化

图数据

路径数据

上图的行程大概就是,早上到鼓浪屿转一圈,在下午 16:00 前上轮渡出鼓浪屿,然后到对面中山路步行街喝点花生汤,再找找特色小吃,就可以结束 AI 推荐下的、朴素而又美好的一天。

关于星影:

🌟以上界面截图来自【星影 · 图数据库客户端】

🌟下载地址:https://dudu.ltd/

🌟点击「阅读原文」,了解更多星影 2.0 功能介绍


NebulaGraph 邀你参加开源之夏🌟⬇️

开源之夏|从 NebulaGraph 开启你的图数据库开源之旅!