首页 > 其他分享 >GraphRAG原理及部署实战(GraphRAG系列第一篇)

GraphRAG原理及部署实战(GraphRAG系列第一篇)

时间:2024-10-29 17:21:53浏览次数:6  
标签:实战 RAG GraphRAG 第一篇 查询 索引 Instruct 指令

      RAG在大模型时代,被寄予了厚望,但在近一年多各大小公司的实施过程中,其效果远没有抖音中宣传的那么振奋人心,其原因是多方面的。这篇文章就RAG中的一个弱项--局部性来展开讨论。

一、RAG原理      

      图1描述了RAG的原理,用户输入了一个指令Instruct,RAG将其与Document store(向量库)中的预存文本进行匹配,然后将符合条件的筛选文本(Retrieved Documents)与指令Instruct,共同合成为一个增强型的Prompt,并将该增强型Prompt喂给大模型,

      最终大模型根据此增强型Prompt,生成最终的Response。

图1 RAG原理图(来源于网络)

      因为关于RAG的文章,网络上非常多,本文不再缀叙,因前后逻辑理解上的需要,只就RAG基本流程进行说明。需要更详细了解RAG原理,可参考以下两篇博客:

  • RAG技术架构与实现原理

           https://cloud.tencent.com.cn/developer/article/2436421

  • 用通俗易懂的方式讲解:一文详解大模型 RAG 模块

          https://blog.csdn.net/python1222_/article/details/140124845

二、RAG的缺陷

      目前RAG效果不佳的原因,一个是Document=>Chunks的切分策略,另一个是在向量库检索(Retrieval)与指令Instruct关联的文本(Chunks)策略。

      Document=>Chunks的切分策略最大的问题,如何将一篇完整的文档,自动划分为数个具有完整语义的段落集合,但现有的工具,比如Langchain里提供的RecursiveCharacterTextSpliter、CharacterTextSpliter等,都是简单的武断的将文档分成若干个段落,具有完整语义的段落被拆分为数个chunks,或者一个chunk包含几个不同语义的段落,这样的数据预处理,自然会导致在LLM推理时效果不佳。

      从向量库检索匹配指令Instruct的文本,存在只能匹配细粒度的问题,如果用户指令需要从宏观上去总结一篇文章,那传统的RAG的表现就很糟糕了,因为这是传统RAG技术架构上的先天缺陷导致。传统RAG是将一篇文章打碎拆分为几个小的章节(chunks),然后embedding后存入向量库,在查询阶段,RAG将用户指令Instruct挨个在向量库与这些chunks的embedding向量进行相似度匹配,然后输出最匹配的k个作为prompt的上下文(context),无论是在文档预处理进向量库阶段,还是用户查询阶段,都没家考虑各个chunk之间的关联,这就形成了普通RAG技术的先天设计缺陷。

      所以,微软这些牛人就针对上面提到的这个RAG先天设计缺陷,提出了GraphRAG的理念和实现版本。

三、GraphRAG

   论文:《From Local to Global: A Graph RAG Approach to Query-Focused Summarization》

        源码:https://github.com/microsoft/graphrag

        GraphRAG提出了一种回答总结类(summary)问题的算法思路,图2展示了GraphRAG算法的工作流程,包括索引建立阶段(index time)和查询阶段(query time)。

图2 GraphRAG算法工作流

  •  索引建立(index time)

   索引建立阶段,属于数据预处理阶段,主要目的是从提供的文档集合中,提取出知识图谱(Knowledge Graph),然后以聚类算法(Leiden),将知识图谱分为数个社区(community),并总结每个社区(community)所表达的含义(community summary)。

 

  • 查询(query time)

   查询阶段,是建立在索引建立的阶段基础上,GraphRAG系统的终端用户,在此阶段加入进来,并向系统提供查询指令Instruct。GraphRAG将用户Instruct与每个社区的community summary进行相似度匹配,并将匹配结果作为最终喂给大模型的prompt的上下文(context),以生成返回给用户的最终回答。

 

 三、GraphRAG部署

   GraphRAG部署分为安装包部署和源码部署,这里推荐源码部署,因为部署过程中,可能会遇到不可预知的问题,有些问题只能修改源码才能规避。

1、安装依赖环境

      安装依赖管理工具poetry,poetry是比pip更完善依赖管理工具,只要通过poetry安装或删除的包,poetry都会对pyproject.toml文件进行更新。

      

      安装graphrag依赖包    

      

      安装openai sdk

      

 

 2、索引建立

2.1 配置.env文件

      配置GRAPHRAG_API_KEY,该API_KEY是OpenAI、Qwen、GLM等大模型API的API Key,可自行去各大模型厂商的官网获取。

      

2.2 配置settings.yaml

    配置llm->model和llm->api_base,使GraphRAG能访问到大模型 API接口

    

 配置embeddings的llm->model和llm->api_base,配置方法同上。

2.3 搭建数据集

 将数据集文本 flatten方式存放在input文件夹下,本文目的是展示搭建GraphRAG的流程,数据集只包含一个文本文件。

    

2.4 建立索引

    运行poetry run poe index --root . ,

    

    执行到create_base_entity_graph阶段,遇到错误,查日志发现是大模型服务器证书是自验证的证书,而不是CA这类权威机构颁发的证书。,如果所在网络没有报证书校验问题,可忽略下面跳过证书验证的部分。

    

    为解决自验证证书问题,只能修改GraphRAG网络访问部分的代码,需要修改graphrag/llm/openai/create_openai_client.py、graphrag/query/oai/base.py和tiktoken/loader.py三个文件。

    graphrag/llm/openai/create_openai_client.py需要修改:

    

    graphrag/query/oai/base.py需要修改:

    

    tiktoken/loader.py需要修改:

    

    然后再执行构建索引指令,即可成功构建索引。

   

 2.4 查询

      执行以下指令,进行global方式查询。

      

     global方式查询效果如下:

 

      执行以下指令,进行local方式查询。

      

     local方式查询效果如下:

 

     至此,GraphRAG调试环境部署完成。

 

关注更多安卓开发、AI技术、股票分析技术及个股诊断等理财、生活分享等资讯信息,请关注本人公众号(木圭龙的知识小屋)

标签:实战,RAG,GraphRAG,第一篇,查询,索引,Instruct,指令
From: https://www.cnblogs.com/tgltt/p/18512586

相关文章

  • 购物平台数据抓取实战指南:从API到深度分析
    在当今电商盛行的时代,淘宝、京东、拼多多等购物平台已成为消费者日常购物的主要场所。对于企业、市场分析师及开发者而言,这些平台上的数据无疑是一座宝贵的金矿。本实战指南将带您从API接口出发,一步步实现购物平台数据的抓取、处理到深度分析。一、API接口初探API(Application......
  • 【项目实战】Java中集合Collection 和 Collections入门介绍
    在Java编程语言中,Collection是一个接口,它是集合层次结构中的根接口。Collection接口定义了所有集合类型(如列表、集合和队列)所共有的基本操作方法。而Collections则是一个工具类,它提供了一系列静态方法来操作或返回集合。当你需要存储一组对象并在程序中对其进行操作时,......
  • 【项目实战】网络通信协议Socket和WebSocket入门介绍
    一、Socket1.1文件描述符详解文件描述符是在操作系统层面用来访问文件或I/O资源(如网络套接字)的一个抽象的、非负整数。每个进程在打开一个文件或创建一个套接字时,都会得到一个唯一的文件描述符。在Unix/Linux系统中,标准输入(stdin)、标准输出(stdout)和标准错误(stderr)默认......
  • 【项目实战】分布式日志搜索系统之数据同步方案(Logstash-input-jdbc、go-mysql-elast
    在构建分布式日志搜索系统时,数据同步是一个核心环节。以下是针对您提出的五种数据同步方案的详细分析:一、Logstash-input-jdbcLogstash是ElasticStack的一部分,用于从各种来源收集数据,并将其发送到Elasticsearch。Logstash-input-jdbc插件允许Logstash从关系型数据库(如My......
  • 【项目实战】分布式日志搜索系统之Elastic Stack日志抽取(filebeat、heartbeat、packet
    一、ElasticStack是什么?ElasticStack,以前称为ELKStack,是一套开源的日志分析解决方案。ElasticStack,由Elastic公司开发和维护。ElasticStack,包括了几个核心组件,这些组件协同工作以帮助用户收集、处理、存储、搜索和可视化数据。ElasticStack,因其灵活性和强大的功能......
  • Autofac 解释第一个例子 《第一篇》
    Autofac解释第一个例子《第一篇》 Autofac是一个轻量级的依赖注入的框架,同类型的框架还有Spring.NET,Unity,Castle等。Autofac的使用有一个非常让人郁闷的地方,就是服务器要求安装有Microsoft.NETFramework4KB2468871。该补丁的地址是:http://www.microsoft.com/zh-cn......
  • 多线程应用在鸿蒙 HarmonyOS Next 中的内存管理与 GC 实战
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在构建高性能应用时,尤其是需要处理大......
  • ArkTS 中的 XML 解析与生成:应用开发实战
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。引言XML是一种广泛使用的标记语言,用......
  • Java毕业设计-基于Springboot框架的智慧学生校舍系统项目实战(附源码+论文)
    大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。......
  • Java毕业设计-基于Springboot框架的档案管理系统项目实战(附源码+论文)
    大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。......