2023 年值得一读的技术文章 | NebulaGraph 技术社区

在之前的产品篇,我们了解到了 NebulaGraph 内核及周边工具在 2023 年经历了什么样的变化。伴随着这些特性的变更和上线,在【文章】博客分类中,一篇篇的博文记录下了这些功能背后的设计思考和研发实践。当中,既有对内存管理 Memory Tracker 的原理讲解,也有对 NebulaGraph 的安装选择指引。

而 LLM 作为 2023 年技术圈的一大热点,NebulaGraph 也凭借 Graph + RAG 的契机,让社区用户了解到了在图、知识图谱、大模型这一新的三元组。无独有偶,社区小伙伴 @heikeladi 的《利用 ChatGLM 构建知识图谱》也开启了 GPT 构建知识图谱的新章节,让知识图谱的构建更加 easy。

不只是 LLM、图数据库 NebulaGraph,今年也是 DDIA(design data-intensive application)系列在 NebulaGraph 技术社区连载的第一年,从底层数据结构到顶层架构设计,带你更全面地了解分布式系统。

下面,来看看今年 NebulaGraph 技术社区有哪些博文值得你读一读。如果你觉得某篇文章不错,不要吝啬你的 ❤︎,你的评论和点赞是对作者们最好的赞赏 ❤︎。

LLM + GRAPH

自 2023.05,Wey 在 LlamaIndex 的 pr#2581 中第一次将图数据库、知识图谱和 LLM 放在一起,从此揭开了 Graph + RAG 的面纱。

利用 ChatGLM 构建知识图谱

这是一名东方财富算法工程师陈卓见的大模型实践,在经历 1.0 时代,会利用大量的规则和人力去提取和校验相应的数据,到 2.0 时代去构建相应的深度学习模型辅助完成 NER、实体链接,到现在大模型时代,利用大模型去清晰数据、标注和训练数据。本文给出了这位工程师的 Demo 分享;

LLM + NebulaGraph 三部曲

在 《图技术在 LLM 下的应用:知识图谱驱动的大语言模型 Llama Index》 中,Wey 详细地讲解了何为 LLM 范式,Llama Index 是如何同模型交互的,以及在 Embedding 和向量对搜索结果效果不佳的情况下,知识图谱是如何辅助增加搜索结果的。

作为上篇,它讲述了知识图谱同 LLM 的关系。在随后的《Text2Cypher:大语言模型驱动的图查询生成》和《Graph RAG: 知识图谱结合 LLM 的检索增强》,分别讲述了自然语言到查询语言的转化:

  1. 将任务拆解成从自然语言中理解意图
  2. 找出实体
  3. 从意图和实体构造查询语句

以及 Graph RAG 与 Vector RAG 的结果对比,相比单独的向量搜索,有了知识图谱的 RAG 会更加精准。

向量检索 vs 关键词检索 vs 混合检索怎么选?

基于 Wey 在 Llama Index 以及 LangChain 的 Graph + RAG 贡献,海外工程师 Wenqi Glantz 对所有 Graph + LLM、RAG 方法进行了全面的实验、评估、综述、总结和分析。《7 种查询策略教你用好 Llama Index 和 NebulaGraph 探索知识图谱》 便是本次实验测评的中文译文:

哪个查询引擎最适合,将取决于你的特定使用情况。

  • 如果你的数据源中的知识片段是分散和细粒度的,并且你需要对你的数据源进行复杂的推理,如提取实体和它们在网格中的关系,如在欺诈检测、社交网络、供应链管理,那么知识图谱查询引擎是一个更好的选择。当你的 Embedding 生成假相关性,导致幻觉时,KG 查询引擎也很有帮助。
  • 如果你需要相似性搜索,如找到所有与给定节点相似的节点,或找到在向量空间中最接近给定节点的所有节点,那么向量查询引擎可能是你的最佳选择;
  • 如果你需要一个能快速响应的查询引擎,那么向量查询引擎可能是一个更好的选择,因为它们通常比 KG 查询引擎更快。即使没有 Embedding,任务的提取(运行在 NebulaGraph 单个 storage 服务上的子任务)也可能是 KG 查询引擎延迟高的主要原因;
  • 如果你需要高质量的回答,那么自定义组合查询引擎,它结合了 KG 查询引擎和向量查询引擎的优势,是你最好的选择。

新手友好

使用 NebulaGraph 的第一步便是安装部署,如何提供保姆级的安装教程,让新用户 Step By Step 按照教程完成一开始的部署安装呢?想必没有比 @堕落飞鸟 更合适回答这个问题的人了。

用上 NebulaGraph

在 NebulaGraph 技术社区年度征文活动中,飞鸟以一己之力更新了 5 篇极度新手友好的部署安装相关文章:

《NebulaGraph 安装方式选择》中不只是给出了 7 种安装方式:编译、Docker 编译、单机部署、集群部署、Docker-Compose 安装、K8s 安装和 Docker 集群部署,还给出了这 7 种方式的优劣。下图仅供参考:

编译安装Docker 编译安装单机安装集群安装Docker-Compose 安装K8s 安装Docker 集群
部署维护难度★★★★★★★★★★★★★★
所需资源★★★★★★★★★★★
高可用,高性能★★★★★★★★★★★

而随后飞鸟更新的 《NebulaGraph 的备份管理》 则详细地记录了使用备份工具 BR 的过程。不同于 Linux 之类的本地环境,容器化部署的备份方式也是部分社区小伙伴关心的话题。《NebulaGraph 使用 Docker-Compose 部署方式如何备份还原》 便是一个详细到没朋友的容器化部署备份文。

无独有偶,《使用 RKE 方式搭建 K8s 集群并部署 NebulaGraph》 则从 K8s 入手,用一文留下了他是如何使用 RKE 来搭建 NebulaGraph 的过程。《构建 Nebula Graph 3.3.0 和 Nebula Studio 3.7.0 在 ARM 架构上的指南》 则为 ARM 用户带来了一丝暖意,无痛地在 ARM 上用上 NebulaGraph 和 NebulaGraph Studio。

等你有了良好的 NebulaGraph 运行环境,下面就可以试试《使用 NebulaGraph Exchange 通过 Hadoop 导入 OwnThink 数据》,领略一下千亿知识图谱 OwnThink 导入 NebulaGraph 的全过程,以及用这个知识图谱搭建你自己的智能机器人。而《可视化探讨 NebulaGraph 开源社区中的贡献关系》在提供数据集的基础之上,手把手教你如何用可视化探索工具进行导数、查询,观察到数据之间的关系。

上面讲到的用上 NebulaGraph 的 case 都是从零到一,搭建一个空的图数据库,但是如果你已经拥有了成百亿上千亿的数据,如何无缝切换到 NebulaGraph 模式呢?《图数据库系统重构之路》 给那些时间紧、对已有技术栈不了的社区小伙伴指明了方向,重构应该这样做:

  1. 对外接口梳理:梳理系统所有对外接口,包括接口名、接口用途、请求量 QPS、平均耗时,调用方(服务和 IP);
  2. 老系统核心流程梳理:输出老系统整理架构图,重要的接口(大概 10 个)输出流程图;
  3. 环境梳理:涉及到的需要改造的项目有哪些,应用部署、MySQL、Redis、HBase 集群 IP,及目前线上部署分支整理;
  4. 触发场景:接口都是如何触发的,从业务使用场景出发,每个接口至少一个场景覆盖到,方便后期功能验证;
  5. 改造方案:可行性分析,针对每一个接口,如何改造(OrientDB 语句改为 NebulaGraph 查询语句),入图(写流程)如何改造;
  6. 新系统设计方案: 输出整理架构图,核心流程图。

用好 NebulaGraph

当你有了良好的运行环境,面临的就是如何将你的业务 NebulaGraph 化的问题。也许你是从 MySQL 之类关系型数据库来一探图数据库的奇妙,也许你是从 Neo4j、JanusGraph 来想看看 NebulaGraph 的高性能。这时候有一份贴心的进阶使用指南,就非常完美了。

说到进阶用法,有什么比同广大用户频繁交流,获得他们使用姿势,进而总结出的一份产品最佳实践更合适的呢?《使用秘籍|如何实现图数据库 NebulaGraph 的高效建模、快速导入、性能优化》 由 NebulaGraph 产品总监出品,它收录了从图建模开始的各类优化指南,没想到你的 VID 大小也和性能息息相关,更别提多块硬盘竟然能左右写速率。文中收录了各种获取高性能的技巧,如果是新手的话,读一读必有收获。

除了产品的最佳实践,NebulaGraph 的资深研发和布道师也从执行计划角度,让大家了解查询语句生命周期之余,读明白那些执行算子的作用,以及语句执行的耗时点在何处:

  • 《执行计划详解与调优》
  • 《从真实案例出发,全方位解读执行计划》

说完官方出品的使用指北,再来看看其他小伙伴是咋用好 NebulaGraph 的。在今年开启的 Happy Office Hour 便是一个官方对话用户的活动,在活动中 NebulaGraph 的资深用户会和大家交流他们的使用姿势,而相关的会议纪要你将了解到更多的 NebulaGraph 实用技能。正如第一期会议纪要《如何提升 meta 性能?提高 TTL 删除速率?主备集群怎么做…Happy Office Hour 第一期会议纪要告诉你》 所记录的那样,你可以了解到大企业他们面临的业务问题,以及如何更好地解决、规避这个问题。

内存管控

资源的使用,尤其是内存的使用,是社区用户关心的一大重点。而到底 NebulaGraph 有哪些地方需要使用内存?这是 @肖小可爱乐乐 在文章《NebulaGraph 的内存探查》 中所要探讨的主题。

NebulaGraph 内存初探

一般来说数据库会在多个方面使用到内存,比如:线程池、缓冲区、索引等等。在《NebulaGraph 的内存探查》 中,作者先从一般数据库的内存消耗点讲起,再娓娓道来 NebulaGraph 的工作流程,最后通过实验数据查看在数据导入之后,nebula-storage 的内存使用量变化。

虽然文章并未提及到查询时内存的消耗情况,但是通过本文你将了解一些 nebula-storage 存储方面的内存使用点。下面摘录了部分结论:

  • 面对重复插入的数据,nebula 采用忽略掉的机制。假使数据长度不符合不能写入 nebula-storage,将会都写入 nebula-storage 的 err 日志上,不会占用内存。
  • 当 CPU 个数较少,Compact 落盘释放内存资源的速度慢于写入数据的速度,内存会持续上升。
  • 读操作统计 Tag 和 Edge 个数,假设个数太多将耗费 nebula-storage 大量的内存,如果 nebula-storage 有写入操作,很容易令 nebula 进入崩溃状态。

如果你想了解 nebula-storage 这块的内存消耗,不妨读一读此文参考下。此外,在《NebulaGraph 内存分析》 中,浅析了下三大服务——metad、graphd、storaged 的内存消耗点,可作为理论输入,再结合你具体的业务场景再探内存用量。

Memory Tracker

数据库的内存管理是数据库内核设计中的重要模块,内存的可度量、可管控是数据库稳定性的重要保障。图数据库的多度关联查询特性,往往使图数据库执行层对内存的需求量巨大。

《内存管理实践之 Memory Tracker》主要介绍 NebulaGraph v3.4 版本中引入的新特性 Memory Tracker,希望通过 Memory Tracker 模块的引入,实现细粒度的内存使用量管控,降低 graphd 和 storaged 发生被系统 OOM kill 的风险,提升 NebulaGraph 图数据库的内核稳定性。

memory_tracker

另类实践

大多数的用户都是使用官方提供的周边工具,例如:nebula-java 客户端来操作图数据,而 auhusy 则对 nebula-python 在《python 简单封装CRUD》进行了封装,CurvusY 用 Dart 对 NebulaGraph 进行了移动端适配,开发出来了nebula_dart_gdbc,在手机端也可能查询图数据,《使用 GraphQL 语法查询 NebulaGraph 中的数据》则记下了 Dragonchu 对 GraphQL 的适配,让前端自由地选择想要的数据。

聊聊数据库和分布式

除了 NebulaGraph 使用相关的文章之外,本年度还有同分布式系统相关的 DDIA 系列,以及 RocksDB 的讲解文。

DDIA 系列由数据库研发人员从自身的开发经验出发,结合原书传授的数据系统的设计理念,深入浅出地道明数据系统中的精妙之处。

《一文科普 RocksDB 工作原理》 全方位讲解 kv 嵌入数据库 RocksDB 的核心概念 LSM-Tree、MemTable 和 SSTables,《RocksDB Iterator Internal, part 1》 从工程师角度,以源码阅读的形式带你深入了解 RocksDB 的组件。


2023 年的文章介绍告一段落,感谢你的阅读 (///▽///) 。你可以前往论坛-文章区,阅读本年度所有的文章。

如果你有什么想看,但是社区并没有安排上,来和星云小姐姐 说道说道。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/336607.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫IP池

目录 一、介绍 1.1 为什么需要IP池? 1.2 IP池与代理池的区别 二、构建一个简单的IP池 三、注意事项 一、介绍 在网络爬虫的世界中,IP池是一个关键的概念。它允许爬虫程序在请求网页时使用多个IP地址,从而降低被封禁的风险,提高…

【大坑】MyBatisPlus使用updateById莫名将数据四舍五入了

问题描述 我目前在为本地的一所高中开发一个成绩分析的网站,后端使用的是SpringBootMyBatisPlus,业务逻辑是用户在前端上传EXCEL文件,后端从文件中读取成绩存到数据库用于分析。但是奇怪的是:在后端,进入数据库之前的…

DBA技术栈MongoDB: 索引和查询优化

2.1 批量插入数据 单条数据插入db.collection.insertOne()多条数据插入db.collection.insertMany() db.inventory.insertMany( [{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },{ item: "notebook"…

【MATLAB源码-第119期】基于matlab的GMSK系统1bit差分解调误码率曲线仿真,输出各个节点的波形以及功率谱。

操作环境: MATLAB 2022a 1、算法描述 GMSK(高斯最小频移键控)是一种数字调制技术,广泛应用于移动通信,例如GSM网络。它是一种连续相位调频制式,通过改变载波的相位来传输数据。GMSK的关键特点是其频谱的…

vue3通过ref调用子组件方法,第一次点击报找不到该方法,ref和v-if冲突

通过ref实现父子组件通信&#xff0c;但在第一次点击按钮的时候报找不到子组件的方法 原因&#xff1a;ref和v-if冲突,ref只有在组件渲染完成才注册引用信息&#xff0c;v-if首次为false没有把元素或子组件渲染&#xff0c;所以没有注册引用信息。 父组件 <uni-popup ref…

GO 中高效 int 转换 string 的方法与高性能源码剖析

文章目录 使用 strconv.Itoa使用 fmt.Sprintf使用 strconv.FormatIntFormatInt 深入剖析1. 快速路径处理小整数2. formatBits 函数的高效实现 结论 Go 语言 中&#xff0c;将整数&#xff08;int&#xff09;转换为字符串&#xff08;string&#xff09;是一项常见的操作。 本文…

Peter算法小课堂—拓扑排序与最小生成树

拓扑排序 讲拓扑排序前&#xff0c;我们要先了解什么是DAG树。所谓DAG树&#xff0c;就是指“有向无环图”。请判断下列图是否是DAG图 第一幅图&#xff0c;它不是DAG图&#xff0c;因为它形成了一个环。第二幅图&#xff0c;它也不是DAG图&#xff0c;因为它没有方向。第三幅…

汽车加油问题(贪心)

问题描述&#xff1a; 一辆汽车加满油后可行驶n 公里。旅途中有若干个加油站。设计一个有效算法&#xff0c;指出应在哪些加油站停靠加油&#xff0c;使沿途加油次数最少。并证明算法能产生一个最优解。 编程任务&#xff1a; 对于给定的n 和k 个加油站位置&#xff0c;编程计算…

Harmony Ble蓝牙App(四)描述符

Harmony Ble蓝牙App&#xff08;四&#xff09;描述符 前言正文一、优化二、描述① 概念② 描述提供者③ 显示描述符 三、源码 前言 上一篇中了解了特性和属性&#xff0c;同时显示设备蓝牙服务下的特性和属性&#xff0c;本文中就需要来使用这些特性和属性来完成一些功能。 正…

设计模式--组合模式

缘起 某日&#xff0c;小明公司最近接到一个办公管理系统的项目&#xff0c;并且在每个城市都有分部。这属于是很常见的OA系统&#xff0c;只要前期将需求分析完善好&#xff0c;中后期开发维护是不难的。 然而&#xff0c;总部公司使用后觉得很OK&#xff0c;想要其他城市的…

softmax回实战

1.数据集 MNIST数据集 (LeCun et al., 1998) 是图像分类中广泛使用的数据集之一&#xff0c;但作为基准数据集过于简单。 我们将使用类似但更复杂的Fashion-MNIST数据集 (Xiao et al., 2017)。 import torch import torchvision from torch.utils import data from torchvisi…

STM32标准库开发—软件I2C读取MPU6050

软件模拟I2C时序 初始化I2C引脚以及时钟 void MyI2C_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_ModeGPIO_Mode_Out_OD;GPIO_InitStruct.GPIO_PinGPIO_Pin_10|GPIO_Pin_11;GPIO_InitStruct.G…

pearcmd文件包含漏洞

1.什么是pearcmd.php pecl是PHP中用于管理扩展而使用的命令行工具&#xff0c;而pear是pecl依赖的类库。在7.3及以前&#xff0c;pecl/pear是默认安装的&#xff1b;在7.4及以后&#xff0c;需要我们在编译PHP的时候指定--with-pear才会安装 不过&#xff0c;在Docker任意版本…

(菜鸟自学)Metasploit漏洞利用——ms08-067

&#xff08;菜鸟自学&#xff09;漏洞利用——ms08-067 漏洞简介利用nmapMSF软件对XP sp3系统进行渗透攻击设置exploit模块参数RHOSTRPORTSMBPIPEExploit Target 设置有效载荷查找可兼容的有效载荷 渗透测试VNC 漏洞简介 MS08-067 是指微软于2008年发布的一个安全漏洞&#x…

重学Java 10 面向对象

正是风雨欲来的时候&#xff0c;火却越烧越旺了 ——24.1.20 重点 1.为何使用面向对象思想编程 2.如何使用面向对象思想编程 3.何时使用面向对象思想编程 4.利用代码去描述世间万物的分类 5.在一个类中访问另外一个类中的成员 -> new对象 6.成员变量和局部变量的区别 一…

利用HTML+CSS+JS打造炫酷时钟网页的完整指南

引言 在现代Web开发中&#xff0c;制作一个引人注目的时钟网页是一种常见而令人愉悦的体验。本文将介绍如何使用HTML、CSS和JavaScript来创建一个炫酷的时钟网页&#xff0c;通过这个项目&#xff0c;你将学到如何结合这三种前端技术&#xff0c;制作一个动态且美观的时钟效果…

接口测试 02 -- JMeter入门到实战

前言 JM eter毕竟是做压测的工具&#xff0c;自动化这块还是有缺陷。 如果公司做一些简单的接口自动化&#xff0c;可以考虑使用JMeter快速完成&#xff0c;如果想做完善的接口自动化体系&#xff0c;建议还是基于Python来做。 为什么学习接口测试要先从JMeter开始&#xff1f;…

C语言数据结构——顺序表

&#xff08;图片由AI生成&#xff09; 0.前言 在程序设计的世界里&#xff0c;数据结构是非常重要的基础概念。本文将专注于C语言中的一种基本数据结构——顺序表。我们将从数据结构的基本概念讲起&#xff0c;逐步深入到顺序表的内部结构、分类&#xff0c;最后通过一个实…

Unity常用的优化技巧集锦

Unity性能优化是面试的时候经常被问道的一些内容&#xff0c;今天给大家分享一些常用的Unity的优化技巧和思路&#xff0c;方便大家遇到问题时候参考与学习。 对啦&#xff01;这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白&#xff0c;也有一些正在从事游…

电脑pdf如何转换成word格式?用它实现pdf文件一键转换

pdf转word格式可以用于提取和重用pdf文档中的内容&#xff0c;有时候&#xff0c;我们可能需要引用或引用pdf文档中的一些段落、表格或数据&#xff0c;通过将pdf转换为可编辑的Word文档&#xff0c;可以轻松地复制和粘贴所需内容&#xff0c;节省我们的时间&#xff0c;那么如…