本文记录了整个GraphRAG+ollama+Lmstudio实操完整详细流程。包括完整的GraphRAG的操作,ollama的端口获取、Lmstudio完整的模型下载和Api获取。小白学习,可供大家参考。
Grphrag理论学习
生成步骤:分块、向量化、抽取实体和关系然后保存为本地知识图谱文件。
源文档到文本块:一个基本的设计决策是决定从源文档中提取的输入文本应以何种粒度分割成文本块进行处理。使用较小的文本块可以整体提取更多实体。
文本块到元素实例:这一步骤的基本要求是识别并提取每个文本块中的图节点和边的实例。使用一个多部分的LLM提示来首先识别文本中的所有实体,包括它们的名称、类型和描述,然后识别所有明确相关实体之间的关系,包括源实体和目标实体以及它们关系的描述。为了更好地表示这些实例(节点和边),可能会使用嵌入模型来生成它们的向量表示。这些嵌入可以是文本嵌入(如BERT生成的词嵌入),也可以是图嵌入(如果节点和边已经被表示为图结构)。
元素实例到元素摘要:使用LLM将实例级摘要转换为每个图元素的描述性文本块。使用LLM“提取”源文中表示的实体、关系和声明的描述已经是一种抽象摘要的形式,依赖于LLM创建独立有意义的摘要,这些摘要可能是文本本身暗示但没有明确陈述的概念(例如,暗示关系的存在)。要将所有这些实例级摘要转换为每个图元素(即实体节点、关系边和声明协变量)的单一描述性文本块,需要进一步通过匹配实例组进行LLM摘要。
元素摘要到图社区:使用社区检测算法将图划分为模块化社区。前一步创建的索引可以被建模为一个同质无向加权图,其中实体节点通过关系边连接,边权重表示检测到的关系实例的归一化计数。给定这样的图,可以使用各种社区检测算法将图划分为节点之间相互连接的社区。在流程中使用Leiden算法,因为它能够高效地恢复大规模图的层次社区结构。这个层次结构的每个级别都提供了一个社区划分,以相互独立、集体穷尽的方式覆盖图中的节点,使得分而治之的全局摘要成为可能。
图社区到社区摘要:为Leiden层次结构中的每个社区创建报告式摘要。这一步是使用旨在扩展到非常大的数据集的方法为Leiden层次结构中的每个社区创建报告式摘要。这些摘要本身是有用的,因为它们是理解数据集的全局结构和语义的一种方式,并且它们自己可以用来在没有问题的情况下理解语料库。大模型被用来为每个社区生成摘要。
社区摘要到社区回答再到全局回答:使用社区摘要生成最终答案的多阶段过程。准备社区摘要,社区摘要被随机打乱并分成预指定token大小的块。这确保了相关信息分散在各个块中,而不是集中在一个上下文窗口中(可能丢失)。映射社区回答,并行生成中间答案,每个块一个。LLM也被要求生成一个0-100之间的分数,以指示生成的答案在回答目标问题方面的有用程度。得分为0的答案被过滤掉。汇总为全局答案,按有用性得分降序排列的中间社区答案被迭代地添加到新的上下文窗口中,直到达到token限制。这个最终上下文被用来生成返回给用户的全局答案。
综上所述,大模型在文本处理(如实体识别、关系抽取、文本生成)方面发挥了核心作用,而嵌入模型则更多地用于表示学习,以支持更复杂的图算法或优化文本处理任务。
查询逻辑
04-graphrag的查询流程原理介绍_哔哩哔哩_bilibili
局部查询首先对比实体相关度,然后用相关实体查询对应的文本、报告这些信息
全局是与每个社区做检索
GrphRAG利用ollama和Lmstudio生成图谱完整流程
微软开源GraphRAG的使用教程(最全,非常详细)_graphrag 使用-CSDN博客
创建input目录
mkdir ./ragtest/input
放入文档
curl https://www.xxx.com/xxx.txt > ./ragtes/input/book.txt
注意txt的编码方式
初始化配置文件
poetry run poe index --init --root ./ragtest
修改配置文件
具体怎么获取这些端口和模型名称可以参考后文ollama和lmstudio介绍
生成图索引
poetry run poe index --root ./ragtest
查询
poetry run poe query --root ./ragtest --method global "本文主要讲了什么"
poetry run poe query --root ./ragtest --method local "请问大模型在1980年是什么阶段"
这里报错处理比较复杂,请参考我后文的报错记录中第6点。
本地部署大模型端口
ollama+lmstudio
100%本地设置的GraphRAG_哔哩哔哩_bilibili
颠覆传统RAG!GraphRAG结合本地大模型:Gemma 2+Nomic Embed齐上阵,轻松掌握GraphRAG+Chainlit+Ollama技术栈_哔哩哔哩_bilibili
GraphRAG太烧钱?Qwen2-7b本地部署GraphRAG,无需Ollama,从环境搭建到报错解决全流程_哔哩哔哩_bilibili
本地大模型启动openai服务的N种方式,vllm,fastchat,llama factory,llama.cpp,ollama_哔哩哔哩_bilibili
ollama
【ollama本地知识库】_01-ollama入门和自定义模型_哔哩哔哩_bilibili
-安装
-运行或者下载模型:ollama run gemma2 (模型名称)
-没有的模型需要gguf格式的文件(hugging face上可以下载)导入模型
ollama的端口:http://localhost:11434/v1(默认)
lmstudio
可以离线运行大语言模型、可以聊天、以openai兼容的格式提供接口。
下载之后先修改下载路径必须如下路径格式,从models开始如下:
然后在加载模型时只选择到models就可以
下载之后搜索不到模型解决办法:
LM Studio语言大模型部署软件搜索语言模型报错“Error searching for models ‘Network error‘”解决办法 (chinasem.cn)
也可以去魔塔社区下载
本地服务api:
开始之后需要获取的信息:
在模型中调用lmstudio的模型主要是以下四个信息:
修改成如下
model信息来自于lmstudio文档:文本嵌入 |LM工作室 (lmstudio.ai)
其他模型名称其实可以从自己的文件路径中获取
下载魔塔社区的gguf文件然后这样保存就可以让lmstudio来加载该模型
GraphRAG + Ollama 本地部署全攻略:避坑实战指南-AI.x-AIGC专属社区-51CTO.COM
报错记录
1.在服务器上运行ollama,api地址为:
2.在运行的时候可能会出现llm调用失败的情况,会尝试重复调用llm
3.图没有节点可以查看实体和摘要是不是为空
修改chunks为500后能生成图了
4. 报错读取配置文件时文件编码为gbk,是settings文件出了问题,处理方式是可以新建一个文件或者更新settings.yaml文件。
5.本地跑lmstudio时太慢,但是lmstudio貌似必须要本地启动没有终端启动语言
LM Studio + open-webui 快速本地部署大语言模型 - SharpCJ - 博客园 (cnblogs.com)
所以需要查看一下embedding模型有没有其他的解决方法
GraphRAG+Ollama 本地部署,保姆教程,踩坑无数,闭坑大法_graphrag部署-CSDN博客
【深度学习】本地运行 GraphRAG + Ollama_graphrag ollama-CSDN博客
(1)尝试直接使用ollama的嵌入模型
我在settings文件里只修改了api其他的都没有修改最后也成功生成了图索引,但是其他方法说要修改一些配置。
基于 ollama 本地部署 graphRAG_哔哩哔哩_bilibili
6.在进行局部搜索时报错
将embedding文件里的这三句话注释掉没有报错了,但是可以看到并没有查询到任何信息,说明这里没有返回成功数据。
参考这个链接修改embedding.py文件的代码:【大模型RAG】Graph RAG介绍及ollama本地部署_哔哩哔哩_bilibili
参考上述链接后还是报错。
于是,首先我加了语句将chunk的类型进行修改,用print查看chunk的类型以及改变为str类型后是否有影响,还可以查看embedding是否有数据,可以看到通过修改代码embedding是有数据的。
报错如下:
找到这个报错提示的graphrag730\graphrag\vector_stores\lancedb.py文件print出text和query_embeddings的类型,是正确的,将if query_embedding 改成如下语句测试发现可以成功局部查询了。这是因为不能将数据作为逻辑变量直接查询
我並沒有修改视频里的這個文件
可以直接修改虚拟环境里graphrag相关文件的代码。
7.更换其他数据集和模型
使用小王子这个数据集尝试跑:小王子,小王子小说,小王子电子书,全集免费下载 - 365小说网 (shukuge.com)
大模型是gemma2和nomic的时候还是在生成基础图的时候出错,但是换成qwen2后不报错了。
[Bug]: Error executing verb "cluster_graph" in create_base_entity_graph: EmptyNetworkError details=None · Issue #562 · microsoft/graphrag · GitHub 这个bug里有人也讨论说更换模型可以解决问题。