因为最近在做一些关于提高公司内部使用的聊天机器人的回答准确率,并且最近微软官方也是开源了一下graphrag的源码,所以想聊一聊这个知识图谱结合rag。
rag在利用私有数据增强大模型回答的领域是一种比较典型的技术,也就是我们提出问题的时候,rag会根据我们的问题去知识库中检索一些比较相关的文档或者语句,将这些文档和我们的问题一起拼接到提示词模版中,得到一个完整的提问大模型的问题,这样大模型就可以根据我们提供的知识以及我们的问题来对特定领域的问题进行回答了。
首先,我们了解一下传统的rag技术,传统的rag技术就是通过匹配文档语句的相关性或者相似度来得到一些比较相关的文档。可以分为两个角色,分别是用户和文档管理者。大致流程:
文档管理者:
①上传导入文件,解析文件内容
②对文本内容进行切块,每一块可以成为一个chunk。
③得到每个chunk,利用嵌入式模型得到每个chunk的向量表示,并将这个向量存储到向量数据库中,常见的向量数据库,比如faiss数据库,将其作为一个本地知识库。
用户:
①提出问题
②对问题进行向量化
③利用得到的向量去知识库中匹配,得到相关性分数比较大的一些语句块,即chunk,这里就会涉及到一些检索技术了
④得到chunk,将其和问题拼接到提示词模版中,就可以得到一个完整的对大模型的问题。
⑤大模型回答问题,得到答案
由此,我们可以看的出来,传统的rag是一种局部检索的技术,也就是我们提问的问题会跟每个语句块进行匹配得到相关性分数,只能提问一些局部的问题,以及得到一种比较局部的答案,当我们要问某个文档的全局性的问题的时候,他就不会出现很好的效果。
这时候就需要知识图谱了,知识图谱是一种类似于图结构,其中有很多的实体,也就是结点,也有很多的关系,也就是边,一个文档可以理解为一个图结构,各个文档之间没有交集,也就是对应的图结构不会有关系。
这样,我们在上传文档的时候,切分为了很多的块,即chunk,我们会将每个块交给大模型,让其提取其中的实体和关系,然后存储起来,实体和关系分别存储到各自的集合中,最终所有的chunk提取完以后,一次性的将所有的结点和关系存储到一个图数据库中,然后我们就可以在数据库中得到这个文档的一个知识图谱。这样,当用户提问的时候,就可以提供更丰富的上下文或者关系,提供总结能力和回答的准确性。