LLM之本地部署GraphRAG(GLM-4+Xinference的embedding模型)(附带ollma部署方式)

前言

有空再写

微软开源的GraphRAG默认是使用openai的接口的(GPT的接口那是要money的),于是就研究了如何使用开源模型本地部署。

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

操作文档:https://microsoft.github.io/graphrag/posts/get_started/

:1、其实本次操作也可以不用下载源码,使用pip install graphrag 就能将graphrag下载下来变成包,建议大家先跑起来之后,再去看源码

2、要有足够的显存,给大家看看我的使用情况

一、启动GLM-4 

由于GraphRAG默认是使用openai的接口的,而GLM-4使用VLLM提供了相应的接口,这里就不在对GLM-4以及VLLM进行介绍啦,感兴趣的小伙伴可以自己去搜索一下 

GLM-4的github地址: https://github.com/THUDM/GLM-4

huggingface地址https://huggingface.co/collections/THUDM/glm-4-665fcf188c414b03c2f7e3b7

百度网盘链接(glm-4-9b-chat):

链接:https://pan.baidu.com/s/1dSMVbFg8GTfS901MZYOiMw?pwd=o2xt 
提取码:o2xt 
 

下载好之后如下:THUDM是模型存放的文件夹

然后我们执行

pip install uvicorn vllm fastapi

安装好相应的包之后,在GLM-4\basic_demo\openai_api_server.py文件中修改

MODEL_PATH为自己存放模型的所在路径(建议使用绝对路径)

代码默认的host是0.0.0.0,大家可以按需要自己修改想要的IP和端口号

运行如下:

二、启动Xinference

Xorbits Inference (Xinference) 是一个开源平台,用于简化各种 AI 模型的运行和集成。借助 Xinference,您可以使用任何开源 LLM、嵌入模型和多模态模型在云端或本地环境中运行推理,并创建强大的 AI 应用

官网:https://inference.readthedocs.io/zh-cn/latest/index.html

快速安装文档:https://github.com/xorbitsai/inference/blob/main/README_zh_CN.md

Transformers 引擎

pip install "xinference[transformers]"

vLLM 引擎

pip install "xinference[vllm]"

Llama.cpp 引擎

初始步骤:

pip install xinference

不同硬件的安装方式:

Apple M系列:

CMAKE_ARGS="-DLLAMA_METAL=on" pip install llama-cpp-python

英伟达显卡:

CMAKE_ARGS="-DLLAMA_CUBLAS=on" pip install llama-cpp-python

AMD 显卡:

CMAKE_ARGS="-DLLAMA_HIPBLAS=on" pip install llama-cpp-python

全部

pip install "xinference[all]"

由于我们前面使用vllm运行GLM-4,所以我们运行 pip install "xinference[vllm]"

后台启动服务

如果是服务器端,得到服务器的IP再改上去运行就可以了

xinference-local --host 0.0.0.0 --port 9997

例如我的就是 xinference-local --host 192.0.0.181 --port 9997 

在浏览器上输入 http://192.0.0.181:9997/

 在 EMBEDDING MODELS 中选一个,我这边选择的是bge-m3 大家也可以选择bge-base-en先尝试尝试,按需求选择

点击小火箭进行下载

下载完成之后会自动跳入Running Models中

三、启动GraphGAG

参考我上面发的GraphGAG操作文档

1、创建目录

mkdir -p ./ragtest/input

2、下载文档

curl https://www.gutenberg.org/cache/epub/24022/pg24022.txt > ./ragtest/input/book.txt

或者大家自己随便找个txt文件或者小说啥的,塞进去也行

3、初始化

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

 执行的是

 在ragtest下会多出个目录prompts,里边存放着一些prompts

4、更改settings.yaml 

更改内容如下:对llm、embeddings部分内容进行了修改:

  改动了api_key, model, 增加了api_base,但type不需要变动。

encoding_model: cl100k_base
skip_workflows: []
llm:
  api_key: glm-4
  type: openai_chat # or azure_openai_chat
  model: glm-4-9b-chat
  model_supports_json: true # recommended if this is available for your model.
  api_base: http://0.0.0.0:8081/v1
 

parallelization:
  stagger: 0.3

async_mode: threaded # or asyncio

embeddings:
  async_mode: threaded # or asyncio
  llm:
    api_key: xinference
    type: openai_embedding # or azure_openai_embedding
    model: bge-m3
    api_base: http://192.0.0.181:9997/v1

 5、Running the Indexing pipeline

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

这是最容易出错的地方了

1、

11:11:54,823 graphrag.llm.openai.utils ERROR error loading json, json=
Traceback (most recent call last):
  File "/home/nlp/graphrag-main/graphrag/llm/openai/utils.py", line 93, in try_parse_json_object
    result = json.loads(input)
  File "/home/anaconda3/envs/nlp/lib/python3.10/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
  File "/home/anaconda3/envs/nlp/lib/python3.10/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/home/anaconda3/envs/nlp/lib/python3.10/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

是因为在graphrag\llm\openai\openai_chat_llm.py 中try_parse_json_object(output)函数中接收的output对应的格式不对,不知道咋描述,大家可以自己瞅瞅

解决办法:

 在graphrag-main\graphrag\llm\openai\utils.py中替换掉try_parse_json_object的定义,如下:

def try_parse_json_object(input: str) -> dict:"""Generate JSON-string output using best-attempt prompting & parsing techniques."""try:clean_json = clean_up_json(input)result = json.loads(clean_json)except json.JSONDecodeError:log.exception("error loading json, json=%s", input)raiseelse:if not isinstance(result, dict):raise TypeErrorreturn resultdef clean_up_json(json_str: str) -> str:"""Clean up json string."""json_str = (json_str.replace("\\n", "").replace("\n", "").replace("\r", "").replace('"[{', "[{").replace('}]"', "}]").replace("\\", "")# Refer: graphrag\llm\openai\_json.py,graphrag\index\utils\json.py.replace("{{", "{").replace("}}", "}").strip())# Remove JSON Markdown Frameif json_str.startswith("```json"):json_str = json_str[len("```json"):]if json_str.endswith("```"):json_str = json_str[: len(json_str) - len("```")]return json_str

2、如果输出的output是空的,不妨将max_tokens调小一点

如果出现🚀 All workflows completed successfully,恭喜你完成了安装

5、Running the Query Engine

使用Global search:

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

 然后你就会得到这个故事的主题

使用 Local search 

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

 然后你就会得到Scrooge是谁以及他相应的关系介绍

如果在执行Local search,模型输出为空

解决办法:在settings.yaml找到local_search:调小你的max_tokens

如果在执行 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)

解决办法:在settings.yaml找到global_search,调小你的max_tokens与data_max_tokens: 

给大家看看我的输出,我额外加了一段斗破苍穹的小说txt,并且魔改了一下,加进了自己的名字,嘿嘿

6、ollama部署

累了,看链接吧

颠覆传统RAG!GraphRAG结合本地大模型:Gemma 2+Nomic Embed齐上阵,轻松掌握GraphRAG+Chainlit+Ollama

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

欢迎大家点赞或收藏。

大家的点赞或收藏可以鼓励作者加快更新哟~

其他系列的文章也不错哟~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/391798.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nextjs 实现TodoList网页应用案例

参考: https://nextjs.org/ Next.js 是用于网络的一种 React 框架。一些世界上最大的公司在使用它,它能够借助 React 组件的力量让您创建高质量的网络应用程序。 1、创建项目: 另外注意:pages与app路由存在冲突,如果有…

Jenkins未授权访问漏洞 *

漏洞复现 步骤一:使用以下fofa语法进行产品搜索.... port"8080" && app"JENKINS" && title"Dashboard [Jenkins]" 步骤二:在打开的URL中...点击Manage Jenkins --> Scritp Console在执行以下命令..…

leetcode数论(​3044. 出现频率最高的质数)

前言 经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。现阶段开始专项练习。 描述 给你一个大小为 m x n 、下标从 0 开始的二维矩阵 mat 。在每个单元格,你可以按以下方式生成数字: 最多有 8 条路径可以选择&#xff1…

通俗易懂!495页看漫画学Python入门教程(全彩版)Git首发破万Star

前言 在编程的世界里,Python无疑是一颗璀璨的明星。从最初作为打发圣诞节闲暇时间的项目,到如今成为最受欢迎的程序设计语言之一,Python以其简洁、易学、强大的特点吸引了无数编程爱好者。然而,对于初学者来说,编程的…

【redis 第八篇章】链表结构

一、数组和链表 1、数组 数组会在内存中开辟一块连续的空间存储数据,这种存储方式有利也有弊端。当获取数据的时候,直接通过下标值就可以获取到对应的元素,时间复杂度为 O(1)。但是如果新增或者删除数据会移动大量的数据,时间复…

范伟:大叔这句是咱俩合唱的,赵本山:我唱不上去!——小品《门神》(下)的台词与解说

范伟:大叔这句是咱俩合唱的,赵本山:我唱不上去! ——小品《门神》(下)的台词与解说 (接上) 范伟:大叔快快快走 赵本山:干啥 范伟:上咱家过年…

苹果手机锁屏怎么设置?3个技巧,教你快速设置

在科技与创意交织的时代,苹果手机以其简约而不失优雅的设计,成为了我们日常生活中不可或缺的一部分。而作为手机的【第一印象】,锁屏界面更是彰显用户个性的关键所在。那么,苹果手机锁屏怎么设置呢?接下来,…

AI生成PPT?三款工具让总结更轻松

哎呀,职场新人们,你们是不是也跟我一样,刚开始做PPT的时候,感觉像是走进了一个大迷宫,脑袋里装满了想法,但就是不知道怎么把它们变成一页页漂亮的幻灯片?别急,今天咱们就来聊聊三个超…

【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值

C语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载 本章将分享C增加的几种常见特性,主要内容为引用与内联函数 | auto关键字与for循环 | 指针空值,这些知识看似很多,实际也不少。本章篇幅长&#…

C# Unity 面向对象补全计划 七大原则 之 里氏替换

本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正 本系列作为七大原则和设计模式的进阶知识,看不懂没关系 请看专栏:http://t.csdnimg.cn/mIitr,尤其是关于继承的两篇文章&#xff…

形参和实参的运用

形式参数:定义函数时括号中的变量。只有被调用时才被初始化,函数调用完成后自动销毁,只在函数中有效。 实际参数:真实传递给函数的参数,可以是常量、变量、表达式、函数等。无论实参是何种类型,在调用函数…

DBMS 与 RDBMS

DBMS 与 RDBMS 了解数据库什么是数据库管理系统?Types of DBMS 数据库管理系统的类型T数据库管理系统的好处 关系型数据库管理系统的优点 【纪录片】中国数据库前世今生 在数字化潮流席卷全球的今天,数据库作为IT技术领域的“活化石”,已成为…

JAVA(IO流)7.31

ok了家人们今天还是学习IO流, 一.打印流【了解】 1.1 打印流的概述 我们平时使用的System语句就是调用了print()方法和println()方法。 这两个方法都来自于 java.io.PrintStream 类。 作用: 该类能够方便地打印各种数据类型的值,写入数据后…

【Web】TFCCTF 2024 部分题解

目录 GREETINGS SURFING SAFE_CONTENT FLASK DESTROYER GREETINGS 打express的SSTI GitHub - TheWation/NodeJsSSTI: Express app with Pug templates demonstrating SSTI vulnerability and secure implementation for educational purposes. payload: /result?user…

使用腾讯云域名解析实现网站重定向

前言 最近,在CSDN平台上我写了一系列博客,希望能与同学分享一些技术心得。然而,每当需要向他人推荐我的博客时,那串复杂且缺乏规律的CSDN博客首页域名总让我感到不便。这让我开始思考,如果能将这一域名替换为一个既个…

设计模式的概念

设计模式主要分为三类:创建类的设计模式、结构型设计模式、行为型设计模式。 创建类的设计模式:简单工厂,工厂模式,抽象工厂,建造者,单例,原型 结构型设计模式:代理模式、享元模式 行…

博物馆展厅AI交互数字人,解锁创新的文化交互体验

在智能化时代,博物馆展厅融入AI交互数字人,可以为游客给予实时交互的旅游服务,AI交互数字人可以承担智能引导、讲解、接待、客服与导游等多重角色,为游客塑造崭新的旅游体验。 AI交互数字人相比传统的录屏解说相比,AI…

【无所从来,亦无所去】纪念去世的奶奶和外公「纪念网页」

大家好,我是DX3906 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘大前端领域、真诚分享知识与智慧的小天地!🎇 纪念 2024年 奶奶 85岁、 外公83岁。他们俩分别在今年的2月份和7月份离开了。 时光倒流,奶…

SVPWM5段式7段式差异分析和关键代码基于TI F28035

SVPWM5段式7段式差异分析和关键代码基于TI F28035 5段式有一相占空比始终为0或者1 扇区判断的扇区号和实际扇区不是一一对应,直接使用,而是映射关系 扇区判断变量 7段式和5段式在基本矢量作用顺序上的差异 SVPWM算法详解(已标注重点) 来自这篇文章,但经过实际测试,发现是…

使用Halcon变换与校正图像

使用Halcon变换与校正图像 文章目录 使用Halcon变换与校正图像1. 二维图像的平移、旋转和缩放1.图像的平移2.图像的旋转3.图像的缩放2. 图像的仿射变换3. 投影变换4 实例:透视形变图像校正 由于相机拍摄的时候可能存在角度偏差,因此实际获得的画面可能会…