当前位置: 首页 > news >正文

谈基于大语言模型的图数据库路径检索

        随着微软已经开源了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 来逐步确定图数据库的搜索路径。

  1.   提取询问中的实体(Entity),实体对应于图数据库中的节点名称。
  2.   在图数据的查询实体节点的所有属性,与该节点连接的相邻节点,以及所有的关系集(relationships)。
  3.    将读出的信息添加到对话的上下文信息(Context Information) 中。
  4.     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项目的代码&#xff0c;基于图数据库的RAG 热度迅速升温。关注基于大语言模型与图模型数据库相结合的技术的人多了起来。 本文提出了一种类似人工搜索的“顺藤摸瓜”方法&#xff0c;实现图数据库的智能搜索方法。 本地私有数据存储和查询 本地私有…...

XHTML 简介

XHTML 简介 XHTML&#xff0c;即“可扩展超文本标记语言”&#xff08;eXtensible HyperText Markup Language&#xff09;&#xff0c;是一种基于XML的标记语言&#xff0c;旨在取代HTML作为网页内容的标准格式。XHTML继承了HTML的基本结构&#xff0c;但更加严格和规范&…...

驱动开发系列10 - Linux Graphics 图形栈介绍

目录 一:Linux 图形栈总体结构 1. 整体图形栈: 2. 现代3D图形栈: 二:Xorg 介绍 Xorg 概述: Xorg的发展历史: Xorg绘制原理: Xorg的缺点: 三:Wayland 介绍 一:Linux 图形栈总体结构 1. 整体图形栈: 应用程序->桌面环境->GUI框架->Display Client->Displ…...

Docker快速入门指南

&#x1f6e0;️ Docker 应用场景 Docker 是一个开源的平台&#xff0c;旨在简化应用程序的开发、部署和管理。它通过容器技术&#xff0c;将应用及其所有依赖打包在一个标准化的环境中&#xff0c;从而确保应用在不同环境中的一致性和可移植性。在 Python 爬虫的场景中&#…...

VS Code中使用MSVC编译C++程序

前置条件 1. VS Code配置C开发环境 2. CMake安装 3. VS安装&#xff08;MSVC编译器&#xff09; 4. 环境变量配置&#xff08;重要&#xff01;&#xff01;&#xff01;&#xff09; ​​​​使用msvc的cl工具编译程序&#xff0c;以及 “fatal error C1034: iostream: 不包括…...

四数之和(LeetCode)

题目 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff1a; 0 <…...

学习使用备份软件BorgBackup

Time Machine是官方提供的强大备份系统&#xff0c;它能够备份macOS系统的一切&#xff0c;包括文件、照片、网页纪录、帐号密码以及安装过的软件等。如果系统出了问题&#xff0c;使用”时光回溯“&#xff0c;系统就能回到任意记录点&#xff0c;用过的多说好&#xff01; B…...

Java 实现合并两个有序链表:递归与迭代

Java 实现合并两个有序链表&#xff1a;递归与迭代 在面试和算法题中&#xff0c;合并两个有序链表是一个经典问题。通过这个问题&#xff0c;不仅可以考察候选人的基础数据结构掌握情况&#xff0c;还能测试他们对递归和迭代等编程技巧的应用能力。 本文将讨论如何使用 Java…...

【每日刷题】Day98

【每日刷题】Day98 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 大数加法_牛客题霸_牛客网 (nowcoder.com) 2. 大数乘法_牛客题霸_牛客网 (nowcoder.com) 3. 扑克牌…...

51单片机-LED实验二

使用51单片机进行LED灯的实验&#xff0c;使用8个LED灯展示二进制数&#xff0c;使用独立按键控制二进制数的加法&#xff0c;每次按下独立按键K2&#xff0c;就让二进制数加一&#xff0c;定义了一个LedNum,表示二进制数&#xff0c;二进制数取反之后可以得到输出到LED端口的8…...

批发行业进销存-webview 读取NFC,会员卡 源码CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构

一、混合应用开发 混合应用顾名思义就是网页html和原生APP共同作用的结果 好处在一既有web的跨平台优势&#xff08;安卓、苹果&#xff0c;电脑、国产电脑、平板电脑&#xff0c;自助机都能用&#xff09; 好处二可以离线使用&#xff0c;比较稳定 好处三可以与本地硬件交…...

博弈dp,CF 731E - Funny Game

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 731E - Funny Game 二、解题报告 1、思路分析 游戏规则其实就是交替取前缀和 考虑 f(i) 为 某人先手取前 i 个&#xff0c;最终能得到的最大分差 由于每人都是最佳发挥&#xff0c;所以有如下状态转移&am…...

基础知识:深入理解MongoDB、MySQL与Redis的应用与实践

基础知识&#xff1a;深入理解MongoDB、MySQL与Redis的应用与实践 在现代应用开发中&#xff0c;数据库系统的选择对于系统的性能、扩展性和维护性有着至关重要的影响。MongoDB、MySQL 和 Redis 是三种流行的数据库技术&#xff0c;它们各自有着独特的特点和适用场景。本文将详…...

Reids中List类型、Set类型、SortedSet类型的常用指令

List类型&#xff1a; Redis中的List类型与Java中的LinkedList类似&#xff0c;可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。 特征也与LinkedList类似&#xff1a; 有序元素可以重复插入和删除快查询速度一般 常用来存储一个有序数据&#xff0c…...

K8S Ingress 常用配置

目录 介绍ingress 安装 基本使用请查看域名重定向前后端分离配置默认证书配置指定证书配置白名单配置黑名单配置Annotations 配置ConfigMap 配置 匹配请求头速率限制限制客户端的最大连接数限制每秒钟段并发连接数限制每分钟段并发请求突发访问限制限制传输速度速率限制白名单 …...

【K8S】K8S架构及相关组件

文章目录 1 K8S总体架构2 相关组件2.1 控制面板组件2.2 节点组件2.3 附加组件 写在最后 1 K8S总体架构 K8S&#xff0c;全称Kubernetes&#xff0c;是一个开源的容器部署和管理平台&#xff0c;由Google开发&#xff0c;后捐献给云原生计算基金会&#xff08;CNCF&#xff09;…...

【MATLAB第108期】基于MATLAB的fast、vbsa、dynia、eet、glue、pawn、rsa敏感性分析模型合集(无目标函数)【更新中】

【MATLAB第108期】基于MATLAB的fast、vbsa、dynia、eet、glue、pawn、rsa敏感性分析模型合集&#xff08;无目标函数&#xff09;【更新中】 一、FAST&#xff08;Fourier Amplitude Sensitivity Test&#xff09; FAST&#xff08;Fourier Amplitude Sensitivity Test&#…...

【K8S】为什么需要Kubernetes?

文章目录 1 什么是Kubernetes&#xff1f;2 三种常见的应用部署方式2.1 传统部署2.2 虚拟化部署2.3 容器化部署 3 Kubernetes的特点写在最后 1 什么是Kubernetes&#xff1f; Kubernetes是 一个开源的&#xff0c;用于管理云平台中多个主机上的容器化应用&#xff0c;Kubernet…...

【Linux】Linux中查找字符串中的命令

在Linux中&#xff0c;查找字符串的命令通常使用grep。grep是一个强大的工具&#xff0c;用于在文件中搜索指定模式的字符串。以下是一些基本用法&#xff1a; 1.在文件中查找字符串 grep "字符串" 文件名例如&#xff0c;查找文件example.txt中包含“hello”的行&…...

最新HTML设计搜索表单

设计搜索表单 页眉中包含表单&#xff0c;表单中只需包含label和Input. 实现如下效果&#xff1a;文本框动态变宽效果 代码&#xff1a;6.2.4.设计搜索表单.html <!DOCTYPE html> <html><head><meta charset"utf-8"><title></t…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...