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://xiahunao.cn/news/3281380.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

springBoot+protobuf(全程Protocol Buffers协议)简单入门

了解Protocol Buffers协议 Protocal Buffers是google推出的一种序列化协议,用于结构化的数据序列化、反序列化。 官方解释:Protocol Buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通…

鸿蒙(API 12 Beta2版)NDK开发【使用Node-API接口进行异步任务开发】

使用Node-API接口进行异步任务开发 场景介绍 napi_create_async_work是Node-API接口之一,用于创建一个异步工作对象。可以在需要执行耗时操作的场景中使用,以避免阻塞主线程,确保应用程序的性能和响应性能。例如以下场景: 文件…

入门 PyQt6 看过来(案例)17~ 表格

PyQt6提供了两种用于有规律地呈现更多数据的控件,一种是表格结构的控件(QTableView),另一种是树形结构的控件(QTreeView)。表格控件属于QTableView类,QTableWidget继承于QTableView。 1 QTableView 表格控件 QTableView控件中QStandItemMod…

IT人求职就业手册:如何在数字时代脱颖而出

💂 个人网站:【 摸鱼游戏】【网址导航】【神级代码资源网站】🤟 一站式轻松构建小程序、Web网站、移动应用:👉注册地址🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交…

【CodinGame】趣味算法(教学用) CLASH OF CODE -20240731

文章目录 正文闰年偶数和密码塔楼高度 写在最后END 正文 闰年 import sys import math# Auto-generated code below aims at helping you parse # the standard input according to the problem statement.a int(input()) b int(input()) count0 for i in range(a, b 1):if…

DELL服务器RAID配置详细教程

DELL服务器RAID配置教程 在启动电脑的时候按CTRLR 进入 RAID 设置见面如下图 名称解释: Disk Group:磁盘组,这里相当于是阵列,例如配置了一个RAID5,就是一个磁盘组 VD(Virtual Disk): 虚拟磁盘&#xff…

开启智能开发的新纪元:探索 GPT-4o mini 模型的无限可能

引言 随着人工智能技术的飞速发展,大型语言模型已成为推动软件开发和创新的关键力量。OpenAI 最新发布的 GPT-4o mini 模型以其卓越的性能和极具竞争力的价格,为开发者社区带来了新的活力。本文将探讨 GPT-4o mini 模型的特性,以及它如何帮助…

K8S第二节:kubeadm搭建K8s集群

上回书说到什么是K8s,这回就在我自己的虚拟机上搭建一个K8s集群; 一、安装K8S需要的软件包 yum install -y kubelet-1.23.1 kubeadm-1.23.1 kubectl-1.23.1 其中: kubelet:是K8s集群中每个node节点上的管家,用来处理Master节点下发到本节点的…

深入源码:解析SpotBugs (5)BugReportor

常见的 Bug 定位后,通过 bugReport的reportBug(BugInstance) 方法,将bug 发布出来。 一般的 Detector 经检测后会调用 bugReportor.reportBug 方法或者 BugAccumulator.accumulateBug 。 在GUI中,分析结束后会在下框…

楼宇智能化仿真实训室解决方案

在信息技术的浪潮中,智慧城市作为未来城市发展的新形态,正以前所未有的速度在全球范围内兴起。其中,楼宇智能化作为智慧城市的关键构成,扮演着举足轻重的角色。它不仅提升了建筑的能源效率、安全性与舒适度,还促进了城…

WIFI7:引领智能驾驶新未来

近年来,智能驾驶技术飞速发展,从最初的初级的辅助驾驶逐步迈向高度自动驾驶,这一变化历程深刻依赖的是高效、稳定且前沿的无线通信技术的支撑。WIFI7,作为无线通信领域的最新里程碑,凭借其前所未有的性能提升与功能拓展…

这些才是电脑该装的,5款软件良心且实用,别让它们寒心

为什么别人的电脑,开机无广告,使用0卡顿,下载资源快的飞起,网页就是简洁画面。 而自己的电脑却.....开机超过1%,广告一大堆,下载速度差之千里,网页全是“是兄弟,就来砍我”的船新版…

奥运会被误报的韩国国旗,有多少AI能准确识别?结果出人意料!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工…

飞创直线模组桁架机械手优势及应用领域

随着工业自动化和智能制造的发展,直线模组桁架机械手极大地减轻了人类的体力劳动负担,在危险性、重复性高的作业环境中展现出了非凡的替代能力,引领着工业生产向自动化、智能化方向迈进。 一、飞创直线模组桁架机械手优势 飞创直线模组桁架…

Spring Boot集成udp通讯

Spring Boot集成udp通讯 加入依赖编辑配置文件配置相关属性具体业务类客户端调试 加入依赖 <!--加入UDP通信所需依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-integration</artifactId&…

【PCB设计原则5】-PCB设计的寄生元件

寄生电容 在PCB上布两条靠近的走线&#xff0c;很容易形成寄生电容。由于这种电容的存在&#xff0c;在一条走线上的快速电压变化&#xff0c;可在另一条走线上产生电流信号。 设计电路板时&#xff0c;放置两条彼此靠近的走线就会产生寄生电容。例如,在不同的两层&#xff0c…

OJ-0731

题目 题解 参考 import java.util.Arrays; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);while (scanner.hasNext()) {int xmh scanner.nextInt();int n scanner.nextInt();int[] COs …

SFP, SFP+,QSFP光模块封装类型

前言&#xff1a; 本文是自己对SFP, SFP,QSFP光模块封装类型的学习记录&#xff0c;所有的资料都搜集字引用链接里的博客内容&#xff0c;本文更多的是自己的学习笔记记录所以可能会有一些理解错误&#xff0c;请更多的参考引用链接里的信息来源。 引用&#xff1a; 认识SFP/SF…

Arduino Mega 2560开发板的引脚分配图及说明,以及链接can的方法

与Arduino Uno相比,Arduino Mega2560的资源就丰富多了,它具有54个数字I/O口(其中14个可提供PWM输出),16个模拟I/O口,4对串行数据通信口(UART),一个复位开关,一个ICSP下载口,支持USB接口和直流电源供电,具体的资源分配见下图。 Arduino Mega 2560开发板的引脚分配…

nginx代理设置时能获取到源IP地址的方法

nginx通过http_x_forwarded_for限制来访IP示例_ngnix 根据header的x-forwarded-for限制接入-CSDN博客 名称ip客户端地址10.0.23.90nginx服务器地址110.0.202.48:18888&#xff0c;代理到10.0.204.82:8888nginx服务器地址210.0.204.82:8888&#xff0c;代理到10.0.204.82:8887后…