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

      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技术、股票分析技术及个股诊断等理财、生活分享等资讯信息,请关注本人公众号(木圭龙的知识小屋)

posted @   tgltt  阅读(3982)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示