云计算百科
云计算领域专业知识百科平台

4卡4090服务器GraphRAG环境部署、加载ollama向量模型及向量知识图谱构建、加载vllm本地DeepSeek 32B推理模型无缝接入及API接口调用

@4卡4090服务器GraphRAG环境部署、加载ollama向量模型及向量知识图谱构建、加载vllm本地DeepSeek 32B推理模型无缝接入及API接口调用

本人安装的硬件环境如下:
CPU:intel至强金牌6148*2主频2.5G 共40核80线程
内存:三星32G DDR4服务器内存2933 *4=128GB
显卡:英伟达4090涡轮公版 *4 = 96G
操作系统:ubuntu 24.04 LTS
conda:Anaconda 24.11.3

部署GraphRAG环境

1.创建虚拟环境,本项目由于部署GraphRAG稳定版本,经多次测试python3.10版本相对较稳定。

conda create -n graphrag python=3.10 -y

2.进入创建的GraphRAG环境

conda activate graphrag

虚拟环境创建成功如下图所示。
在这里插入图片描述
3.安装graphrag环境,本项目安装的稳定的0.5.0版本

pip install graphrag==0.5.0

安装成功如下图所示。
在这里插入图片描述

4.安装openai标准接入大模型的API协议依赖项

pip install openai

安装成功如下图所示。
在这里插入图片描述
5.安装调用ollama服务的依赖项

pip install ollama

安装成功如下图所示。
在这里插入图片描述
6.由于graphrag发布是基于openai环境的,因此本地化部署及调用本地推理大模型,需要修改graphrag开源的配置文件,满足项目文件调用本地推理模型,支持数据保密相关业务运行;共需要修改三个Graphrag的python的源代码文件,修改简单,但是也需要会python编程技术,防止修改后格式问题报错。
6.1.修改llm/openai/openai_embeddings_llm.py的GraphRAG源代码文件,查找路径在conda系统目录下的env->当前安装环境,我当前项目名是graphrag->lib/python3.10/site-packages/graphrag目录下,当前我的项目具体目录是

/home/allanfan/anaconda3/envs/graphrag/lib/python3.10/site-packages/graphrag

当前项目找到的graphrag源代码位置目录如下图所示。
在这里插入图片描述

备注:大家的项目根据安装的conda环境目录,按我上面一直找下去即可,当前python环境是3.10,其它更高版本我试过,不太好用。如果大家有时间可以试一下更高版本,但是graphrag 0.5.0以上版本完全基于openai协议,个人尝试很多次无法本地化接推理模型。

通过上面目录向下找到llm/openai/openai_embeddings_llm.py源文件,用sudo nano打开文件注释掉下面代码,然后添加以下新代码。

sudo nano openai_embeddings_llm.py

注释36行至41行,注释具体代码如下所示,行数仅供参考,具体是以下代码。

'''embedding = await self.client.embeddings.create(
input=input,
**args,
)
return [d.embedding for d in embedding.data]'''

注释代码如下图所示。
在这里插入图片描述
添加代码如下所示。其中,向量模型名称根据自己下载的模型命名修改,本项目测试用的是nomic-embed-text模型。
文件头部添加引用本地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

添加新代码如下图所示。
在这里插入图片描述
nano保存文件按ctrl+o,保存后退出按ctrl+c。修改后整体代码参考如下所示。

# Copyright (c) 2024 Microsoft Corporation.
# Licensed under the MIT License

"""The EmbeddingsLLM class."""
import ollama

from typing_extensions import Unpack

from graphrag.llm.base import BaseLLM
from graphrag.llm.types import (
EmbeddingInput,
EmbeddingOutput,
LLMInput,
)

from .openai_configuration import OpenAIConfiguration
from .types import OpenAIClientTypes

class OpenAIEmbeddingsLLM(BaseLLM[EmbeddingInput, EmbeddingOutput]):
"""A text-embedding generator LLM."""

_client: OpenAIClientTypes
_configuration: OpenAIConfiguration

def __init__(self, client: OpenAIClientTypes, configuration: OpenAIConfiguration):
self.client = client
self.configuration = configuration

async def _execute_llm(
self, input: EmbeddingInput, **kwargs: Unpack[LLMInput]
) > EmbeddingOutput | None:
args = {
"model": self.configuration.model,
**(kwargs.get("model_parameters") or {}),
}
"""embedding = await self.client.embeddings.create(
input=input,
**args,
) return [d.embedding for d in embedding.data]"""

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

6.2.修改qutry/llm/oai/embedding.py源代码文件,还在当前我的项目下查找该源代码文件,下面当前我项目的graphrag目录.

/home/allanfan/anaconda3/envs/graphrag/lib/python3.10/site-packages/graphrag

找到qutry/llm/oai/embedding.py,如下图所示。
在这里插入图片描述
用nano命令打开文件,注释及添加以下代码。

sudo nano embedding.py

文件头部添加引用本地ollama依赖项

import ollama

如下图所示。
在这里插入图片描述
找到源代码中两处以下代码,如下所示
第一处:

embedding, chunk_len = self._embed_with_retry(chunk, **kwargs)

第二处:

chunk_embeddings = np.average(chunk_embeddings, axis=0, weights=chunk_lens)
chunk_embeddings = chunk_embeddings / np.linalg.norm(chunk_embeddings)
return chunk_embeddings.tolist()

将上面两处代码添加#,注释掉,操作如下图所示。
在这里插入图片描述
在上面两处注释后面添加以下两段新代码,其中,第一处代码模型名称根据实际模型名称修改,本项目向量模型使用的是nomic-embed-text。
第一处:

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

第二处:

return chunk_embeddings

具体添加代码后,如下图所示。
在这里插入图片描述
添加好新代码后按ctrl+o保存,保存后按ctrl+c退出即可。

在这里插入图片描述
6.3.修改qutry/llm/text_utils.py源代码文件,,还在当前我的项目下查找该源代码文件,下面当前我项目的graphrag目录.

/home/allanfan/anaconda3/envs/graphrag/lib/python3.10/site-packages/graphrag

找到qutry/llm/text_utils.py,如下图所示。

在这里插入图片描述
使用sudo nano打开源代码文件,添加以下一行代码即可,该代码是将tokens解码成字符串。

tokens = token_encoder.decode(tokens)

添加上面代码位置如下图所示。
在这里插入图片描述
添加好新代码后按ctrl+o保存,保存后按ctrl+c退出即可。
在这里插入图片描述
至此GraphRAG环境部署已完成,接下来开始GraphRAG的知识库索引构建、知识库查询服务等。

GraphRAG配置ollama向量模型、配置本地vllm的DeepSeek 32B推理模型、知识库构建、示例知识库的查询

1.创建知识库目录,本项目示例民政部相关文件构建知识库,个人先在民政部下载“民政部2024年11月文告”的PDF版,通过python程序将pdf转化成word,转化程序大家可以采用在线转换,或者WPS转换,这里就不做简单的python转化程序分享;在当前项目根目录下,本人创建的知识目录名称为minzheng,具体如下图所示。
在这里插入图片描述
2.在项目根据下,对minzheng目录初始构建知识库索引,执行命令如下。注意:执行环境一定要在上面自己命名的CONDA环境下,本项目CONDA环境名称为graphrag,否则执行报错。

graphrag init –root ./minzheng

执行完成之后,进入minzheng目录,会看到graphrag初始化创建的目录及文件,.env项目配置文件; settings.yaml项目运行配置及依赖文件prompts项目提示词工程,这个文件很重要,他是知识图谱最核心地方,构建项目简单,但是针对业务构建符合业务的工作全在这里,一个好的知识库就看你写的提示词了。

在这里插入图片描述
3.修改当前项目配置文件.env,当前项目采用本地ollama部署的推理模型进行知识图谱构建及查询,部署环境已修改源代码为调用本地,如果不修改,本地需要在openai申请API密钥,在该文件配置即可,由于调用本地vllm部署的DeepSeek 32B推理模型,同时本地化调用vllm启用api_key,因此本配置文件可修改为我设置的api_key即可,我设置本地部署的DeepSeek 32B的api_key是allanfan。
为了个人更好识别是调用本地,建议修改配置为

GRAPHRAG_API_KEY=allanfan

具体如下图所示。
在这里插入图片描述
修改好后按ctrl+o保存,保存后按ctrl+c退出即可。

4.修改当前项目配置文件settings.yaml,该文件原内容如下。

### This config file contains required core defaults that must be set, along with a handful of common optional settings.
### For a full list of available settings, see https://microsoft.github.io/graphrag/config/yaml/

### LLM settings ###
## There are a number of settings to tune the threading and token limits for LLM calls – check the docs.

encoding_model: cl100k_base # this needs to be matched to your model!

llm:
api_key: ${GRAPHRAG_API_KEY} # set this in the generated .env file
type: openai_chat # or azure_openai_chat
model: gpt-4-turbo-preview
model_supports_json: true # recommended if this is available for your model.
# audience: "https://cognitiveservices.azure.com/.default"
# api_base: https://<instance>.openai.azure.com
# api_version: 2024-02-15-preview
# organization: <organization_id>
# deployment_name: <azure_model_deployment_name>

parallelization:
stagger: 0.3
# num_threads: 50

async_mode: threaded # or asyncio

embeddings:
async_mode: threaded # or asyncio
vector_store:
type: lancedb
db_uri: 'output/lancedb'
container_name: default
overwrite: true
llm:
api_key: ${GRAPHRAG_API_KEY}
type: openai_embedding # or azure_openai_embedding
model: text-embedding-3-small
# api_base: https://<instance>.openai.azure.com
# api_version: 2024-02-15-preview
# audience: "https://cognitiveservices.azure.com/.default"
# organization: <organization_id>
# deployment_name: <azure_model_deployment_name>

### Input settings ###

input:
type: file # or blob
file_type: text # or csv
base_dir: "input"
file_encoding: utf-8
file_pattern: ".*\\\\.txt$"

chunks:
size: 1200
overlap: 100
group_by_columns: [id]

### Storage settings ###
## If blob storage is specified in the following four sections,
## connection_string and container_name must be provided

cache:
type: file # or blob
base_dir: "cache"

reporting:
type: file # or console, blob
base_dir: "logs"

storage:
type: file # or blob
base_dir: "output"

## only turn this on if running `graphrag index` with custom settings
## we normally use `graphrag update` with the defaults
update_index_storage:
# type: file # or blob
# base_dir: "update_output"

### Workflow settings ###

skip_workflows: []

entity_extraction:
prompt: "prompts/entity_extraction.txt"
entity_types: [organization,person,geo,event]
max_gleanings: 1

summarize_descriptions:
prompt: "prompts/summarize_descriptions.txt"
max_length: 500

claim_extraction:
enabled: false
prompt: "prompts/claim_extraction.txt"
description: "Any claims or facts that could be relevant to information discovery."
max_gleanings: 1

community_reports:
prompt: "prompts/community_report.txt"
max_length: 2000
max_input_length: 8000

cluster_graph:
max_cluster_size: 10

embed_graph:
enabled: false # if true, will generate node2vec embeddings for nodes

umap:
enabled: false # if true, will generate UMAP embeddings for nodes

snapshots:
graphml: false
raw_entities: false
top_level_nodes: false
embeddings: false
transient: false

### Query settings ###
## The prompt locations are required here, but each search method has a number of optional knobs that can be tuned.
## See the config docs: https://microsoft.github.io/graphrag/config/yaml/#query

local_search:
prompt: "prompts/local_search_system_prompt.txt"

global_search:
map_prompt: "prompts/global_search_map_system_prompt.txt"
reduce_prompt: "prompts/global_search_reduce_system_prompt.txt"
knowledge_prompt: "prompts/global_search_knowledge_system_prompt.txt"

drift_search:
prompt: "prompts/drift_search_system_prompt.txt"

上面文件我们需要关注几个地方,一个是llm配置项,一个是embeddings配置项。

首先针对settings.yaml里面的llm配置修改如下:
原文件llm代码

llm:
api_key: ${GRAPHRAG_API_KEY} # set this in the generated .env file
type: openai_chat # or azure_openai_chat
model: gpt-4-turbo-preview
model_supports_json: true # recommended if this is available for your model.
# audience: "https://cognitiveservices.azure.com/.default"
# api_base: https://<instance>.openai.azure.com
# api_version: 2024-02-15-preview
# organization: <organization_id>
# deployment_name: <azure_model_deployment_name>

修改后llm代码

llm:
api_key: ${GRAPHRAG_API_KEY} # 取配置文件.env的APIKey,不进行修改
type: openai_chat # 当前取本地私有化部署的DeepSeek 32B,DeepSeek延用openai协议
model: DeepSeek-R1-Distill-Qwen-32B # 当前模型名称更换为本地私化部署的deepseek 32B模型名称
model_supports_json: true # recommended if this is available for your model.
api_base: http://localhost:8001/v1 # 添加本地化模型对外发布调用的地址,该地址填写自己部署的地址即可
# audience: "https://cognitiveservices.azure.com/.default"
# api_base: https://<instance>.openai.azure.com
# api_version: 2024-02-15-preview
# organization: <organization_id>
# deployment_name: <azure_model_deployment_name>

修改后如下图所示。
在这里插入图片描述

第二步针对settings.yaml里面的embeddings配置修改如下:
原文件embeddings的代码

embeddings:
async_mode: threaded # or asyncio
vector_store:
type: lancedb
db_uri: 'output/lancedb'
container_name: default
overwrite: true
llm:
api_key: ${GRAPHRAG_API_KEY}
type: openai_embedding # or azure_openai_embedding
model: text-embedding-3-small
# api_base: https://<instance>.openai.azure.com
# api_version: 2024-02-15-preview
# audience: "https://cognitiveservices.azure.com/.default"
# organization: <organization_id>
# deployment_name: <azure_model_deployment_name>

修改后embeddings的代码如下

embeddings:
async_mode: threaded # or asyncio
vector_store:
type: lancedb
db_uri: 'output/lancedb'
container_name: default
overwrite: true
llm:
api_key: ollama # 当前向量模型使用的是ollama部署的,ollama未启用api_key,方便认知是调用本地ollama运行的向量模型,该处填写ollama
type: openai_embedding # 模型延用openai的向量模型协议,该处不进行修改
model: nomic-embed-text # 本项目采用的向量模型名称是nomic-embed-text,该处修改为nomic-embed-text
api_base: http://localhost:11434/api # 本项目调用是本地部署的向量模型,该地址地址修改成本地部署推理的地址即可
# api_version: 2024-02-15-preview
# audience: "https://cognitiveservices.azure.com/.default"
# organization: <organization_id>
# deployment_name: <azure_model_deployment_name>

修改后如下图所示。
在这里插入图片描述
修改好配置后按ctrl+o保存,保存后按ctrl+c退出即可。

5.在minzheng目录下创建input文件夹,用于构建知识的文本内容,本项目示例上传在民政部下载的“民政部2024年11月文告”,用于构建知识库内容。具体详见下图所示。
在这里插入图片描述
6.构建GraphRAG索引,在当前graphrag及上面安装的环境下执行构建索引命令,程序会根据上面配置文件自动调用本地ollama及本地vllm的向量模型及推理模型。

graphrag index –root ./minzheng –reporter rich

执行效果如下图所示。

在这里插入图片描述
我提供的数据量不大,执行整个过程10分钟以内完成。
在这里插入图片描述
上图是本地推理模型进行实体及关系的提取。

7.构建完成的GraphRAG的示例项目内容查询,例如:我查询“困境儿童”及“中国福利彩票”,看知识图谱如何准确的回答我。
在这里插入图片描述

在这里插入图片描述
剩下大家自己部署及测试吧!对了,如果你的服务器GPU资源不够,可以在配置文件中修改成你在网上申请DEEPSEEK的API地址及KEY即可,如下所示。

llm:
api_key: API_KEY # 直接填写申请的API_KEY,或者在.env里面修改也可以
type: openai_chat # 当前取本地私有化部署的DeepSeek 32B,DeepSeek延用openai协议
model: deepseek-chat # DEEPSEEK使用模型名称 deepseek-chat
model_supports_json: true # recommended if this is available for your model.
api_base: https://api.deepseek.com # Deepseek调用的地址,deepseek是延用openai地址协议,后面的v1/chat/completions默认自动补齐
# audience: "https://cognitiveservices.azure.com/.default"
# api_base: https://<instance>.openai.azure.com
# api_version: 2024-02-15-preview
# organization: <organization_id>
# deployment_name: <azure_model_deployment_name>

8.使用APP构建GraphRAG对外的接口代码及示例。
8.1.对外接口路由代码

#===================================================================#
#===================================================================#
# GraphRAG对外接口应用V1.0-Allan.Fan 20250525
# 模型查询构建方法实现
#===================================================================#
#===================================================================#
import json
from datetime import datetime
from flask import Blueprint, request, g
from services.appquerymodeloutput_service import get_appquerymodeloutput
from flask_restx import Api,Namespace, Resource, reqparse

appquerymodeloutput_bp = Blueprint('querymodel_bp', __name__, url_prefix="/app/query/model")
api = Api(appquerymodeloutput_bp, doc='/doc', version='1.0', title='模型查询接口文档', description='关于企业模型文档说明')

# ————————————————————
# 创建默认命名空间
# ————————————————————
default_ns = Namespace(
name="",
path="",
description="模型查询接口文档"
)
api.add_namespace(default_ns)

# ———————————————-
# 参数解析器
# ———————————————-
parser = reqparse.RequestParser()
parser.add_argument('query', type=str, default='', required=True,
help='向企业模型提出问题', location='args')

@appquerymodeloutput_bp.before_request
def before_request():
g.client_ip = request.headers.get('X-Forwarded-For', request.remote_addr)

@default_ns.route('/output',methods=['GET'])
class AppQueryModelOutput(Resource):
@default_ns.expect(parser)
def get(self):
"""企业模型应用"""
args = parser.parse_args()
if args['query'] == None:
return {'code': 400, 'msg': '提出问题不能为空'}

query = args['query']
print (f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} query: {query}")

if not query:
return {"success": False, "message": "提出问题不能为空!"}, 400
try:
istrue,querymodeloutput_data = get_appquerymodeloutput(query)
if istrue:
return {"success": istrue,"message": "模型请求处理成功","data": querymodeloutput_data}, 200
else:
return {"success": istrue, "message": f"模型请求处理失败!", "data": querymodeloutput_data}, 200
except Exception as e:
return {"success": False, "message": str(e)}, 500

8.2.GraphRAG获取查询问题后进行检索的业务代码。

#===================================================================#
#===================================================================#
# GraphRAG对外接口应用V1.0-Allan.Fan 20250525
# 模型查询相关API方法实现
#===================================================================#
#===================================================================#
import subprocess
def get_appquerymodeloutput(query):
result = []
taskoneoutput = {
"msg":None,
"count":0,
"data":[]
}
try:
command = ['graphrag','query','–root', '/home/allanfan/code/graphrag/minzheng','–method', 'global','–query', query]
result = subprocess.run(command, capture_output=True, text=True)
taskoneoutput["data"] = result.stdout
return True,taskoneoutput
except Exception as e:
return False,str(e)

备注:/home/allanfan/code/graphrag/minzheng这个地址是上面构建知识图谱内容的在服务器的绝对地址,请修改成自己的服务器构建的项目绝对地址即可,上面是我示例项目在服务器的绝对地址位置。

以上就是GraphRAG从环境部署,加载本地向量模型、本地推理模型、简单的知识图谱构建、简单的对外API接口开发;剩下最复杂的就是知识图谱的实体、关系如何根据业务构建,以及检索的数据召回率管理,检索数据速度及准确率的知识图谱构建,这个是除技术之外还要结合业务去整合发展。希望上面的GraphRAG能够在业务中帮助至大家;如果能够帮助到你一点,也希望你多支持支持我,给我多点击及收藏;也期望你的关注。

赞(0)
未经允许不得转载:网硕互联帮助中心 » 4卡4090服务器GraphRAG环境部署、加载ollama向量模型及向量知识图谱构建、加载vllm本地DeepSeek 32B推理模型无缝接入及API接口调用
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!