谈基于大语言模型的图数据库路径检索
随着微软已经开源了GraphRAG项目的代码,基于图数据库的RAG 热度迅速升温。关注基于大语言模型与图模型数据库相结合的技术的人多了起来。
本文提出了一种类似人工搜索的“顺藤摸瓜”方法,实现图数据库的智能搜索方法。
本地私有数据存储和查询
本地私有数据的存储和查询主要包括:
- 历史对话(Hostory chat)
又称为长期记忆。通常就是将历史对话存储在内存或者数据库中,但是,这种方式不分青红皂白一股脑地存下来,造成了各种幻觉,例如 问: 我是谁?LLM 将这个问话也存储起来了,再次问我是谁? LLM 则回答:我是谁。显然错了。
- 上传的文档(upload documents)
又称为RAG。
历史对话和RAG 不同,历史对话是零星输入的,相同的内容不会集中在一起,而RAG 是从上传的文本中提取信息,相同的内容是相对集中在一起的。我们曾经尝试将历史数据存储在一个TEXT 文本中,然后定期地通过embedding 存储到vector 数据库中,效果并不会,例如 X 的儿子是Y,Y 的儿子是Z ,有时候LLM 会回答X 的儿子是Z。对应关系复杂的内容,RAG 的效果并不好。如果询问 X 的孙子是谁?LLM 也经常回答错误。
基于图数据库的RAG 方法的基本过程
- 将内容分成块( chunks.)
- 将块存储到图数据库中,并且连接到文档节点
- 高度相似的块通过SIMILAR 关系连接成为邻近节点。
- 通过Embeddings生成矢量索引(vector index)
- 使用lm-graph-transformer 或者 diffbot-graph-transformer,提取块的主体和关系
- 将主体存储到图中,并且连接到原始的块
查询的结果是通过实体查询到 chunks节点。进一步通过SIMILAR 关系查询相似的chunks节点。

本文重点讨论如何使用图数据库实现长期记忆。
历史对话存储的方法
历史对话使用memory 模块来实现,最简单的是将所有的对话都存储在内存(短期记忆),或者存储在数据库中(长期记忆)。
图数据库适合存储复杂关系的信息,例如对话者的家庭关系。个人简历。
普通数据库适合存储对话者的活动,备忘录等信息。
LLM 与图数据库结合
LLM 与图数据库结合关键在两点
- 利用大模型将非结构化数据转换成为图数据库的结构化数据
- 利用大模型智能搜索图模型中的相关数据
数据存入图数据库
首先通过LLM判断陈述语句中的实体和关系。并且输出json 格式
{
startNodeName:"姚家湾"
relationship:"儿子“
endNodeName:"姚大为"
}
通过图数据库的语句将实体和关系存储到图数据库中。
下图是根据对话存储的个人信息。

数据查询
通过LLM 实现图数据库看起来是十分简单的事情,许多的大模型能够直接产生图模型的查询语句。事实上并没有想象的简单,首先是LLM 提取实体和关系的名称是不确定的。有时候存储和查询对话产生的实体和关系的类型不能够对应。对于复杂的提问,LLM 也无法生成完整的查询语句。这就需要LLM具有智能(或者说是模糊的)查询的图数据库的能力。
网络上有一些关于图模型查询的介绍,
比如找出与实体连接的的一部分节点,搜索N跳以内的局部子图 比如4层。
另一种方法是利用vector 数据库构建图数据库中所有节点,关系的vector 通过vector数据库查询相关的节点内容,这似乎失去了图模型的意义。
这些方法基本上是简单粗暴法。
我们尝试模仿人类查询的方式,根据实体的属性和所有的关系顺藤摸瓜地检索图数据库的信息。姑且称之为“顺藤摸瓜法”。
顺藤摸瓜法
所谓顺藤摸瓜法就是模仿人工搜索图的方法,通过LLM 来逐步确定图数据库的搜索路径。
- 提取询问中的实体(Entity),实体对应于图数据库中的节点名称。
- 在图数据的查询实体节点的所有属性,与该节点连接的相邻节点,以及所有的关系集(relationships)。
- 将读出的信息添加到对话的上下文信息(Context Information) 中。
- LLM 尝试回答问题,如果已经得到了答案,就直接输出答案,如果没有获得答案,就推荐下一步查询的子节点重复 (2),如果无法进一步推荐合适的子节点就退出。
这个过程类似迷宫 站在一个节点上,看哪个方向的节点更接近目标,然后选择一个或者几个方向尝试。每前进一步,都需要思考。
下图是一个例子。
询问:
姚远的岳父是谁?

大模型首先提取出询问中的实体-“姚远”,然后通过neo2J 数据库查询出“姚远”节点,已经临近节点,这是并不能回答“姚远的岳父是谁”,但是他会回答“通过查询”刘素霞节点进一步查询。
通过第二次查询“刘素霞节点以及它相邻的节点,能够读取 ”刘亚敏“节点。
终于,LLM 回答:
姚远的岳父是刘雅敏。
一些例子:

实验
- 基于NodeJS 平台
- 基于neo4J 图数据库
- 基于零一万物大模型yi-large
实现该技术的难点
设计LLM 的提示信息十分重要。编写提示类似于辅导中学生做应用题,不断地提示大模型如何正确的思考。
判断实体的提示
const Prefix = "请列出下列语句中的实体,实体的属性以及实体之间的关系 。"const Suffix = `请使用下列json 格式输出:{entities:[{name:name of entity,attributes:{name of attribute:Value of attribute}}],relashichips:[{source:source_node_name,target:target_node_name,type:relationship_type}]}json格式中的名称使用英文表示。关系使用中文表达。`const Prompt = Prefix + Message + Suffix
判断下一个实体的提示
const Prefix = "根据提供的信息(来自于neo4j 图数据库,包括关系和节点的属性),回答下列问题:\n"const Suffix =`提示:如果你已经有了答案,请简单地以字符串给出答案。否则,请提示通过哪个节点能够进一步查询到相关信息(JSON 格式)。JSON 格式为:{entities:[{name:name of entity]}json格式中的名称使用英文表示`const Prompt = Prefix + Message + ContextMessage+Suffix
使用迭代函数实现
路径搜索程序使用迭代函数实现会使程序十分简洁。
代码(PathSeach)
async function PathSerch(entities,Message) {console.log("PathSerch....")for (let i = 0; i < entities.length; i++) {const Result= await graphDB.ReadNode(entities[i].name)ContextMessage=ContextMessage+JSON.stringify(Result)}//const Prefix = "根据提供的信息(来自于neo4j 图数据库,包括关系和节点的属性),回答下列问题:\n"const Suffix =`提示:如果你已经有了答案,请简单地以字符串给出答案。否则,请提示通过哪个节点能够进一步查询到相关信息(JSON 格式)。JSON 格式为:{entities:[{name:name of entity]}json格式中的名称使用英文表示`const Prompt = Prefix + Message + ContextMessage+Suffixconsole.log(Prompt)const completion = await openai.chat.completions.create({messages: [{"role": "user","content": Prompt,}],model: "yi-large",});const Content = completion.choices[0].message.contentconsole.log(Content)let p= Content.indexOf("```json\n")console.log("p="+p)if (p>0){let ContentB=Content.replace("```json\n", "")let e= ContentB.indexOf("```")const JSonContent =ContentB.substr(p,e-p)//console.log("JSonContent:"+JSonContent)const entities = JSON.parse(JSonContent).entitiesconsole.log("entities:"+entities)const Result=await PathSerch(entities,Message)return Result} else return Content
}
结论
使用LLM 实现图数据库的路径搜索,图数据库存储是可能的,它对于复杂关系的数据存储和检索是十分有效的。
对于关系不复杂的数据,例如与时间相关的活动,事件,使用图模型并不合适,不如使用传统数据库。
利用大模型构建一套高效的记忆系统的应用,并不简单。而增强人类的记忆能力是AI 的重要应用之一。
相关文章:
谈基于大语言模型的图数据库路径检索
随着微软已经开源了GraphRAG项目的代码,基于图数据库的RAG 热度迅速升温。关注基于大语言模型与图模型数据库相结合的技术的人多了起来。 本文提出了一种类似人工搜索的“顺藤摸瓜”方法,实现图数据库的智能搜索方法。 本地私有数据存储和查询 本地私有…...
XHTML 简介
XHTML 简介 XHTML,即“可扩展超文本标记语言”(eXtensible HyperText Markup Language),是一种基于XML的标记语言,旨在取代HTML作为网页内容的标准格式。XHTML继承了HTML的基本结构,但更加严格和规范&…...
驱动开发系列10 - Linux Graphics 图形栈介绍
目录 一:Linux 图形栈总体结构 1. 整体图形栈: 2. 现代3D图形栈: 二:Xorg 介绍 Xorg 概述: Xorg的发展历史: Xorg绘制原理: Xorg的缺点: 三:Wayland 介绍 一:Linux 图形栈总体结构 1. 整体图形栈: 应用程序->桌面环境->GUI框架->Display Client->Displ…...
Docker快速入门指南
🛠️ Docker 应用场景 Docker 是一个开源的平台,旨在简化应用程序的开发、部署和管理。它通过容器技术,将应用及其所有依赖打包在一个标准化的环境中,从而确保应用在不同环境中的一致性和可移植性。在 Python 爬虫的场景中&#…...
VS Code中使用MSVC编译C++程序
前置条件 1. VS Code配置C开发环境 2. CMake安装 3. VS安装(MSVC编译器) 4. 环境变量配置(重要!!!) 使用msvc的cl工具编译程序,以及 “fatal error C1034: iostream: 不包括…...
四数之和(LeetCode)
题目 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复): 0 <…...
学习使用备份软件BorgBackup
Time Machine是官方提供的强大备份系统,它能够备份macOS系统的一切,包括文件、照片、网页纪录、帐号密码以及安装过的软件等。如果系统出了问题,使用”时光回溯“,系统就能回到任意记录点,用过的多说好! B…...
Java 实现合并两个有序链表:递归与迭代
Java 实现合并两个有序链表:递归与迭代 在面试和算法题中,合并两个有序链表是一个经典问题。通过这个问题,不仅可以考察候选人的基础数据结构掌握情况,还能测试他们对递归和迭代等编程技巧的应用能力。 本文将讨论如何使用 Java…...
【每日刷题】Day98
【每日刷题】Day98 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 大数加法_牛客题霸_牛客网 (nowcoder.com) 2. 大数乘法_牛客题霸_牛客网 (nowcoder.com) 3. 扑克牌…...
51单片机-LED实验二
使用51单片机进行LED灯的实验,使用8个LED灯展示二进制数,使用独立按键控制二进制数的加法,每次按下独立按键K2,就让二进制数加一,定义了一个LedNum,表示二进制数,二进制数取反之后可以得到输出到LED端口的8…...
批发行业进销存-webview 读取NFC,会员卡 源码CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构
一、混合应用开发 混合应用顾名思义就是网页html和原生APP共同作用的结果 好处在一既有web的跨平台优势(安卓、苹果,电脑、国产电脑、平板电脑,自助机都能用) 好处二可以离线使用,比较稳定 好处三可以与本地硬件交…...
博弈dp,CF 731E - Funny Game
一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 731E - Funny Game 二、解题报告 1、思路分析 游戏规则其实就是交替取前缀和 考虑 f(i) 为 某人先手取前 i 个,最终能得到的最大分差 由于每人都是最佳发挥,所以有如下状态转移&am…...
基础知识:深入理解MongoDB、MySQL与Redis的应用与实践
基础知识:深入理解MongoDB、MySQL与Redis的应用与实践 在现代应用开发中,数据库系统的选择对于系统的性能、扩展性和维护性有着至关重要的影响。MongoDB、MySQL 和 Redis 是三种流行的数据库技术,它们各自有着独特的特点和适用场景。本文将详…...
Reids中List类型、Set类型、SortedSet类型的常用指令
List类型: Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。 特征也与LinkedList类似: 有序元素可以重复插入和删除快查询速度一般 常用来存储一个有序数据,…...
K8S Ingress 常用配置
目录 介绍ingress 安装 基本使用请查看域名重定向前后端分离配置默认证书配置指定证书配置白名单配置黑名单配置Annotations 配置ConfigMap 配置 匹配请求头速率限制限制客户端的最大连接数限制每秒钟段并发连接数限制每分钟段并发请求突发访问限制限制传输速度速率限制白名单 …...
【K8S】K8S架构及相关组件
文章目录 1 K8S总体架构2 相关组件2.1 控制面板组件2.2 节点组件2.3 附加组件 写在最后 1 K8S总体架构 K8S,全称Kubernetes,是一个开源的容器部署和管理平台,由Google开发,后捐献给云原生计算基金会(CNCF)…...
【MATLAB第108期】基于MATLAB的fast、vbsa、dynia、eet、glue、pawn、rsa敏感性分析模型合集(无目标函数)【更新中】
【MATLAB第108期】基于MATLAB的fast、vbsa、dynia、eet、glue、pawn、rsa敏感性分析模型合集(无目标函数)【更新中】 一、FAST(Fourier Amplitude Sensitivity Test) FAST(Fourier Amplitude Sensitivity Test&#…...
【K8S】为什么需要Kubernetes?
文章目录 1 什么是Kubernetes?2 三种常见的应用部署方式2.1 传统部署2.2 虚拟化部署2.3 容器化部署 3 Kubernetes的特点写在最后 1 什么是Kubernetes? Kubernetes是 一个开源的,用于管理云平台中多个主机上的容器化应用,Kubernet…...
【Linux】Linux中查找字符串中的命令
在Linux中,查找字符串的命令通常使用grep。grep是一个强大的工具,用于在文件中搜索指定模式的字符串。以下是一些基本用法: 1.在文件中查找字符串 grep "字符串" 文件名例如,查找文件example.txt中包含“hello”的行&…...
最新HTML设计搜索表单
设计搜索表单 页眉中包含表单,表单中只需包含label和Input. 实现如下效果:文本框动态变宽效果 代码:6.2.4.设计搜索表单.html <!DOCTYPE html> <html><head><meta charset"utf-8"><title></t…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
