赞
踩
随着微软已经开源了GraphRAG项目的代码,基于图数据库的RAG 热度迅速升温。关注基于大语言模型与图模型数据库相结合的技术的人多了起来。
本文提出了一种类似人工搜索的“顺藤摸瓜”方法,实现图数据库的智能搜索方法。
本地私有数据的存储和查询主要包括:
又称为长期记忆。
又称为RAG。
本文重点讨论如何使用图数据库实现长期记忆。
历史对话使用memory 模块来实现,最简单的是将所有的对话都存储在内存(短期记忆),或者存储在数据库中(长期记忆)。
图数据库适合存储复杂关系的信息,例如对话者的家庭关系。个人简历。
普通数据库适合存储对话者的活动,备忘录等信息。
LLM 与图数据库结合关键在两点
首先通过LLM判断陈述语句中的实体和关系。并且输出json 格式
- {
- startNodeName:"姚家湾"
- relationship:"儿子“
- endNodeName:"姚大为"
- }
通过图数据库的语句将实体和关系存储到图数据库中。
下图是根据对话存储的个人信息。
通过LLM 实现图数据库看起来是十分简单的事情,许多的大模型能够直接产生图模型的查询语句。事实上并没有想象的简单,首先是LLM 提取实体和关系的名称是不确定的。有时候存储和查询对话产生的实体和关系的类型不能够对应。对于复杂的提问,LLM 也无法生成完整的查询语句。这就需要LLM具有智能(或者说是模糊的)查询的图数据库的能力。
网络上有一些关于图模型查询的介绍,
比如找出与实体连接的的一部分节点,搜索N跳以内的局部子图 比如4层。
另一种方法是利用vector 数据库构建图数据库中所有节点,关系的vector 通过vector数据库查询相关的节点内容,这似乎失去了图模型的意义。
这些方法基本上是简单粗暴法。
我们尝试模仿人类查询的方式,根据实体的属性和所有的关系顺藤摸瓜地检索图数据库的信息。姑且称之为“顺藤摸瓜法”。
所谓顺藤摸瓜法就是模仿人工搜索图的方法,通过LLM 来逐步确定图数据库的搜索路径。
这个过程类似迷宫 站在一个节点上,看哪个方向的节点更接近目标,然后选择一个或者几个方向尝试。每前进一步,都需要思考。
下图是一个例子。
询问:
姚远的岳父是谁?
大模型首先提取出询问中的实体-“姚远”,然后通过neo2J 数据库查询出“姚远”节点,已经临近节点,这是并不能回答“姚远的岳父是谁”,但是他会回答“通过查询”刘素霞节点进一步查询。
通过第二次查询“刘素霞节点以及它相邻的节点,能够读取 ”刘亚敏“节点。
终于,LLM 回答:
姚远的岳父是刘雅敏。
一些例子:
设计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+Suffix
- console.log(Prompt)
- const completion = await openai.chat.completions.create({
- messages: [
- {
- "role": "user",
- "content": Prompt,
- }],
- model: "yi-large",
- });
-
- const Content = completion.choices[0].message.content
- console.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).entities
- console.log("entities:"+entities)
- const Result=await PathSerch(entities,Message)
- return Result
- } else
- return Content
- }

使用LLM 实现图数据库的路径搜索,图数据库存储是可能的,它对于复杂关系的数据存储和检索是十分有效的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。