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能够在业务中帮助至大家;如果能够帮助到你一点,也希望你多支持支持我,给我多点击及收藏;也期望你的关注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小军哥666

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

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

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

打赏作者

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

抵扣说明:

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

余额充值