GraphRAG本地运行(Ollama的LLM接口+Xinference的embedding模型)无需gpt的api

       7月3日,微软在官网开源了基于图的RAG(检索增强生成,经过我的多番试验和测试,其RAG的性能远超原来基础型RAG,但是他的源代码中默认只能用openai的接口,经过两天的捣鼓,我自己摸索出了本地运行的方法。详细的过程我就不赘述,这里只说一下我自己改源码的心路历程。(我是在linux服务器上运行的,如果在win上运行也大同小异,自行更改即可)

一、准备工作(download)

1、GraphRAG

(1)源码地址: graphrag

(2)Graphrag操作文档:get_started

2、Ollama

   自己去下载相关项目,和其他的github包,这里面都有教程

    源码地址:https://github.com/ollama/ollama

3、Xinference

     这里面集合了很多LLM,我们这里使用它的embedding模型。

     教程地址:https://inference.readthedocs.io/zh-cn/latest/getting_started/installation.html

二、启动服务(多开几个terminal)

1、启动Ollama

(1)拉取了需要的模型

       为了速度和大家显存着想,我们这里用最小的qwen2:0.5b模型

ollama pull qwen2:0.5b

(2)检查存在

  如图已存在

  

(3)启动服务

如图已经成功,记得保证http://127.0.0.1:11434的ollama默认端口,不要被别的占用

2、启动Xinference

(1)后台启动服务

    默认:9997端口

xinference-local --host 0.0.0.0 --port 9997

(2)启动成功后,进入网页

    按住ctrl点击右下角,这样算成功。

(3)launch embedding model

    选择Launch model下面embedding model,点下左下角的小火箭启动,我们这里选择了bge-base-en的大模型,然后设置CPU运行。

(4)检查成功

    后台会开始运行或者下载(之前没下载过的)

如果点开网页的running models,有东西在跑代表成功启动,address好像有点随机,不用过多理会。

3、启动GraphGAG

      具体操作:https://microsoft.github.io/graphrag/posts/get_started/

      上文也已经发过这一个链接了,我们先进行一个基础操作

(1)conda activate一个环境

      python要求是3.10-3.12的,我自己用的是3.11

(2)基础操作

pip install graphrag
mkdir -p ./ragtest/input
curl https://www.gutenberg.org/cache/epub/24022/pg24022.txt > ./ragtest/input/book.txt

    分别是创建文件夹和下载官方数据

(3)文件夹目录

   我自己又添加了多一个根目录bzp_graphrag

   

(4)初始化

   在bzp_graphrag目录下面执行操作

python -m graphrag.index --init --root ./ragtest

(5)检查成功

  然后结果成功如下

三、配置更改

1、更改settings.yaml

  (1)原来的LLM配置

(2)原来的embedding配置

(3)更改完毕

    更改内容有:

    api_key, model, 增加了api_base,但type不需要变动。(记得api_base是http,非https)

encoding_model: cl100k_base
skip_workflows: []
llm:
  api_key: ollama
  type: openai_chat # or azure_openai_chat
  model: qwen2:0.5b
  model_supports_json: true # recommended if this is available for your model.
  api_base: http://127.0.0.1:11434/v1


parallelization:
  stagger: 0.3
  # num_threads: 50 # the number of threads to use for parallel processing

async_mode: threaded # or asyncio

embeddings:
  ## parallelization: override the global parallelization settings for embeddings
  async_mode: threaded # or asyncio
  llm:
    api_key: xinference
    type: openai_embedding # or azure_openai_embedding
    model: bge-base-en
    api_base: http://127.0.0.1:9997/v1

  

   没有列举完yaml所有配置,大家对照自行更改即可,不要全选复制噢。

2、源码修改

     同学们可以先跳过这一步先尝试运行一下,看看能否成功运行,如果在有显示故障"create_base_entity_graph”不能顺利进行,再回来操作这一步。

(1)寻找出错路径

      这里通过我多次的寻找,发现是graphrag里面的一个包出现了问题,可能没有使用默认调用的openai,在一个is_response_valid总是不能显示。我们寻找它的路径如下:

anaconda安装包的位置(因人而异,总之就是要在你当前python环境下面寻找)

①anaconda->envs->bzp_graphrag(你自己取的环境名字)

②/lib/python3.11/site-packages/graphrag/llm/openai/openai_chat_llm.py

(2)修改函数_invoke_json()

       我们寻找到class OpenAIChatLLM这个类下面的_invoke_json()函数,大概在第60行左右。

然后再定位到是这个出问题。这个代码表达的是如果参数kwargs.get("is_response_valid")可以找到到就采用它,找不到就默认用(lambda _x: True)。我们不使用openai就会导致,每次既能get到kwargs.get("is_response_valid"),又得到kwargs.get("is_response_valid")值是false的。

is_response_valid = kwargs.get("is_response_valid") or (lambda _x: True)

       因此我们就索性,删掉kwargs['is_response_valid']这个选项。我们就在上面这个代码加上如下改动即可,这样每次就会返回lambad等于True

if 'is_response_valid' in kwargs:
    del kwargs['is_response_valid']
is_response_valid = kwargs.get("is_response_valid") or (lambda _x: True)

四、运行

1、Running the Indexing pipeline

python -m graphrag.index --root ./ragtest

2、构建

这里实体提取要久一点,耐心等待。

如果出现无法完成“create_base_entity_graph”的报错,请返回上一节的显示故障,来修改源码。

3、完成,进行简单对话

(1)显示成功

(2)执行global输入

python -m graphrag.query \
--root ./ragtest \
--method global \
"What are the top themes in this story?"

  (3)执行local输入

python -m graphrag.query \
--root ./ragtest \
--method local \
"Who is Scrooge, and what are his main relationships?"

  成功返回内容

       不知道是不是qwen2:0.5b的性能有限,很多global的问题回答成功率会比较低,之后可以自行启动其他的ollama内置的模型。不过到此已经大体成功了。

五、提示

       如果还有其他没有讲述的问题,可以在log处查看服务器具体的报错的内容,路径是

/ragtest/output/20240710-060748/reports/log.json

之后还会更新如何自动化更改prompt,放入自己本地的知识库,如果有用的话,可以点赞支持一下,感谢!!

评论 38
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是zp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值