前言


        本文可以说是全网最全GraphRAG操作教程了,本人作为硕士牛马使用GraphRAG已经有一段时间了,在使用过程中将需要踩的坑都踩了一遍,经过了大量的查阅各种资料以及debug过程(Indexing的过程有点费机器),最终成功运行了GraphRAG项目,并提供在gephi上的可视化方法。这里记录一下完整的流程,给兄弟们一些参考。

注:1、部署过程中主要参考了几个教程,列在文末。

       2、使用ollama调用模型,显存占用大概是模型大小两倍。

       3、本文针对graphrag0.4.1版本,纯体验可参考graphrag-local-ollama(不需要修改源代码),本人之前也是使用这个库,奈何版本太低(0.1版本)。


        之所以要使用ollama同时提供llm和Embedding模型服务,是因为原生代码仅仅支持OpenAI的接口(太贵了!!!),微软官方也承认目前工作重心在算法的优化而不是各种模型和框架的兼容性适配性上,并且ollama实在是太好用了,使用超级简单,响应速度也超级快。 

一、GraphRAG+Ollama本地部署

首先说明,本文默认Linux系统,同时已有Anaconda服务。

注:如果在Windows系统,仅需安装ollama的Windows版本,且在conda环境中pip安装ollama包,其他可按本文操作。


1、创建并激活新的 conda 环境:(python版本3.10-3.12,本文采用3.12):

conda create -n graphrag python=3.12
conda activate graphrag

2、安装 Ollama:

访问 Ollama的网站以获取安装说明。

或者,运行:

curl -fsSL https://ollama.com/install.sh | sh #ollama for linux
pip install ollama

3、使用 Ollama 下载所需的模型,我们可以从 llm 的 (llama3.1、qwen2.5等) 和 Ollama 下提供的任何嵌入模型中进行选择:

ollama pull llama3.1  #llm
ollama pull nomic-embed-text  #embedding

注:可通过ollama list 查看模型是否下载成功

4、下载graprag

git clone https://github.com/microsoft/graphrag.git 

5、导航到存储库目录:

cd graphrag

6、安装依赖包

pip install -e .

7、创建所需的输入目录:将数据文本文件放在这个路径下, 文件格式为txt, 注意:txt文件必须是utf-8编码的,可以多个文件。

mkdir -p ./ragtest/input

8、初始化 ./ragtest 文件夹以创建所需的文件:

graphrag init --root ./ragtest

此时会在 ragtest 目录下生成 output,logs,setting.yaml,prompts,.env (默认隐藏)等目录及文件。setting.yaml 是配置文件,后面需要修改,output 是每次跑模型的结果,logs是运行日志。

9、修改.env文件为如下内容:

GRAPHRAG_API_KEY=ollama
GRAPHRAG_CLAIM_EXTRACTION_ENABLED=True

 10、修改setting.yaml文件,修改的代码为:

api_key: ollama
  model: llama3.1-32k
  api_base: http://localhost:11434/v1

api_key: ollama 
  model: nomic-embed-text
  api_base: http://localhost:11434/api

chunks:
  size: 300

snapshots:
  graphml: true

 修改以下七处(其中最后两处可根据需要选择是否修改):

 

 

 

注:1、embeddings模型推荐使用nomic-embed-text

       2、如果出现ValueError: Columns must be same length as key,这时就可以修改第六处,将chunk size调小一点,使用更大的chunk size可以加快处理速度(另一方面,经由验证,改为1200chunk size,可以得到更positive的结果),但是也会导致较低保真度的输出和较少的有意义的参考文本。

       3、如果需要知识图谱的可视化可以将第七处graohml修改为true,具体可视化方法见下文。

 二、源代码修改

 1、修改文件graphrag/graphrag/llm/openai/openai_embeddings_llm.py内容(相对路径为此),调用ollama服务,需要注释的官方原代码请注释,修改的代码为:

import ollama

       embedding_list = []
        for inp in input:
            embedding = ollama.embeddings(model="nomic-embed-text",prompt=inp)
            embedding_list.append(embedding["embedding"])
        return embedding_list

代码位置在:

 2、修改文件graphrag/graphrag/query/llm/oai/embedding.py,调用ollama提供的模型服务,需要注释的官方原代码请注释,修改的代码为:

import ollama

embedding = ollama.embeddings(model='nomic-embed-text', prompt=chunk)['embedding']

return chunk_embeddings

 代码位置在:

 

 3、修改文件graphrag/graphrag/query/llm/text_utils.py里关于chunk_text()函数的定义,新增一行代码:

tokens = token_encoder.decode(tokens) # 将tokens解码成字符串

 代码位置在:

OK!恭喜你源代码修改完毕!

三、Running the Indexing pipeline

graphrag index --root ./ragtest

这一过程耗时较长,所用时间和在 Input 文件夹中数据大小和你所使用的模型大小有关,成功结束之后应该是:

 四、Query 

1、执行全局查询global Search:

graphrag query --root ./ragtest --method global --query "What is Transformer Neural Networks?"

 结果展示:

 

2、 local_search本人在使用graphrag-local-ollama该库时测试成功。时间久远无法展示,有问题可参考:

GraphRAG+Ollama实现本地部署(最全,非常详细,保姆教程)_graphrag ollama-CSDN博客

五、可视化

将可视化生成的graphrag/ragtest/output/summarized_graph.graphml文件上传至gephi进行可视化(具体可根据gephi官方教程操作)。

六、提取自定义实体类别

1、修改settings.yaml文件中实体类别如下位置:

2、手调prompt自定义实体

懒得写了,参考【LLM大模型】GraphRAG手调Prompt提取自定义实体_graphrag prompt-CSDN博客

七、踩坑总结

1、若出现 Errors occurred during the pipeline run, see logs for more details.基本上都是代码修改有错误,自行根据本文回头检查。

2、若出现ValueError: Columns must be same length as key,可查看第10步注2

3、若在执行 global Search时出现报错,回复:

I am sorry but I am unable to answer this question given the provided data
raise JSONDecodeError(“Expecting value”, s, err.value) from None json.decoder.
JSONDecodeError: Expecting value: line 1 column 1 (char 0)

方法1、在settings.yaml找到global_search,调小你的max_tokensdata_max_tokens:

方法2、在graphrag/graphrag/query/structured_search文件夹中有golbal_search local_search 两个文件夹中分别有一个 search.py文件。把其中所有的 search_messages 变量(一共3处)修改为如下格式即可(注释掉的代码为原代码)

search_messages = [ {"role": "user", "content": search_prompt + "\n\n### USER QUESTION ### \n\n" + query} ]

 方法3、修改本地部署的 Ollama 模型的上下文长度(即 `num_ctx` 参数):

(1)使用 `ollama show` 命令生成目标模型的 Modelfile。例如,对于 `qwen2` 模型,执行以下命令:

 ollama show qwen2 --modelfile > Modelfile

 (2)打开生成的 `Modelfile`,在 `FROM` 指令下方添加`num_ctx` 参数,设置为您需要的上下文长度。例如,将上下文长度设置为 32768,完整文件展示如下:

     # Modelfile generated by "ollama show"
     # To build a new Modelfile based on this, replace FROM with:
     # FROM llama3.1:8b-text-fp16

     FROM/usr/share/ollama/.ollama/models/blobs/sha256-758009e77802582eeac49244c4012e884704b01c3f8b5ff1e61be3e7fc45f4ca
     PARAMETER num_ctx 32768
     TEMPLATE {{ .Prompt }}

     ...
     ...

 请注意,增加上下文长度可能会显著增加显存的使用,需根据您的硬件配置谨慎调整。

(3)在编辑并保存 `Modelfile` 后,使用 `ollama create` 命令创建一个新的模型。例如,命名为 `qwen2-32k`:

ollama create qwen2-32k -f Modelfile

 此命令将根据修改后的 `Modelfile` 创建一个新的模型 `qwen2-32k`。

4、若出现:

ZeroDivisionError: Weights sum to zero, can't be normalized

 则按照6.3中方法2修改即可。


其他问题可在评论区交流!

本文有任何问题欢迎指正。

参考链接:

https://github.com/microsoft/graphrag?tab=readme-ov-file

https://github.com/microsoft/graphrag/blob/main/docs/get_started.md

https://blog.csdn.net/vivisol/article

https://blog.csdn.net/weixin_42107217/article

GraphRAG+Ollama实现本地部署+neo4j可视化结果_spring graphrag+ollama+neo4j-CSDN博客

Logo

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!

更多推荐