“难道你还想改变这世界?”
“我想试试。”
《哪吒2》票房已破百亿大关,成功跻身全球影史票房榜前八,并成功问顶全球动画电影票房榜。其导演饺子(本名杨宇)凭借哪吒系列电影《哪吒之魔童降世》《哪吒之魔童闹海》登顶中国影史导演票房榜。《哪吒2》在海外票房和市场口碑也实现了双丰收,这不仅标志着中国动画电影在商业上的巨大成功,更是中国文化自信的有力体现。
电影中人物较多,且属性颇多,你可还记得殷夫人的气象属性?太乙真人又属于哪个阵营?本文将带大家通过 NebulaGraph 和 DeepSeek 带大家盘一盘《哪吒2》中的人物关系和属性。
对于影视 IP 的人物关系,如《哪吒》中的人物,虽然可以用传统的行列表格进行展示。但是对于多重关系,比如“曾经恋人,现在敌对”或者“明面霸总,暗面大哥”,表格这种展示方式显然不如图结构来的直观、清晰。
NebulaGraph
NebulaGraph 是一款强大的开源图数据库,能够承载包含数千亿个点和数万亿条边的超大规模数据集,并且提供毫秒级查询。
NebulaGraph 提供了多种可视化工具,主要包括 NebulaGraph Studio 和 NebulaGraph Explorer,NebulaGraph Studio 更侧重于图数据库的管理和基本操作,适合需要快速上手和日常管理的用户,而 NebulaGraph Explorer 则提供了更强大的数据探索和分析功能,适合对数据有深入分析需求的用户。
此外,NebulaGraph 还有一些好用的生态工具,如星影 StarShadow。星影是一款 NebulaGraph 图数据库客户端,它提供了图数据库的可视化操作界面,让用户可以通过图形化的方式,对图数据库进行操作。星影采用了全新的技术架构(Flutter),目前已经支持的操作系统有:Windows、macOS、Ubuntu | 优麒麟 三大常见操作系统。
NebulaGraph 可以将丰富的关系通过边及其类型和属性自然地呈现,帮助我们更好的呈现影视 IP 人物关系。通过创建点(Vertex, 用点标识符 VID 进行标识) 标识人物名字,如“申小豹”。创建边(Edge)来连接点,表示人物之间的具体关系类型,如“父子”、“师徒”。创建标签(Tag),定义属性,对点进行分类,如“龙族”、“截教”。创建属性(Property),为点和边添加属性,以键值对(Key-value pair)形式存储人物的关系描述和详细信息。
DeepSeek
DeepSeek 是一款国产开源大模型,具备强大的复杂指令推理能力和内容生成能力,并致力于实现通用人工智能 AGI。自 DeepSeek R1 模型发布以来,迅速火遍全球,R1 模型具有高效推理能力,采用纯强化学习进行训练,具备自我验证、反思和生成长思维链的能力。R1 模型采用专家混合架构,优化计算资源,同等计算性能下,功耗更低。R1 模型提供了多个版本,以满足不同的计算资源(“蒸馏版”、“满血版”)和应用需求。DeepSeek 提供了免费的在线对话系统,你可以使用网页版或者下载手机 App,其应用程序目前在 iPhone 的 App Store 上排名第一。
与 DeepSeek 进行对话,打开联网搜索和深度思考选项,可以帮助我们快速收集票房数据、社交影评,梳理人物关系、分析人物性格,辅助我们进行高效数据分析,并生成分析报告。例如,可以询问 DeepSeek 关于哪吒与敖丙的关系,DeepSeek 会根据已有的数据和知识,生成详细的分析报告。
不过,由于最近官方 DeepSeek 热度持续高涨,用户访问量居高不下,经常会遇见“服务器繁忙,请稍后再试”的情况。我们可以调用“云基建”厂商搭建的 DeepSeek R1 “满血版” 的 API,甚至有些厂商已经对外免费提供自部署的对话系统,我们基本可以告别“服务器繁忙”的情况了。部分厂商已实现在国产操作系统、国产 GPU 上部署运行 DeepSeek 国产大语言模型,实现全链条国产化。近日,微信搜索页面也提供了支持 DeepSeek 的 AI 搜索功能,目前处于灰度测试阶段,仅对部分用户开启公测。
NebulaGraph 建模
言归正传,在与 DeepSeek 多次会话后,我们梳理了《哪吒2》的人物关系模型,具体如下表。
接下来,将数据模型转化生成适用于 NebulaGraph 的 nGQL 语言。nGQL 是 NebulaGraph 使用的的声明式图查询语言,支持灵活高效的图模式,支持大部分 openCypher 9 图查询语法,而且 nGQL 是为开发和运维人员设计的类 SQL 查询语言,易于学习。
1. 创建图空间 SPACE
NebulaGraph 数据模型使用 6 种基本的数据模型:图空间(Space)、点(Vertex)、边(Edge)、标签(Tag)、边类型(Edge type)、属性(Property)。
图空间用于隔离不同团队或者项目的数据。不同图空间的数据是相互隔离的,可以指定不同的存储副本数、权限、分片等。
创建图空间 nezha2
用于存储《哪吒2》相关数据。
CREATE SPACE IF NOT EXISTS nezha2(partition_num=1, replica_factor=1, vid_type=fixed_string(128));
2. 创建标签 TAG
定义 TAG 角色 role
,包含五个属性:角色名 name
,气象属性 meteorological
,阵营 faction
,角色描述 role_desc
,配音演员 voice_actor
。
create tag role (name string, meteorological string, faction string, role_desc string, voice_actor string);
3. 创建边 Edge
根据人物关系创建几个边。例如:
- father_of:父子关系
- mother_of:母子关系
- teacher_of:师徒关系
- enemy_of:敌对关系
- lover_of:恋人关系
- friend_of: 好丽友关系
- brother_sister_of: 兄妹关系
CREATE EDGE father_of (edge_time timestamp);
CREATE EDGE mother_of (edge_time timestamp);
CREATE EDGE teacher_of (edge_time timestamp);
CREATE EDGE enemy_of (edge_time timestamp);
CREATE EDGE lover_of (edge_time timestamp);
CREATE EDGE friend_of (edge_time timestamp);
CREATE EDGE brother_sister_of (edge_time timestamp);
4. 插入数据
根据《哪吒2》的核心角色和关系,插入一些示例数据。
INSERT VERTEX role (name, meteorological, faction, voice_actor) VALUES \
"哪吒": ("哪吒", "雷电", "阐教", "吕艳婷"), \
"敖丙": ("敖丙", "冰雪", "龙族", "瀚墨"), \
"太乙真人": ("太乙真人", "云雾", "阐教", "张珈铭"), \
"殷夫人": ("殷夫人", "细雨", "人类", "绿绮"), \
"李靖": ("李靖", "木", "人类", "陈浩"), \
"申公豹": ("申公豹", "风暴", "截教", "杨卫"), \
"敖光": ("敖光", "海浪", "龙族", "雨辰"), \
"敖闰": ("敖闰", "空间系", "龙族", "周泳汐"), \
"敖顺": ("敖顺", "毒", "龙族", "韩雨泽"), \
"敖钦": ("敖钦", "火", "龙族", "南屿"), \
"无量仙翁": ("无量仙翁", "木", "", "王德顺"), \
"石矶娘娘": ("石矶娘娘", "沙尘", "截教", "小薇"), \
"结界兽": ("结界兽", "雾霭", "中立", ""), \
"申正道": ("申正道", "", "", ""), \
"申小豹": ("申小豹", "", "", ""), \
"饺子": ("饺子", "", "导演", "杨宇");
INSERT EDGE friend_of VALUES "哪吒" -> "敖丙": (1234567890);
INSERT EDGE teacher_of VALUES "哪吒" -> "太乙真人": (1234567890);
INSERT EDGE mother_of VALUES "哪吒" -> "殷夫人": (1234567890);
INSERT EDGE father_of VALUES "哪吒" -> "李靖": (1234567890);
INSERT EDGE father_of VALUES "敖丙" -> "敖光": (1234567890);
INSERT EDGE brother_sister_of VALUES "敖闰" -> "敖光": (1234567890);
INSERT EDGE brother_sister_of VALUES "敖顺" -> "敖光": (1234567890);
INSERT EDGE brother_sister_of VALUES "敖钦" -> "敖光": (1234567890);
INSERT EDGE enemy_of VALUES "申公豹" -> "太乙真人": (1234567890);
INSERT EDGE father_of VALUES "申公豹" -> "申正道": (1234567890);
图-结界兽
5. 查询数据
通过 NebulaGraph 的查询语言 nGQL,可以轻松查询人物关系。例如,查询所有人物关系。
MATCH ()-[e]->() RETURN e LIMIT 100;
6. 可视化展示
使用 NebulaGraph Studio 或 StarShadow 等工具,可以将上述查询结果可视化展示。通过图形化的方式,可以直观地看到《哪吒2》中的人物关系网络。例如,哪吒与太乙真人之间的师徒关系,敖光与敖丙的父子关系等。
以下两张图是用 StarShadow 查询哪吒的人物关系网,分别用力导图和环形图进行展示。
力导图(Force-Directed Graph)是一种基于物理模拟的图形布局算法,常用于数据可视化领域,尤其是社交网络分析、知识图谱和关系图等场景。其核心在于模拟物理世界中的粒子运动,每个节点可以看作是一个带有质量的粒子,边可以看作是弹簧,通过施加不同的力,节点在图中动态演化,最终达到稳定状态。
环形布局关系图,多用于展示多个对象之间的关系。在这种布局中,通过将节点均匀分布在圆形路径上,以可视化的方式展示节点之间的连接关系。这种布局结构清晰、层次分明,且美观性高。
NebulaGraph 与 DeepSeek 结合的 GraphRAG
通过结合 NebulaGraph 和 DeepSeek,我们可以更快速、全面地分析《哪吒2》中的人物关系和属性。但对于 NebulaGraph + DeepSeek 的用法不止于此,还可实现高级进阶版应用,如 GraphRAG(Graph Retrieval Augmented Generation)。
NebulaGraph 能够与 Llama Index 和 LangChain 等大型语言模型深度集成,是业界首个提出 Graph RAG 概念的公司。Graph RAG 结合了知识图谱和大型语言模型,提供了更具成本效益、更智能和更精确的搜索结果。
GraphRAG 是一种使用知识图谱的检索增强生成 (RAG) 方法,也可简称 GRAG。它基于图数据库(如 NebulaGraph),采用图结构存储数据,能够高效地表示和存储实体之间的复杂关系,支持大规模图数据的存储和查询。图结构使得数据之间的关系更加直观和灵活,可以方便地进行关系的遍历和分析。GraphRAG 的检索方法是从关键实体开始的图形检索,使用图推理或子图检索通过关系找到相关上下文。GraphRAG 从细粒度实体提取开始,遵循高质量关系(手动定义或由大型语言模型定义)进行精确的上下文匹配,能够正确识别缺乏相关内容,避免产生幻觉答案,有效提高内容生成准确性。结合使用大语言模型 LLM(如 DeepSeek)从文档构建知识图,并执行以查询为中心的摘要,可以改进 RAG 的搜索部分。LLM 先从存储在图数据库中的语料进行搜索匹配相关信息,再按需进行联网搜索,在 DeepSeek R1 模型的推理模型加持下,搜索结果更多,知识推理和分析过程更全面,生成出来的内容更丰富准确。
传统基于向量的方法多采用支持向量类型和向量索引的关系型数据库,关系型数据库采用表格形式存储数据,通过表与表之间的关系来表示实体之间的联系。虽然也可以存储关系数据,但在处理复杂关系和大规模图数据时,性能和灵活性略显不足。GraphRAG 与传统的基于向量的方法相比,可以检索到更多相关内容,当您需要对整个数据集进行全面的答案时,选择 GraphRAG 更为合适。
在实际应用中,GraphRAG 可以用于多种场景。例如,在影视制作中,可以通过 NebulaGraph 和 DeepSeek 分析人物关系,帮助编剧和导演更好地构建故事线。在学术研究中,可以通过这种结合,深入研究影视作品中的人物关系和文化内涵。在市场营销中,可以通过分析人群浏览记录和购买记录,更精准的推荐商品。
目前,GraphRAG 仍处于学术研究阶段和工业实现的初级阶段,技术在训练数据和文本理解方面仍面临挑战,需要持续“投喂”大量的数据,和计算资源、算力支撑。
随着图技术发展、算法改进提升,相信 GraphRAG 检索计算能力、推理表达能力将更快、更强,期待有更多基于 NebulaGraph 的 GraphRAG 项目落地生花。
最后,推荐两篇基于 NebulaGraph 的 GraphRAG 文章,以供参考、学习。
NebulaGraph + DeepSeek 解锁元宵节文化知识图谱
NebulaGraph + DeepSeek 构建农业知识图谱
关于作者:
严少安。数据库领域从业者。Oracle ACE。公众号“少安事务所”。Certs:NebulaGraph NGCP, CKA, PMP。